ラズベリーパイ(Raspberry Pi Zero WH)とフォトリフレクタでハムスターの回転計

2019年10月24日

ラズベリーパイ(Raspberry Pi Zero WH)とフォトリフレクタWebIOPiを使って、ハムスターの回し車の回転計を作成しました。

測定した回転数は、JavaScriptのチャートライブラリ「Chart.js」を使ってグラフ表示し、リアルタイムでパソコンやスマホから確認することができます。

ハムスター回し車の回転数グラフ

Left Caption
まあちゃん
わぁ グラフ きれい!
Right Caption
ままあちゃん
Chart.jsを使うと簡単に
グラフが作れるんだよ

 

これまで紹介したフォトリフレクタWebIOPiの使い方の記事はこちらです。

ハムスターの紹介

こちらが我が家のプリンセス! ジャンガリアンハムスターの「ハムハム」です。

ジャンガリアンハムスター

2018年の8月末くらいに生まれたそうなので、生後8カ月くらいです。

しぐさがとっても愛らしくて、手を入れるとすぐに寄ってくる人懐っこい女の子です。

Left Caption
うさたん
むっちゃ、かわいいです
Right Caption
ままあちゃん
ほんと、癒されます

でも、かわいがりすぎて、最近ちょっと太め? ダイエットが必要でしょうか?

夜、結構、回し車を回しているようなのですが、実際どのくらい回しているのか、調べてみたいと思います。

これまで紹介したフォトリフレクタWebIOPiのしくみを利用して、ラズベリーパイ(Raspberry Pi Zero WH)でハムスターの回転計を作成します。

ジャンガリアンハムスター

回転計の作成にあたって、こちらのブログを参考にさせていただきました。ありがとうざいました!
ハムスターの回転計(回し車 カウンター) [光学]

準備するもの

1

ラズベリーパイ(Raspberry pi zero WH)

詳しくは、こちらです。

初期設定環境設定が済んだものを使用します。

Raspberry Pi Zero WH
2

microSDカード 8~32GB

詳しくは、こちらです。

Team microSDHCカード 32GB 高速転送UHS-1 日本国内10年保証 SD変換アダプター付属 正規品

3

microUSB電源ケーブル

スマホの充電ケーブルでOKです。
詳しくは、こちらです。

microUSB電源ケーブル
4

パソコン

microSDに書き込めるもの。
詳しくは、こちらです。

エイスース 13.3型ノートパソコン ASUS ZenBook UX331UN ロイヤルブルー UX331UN-8250B

5

ブレッドボード

詳しくは、こちらです。

ブレッドボード
6

ジャンパーワイヤー

詳しくは、こちらです。

ジャンパーワイヤ
7

抵抗

詳しくは、こちらです。

抵抗
8

フォトリフレクタ(反射型フォトセンサ)RPR-220

詳しくは、こちらです。

フォトリフレクタ
9

74HC14

詳しくは、こちらです。

74HC14
10

温湿度センサ DHT11

詳しくは、こちらです。

DHT11
11

ハムスターの回し車

赤いピカピカのテープを貼りました。

回し車が回転すると、フォトリフレクタでこのテープの通過を検出します。

テープを貼ったハムスターの回し車
11

ブレッドボードを固定する台

固定できれば何でもOKです。

次で詳しく紹介しています。 

レゴでラズベリーパイの台

ブレッドボードを固定する台

フォトリフレクタの高さを調節して、ブレッドボードを固定する台を作成しました。

ブレッドボードの後ろにも両面テープが貼ってあるようなので、空き箱を利用して作ろうかと思っていたのですが、子どもが小さいころ遊んでいたレゴブロックのドアがちょうどいいサイズ!

レゴでラズベリーパイの台

 

こちらは、後ろからの写真です。ブレッドボードの横にちょっと隙間があくので、ジャンパーワイヤを通すことができました。

レゴでラズベリーパイの台

横にラズベリーパイ(Raspberry Pi Zero WH)を置いて、赤い柵で固定しています。

