前回でRaspberry Piにモーターを制御するサーバープログラムが実装できました。しかし、クライアントアプリの実装がまだだったため、netcatを使ってテスト的なクライアントから動作確認を行いました。
これだと使い勝手が悪いので、今回はSwiftを使ってiOS上で動作するモーター制御クライアントアプリを作成します。
ちなみに下記順で見ると、DCモーターを制御する回路の作成方法、モーター制御サーバーの作成方法やクライアントアプリの作成方法といった、一通りのことがわかりますので、時間があれば最初からどうぞ。
- 【第1回】Raspberry Piでモーターを制御してみよう
- 【第2回】Raspberry PiでPWM制御して、モーター回転数を制御しよう
- 【第3回】Raspberry Piでモータードライバーを制御して、モーターの回転方向を変えてみよう
- 【第4回】Raspberry Piでモーターを制御するサーバープログラム
- 【第5回】Raspberry Piでモーターを制御するクライアントアプリ(iOS) ← 今ココ
モーター制御のクライアントアプリ
作成したアプリの解説
今回作成したクライアントアプリで重要な部分は下記2つなります。
- Network Framework(ネットワークフレームワーク)
サーバーにアクセスするため使用。簡単にTCP通信などを確立できる。 - Timer(タイマー)
定期的にサーバーアクセスするために使用。
この2つの使い方については、以前の温湿度センサーのクライアントアプリを作成した際に詳細を解説しているので、こちらを参考にして頂ければと思います。
というわけで今回作ったアプリは下記のリポジトリに格納しています。クライアントアプリのコードは "motor_client" ディレクトリに入っています。かなり規模の小さいコードなので、上の2つの重要な部分が理解できていれば、比較的楽に理解できると思います。
処理の流れとしてはこんな感じ。
- クライアントアプリ起動時にサーバーとコネクション確立
- スライダーを通してユーザーからスピードの要求値を受け取る
- 0.2秒毎(Timer機能を使用)にスライダーの値を取得してサーバーに送信(Network Frameworkを使用)
- サーバーは受信した値に合わせてPWM出力を変えて、モーター回転数を制御
やってることは非常に少ないですね。
また、今回のアプリではscenePhaseを使って、アプリがアクティブ状態かバックグラウンド状態かを判別しています。この辺りも簡単に実装できるのでSwiftってマジ楽だなと思いました。scenePhaseの使い方については、また別途解説しますので少々お待ちを。
アクティブ状態の場合はサーバーに接続してスライダーの値を0.2秒ごとに送信しますが、バックグラウンド状態に移行した場合はサーバー接続を切断してデータ送信を止めるようにしました。バックグラウンドにいるのにデータを送る必要はありませんからね。
まあ、他にもムダにデータをたくさん送っているので、本来はその辺りのムダも削った方が良いのですが、動けば良いので!
作成したアプリの動作確認
まずはラズパイ側で前回作成したモーター制御用のサーバーを起動しておきます。サーバープログラム "motor_server" ファイルがあるディレクトリに移動して、下記コマンドを実行してサーバーを起動。
sudo ./motor_server
起動できたらiPhoneで今回作成した "Motor" アプリを起動します。作成したアプリを実機(たとえばiPhone)上で動作させる方法は下記の記事を参考にしてください。
あとはスライダーを動かすだけでモーターの回転数・回転方向を制御できます。参考までに実際に動かしている動画を載せておきます。
まとめ
以前に温湿度センサーのクライアントアプリを作成していたため、今回のアプリはとても簡単に作成することができました。次回はいよいよレゴ車に載せて走らせますが、その前にやることが1つあります。
それはラズパイの電源をバッテリーから供給することです。そのために回路に手を加えてやる必要があります。その辺りも解説するので、気になる方は参考にして頂ければと思います。
コメント