自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on...

23
Raspberry Pi とサーボモータを利用した魚自動給餌装置製作マニュアル ǸķõƨĈƨĈðƍǹǖĈıęý njǨýĈƕĿンįnjǨĈıęŨ ãǥűů _;Y?;;Ai)e;Afp;(l);Z)ag UŀƃȇȒV Q?i+),Y -+-+*.*-1 ÎàÁ»ªÎļă Q?i+),Z -+-+*.*-2 »ªÒŰƌd džư{ǧ゙Ƨ N?imf[iCm?i ȔĬDZ Dz¦ƵĖ Q?i+)- -+-+*.*.+ ȚȀđŒƎgŬǣDZDzƒǺƵúeǧ゙Ƨ N?imf[iCm?i ¦ƈ Ļ¢Îà±ÜÕƵú UȆȃżƱëV ,) ǪŹ°Ý¬ª¿©Íg³×â¸gܪ¹â· >>=S(I> ラĮ~Kpk_fe ³ i BKGm. ܪ¹â·ļăvアv#ŭļ㦳w{Ÿ ~Ź”DZ{Ďíy¡ yğx}v$e -) ƜƮŒƎ~ȘĒǴƽ M;jgY?iipKC ŖȃDZDzď¢Ƭŧ~șĒƙƽ DŽĕľŒƬŧ{ǟȄe 3. このマニュアルは阿部が自分自身の研究室で使用するために装置を作製した過程を 公開するものです。従って装置の作製・利用は自己責任でお願い致します。作製し た装置の動作に不具合があっても阿部は一切の責任を負いません。 /) Îà±ÜÕgĚȚƜƮ~ŬǣDZDzĂȌǃ{u¡ ~ƇǞ~ãǥ yē}veŬ¡Ǒ£ĂȌǃ¦ĂƼǚÓÄÚ¨ÞƺçŪyǸƗ ĝĨŏve

Transcript of 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on...

Page 1: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

Raspberry Pi とサーボモータを利用した魚自動給餌装置製作マニュアル

_ Y ; i)e fp (l) Z)ag

U VQ i +),Y -+-+*.*-1Q i +),Z -+-+*.*-2 ゙ N imf [i m i

Q i +)- -+-+*.*.+ ゙ N imf [i m i

U V,) >> =S(I>ラ ~Kpk_fe

BKGm. ア #~ ” $

-) ~ M jgY iipK ~

3. このマニュアルは阿部が自分自身の研究室で使用するために装置を作製した過程を公開するものです。従って装置の作製・利用は自己責任でお願い致します。作製した装置の動作に不具合があっても阿部は一切の責任を負いません。

/) ~ ~ ~

Page 2: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

1 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

自動魚給餌装置の作製

目的目的2週間程度研究室にこれないときに実験魚の給餌(1日5回)を維持するための自動給餌装置を作成する。

ネットで同様のアイデアがないか検索したところ,以下の記事があった。

サーボモーターSG90とRaspberry Pi Zero WHで金魚にエサをやるhttps://raspida.com/learn-sg90-zerow

この記事ではRaspberry Pi zero WH(Raspberry Piの中で一番小さいが,性能も低いバージョン。ただし無線LAN,Bluetooth

は内蔵されている)を使用して一個のサーボモーターを動作させ,テトラのキリミンの缶を直接とりつけて回転動作で餌やりをしている。残念ながら複数の水槽への餌やりを自動化することは出来ない。

そこで以下の方法を使うことにした。

Pythonで書いたコードに従って複数のサーボモータの回転を制御する!RaspberryPiを使うので,上記Pythonコードをcronによって毎日一定時間に実行させる!Adafruit PCA9685 Servo driver(最大16chのサーボモータを制御できる)を使用して,複数のサーボモータを使ってエサが入ったチューブを回転させることで餌やりを行う。

!

Adafruit PCA9685 Servo driverは最大で62台連結して使用することができ、その場合は992台ものサーボモータを制御可能

材料材料

制御装置本体関係

Raspberry Pi zero WH 3900 Amazon

価格とコンパクトさからzero WHにしたが,Pi3B+でも勿論OK(左の価格は2020/3/26現在,amazonで32GBのRaspbianインストール済みMicroSDカード附属での価格)。無線LANが使えなくてもよければもっと初期のRaspberryPiでもかまわない。