ちょうどラズベリーパイ(Raspberry Pi Zero WH)の電源ケーブルが赤い柵の隙間に固定されていいかんじです。

レゴでラズベリーパイの台

この台を、ハムスターの回し車のところにおいて、回転数を数えます。

レゴでラズベリーパイの台

横から見るとこんなかんじです。フォトリフレクタを回し車の近くにおいて、赤いピカピカテープが通過すると数をカウントしていきます。

レゴでラズベリーパイの台

配線方法

回路図

回路図はこのようにしました。

温湿度センサーのDHT11は、4.7kΩのプルアップ抵抗が必要ということで、手元にあった10kΩの抵抗を使用しました。

回転計の回路図

配線図

配線の方法を、簡単な図で示します。

ハムスターの回転計の配線

配線の写真

写真で見るとこんなかんじです。

Raspberry Pi Zero WHと回転計の配線写真

ブレッドボードの方をアップにします。

回転計の配線写真

JavaScriptのチャートライブラリー(Chart.js)

次は、ラズベリーパイに必要なライブラリーを追加していきます。

いろいろな種類のグラフを簡単に表示できるライブラリーChart.jsを使います。

Chart.jsは、HTML5のcanvasを使って、JavaScriptベースでグラフを表示することができるライブラリです。

公式サイトなどで使い方や設定などが、詳しく説明されています。

設定方法は、以下の2つがあります。

設定方法1 ライブラリにアクセス

外部のライブラリにアクセスするのであれば、htmlファイルのheadタグに以下を記述するだけでOKです。

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js"></script>

設定方法2 ダウンロードする

外部にはアクセスしないで、ダウンロードしたファイルを使うこともできます。

でも、その方法がなかなか見つからなかったので、設定方法を紹介します。

公式サイトにアクセスし、「Git Started」ボタンをクリックします。

chart.jsのダウンロード1

InstallationのGitHub releasesリンクをクリックします。

chart.jsのダウンロード2

ページの一番下のChart.jsファイルをクリックしてダウンロードします。

chart.jsのダウンロード3

/home/pi/webiopi/test/jsフォルダを作成し、ダウンロードしたChart.jsファイルを保存します。

htmlファイルのheadタグでChart.jsを読み込みます。

<!-- グラフ描画用のチャートライブラリファイル読み込み -->
<script src="js/Chart.js"></script>

グラフのデータ・オプションを設定

javascriptで、描画するグラフのデータやオプションを設定することができます。(詳しくは、プログラムを見てください)

