メダカ水槽に水温計を設置して2年ほど経過しましたが、おおよそ季節ごとの水温の推移がデジタル温度センサー(DS18B20)で確認できるようになりました。
メダカを育てていて、やっぱり気になることは日々の「餌やり」だと思うんですよね。例えば、旅行とかで長い期間外出しているうちは誰もメダカに餌やりできないので、その間にメダカが弱ってしまうんじゃないかと気になってしまいます。(とはいえ、実際には1週間餌やりしない、冬の寒い期間は餌をあげなくても問題ないんですけどね)
そう思ったら、やっぱり自動で餌やりする仕組みが欲しいなと思い立ち、早速いくつかのサイトを参考に、自宅のメダカにあう餌やり機を作ってみました。
今回はその餌やり機を既に水温計で使っているRaspberry Pi 3 Model B+と、そこから動かすサーボモーターである「SG92R」を使いました。
用意したもの
今回使ったモデルを記載していますが、Zeroでも動くと思います。
餌やりを行うためのモータですね。他にもSG90があるようですが、こちらのモーターの方がトルクが強いようです。
- 餌やり本体:ダイソー ワンタッチボトル(携帯用、15 mL)
餌やりに入れるボトルはダイソーで買いました。このボトルにいくつか穴を開けて、モーターで動かした際にこのボトルを回転させて、これらの穴から餌を放出するようにします。
これはサーボモーターを水槽の上部に固定するのにちょうど良さそうでしたので購入しました。このハンガーの上部にモーターをビニールタイ等で括り付けて固定します。
ブレッドボードでの配置例
こんな感じで組みました。
シンプルですが、モーターからはVCC、GND、制御ピンがありますので、今回は以下のようにつなげています。
- 電源ピン(赤色) → 5V
- GNDピン(茶色) → GND
- 制御ピン(橙色) → GPIO18
実装のポイントなど
ボトルを回転させるために、シャフトとボトルキャップの上部を接着剤でくっつけます。画像だと自宅にあったボンドを使いました。
くっつけたボトルキャップを、エサ放出用にいくつか穴あけしたボトル本体を装着し、画像のようなイメージでモーターとボトルを連動させます。
SG92Rの仕様(秋月電子さんのサイトから抜粋)から、制御角は±約90°(180°)となっているようです。この角度は制御パルス(0.5ms~2.4ms)からPWMサイクル(20ms)で割った「デューティ比(%)」をインプットすることで角度が調整できます。
このデューティ比の詳細については、自分自身が詳細まで理解しきれていないのでここでは割愛しますが、この計算によって2.5(-90°)〜7.25(0°)〜12.0(90°)の角度になります。
今回はこのデューティ比を2.5→12.0にすることで、180°回転させるように制御します。
サンプルコード
import sys
import RPi.GPIO as GPIO
import time
count = int(sys.argv[1])
wait = float(sys.argv[2])
GPIO.setmode(GPIO.BCM)
gp_out = 14 # GPIOピン番号
GPIO.setup(gp_out, GPIO.OUT)
servo = GPIO.PWM(gp_out, 50) # PWMサイクル:20ms(=50Hz)
servo.start(0)
time.sleep(2)
for i in range(count):
servo.ChangeDutyCycle(2.5)
time.sleep(wait)
servo.ChangeDutyCycle(12)
time.sleep(wait)
servo.stop()
GPIO.cleanup()
実際の呼び出しはこんな感じです。引数を2つ取るようにしており、ここではシェイクする回数を「$1」、シェイク後の次のシェイクまでの待ち時間を「$2」にしています。
python /path/to/file/servo_motor.py $1 $2
「servo.ChangeDutyCycle」に先ほどの”2.5″、”12″を指定することで、90°反時計回りに回転させ、次に180°時計回りに回転させることで1回のシェイクを行い、その後2番目の引数で指定した待ち時間分スリープします。これを1番目の引数で指定した回数分行います。
今回は1番目の引数を「3」、2番目の引数を「0.5(=500ms)」を指定することで、500ms間隔で計3回のシェイクを行うことができます。
作成したもの
実際の動きはこちら。動画では我が家のLINEボット(ねみちゃん)に餌やりを指示してメダカに餌やりしています。
実行するだけであれば、Raspberry Pi からcronか何かをつかって定期的にモーターを動かすpythonプログラムを実行するようスケジュールすれば、最低限のこと(実行してプログラムからモーターを動かす)ことはできると思います。
ただ、これだと外出先からの対話的な実行ができないので、すぐに餌やりしたい場合などにはやっぱり外から実行できる仕組みが欲しいところです。方法はいくつでもあると思いますが、自分の場合はいつも使っているLINEボットがあったので、この仕組みに乗っかって利用しています。
LINEボットからどうやってモーターを動かしているかについては、どこか別の記事で紹介できればと思いますが、大雑把に言えば、LINE → Lambda → WebhookRelay → (ラズパイ)Node-REDからモーターに伝えて動かしています。
振り返り
実際に運用してみると、水槽の掃除とかでモーターから餌やりボトルを切り離す必要があるのですが、やっぱりフタとシャフトを接着していたボンドが時々取れてしまい、またくっつけ直す手間がありますね。
あとは、運用当初は水槽のポンプから上がってくる水しぶきがボトルにかかるので、餌自体が湿ってしまい、餌の出が少し良くなかったです。(加えて餌が湿ることでカビが発生しそうな。。。)
これは上で紹介したように、運用後の思いつきでボトルの側面に水しぶきを水滴として集めて水槽に落とすちょっとした「出っ張り」をつけることで、水分がその出っ張りに集まるようになり、餌のボトル内部まで入り込むことがなくなりました。
モーター自体の動きについて特に問題はなさそうですが、どちらかというと、水槽からくる水しぶきにモーター自身やボトルがどうやって耐えられるか、もう少しやりやすい掃除の方法などを考えた方が良いかもしれませんね。