USB(microB toA)変換アダプタ 387 Amazon

zero WHを使うときは最初の設定時に必要

HDMI変換アダプタ ミニHDMI 664 Amazon

zero WHを使うときは最初の設定時に必要

USB充電器zero WHの場合,100均や家電量販店でうっている携帯充電用ので充分

品名 購入価格 入手先 url メモ

1

2https://www.amazon.co.jp/gp/product/B07PHPK8CP/

3

https://www.amazon.co.jp/iBUFFALO-microB-変換アダプター-ブラック-BSMPC11C01BK/dp/B005WNBLN0/

4

5

Table1

2020/3/24火曜日

Page 3: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

2 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

AC充電器 1099 Amazon

Pi2やPi3を使うときはこちらのACアダプタが必要。5V,2.5~3Aで出力端子がUSB microB端子になっていること

駆動用サーボモータ

VKLSVAN 2個 PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー

1099Amazon (2020/3/26現在売り切れ)

Raspberry PiとI2C接続して使用するサーボモータドライバ。Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface - PCA9685 (https://www.adafruit.com/product/815 $14.95, Adafruit Industriesのジェネリック品。 他にも上記のジェネリック品は多数Amazon上に出ている。

Miuzei サーボモーター マイクロサーボ 9g 10個セット デジタル・サーボ (10個セット)

2199 AAmazon5V駆動するサーボモータなら何でも良い。

ジャンパーワイヤーケーブルセット (メスメス,メスオス,オスオス)

479

Raspberry Piとサーボモータドライバ間,サーボモータとドライバ間の延長用。10~20cmくらいの長さしかないので,サーボモータとドライバの距離を離して設置するためには,寧ろ自分でビニールコードをハンダ付けして延長した方がよい

エサ容器100均で売っている食品保存用円形ミニパックや15 or 50 mLチューブ,エッペンドルフチューブなど

水槽に給餌器をとりつけるための治具類 取り付ける水槽によって様々なものが考えられるので,各自で工夫が必要。以下に挙げるのは一例

L字ジョイント金具 一個200~500円

ホームセンターの金物コーナー

ジョイント金具19型L ステンレス鋼/鉄 (19A49-4/ステンレス https://jp.misumi-ec.com/vona2/detail/221005611682/?HissuCode=19A49-4%2Fステンレス

名東水園が作製しているメダカシステム水槽で,それぞれの棚に設置されている給水配管を固定するボルトにはめ込んで,サーボモータを置くためのレールを取り付けるために使用する。

エコアングルブラック 20x20 1,820mm

278円ホームセンターの棚工作用部品コーナー

PVC樹脂製のL字アングル。この上にサーボモータを載せることで,システム水槽の上や小型水槽の壁面にモータ台として渡した状態で使用する

両面テープ,ビニールテープ,など

サーボモータとL字アングルを接着するために使用する。接着力が弱いとアングルからモータが外れてしまう危険性があるが,あまり強固に接着してしまうと,餌の補充や取り付け位置の再調整時に困るので,ほどほどの接着力のものを使用するのが望ましい

6

https://www.amazon.co.jp/NorthPada-オムロン-Omron-アダプター-腕帯巻きつけタイプ/dp/B07D33HVZW/

7

8

9https://www.amazon.co.jp/gp/product/B07SLRG5J1/

10https://www.amazon.co.jp/gp/product/B07PHFQY6B/

11https://www.amazon.co.jp/gp/product/B07MR1SVVR/

12

13

14

15

16

17http://www.h-mol.co.jp/product/item.php?pid=1&mid=1

18

Page 4: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

3 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install python-smbus

sudo apt-get install i2c-tools

RaspberryPi ピン配置

作成手順作成手順以下のマニュアルを参考にした。Adafruit 16 Channel Servo Driver with Raspberry Pi

https://cdn-learn.adafruit.com/downloads/pdf/adafruit-16-channel-servo-driver-with-raspberry-pi.pdf?

timestamp=1585203544

全ての操作はSSHまたはVPN接続状態で実施した。RaspberryPiの初期設定からSSH,VPN設定まではネット上に様々な解説があるのでそちらを参照のこと。

Raspberry pi 自体の設定自体の設定Raspberry PiはNOOBSでRasbianをインストール後,

で最新状態にアップデートした

そのあと,「設定」→「RaspberryPiの設定」→「インターフェイス」でSSHとVNC,I2Cを有効にして再起動このあとは全てVNC経由で設定をすることとした

I2Cの設定の設定

ここまでを行ったところでAdafruit PCA9685 Servo driverを接続

配線配線

2020/3/25水曜日

Page 5: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

4 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

回路配線図.png

sudo i2cdetect -y 1

I2C検出結果

接続するのは

Pi 3V3 to breakout VCC!Pi GND to breakout GND!Pi SCL to breakout SCL!Pi SDA to breakout SDA!Pi 5V to breakout V+!Servo orange wire to breakout PWM on channel 0!Servo red wire to breakout V+ on channel 0!Servo brown wire to breakout Gnd on channel 0!

16チャネル全てにサーボモータを接続するときは,上の図のように別系統のACアダプタからV+(5V)を入力すること(そうしないとRaspberryPiの出力電流が不足するのと,モータからのノイズが悪影響を及ぼす可能性大)(本来ならばV+はRaspberryPiからはとらないほうがよい。”ジェネリック品”のサーボモータdriverを買ったら,外部V+を入力する回路の途中にトランジスタがついておらず外部V+を入れられなかった)

接続確認接続確認

その結果以下のように出ればOK。一番左の列に40とか70の数字がない場合はどこか配線ミスをしているので確認する。

Page 6: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

5 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

sudo pip3 install adafruit-circuitpython-servokit

from adafruit_servokit import ServoKit

kit = ServoKit(channels=16)

kit.servo[0].angle = 180

kit.servo[0].set_pulse_width_range(1000, 2000)

#AquariumAutoFeeder

#By Hideki Abe, Lab. of Fish Biology, Grad. School of Bioagricultural Sci., Nagoya Univ.

#

# This program is free software: you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation, either version 3 of the License, or

# (at your option) any later version.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program. If not, see <http://www.gnu.org/licenses/>.

#

# 改変履歴# v0.1 2020/3/26 Prototype release

# とりあえず作製したコード。サーボモータ5台を使用した動作テストバージョン

この表示は,I2C デバイスが0x40, 0x70のアドレスをRaspberryPiにおいて使用していることを示す(I2Cデバイスは出荷時に

0x03 - 0x77 の範囲でアドレスが割り当てられている)。このことはサーボモータドライバを複数台接続するときに意味が出てくる。

Python installation of ServoKit library以下のコマンドを実行

このライブラリはpython3用(Python2用は別の方法を使わないといけない。以下のurlを参照のこと。https://learn.adafruit.com/16-channel-pwm-servo-driver/python-circuitpython)

ServoKit Libraryを利用したサーボモータの制御方法を利用したサーボモータの制御方法作製するPython3コードの先頭でまず以下を宣言する必要がある

通常のサーボモータを制御するためにはこの下に以下の文を書けば良い

角度は0~180度の間で指定できる。

サーボモータの個体差を補正するためには以下の文をkit.servo[].angle文の前で実行し,actuation rangeを指定しておく。

以上の命令文を用いて作製した最初のプログラム(AutoFeeder.py)

Page 7: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

6 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

# v0.11 2020/3/26 コメント文の記述間違いを訂正

# 使用するライブラリの読込from adafruit_servokit import ServoKit

import time

#初期条件設定kit=ServoKit(channels=16) # 最大利用可能なサーボモータ制御チャネル数を宣言

svo=5 #接続するサーボモータの台数rept=4 #首振り動作の繰り返し回数ptime=0.25 #首振り時の停止時間iangle=70 #首振り動作の開始角度langle=110 #首振り動作の停止角度

#サーボモータ毎の個体差設定#最初に以下の文でactuation rangeを指定する#サーボモータはゼロから数え始める#購入したサーボモータ毎に調整が必要

kit.servo[0].set_pulse_width_range(580,2200)

kit.servo[1].set_pulse_width_range(635,2350)

kit.servo[2].set_pulse_width_range(660,2300)

kit.servo[3].set_pulse_width_range(520,2200)

kit.servo[4].set_pulse_width_range(550,2600)

#メインルーチン#初期条件設定で記述した条件に基づいてサーボモータの首振り動作を繰り返す

i=0 #繰り返し回数を指定するための内部変数s=0 #サーボモータ番号を扱うための内部変数

for i in range(0,rept):

for s in range(0,svo):

kit.servo[s].angle=iangle

time.sleep(ptime)

for s in range(0,svo):

kit.servo[s].angle=langle

time.sleep(ptime)

#初期状態への回復動作for s in range(0,svo):

kit.servo[s].angle=0

Page 8: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

7 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

crontab -e

分 時 日 月 曜日 [実行コマンド] 

0 3 * * * /sbin/shutdown -r now

0 9,12,15,18,21 * * * python3 /home/pi/AutoFeeder.py

サーボモータ(SG90)側面

給餌プログラムの自動実行設定給餌プログラムの自動実行設定以下のコマンドを使って,cronで実行するタスクのスケジュールを設定する。

文法は

の順番に記載する

例えば

で毎日3時にshutdownコマンドが実行されて再起動される

リスト形式でも記載可能で,

だと毎日9,12,15,18,21時にAutoFeeder.pyが実行される。これらの設定を行った。

サーボモータの水槽へのとりつけ稚魚用の小型水槽壁面に引っかける形で取り付けるプロトタイプを試作した。そのためにホームセンターで購入してきたプラスチック製のL型アングルを適当な長さに切断し,そこに両面テープとビニールテープを使ってサーボモータを貼り付けた。

今回,プロトタイプの作製に使用したサーボモータはSG90と呼ばれる,ロボット工作などの入門用に使用される最も安価なサーボモータで流通量も多い。

Page 9: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

8 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

サーボモータ(SG90)回転軸

サーボモータはドライバからのパルス信号を受け取ると,回転軸の写真で見たときに反時計回り方向で回転運動をする。そこで上の写真の状態(0度)の時には餌容器が横向きになるようにサーボモータに取り付けておき,制御信号によって回転させ,70~110の範囲で数回首振り動作を行う事で,「調味料容器から胡椒や塩を振るように」,水槽内にエサを散布することをもくろんだ。

給餌用の餌容器には,以下の三種類を使用することとした。

100均ショップで購入した円形食品容器(ポリプロピレン製:直径53mm)の側面にドリル(直径1mm)で穴をあけたもの

!

15mLファルコンチューブの底を切断し,パラフィルム張って,ピンセットの先でいくつか穴をあけたもの!1.5mLエッペンドルフチューブの底にドリルで3,4個,直径1mmの穴を開けたもの!

円形食品容器では容器底面にドリルで穴を開け,そこにサーボモータの軸に附属していたネジを用いて固定した。15mLチューブやエッペンドルフチューブの場合は,サーボモータ附属の十字型の回転軸パーツにビニールテープを使って貼り付けた。

Page 10: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

9 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

プラスチック容器

15mLチューブ

Page 11: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

10 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

エッペンドルフチューブ

これまでのところ,上記のPythonコードならびに餌容器3種類ともに良好に半日間動作している。

気付いた点容器に開ける穴の大きさと首振り回数の調整によって給餌量を調節する!容器の回転スピードはゆっくり動かすよりも0.25秒くらいの動作インターバルで70-110度に急に動かすことを繰り返す方が,容器内部で粉末飼料が揺れて,外に出やすい

!

現在,追加発注したServo Motor Driverを待っている状態で,その到着次第,メダカシステム水槽(1棚あたり8水槽x4段の32

水槽)にこれらのモータを取り付ける予定(2020/3/26)

システム水槽へのサーボモータ取付準備システム水槽へのサーボモータ取付準備当研究室では名東水園が製作したメダカ用システム水槽を運用している(下写真)

Page 12: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

11 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

メダカ用システム水槽

このシステム水槽では,各棚に設置されている小型のプラスチック水槽にリザーバーから水を給水するための配管が棚の上面に伸びている。この配管を金属枠と固定しているボルト部分に,L字金具を挿入することで,給水配管と水槽の間にサーボモータの足場となるL字アングルを設置する構造を作り出した。

Page 13: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

12 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

配管の固定金具を外したところ。L字金具のボルト穴をこのボルト穴と同じ口径のものになるように選ぶ

L金具を取り付けたところ。この金具を足場にして,プラスチック製L字アングルを給水配管と水槽の間に設置する

Page 14: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

13 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

L字アングルを設置したところ。

L字金具とアングルの間はボルト止めなど,あまり強固に接着しない方がよいかもしれない(水槽の入れ替え作業や棚掃除など,サーボモータがぬれるのを防ぐために取り外す機会が多いので)

同様にL字アングルとサーボモータ間もビニールテープで貼り付けるだけにとどめる(異なるサイズの水槽を設置した場合,給餌機と水槽の位置がずれる可能性があるため)

ここまでやったことをpdf化して,研究グループHPにて公開。またFacebookでも公開アナウンスを出した。

複数の複数のAdafruit PCA9685 Servo driverを一台のを一台のRaspberry Piで制御する方法で制御する方法

まだAdafruit PCA9685 Servo driverの追加発注分が届いていないが,先行してDriverを複数台直列に繋いで使用する方法を調べておくことにする。

Web上の説明文(https://learn.adafruit.com/16-channel-pwm-servo-driver/chaining-drivers)によれば,このDriverは理論上は62台まで連結することで,922チャネル(16x62)のサーボモータまで制御することが出来る。

2020/3/26木曜日

Page 15: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

14 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

image.png

image.png

このとき,最初のDriverボードに外部ACアダプタからV+を繋ぐと共に,次のDriverボードには6ピン全てを繋いで電源供給を行う。

この際に直列接続した複数のDriverボードを識別するためのアドレス設定が問題となってくるが,それにはボード右上にある端子間をハンダ付けで短絡させることで行うと書かれている。

記述を引用すると以下,

Page 16: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

15 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

Addressing the Boards

Each board in the chain must be assigned a unique address. This is done with the address jumpers on the

upper right edge of the board. The I2C base address for each board is 0x40. The binary address that

you program with the address jumpers is added to the base I2C address.

To program the address offset, use a drop of solder to bridge the corresponding address jumper for each

binary '1' in the address.

Board 0: Address = 0x40 Offset = binary 00000 (no jumpers required)

Board 1: Address = 0x41 Offset = binary 00001 (bridge A0 as in the photo above)

Board 2: Address = 0x42 Offset = binary 00010 (bridge A1)

Board 3: Address = 0x43 Offset = binary 00011 (bridge A0 & A1)

Board 4: Address = 0x44 Offset = binary 00100 (bridge A2)

etc.

#AquariumAutoFeeder for 32ch Servo Motor

#By Hideki Abe, Lab. of Fish Biology, Grad. School of Bioagricultural Sci., Nagoya Univ.

このようにハードウェア側の設定方法は書かれているのだが,Pythonのコードではどのように記述設定すれば良いのか,当該ページには書かれていない(Arduinoのスケッチサンプルはあった)。

そこでネット上で調べていると,adafruit_servokitのAPI referenceページを発見した。https://circuitpython.readthedocs.io/projects/servokit/en/latest/api.html

そこの記述に寄れば,

class adafruit_servokit.ServoKit (*, channels, i2c=None, address=64, reference_clock_speed=25000000)

Class representing an Adafruit PWM/Servo FeatherWing, Shield or Pi HAT and Bonnet kits.

Automatically uses the I2C bus on a Feather, Metro or Raspberry Pi.

Initialise the PCA9685 chip at address .

The internal reference clock is 25MHz but may vary slightly with environmental conditions and manufacturing variances.

Providing a more precise reference_clock_speed can improve the accuracy of the frequency and duty_cycle

computations. See the calibration.py example in the PCA9685 GitHub repo for how to derive this value by measuring

the resulting pulse widths.

Parameters

channels (int) – The number of servo channels available. Must be 8 or 16. The FeatherWing has 8 channels. The

Shield, HAT, and Bonnet have 16 channels.

!

address (int) – The I2C address of the PCA9685. Default address is 0x40 .!reference_clock_speed (int) – The frequency of the internal reference clock in Hertz. Default reference clock speed

is 25000000 .

!

とある。そこで以下のコードを書いた(AutoFeeder32ch.py)

Page 17: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

16 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

#

# This program is free software: you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation, either version 3 of the License, or

# (at your option) any later version.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program. If not, see <http://www.gnu.org/licenses/>.

#

# 改変履歴# v0.1 2020/3/26 Prototype release

# とりあえず作製したコード。サーボモータ5台を使用した動作テストバージョン#

# v0.2 2020/3/27

# 粉餌が底面で固まってしまうのを防止するために、給餌開始時に大きく首振り動作を行うようにした#

# v0.3 2020/3/27

# v0.2で取り入れた動作はやめ,iangle,langleを大きく変えるように変更。#  またpulse_width_rangeも20程度狭くした#

# v0.4 2020/3/28

# システム水槽設置用に32チャンネルのServo motorを同時制御できるようにした

# 使用するライブラリの読込from adafruit_servokit import ServoKit

import time

#接続しているServo Driverのチャネル数,I2Cアドレスの指定kit1=ServoKit(channels=16,address=0x40) # 1台目のServo Driverのチャネル数とI2Cアドレスの指定kit2=ServoKit(channels=16,address=0x41) # 2台目のServo Driverのチャネル数とI2Cアドレスの指定

#首振り条件設定svo=16 #接続するサーボモータの台数rept=5 #首振り動作の繰り返し回数ptime=0.25 #首振り時の停止時間iangle=130 #首振り動作の開始角度langle=160 #首振り動作の停止角度

#メインルーチン

Page 18: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

17 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

i=0 #繰り返し回数を指定するための内部変数s=0 #サーボモータ番号を扱うための内部変数

for s in range(0,svo):

kit1.servo[s].set_pulse_width_range(600,300) #サーボモータの駆動範囲設定 kit2.servo[s].set_pulse_width_range(600,3000)

kit1.servo[s].angle=170

kit3.servo[s].angle=170

time.sleep(0.25)

kit1.servo[s].angle=0

kit2.servo[s].angle=0

for i in range(0,rept):

for s in range(0,svo):

kit1.servo[s].angle=iangle

kit2.servo[s].angle=iangle

time.sleep(ptime)

for s in range(0,svo):

kit1.servo[s].angle=langle

kit2.servo[s].angle=langle

time.sleep(ptime)

#初期状態への回復動作for s in range(0,svo):

kit1.servo[s].angle=0

kit2.servo[s].angle=0

餌入れ容器と同容器による給餌量の検討餌入れ容器と同容器による給餌量の検討

以下の二種類の容器について,安定した給餌に必要な条件を検討。

エッペンドルフチューブ(1.5mL)!クライオチューブ(nunc CryoTube Vials 115420)!

2020/3/27金曜日

Page 19: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

18 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

IMG_4219.jpg

IMG_4221.jpg

エッペンドルフチューブの底面にダイアモンドやすりをつかって直径約2mmの穴をあけ,稚魚用餌(おとひめB2 粒径~0.36mm)を薬さじをつかって一杯まで(おしこまずに)入れた。その場合,逆さにするとエッペンドルフチューブの底(穴を開けたところ)に5mm程度空間ができる。

クライオチューブについては,底面に直径2.5mmの穴をあけ,成魚用顆粒餌(GEX メダカ元気メダカ元気 産卵・育成用フードまた産卵・育成用フードまたは クハラ お腹まんぷく!めだか(沈下性))を押し込まずにチューブ一杯までつめた。は クハラ お腹まんぷく!めだか(沈下性))を押し込まずにチューブ一杯までつめた。

Pythonコードに以下の変更を加えた。餌が容器内で張りついた状態になるのをほぐすために,給餌開始時に容器を一度180度逆転させてから戻す操作を加えた!その後,150~180度の範囲で0.25秒間隔で4回,首振り動作をさせるようにした!

エッペンドルフチューブに入れた稚魚用餌についてはこの条件で充分に餌がでるので,充填した餌が何回給餌動作をおこなうと中味がなくなるのかしらべることにした。

Page 20: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

19 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

#AquariumAutoFeeder

#By Hideki Abe, Lab. of Fish Biology, Grad. School of Bioagricultural Sci., Nagoya Univ.

#

# v0.1 2020/3/26 Prototype release

# とりあえず作製したコード。サーボモータ5台を使用した動作テストバージョン#

# v0.2 2020/3/27

# 粉餌が底面で固まってしまうのを防止するために、給餌開始時に大きく首振り動作を行うようにした# v0.3 2020/3/27

# v0.2で取り入れた動作はやめ,iangle,langleを大きく変えるように変更。#  またpulse_width_rangeも20程度狭くした

まず

rept=4 #首振り動作の繰り返し回数ptime=0.25 #首振り時の停止時間iangle=150 #首振り動作の開始角度langle=180 #首振り動作の停止角度

の条件で餌やりを繰り返したところ,約90回の命令実行でエッペンドルフチューブ内が空になった。また途中でモーターのギアがかみそうになることがあった。

そこで以下のように条件を変更してみる

rept=3 #首振り動作の繰り返し回数ptime=0.25 #首振り時の停止時間iangle=140 #首振り動作の開始角度langle=170 #首振り動作の停止角度

この結果,121回給餌動作をしたところで中の餌がなくなった(ただし,その間に5回,ギアが噛んで停止してしまった)

サーボのactuation range指定を外して同じ事をためしてみると100回以上給餌動作を行ってもギアが噛むことはなかった。そこでactuation rangeの設定を最小最大ともに20ずつ範囲を狭めることで動作範囲を狭くして,ギアが噛まないようにした。

今度は一度にでる量が減ってしまったので,

rept=4 #首振り動作の繰り返し回数ptime=0.25 #首振り時の停止時間iangle=130 #首振り動作の開始角度langle=180 #首振り動作の停止角度

にしてみる。これでもまだ先端が詰まってしまいやすかったので,

!餌が容器内で張りついた状態になるのをほぐすために,給餌開始時に容器を一度180度逆転させてから戻す操作は外した!iangle=20, langle=180にした

この結果,120回の給餌動作でエッペンドルフチューブ中の稚魚餌が空になった(3週間以上もつ)ここまでの変更を加えたファイルをAutoFeeder2b.pyと命名

Page 21: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

20 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

# 使用するライブラリの読込from adafruit_servokit import ServoKit

import time

#初期条件設定kit=ServoKit(channels=16) # 最大利用可能なサーボモータ制御チャネル数を宣言

svo=5 #接続するサーボモータの台数rept=4 #首振り動作の繰り返し回数ptime=0.25 #首振り時の停止時間iangle=20 #首振り動作の開始角度langle=180 #首振り動作の停止角度

#サーボモータ毎の個体差設定#最初に以下の文でactuation rangeを指定する#サーボモータはゼロから数え始める#購入したサーボモータ毎に調整が必要

kit.servo[0].set_pulse_width_range(600,2000)

kit.servo[1].set_pulse_width_range(655,2150)

kit.servo[2].set_pulse_width_range(680,2100)

kit.servo[3].set_pulse_width_range(540,2000)

kit.servo[4].set_pulse_width_range(570,2300)

#メインルーチン

i=0 #繰り返し回数を指定するための内部変数s=0 #サーボモータ番号を扱うための内部変数

for i in range(0,rept):

for s in range(0,svo):

kit.servo[s].angle=iangle

time.sleep(ptime)

for s in range(0,svo):

kit.servo[s].angle=langle

time.sleep(ptime)

#初期状態への回復動作for s in range(0,svo):

kit.servo[s].angle=0

Page 22: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

21 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

IMG_4226.jpg

次に成魚用餌をつめたクライオチューブをとりつけてテストしたが,成魚用餌に関してはクライオチューブでは3週間分,1日5

回給餌するには容器の容量が少なかった。

週末の間に行ったことをまとめ書きする。

金曜日までに書いたプログラムとServo MOtor Driverの連結で32チャネル繋いで動くかどうか試した。1.

餌容器の改良2.

その結果,(当たり前だが)ラズベリーパイとは別にACアダプターからサーボモータ駆動用電源をとらないとどう自動さは厳しい(それぞれのドライバにつき1台ずつ動かすには別電源成しでも動作する)

餌容器については15mLチューブの底から5mLのところで切り,切断面をやすりがけした上で,側面をサーボモータの回転軸に二カ所でネジ止めした(下記写真参照)。

2020/3/30月曜日

Page 23: 自動魚給餌装置の作製 · Benchling - WordPress.com...Servo orange wire to breakout PWM on channel 0! Servo red wire to breakout V+ on channel 0! Servo brown wire to breakout

2020/03/30 13'12自動魚給餌装置の作製 · Benchling

22 / 22 ページhttps://benchling.com/hidekiabe/f/lib_0YPLmAek--/etr_9ie8sCzL--/view?versionId=258482480&note=true&protocols=#print

IMG_4232.jpg

IMG_4231.jpg

そしてチューブの底をはんだごてを押し当てて直径2mm程度の穴をあけた。これでテストしたところ設計目標の1日5回の給餌で3週間餌がつきない状態をつくりだすことができた。