// グラフのデータ・オプションを設定
var ctx = $('#canvas').get(0);
var myChart = new Chart(ctx, {
  type: 'bar', // 棒グラフを指定
  data: {
    labels: array_lavels, // 横軸のラベル
    datasets: [{
      data: array_data, // グラフのデータ
      backgroundColor: 'rgba(153, 102, 255, 0.2)', // 棒グラフの背景色
      borderColor: 'rgba(153, 102, 255, 1)', // 棒グラフの縁取りの色
      borderWidth: 1  // 棒グラフの縁取りの太さ
             ……

キャンバスでグラフ描画

あとは、bodyタグ内のグラフを描画したい場所に「canvasタグ」をおくだけで、きれいなグラフが描けてしまいます。とっても簡単で楽しいです。

<!-- HTML5のcanvasで、グラフを描画 -->
<canvas id="canvas"></canvas>

Pythonのスケジューラーモジュール

もう一つ、Pythonのプログラムで「5分ごとに処理を実行」したいので、スケジューラーモジュールをインストールします。

インストール

まずは、現在インストール済みのパッケージを一覧で確認します。

> pip3 list

pip3は、Python3のパッケージを管理するコマンドです。

しばらくすると、インストール済みのパッケージがずらっと表示されます。

schedule」がなければpip3でインストールします。

> sudo pip3 install schedule

使い方

スケジューラを使う方法は、

  1. プログラム内でインポート
  2. 実行したいスケジュールと関数を登録
  3. 登録した関数を実行する

という3段階攻撃です(詳しくは、プログラムを見てください)。

import schedule              # スケジューラライブラリ
  ……
# 5分毎にseveCSVを実行するようスケジュールを登録
schedule.every(5).minutes.do(seveCSV)
  ……
# 設定したスケジュール通り、5分毎にseveCSV関数を実行
schedule.run_pending()

PythonのDHT11モジュール

温湿度センサーDHT11を簡単に使用するために、Pythonのモジュールを使用します。

インストール

Adafruit社がGitHubで公開しているPythonモジュールをインストールします。

> git clone https://github.com/adafruit/Adafruit_Python_DHT.git

> cd Adafruit_Python_DHT
> sudo python3 setup.py install

使い方

このモジュールを使う方法は、こちらです。

  1. プログラム内でインポート
  2. 使用するGPIOを指定
  3. 温度・湿度を読み取る

詳しくは、プログラムを見てください。

import Adafruit_DHT as DHT # DHT11用ライブラリ
  ……
DHT_PIN = 15 # 温湿度入力ピン GPIO15(ピン番号10)
  ……
humi, temp = DHT.read_retry(DHT.DHT11, DHT_PIN)

プログラム

プログラムは、大きく2つの流れで処理しています。

  1. 回転数をCSVファイルに保存
  2. CSVファイルを読み込んでグラフ描画

回転数をCSVファイルに保存

フォトリフレクタからの信号をカウントした回転数と、DHT11で測定した温度湿度を一定時間ごとにCSVファイルに保存します。

ハムスターは夜行性なので、夜20時くらいから、翌朝の6時くらいまでの回転数を測定します。

夜間の回転数を続けて見たいので、昼間の12時から24時間の単位で区切って保存することにしました。

CSVファイルを読み込んでグラフ描画

保存してあるCSVファイルのうち最新のファイルを読み込み、グラフを描画します。

保存されているCSVファイルから、日付選択のセレクトボックスを生成します。

セレクトボックスで日付を選択すると、グラフのデータを切り替えて再表示します。

ファイル構成

ファイルの構成は、こちらです。

ファイル構成

JavascriptやCSS(スタイルシート)などは、別のファイルにした方がいいのですが、ここでは内容を追いやすいように1つのファイルにまとめています。

index.html

index.htmlファイルでは、データのグラフ表示と回し車の状態・回転数を表示します。

script.py

実際に処理をしているPythonのソースファイルです。

データファイル

プログラム内で作成し、データを保存するcsvファイルです。

ファイル名は、cnt_(日付).csvになります。

フォーマットは、時間,回転数,温度,湿度 です。

 

動作確認

WebIOPiを起動して、http://raspberrypi.local:8000/test/にアクセスします。

ハムハムが回し車を回すと……。

回し車をまわすハムハム

回転数グラフの下の「回転中」ボタンが赤くなって、回転数がアップしていきます。

保存されたデータのグラフが表示されます。

回転数は紫の棒グラフ、温度は赤、湿度は青の折れ線グラフです。

ハムスター回し車の回転数グラフ

終了するときは、WebIOPiを停止させ、ラズベリーパイを停止します。

まとめ

気になっていたハムハムの回し車の回転数を、実際に測定してグラフ化したことで、運動量が一目で分かるようになりました。

自動で夜間ずっと計測してくれる便利さも実感です。

測り始めてまだ数日ですが、日によって回転数にばらつきがあることも分かりました。

多い日には、ほとんど休みなく回して2万回以上! 休みが多くて1万回くらいの日もあります。

年齢や季節、温度にもよるようですし、運動量で体調が分かって、エサの量を調節することもできそうです。

もしかしたら地震の予知ができるかもしれません。

これからもなるべく簡単な方法で、楽しくラズベリーパイ(Raspberry Pi Zero WH)を使った工作を紹介していきます。

 

Posted by ままあちゃん