RaspberryPiで自動水やりシステムの構築ー農家のiot入門(11)
RaspberryPiとPythonを使っての、水やりについて検討中です。
水道へ取り付ける「散水タイマー」という商品を使えば、単純に決まった時間・間隔での水やりは簡単に可能です。
でも、もっと細かく制御したり、他の制御とも関連させていきたいと思っているので、RaspberryPiを使ってのチャレンジをしてみます。
ただ、いきなり高度な事は出来ませんので、今回の目標は以下とします。
- 電磁弁を使って、水のON-OFFを制御する
- ラズパイの3.3Vでは電磁弁の開閉が出来ないので、100V電源も活用する
- 一定間隔で、一定時間水を流す(○時間置きに○分とか)
- 動いているかどうか、遠隔でもわかるようにする
RaspberryPiでの自動水やりシステム構想
まず、システム全体像を考えます。
PythonでDC3.3VのON-OFFを制御し、そのON-OFFを受けて電磁弁が開閉して、水道水がノズルからシャワーで出てくる・・といった感じです。
ただ、問題は3.3Vで開閉する電磁弁が無い。
5Vあたりだと怪しい物なら見つかったので、RaspberryPiの5V出力ピンを使う手もありますが、信頼性を上げるために電磁弁の開閉はAC100Vを使う事にします。
そこで、3.3VのON-OFFを検知して100VのON-OFFに切り替えてくれる部品を使う事にしました。
ソリッドステートリレー(SSR)という部品で、入力側の電圧が入ると内部で光り、その明るさを検知して出力側の電気が通電する・・・という面白い部品。
これで違う電圧の橋渡しをして、100Vの電磁弁を開閉する事にしました。
回路を組む
まず、ソリッドステート・リレーを準備します。
完成品でも売っていますが、秋月電子の自分で組み立てるキットが1個250円と安いので、それを何個か購入しました。(失敗したり壊れた時の予備含め)
秋月電子:ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ
組み立てキットだと、部品を基盤にハンダ付けしていく必要があります。
左側が入力側で、RaspberryPiのGPIOピンに繋がっています。
今回は、オレンジ線をGPIO14に繋ぎ、Pythonのプログラムで電圧の出力をON-OFFします。
黒線はGNDに繋がっています。
右側のが出力側で、100V側ですね。
電磁弁を選ぶ
100V側は、電磁弁を介してコンセントに繋げます。
なお電磁弁というのは、電気の力でバルブを開閉する部品です。
(ソレノイドバルブとも呼ばれています。)
中に電磁石が組み込まれており、電圧の入力で開閉しますが、組み込むシステムに合わせて様々な電圧の電磁弁がラインナップされています。
DC12V・DC24V・AC100V・AC200Vあたりが一般的ですね。
感電の危険を考慮して安全に使うならDC12VやDC24Vが良いですが、家庭で使いやすいのはAC100Vなので、今回はAC100Vを選んでいます。
あと、電磁弁を選ぶ際に気をつけるのは、動作形式。
直動式・パイロット式・パイロットキック式とあり、電気の力だけで開閉するのが直動式で、他は通す流体(水や空気)の圧力も借りて開閉しています。
家庭用水道を使う程度なら、直動式を選んでおけば間違いないです。
もっと流量が多い場合は、パイロットかパイロットキック式が当てはまります。
CKDというメーカーのサイトが非常にわかりやすく説明してくれているので、迷ったら見ると良いでしょう。
私が今回選んだのは、上の写真のSMC製。
型番は「VDW22JBZ」
AC100V・直動式で、外形6φのチューブが直接接続出来るので、私の使い方にはピッタリなのです。
回路とチューブを組み立てる
電磁弁を回路に組み込みRaspberryPi側と接続して、水道用のチューブを組み立てた状態がこちら。
チューブとワンタッチ継手を使う事で、水の配管が簡単に出来ます。
太いほど多くの水を流せますが、今回の用途はミストなので外径6mm×内径4mmのポリウレタンチューブで充分です。
ちょっとゴチャゴチャしていますが、簡単な図にするとこんな感じ。
電磁弁で開閉するのですが、いざ手動で使いたい時もあるので、バイパス用のラインも作っておきます。
それと、水量を調製する為の手動弁もつけておきました。
自動水やりのプログラムをPythonで組む
最後に、RaspberryPiでPythonのプログラムを組みます。
と言っても、今回のは非常に簡単。
GPIOの指定ピンをON-OFFするだけです。
- import RPi.GPIO as GPIO
- from time import sleep
- GPIO.setmode(GPIO.BCM)
- GPIO.setup(14,GPIO.OUT)
- try:
- while True:
- GPIO.output(14,GPIO.HIGH)
- sleep(180)
- GPIO.output(14,GPIO.LOW)
- sleep(21600)
- except KeyboardInterrupt:
- pass
- GPIO.cleanup()
4行目:GPIO14を出力に設定。
7行目:GPIO14に3.3V出力命令(電磁弁が開く)
8行目:180秒そのままの状態とする
9行目:GPIO14の出力を停止(電磁弁が閉まる)
10行目:21600秒(6時間)そのままの状態とする
180秒(3分)水が出て、6時間停止。これを、停止命令があるまで繰り返します。
でもこれだと、ずっと繰り返しているだけなのと、実際いつ動いていたのかがわからないので、もう少し機能を増やします。
- import RPi.GPIO as GPIO
- import datetime
- from time import sleep
- GPIO.setmode(GPIO.BCM)
- GPIO.setup(14,GPIO.OUT)
- def main():
- for i in range(100):
- now = datetime.datetime.now()
- print(now)
- print(i)
- GPIO.output(14,GPIO.HIGH)
- sleep(180)
- GPIO.output(14,GPIO.LOW)
- sleep(21600)
- try:
- main()
- except:
- pass
- GPIO.cleanup()
7行目:繰り返しを100回
8行目:今の時間を取得
9行目:今の時間を表示
10行目:繰り返し回数を表示
これで、実際に動いていたかどうかがわかります。
遠隔地からのリモート接続も組み合わせれば、遠くにいても水やりが出来ているかどうかの確認もできちゃいます。
RaspberryPiを異なるネットワークからリモート接続する(AnyDesk編)
とりあえずこれで、一定間隔で一定時間水を出すシステムは出来ました。
ひとまず今回はここまで。 ここからの発展は今後また色々考えていきます(^^)