ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

Arduino+ラズパイ3で金魚の自動餌やり機をリモート操作できるようにした

こんにちは、koheiです。

以前、Arduinoを使って金魚の自動餌やり機を作成しましたが、今回は、ラズパイ3を組み合わせて、スマホ(Android)からリモートで操作できるようにしました。
Aruduino単体では、Wifiモジュールがついていないため、無線通信ができません。ラズパイ3はWifiがついているので、無線通信できます。多分ラズパイだけでも金魚の餌やり機が作れると思いますが、せっかくArduinoで餌やり機を作っていたので、今回はラズパイ+Arduinoでリモート操作を実現してみました。

備忘録としてまとめておきます。

スポンサーリンク

用意したもの

以前の金魚餌やり機から追加したものは、ラズパイ3B+、Android端末です。

・ラズパイ3B+
・Androidスマホ

前回の金魚餌やり機の記事は、以下を参考にしてください。

はじめての電子工作 Arduinoで金魚の自動餌やり機を自作してみた

回路図

回路図は前回の金魚餌やり機の回路にUSBケーブルでArduinoとラズパイをつなぐだけです。(Arduino側の回路図は前回の記事を参照ください)

動作仕様

スマホで、ONボタンを押すと、サーボモーターが動き、OFFを押すとサーボモートが止まるシンプルな仕様です。

システム構成

さて、スマホ(Android端末)からのリモート操作でどうやってサーボを動かすのか?
ざっくり図に書くと以下になります。
・スマホとラズパイ間の通信は、「MQTT」というプロトコルを使っています。
・ラズパイとArduino間はシリアル通信でやり取りします。

1.Arduinoとラズパイ間のシリアル通信を構築

まずは、Arduinoとラズパイ間のシリアル通信を実装していきます。
シリアル通信の仕様は、シンプルに[on]or[off]を通知してモーターを動かす、止めるという仕様にしました。

・on:モーター動かす (ラズパイ→Arduino)
・off:モーター止める(ラズパイ→Arduino)

1-1. Arduino側プログラム

Arduino側のプログラムはシリアル通信でデータを受信し、データがon/offだったらモーターを動かす、止めるというプログラムです。
以下のように実装しました。

■kingyo_esa_program(ver2.0)

【コード解説】
・前回作成したArduinoだけで動く金魚餌やり機のプログラムをベースに作っています。
・シリアルデータを読むこむ関数は、175行目のserialRead()です。
・193行目のthread1関数が、シリアルコマンドを受けて、サーボモーターを動作させている処理です。
・228行目のthread2関数でシリアルデータで読み込んだデータの判定を行っています。

1-2. ラズパイ側のシリアルテストプログラム

ラズパイ側は、on/offを通知するプログラムになります。
とりあえず、テスト的に、コマンド画面から入力した文字をシリアルで通知するプログラムを組みます。
以下のように実装しました。

■arduino_serial_test.py

【コード解説】
・6行目は、シリアル通信するための設定です。
→/dev/ttyACM0は、自分が接続したUSBポートの名前を設定します。「dmesg」コマンドで確認できます。
・12行目でシリアルデータに書き込んでいます。

1-3. 動作確認

さて、早速シリアル通信がうまくいっているか動作確認してみましょう。
ラズパイ側で、作成したPythonテストプログラム「arduino_serial_test.py」を実行してください。
python arduino_serial_test.py

実行したら、onと入力してモーターが駆動、offでモーターが止まればOKです。

2. ラズパイとスマホ間のMQTT通信を実装

次に、ラズパイースマホ間のMQTTプロトコルを実装していきます。
通信仕様は、以下のようにしました。

トピック メッセージ 説明
mqtt/test motor_on サーボモーターを動かす
mqtt/test motor_off サーボモーターを止める

2-1. ラズパイ側

まずは、ラズパイ側にMQTTブローカーをインストールします。
今回は、mosquittoというソフトを使います。以下の記事を参考に早速ラズパイにインストールします。

mosquittoをインストールしたら、ラズパイ側にSubscribe処理を入れます。
Pahoというライブラリを使えば、簡単に実装できます。
以下の記事を参考にさせていただきました。

以下のような処理をPythonで実装します。
■arduino_serial_mqtt.py

【コード解説】
・46行目でMQTTブローカーに対して、subscribeしています。
・48行目のon_message関数で、受信したメッセージの内容を判断し、シリアル通信(on/off)を通知しています。

2-2. スマホ側処理

スマホ側では、パブリッシャー処理を実装します。
こちらも、Pahoというライブラリを使って実装します。
以下の記事を参考にさせていただきました。

まずは、ライブラリファイルを以下のサイトからダウンロードし、Androidプロジェクトファイル内のlibsフォルダ内に格納します。

org.eclipse.paho.android.service-1.1.0.jar

org.eclipse.paho.client.mqttv3-1.1.0.jar

build.gradleに以下を追加しライブラリを読み込みます。

AndroidManifest.xmlファイルに以下を追加します。
■AndroidManifest.xml

MainActivity.javaとactivity_main.xmlは以下のように実装しました。
■MainActivity.java

【コード解説】
・33行目は、ブローカーのIPアドレスを設定します。(今回は、ラズパイのIPアドレスになります)
・92行目、110行目でトピック、メッセージをpublishしています。

■activity_main.xml

3. 動作確認

さて、早速、スマホ→ラズパイ→Arduino→サーボモーターの流れで、動作するかどうかを検証してみました。
まずは、ラズパイで以下のコマンドを実行し、作成したPythonプログラムを動かしておきます。
python arduino_serial_mqtt.py

次にスマホアプリを起動、ON/OFFボタンでサーボモーターを動かします。

やった!うまく動きました!!

4.ラズパイ起動時に自動でプログラムを起動する

【追記】2018年8月26日
水槽の横で動かすために、ラズパイ起動時に自動でプログラムを起動するようにします。
以下サイトによると、ラズパイ起動時にプログラムを動かす方法としては、5種類あるようですが、systemsとrc.localのやり方はうまくいかずハマりそうだったので、autorunというやり方を採用しました。

まずは、今回作ったプログラム「arduino_serial_mqtt.py」をシェルスクリプトで実行できるようにします。
テキストエディタで、以下のような「kingyo.sh」というスクリプトファイルを作成します。

作成したシェルスクリプトに実行権限を与えます。
・chmod +x kingyo.sh

シェルスクリプト「kingyo.sh」を以下へコピーします。
・/usr/local/bin

次に、autostartのファイルを編集します。
テキストエディタで「autostart」を開きます。(以下はテキストエディタviを使用)
・vi /home/pi/.config/lxsession/LXDE-pi/autostart

最後の行に以下を追記します。
@kingyo.sh

これで、ラズパイ起動時に「kingyo.sh」を自動で実行してくれます。

最後に

スマホからリモート操作できるようになったので、あとは実際に金魚の水槽の横で動かしてみたいと思います。
そのためには、ラズパイを起動したときに作成したPythonプログラムを自動で動かすこと、あとはラズパイの電源OFFをどうするかなど。
もう少し課題がありそうです。また随時対応したら記事を更新します!
【更新情報】2018年8月26日 ラズパイ起動時に自動でプログラムを起動するようにしました。これで、水槽の横で動かせるようになりました。(詳細は、4章を参照ください)

それでは!

スポンサーリンク

いいね!を押すと、
最新記事をお届けします。

Twitter で
関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン