コメントこんにちは、koheiです。以前、Arduinoを使って金魚の自動餌やり機を作成しましたが、今回は、ラズパイ3を組み合わせて、スマホ(Android)からリモートで操作できるようにしました。Aruduino単体では、Wifiモジュールがついていないため、無線通信ができません。ラズパイ3はWifiがついているので、無線通信できます。ラズパイだけでも金魚の餌やり機が作れると思いますが、せっかくArduinoで餌やり機を作っていたので、今回はラズパイ+Arduinoでリモート操作を実現してみました。備忘録としてまとめておきます。動作確認4.ラズパイ起動時に自動でプログラムを起動する最後に用意したもの以前の金魚餌やり機から追加したものは、ラズパイ3B+、Android端末です。・ラズパイ3B+・Androidスマホ前回の金魚餌やり機の記事は、以下を参考にしてください。回路図は前回の金魚餌やり機の回路にUSBケーブルでArduinoとラズパイをつなぐだけです。(Arduino側の回路図は前回の記事を参照ください)動作仕様スマホで、ONボタンを押すと、サーボモーターが動き、OFFを押すとサーボモートが止まるシンプルな仕様です。システム構成さて、スマホ(Android端末)からのリモート操作でどうやってサーボを動かすのか?ざっくり図に書くと以下になります。・スマホとラズパイ間の通信は、「MQTT」というプロトコルを使っています。・ラズパイとArduino間はシリアル通信でやり取りします。1.Arduinoとラズパイ間のシリアル通信を構築まずは、Arduinoとラズパイ間のシリアル通信を実装していきます。シリアル通信の仕様は、シンプルに[on]or[off]を通知してモーターを動かす、止めるという仕様にしました。Arduino側プログラムArduino側のプログラムはシリアル通信でデータを受信し、データがon/offだったらモーターを動かす、止めるというプログラムです。以下のように実装しました。・前回作成したArduinoだけで動く金魚餌やり機のプログラムをベースに作っています。・シリアルデータを読むこむ関数は、175行目のserialRead()です。・193行目のthread1関数が、シリアルコマンドを受けて、サーボモーターを動作させている処理です。・228行目のthread2関数でシリアルデータで読み込んだデータの判定を行っています。ラズパイ側のシリアルテストプログラムラズパイ側は、on/offを通知するプログラムになります。テスト的に、コマンド画面から入力した文字をシリアルで通知するプログラムを組みます。以下のように実装しました。・6行目は、シリアル通信するための設定です。→/dev/ttyACM0は、自分が接続したUSBポートの名前を設定します。「dmesg」コマンドで確認できます。・12行目でシリアルデータに書き込んでいます。動作確認さて、早速シリアル通信がうまくいっているか動作確認してみましょう。ラズパイ側で、作成したPythonテストプログラム「arduino_serial_test.py」を実行してください。arduino_serial_test.py実行したら、onと入力してモーターが駆動、offでモーターが止まればOKです。次に、ラズパイースマホ間のMQTTプロトコルを実装していきます。通信仕様は、以下のようにしました。ラズパイ側まずは、ラズパイ側にMQTTブローカーをインストールします。今回は、mosquittoというソフトを使います。以下の記事を参考に早速ラズパイにインストールします。Brokerをインストールするmosquittoをインストールしたら、ラズパイ側にSubscribe処理を入れます。Pahoというライブラリを使えば、簡単に実装できます。以下の記事を参考にさせていただきました。PiにMQTTで通信する以下のような処理をPythonで実装します。・46行目でMQTTブローカーに対して、subscribeしています。・48行目のon_message関数で、受信したメッセージの内容を判断し、シリアル通信(on/off)を通知しています。スマホ側処理スマホ側では、パブリッシャー処理を実装します。こちらも、Pahoというライブラリを使って実装します。以下の記事を参考にさせていただきました。実装するまずは、ライブラリファイルを以下のサイトからダウンロードし、Androidプロジェクトファイル内のlibsフォルダ内に格納します。org.eclipse.paho.android.service-1.1.0.jarorg.eclipse.paho.client.mqttv3-1.1.0.jarbuild.gradleに以下を追加しライブラリを読み込みます。'com.android.support.test.espresso:espresso-core:3.0.2'}AndroidManifest.xmlファイルに以下を追加します。></service></application></manifest>MainActivity.javaとactivity_main.xmlは以下のように実装しました。・33行目は、ブローカーのIPアドレスを設定します。(今回は、ラズパイのIPアドレスになります)・92行目、110行目でトピック、メッセージをpublishしています。動作確認さて、早速、スマホ→ラズパイ→Arduino→サーボモーターの流れで、動作するかどうかを検証してみました。ラズパイで以下のコマンドを実行し、作成したPythonプログラムを動かしておきます。arduino_serial_mqtt.py次にスマホアプリを起動、ON/OFFボタンでサーボモーターを動かします。水槽の横で動かすために、ラズパイ起動時に自動でプログラムを起動するようにします。以下サイトによると、ラズパイ起動時にプログラムを動かす方法としては、5種類あるようですが、systemsとrc.localのやり方はうまくいかずハマりそうだったので、autorunというやり方を採用しました。Piでプログラムを自動起動する5種類の方法を比較・解説まずは、今回作ったプログラム「arduino_serial_mqtt.py」をシェルスクリプトで実行できるようにします。テキストエディタで、以下のような「kingyo.sh」というスクリプトファイルを作成します。/home/pi/arduino/serial_test/arduino_serial_mqtt.py作成したシェルスクリプトに実行権限を与えます。kingyo.shシェルスクリプト「kingyo.sh」を以下へコピーします。・/usr/local/bin次に、autostartのファイルを編集します。テキストエディタで「autostart」を開きます。/home/pi/.config/lxsession/LXDE-pi/autostart最後の行に以下を追記します。@kingyo.shこれで、ラズパイ起動時に「kingyo.sh」を自動で実行してくれます。最後にスマホからリモート操作できるようになったので、あとは実際に金魚の水槽の横で動かしてみたいと思います。そのためには、ラズパイを起動したときに作成したPythonプログラムを自動で動かすこと、あとはラズパイの電源OFFをどうするかなど。ラズパイ起動時に自動でプログラムを起動するようにしました。これで、水槽の横で動かせるようになりました。最新記事をお届けします。飲食店用の無料WordPressテーマを作成しました。店のコンセプト、メニュー、アクセスなど飲食店に必要な最低限の機能を搭載しました。これから飲食店のホームページを開設したい方、この無料テーマを是非活用してみてください。詳しくはこちらへブログ用WordPress無料テーマ「chameleon(カメレオン)」WordPressテーマ(chameleon)は、「WordPressで手軽・気軽にブログ始められる」をコンセプトに制作しました。士業用の無料WordPressテーマを作成しました。一般的なビジネスサイトに活用できます。自分でWordPressテーマを作ってみたい方、この無料テーマを是非活用してみてください。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。Inomata)こんにちは、サイト運営者のkoheiです。現在エンジニアとして働きながら、当サイトの運営をやっています。このブログでは、「自分で作る」をテーマに、ホームページやデザイン制作、Webマーケティングなど色んなノウハウを公開しています。「自分で何でも作るのが大好き」な人です。InomaCreateプライバシーポリシ。