Raspberry Pi で 金魚水槽管理システム を構築
HomeMadeGarbage Advent Calendar 2020 |4日目
Raspberry Pi Advent Calendar 2020 |4日目
これまでESP32等で構成していた我が家の金魚水槽システムですが、
この度メンテナンスのし易さや拡張性の高さから制御をRaspberry Pi で実施することにいたしました。
☟従来型の構成は以下の通りです。
家のローカルネットワーク内で水槽の監視・管理を実施しておりました
外出時にも対応したいと考え、外部監視・制御にはセキュリティの観点からATOM CamやAlexaアプリの既存のサービスの使用を採用いたしました。
目次
システム概要
本システムの機能は以下の通りです。
- 水槽LED照明のON/OFF
- 自動エサあげ機構
- 水槽の水温、pHの監視
いずれも自宅内でWebページからの制御・監視が可能で
さらにAlexaアプリと連動させてスマートスピーカ Amazon Echo dot での音声による制御も可能です。
水温、pHについては以前製作した我が家のコンシェルジュのおしゃべりティラノくんに発話で報告させることができます。
外出先からのエサあげ等の制御にはAlexaアプリを用いてスマホで実施し、
遠隔監視にはネットワークカメラ ATOM Cam を使用いたします。
構成
以下が本システムの構成図です。
Raspberry Pi Zero W のGPIO端子に照明用のテープLED、温度センサ、エサあげ用ソレノイドを接続し、
pHセンサをマイコンを介してUSB Host端子に接続しています。
部品
- Raspberry Pi Zero W
- フルカラーLED Neopixel (WS2812B ) 48セル
- 防水温度センサ DS18B20
- pHセンサ PH-4502C
- Arduino Pro Micro 互換ボード
- ソレノイド
- N-MOSFET IRF520PBF
- ダイオード 1N5819
- MOSFET駆動用レベルシフタ
各部品の動作確認
本システムはNode-REDで構築しております。
ここでは各接続部品のNode-REDによる動作確認を行います。
Neopixel制御
NeoPixel用のNode-REDノードは存在し以下を参考に導入致しました。
https://www.npmjs.com/package/node-red-node-pi-neopixel
NeoPixelの信号線をラズパイの12ピン(GPIO 18)し、
以下のようにrpi-neopixelsノードにカラーコードを送るとLEDが点灯いたします。
自動エサあげ機構
エサあげの機構には タカハ製の5Vプッシュソレノイド SSBC-0830/SSBC-0830-01(7.5Ω) を使用いたしました。
筐体は3Dプリンタで製作いたしました。
構成は以下の通り
Node-REDでラズパイのGPIOピンを制御して
ソレノイドに5V印可してエサが押し出される仕組みにしました。
5V ソレノイドでエサやり装置https://t.co/65Xju9ywyF pic.twitter.com/W4qhNWQBO0
— HomeMadeGarbage (@H0meMadeGarbage) July 13, 2020
水温計
水温系として1 wire温度センサ DS18B20を使用いたしました。
DS18B20のNode-REDノードも存在し、以下を参考に導入致しました。
https://www.denshi.club/pc/raspi/iot6.html
DS18B20の出力をラズパイの7ピン(GPIO 4)に接続します。
pH計
pH計にはアナログ出力の PH-4502C を使用しました。
センサの校正方法など詳細は以下を参照ください。
ラズパイにはアナログ値の入力ピンがないためArduino互換マイコンのアナログピンにpHセンサ出力を接続し、シリアルでpH値を出力します。
ラズパイのUSB Hostコネクタにマイコンを接続してシリアルでpH値を受信します。
シリアル通信Node-REDノードは以下を使用しました。
https://flows.nodered.org/node/node-red-node-serialport
マイコンArduinoコード
シリアルで文字”1″が入力されるとpHをシリアル出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
byte input; const int analogInPin = A3; int sensorValue = 0; unsigned long int avgValue; float b; int buf[10],temp; void setup() { Serial.begin(115200); } void loop() { input = Serial.read(); if (input == '1') { for(int i=0;i<10;i++) { buf[i]=analogRead(analogInPin); delay(10); } for(int i=0;i<9;i++){ for(int j=i+1;j<10;j++){ if(buf[i]>buf[j]){ temp=buf[i]; buf[i]=buf[j]; buf[j]=temp; } } } avgValue=0; for(int i=2;i<8;i++) avgValue+=buf[i]; float pHVol=(float)avgValue*5.0/1024/6; float phValue = -6.1507 * pHVol + 22.511; Serial.println(phValue); } } |
Node-red自動起動設定
以下のコマンドの実行でラズパイ起動で自動的にNode-REDも起動します。
1 |
$ sudo systemctl enable nodered.service |
水槽システム Node-REDフロー
水槽LED制御
水槽の照明としてLEDテープを48セル設置し、WebページやAlexaによる音声でON/OFF 制御します。
① LED ON functionノード
次段に全白のLEDカラーコード(#FFFFFF)を送信します。
② LED OFF functionノード
次段にLED消灯カラーコード(#000000)を送信します。
③rpi-neopixelsノード
前段からの色信号(ON:#FFFFFF / OFF:#000000)を受けてLEDを制御します。
輝度は30%としています。
エサあげソレノイド制御
WebページやAlexaによる音声でラズパイのGPIO23をON/OFFしソレノイドを 制御します。
① ソレノイド ON functionノード
次段に数値1を送ります。
② LED OFF functionノード
ON function後200msecの遅延後に次段に数値0を送ります。
③ rpi-gpio outノード
前段からの信号を受けてソレノイドを制御します。200msecの間だけ数値1がきてGPIO23がONになりソレノイドに電流が供給されエサが押し出されます。
ラズパイのGPIO制御ノードでGPIO23を制御します。
水温・pH測定
Alexaによる音声で起動しおしゃべりティラノくんに発話で水温とpHを報告させます。
① rpi-ds18b20ノード
rpi-ds18b20ノード で水温を取得します。
② functionノード
前段からの水温を小数点第1位で丸めて変数waterに格納し、
次段に”1″の文字を送信。
③ serial requestノード
前段の文字”1″を受けてpHセンサ値を次段に返します。
④ functionノード
前段からのpH値を変数phに格納
⑤ templateノード
水温とpHの測定値を受けて、発話内容を生成します。
⑥ google-ttsノード
Google Text to Speech APIを呼び出すgoogle-ttsノードを使用しました。
https://flows.nodered.org/node/node-red-contrib-google-tts
前段からの発話内容を入力して発話のmp3 URLを返します。
言語は日本語(ja-JP)を指定しています。
⑦ udp outノード
前段で生成されたmp3 URLをUDPで おしゃべりティラノくんに送信して発話させます。
Webページ生成
“ラズパイのNode-REDのURL/aquarium”にアクセスでWebページを生成します。
ブラウザ表示前に水温とpHを計ってtemplateノードに渡しています。
templateノードにWeb表示用コードを記述しています。
以下がWebページ画面です。
“ごはんをあげる”ボタンで/feedにGETリクエストを投げてソレノイド制御します。
LEDのON/OFFスイッチで/on または /offのGETリクエストを投げてLEDを制御します。
水温とpHの数値を表示します。
Alexa連動
Node-RED Alexa Home Skill Bridge というNode-REDノードを用いてAlexaと連動させ、システムの音声による制御を可能にしました。
Node-RED Alexa Home Skill Bridgeの設定等の詳細は以下を参照ください。
Node-RED Alexa Home Skill Bridge へのユーザ登録や、
スマホのAlexaアプリでNode-REDスキルを有効にしてAlexaサービスとNode-RED Alexa Home Skill Bridgeを紐づける必要があります。
デバイス登録
水質の発話報告を起動する”Aquarium”とエサやりソレノイドを起動する”Feed”と
LEDを起動する”水槽”を登録しました。
“水槽”はON/OFF動作させるのでActionにONとOFFを選択しました。
Node-RED
Node-REDに登録したデバイスのノードを配置します。
定型アクションを編集
以上で登録したデバイスをスマートスピーカAmazon Echoから起動させることが可能になりました。
デバイス”水槽”はLEDのON/OFFを制御するので「水槽つけて」、「水槽消して」で問題ないですが、
“Aquarium”と”Feed”はON/OFFの発話だと不自然なので
Alexaスマホアプリで定型アクションを登録しました。
「アレクサ、ご飯あげて」でデバイス”Feed”を起動してソレノイドを制御します。
「アレクサ、水質教えて」でデバイス”Aquarium”を起動してティラノくんに水温とpHを報告してもらいます。
動作
水槽設置前の動作テスト
金魚水槽システム構築
ラズパイとNode-REDでサクサク進行中#ラズパイ #金魚 #NodeRed pic.twitter.com/nulFYHl8tr
— HomeMadeGarbage (@H0meMadeGarbage) July 10, 2020
ユニットはタッパに入れて水槽裏に設置いたしました。
Webページによる動作
金魚水槽システム
Webブラウザから制御 pic.twitter.com/nems1ndJsQ— HomeMadeGarbage (@H0meMadeGarbage) July 13, 2020
音声による動作
我が家の金魚水槽
音声で制御できます。#Alexa #ATOMcam #ラズパイ pic.twitter.com/a7j4a84Kzw— HomeMadeGarbage (@H0meMadeGarbage) July 10, 2020
遠隔動作
旅行先でもご飯の供給ができました!
出先でも金魚ちゃんのご飯はきちんと供給できました。#ATOMcam #Alexa pic.twitter.com/cOQmMlJe8Z
— HomeMadeGarbage (@H0meMadeGarbage) July 26, 2020
追記
みんなのラズパイコンテスト
本システムで今年もみんなのラズパイコンテストに応募いたしました。
受賞はできましたが3年連続となるスタートダッシュ賞をいただくことができました♪
今年は受賞できませんでしたが
3年連続 スタートダッシュ賞をいただくことができました。
2020/7/14にだしたからねw#ラズパイ #ラズパイコンテスト #みんなのラズパイコンテスト https://t.co/bhHM5GYzLP pic.twitter.com/F7zS7ACvuZ— HomeMadeGarbage (@H0meMadeGarbage) December 11, 2020
DS18B20ノードを使用の際はラズパイの設定で1-Wireを有効にすること
NeopixelノードはUnicorn HAT driverもインストールすること
https://www.npmjs.com/package/node-red-node-pi-neopixel