RoombaをiPhoneでリモコンする
花岡ちゃんのウィークエンド:RoombaのWiFiリモコン
今回はRoombaをiPhoneでリモコンしてみます。以前PCからリモコンしてみましたが、それのiOS版です。
最初にブレットボードで組んでいた回路をユニバーサル基板に組み立てました。電源はRoombaのバッテリーから取り、このDC-DCコンバータモジュール(なんと300円!)で3.3Vに変換します。入力12Vでは少し電圧が足りないようにも思いますが、ちゃんと動作します。アマチュア的には問題ないと思います。
これは5Vですがモジュールの5番ピンと6番ピンの間に36KΩの抵抗を入れることで3.3Vに設定できました。個体差があるかもしれないので、追試する場合は必ず電圧をチェックしてくださいね。
コンバータの入力はRoombaのコネクタからとります。
1番、2番ピンには、Roombaのバッテリーから約12Vの電圧が供給されています。これをDC-DCコンバータの入力に入れ、XBee WiFiの電源にします。消費電流を実測したところ、入力電流は待機時で40mAほどでした。
この電源ピンにはRoombaの電源が切れていても12Vの電圧が出ています。ここにXBeeのシリアルポートの信号線が触れるとXBee WiFiが一発でオシャカになります。実は実験中にシリアルポートのワイヤがコネクタ部分ではずれ、それが電源ピンに触れてXBee WiFiをひとつ駄目にしてしまいました! コネクタにワイヤーをハンダ付けしたらホットボンドでしっかり固めた方が安全です。
基板はこんな風に作りました。Roombaに取り付けるために、同じサイズの基板を2枚、スタッドで重ねています。下側の基板を両面テープかなんかで貼付けようと言う訳です。
今回基板の取り付けには、ダイソーの「衝撃吸収パッド」という青いゲル状のシートを使ってみました。ぺたりと乗せるだけで結構しっかり固定できます。取り付け位置の変更も簡単で、両面テープよりずっと手軽です。
さていよいよiPhoneのアプリですが… その前にXBee WiFiのIPアドレスを固定しておきましょう。固定しないと毎回XBee WFiのIPアドレスを調べなければなりません。
X-CTUのModem Configurationで設定します。
Networking..から
MA IP Addressing Mode を 1-STATIC に設定
Addressing..から
MY IP Address に空いているIPアドレス(僕の場合は192.168.1.51)を設定
これを設定したら忘れずにWriteボタンをクリックしてください。これで設定完了です。ポートはこれまでの実験と同じ8081(0x1F91)を使います。
iPhoneのアプリはこんな感じです。もちろん実験に使うiPhoneは、WiFiでRoombaと同じネットワークにつながっている必要があります。
RoombaとXBee WiFiの電源は入れておきます。
アプリの一番上のボックスをタップしてXBee WiFiのIPアドレスを入れ、Connectをタップして接続。接続されるとボタンの脇に"Connected"と表示され、ボックスが青くなります。何かしら不具合があって接続できないと、2分ほどしてから"Connection ERROR"と表示します。(!!残念ながら接続途中でホームボタンを押して終了するとアプリの動作がおかしくなります。そのときは、ホームボタンをダブルクリックして表示される実行中のアプリリストから、RoombaRemoteを長押しし"-"マークをタップして強制終了させてください。)
あとは十字キーで操縦、下のファンクションボタンで掃除をさせたりドックにもどしたりすることが出来ます。止めるときはSTOPをタップします。
アプリを終了するときはiPhoneのホームボタンを押せばOKです。
XCode4.5.2、iOS5.1で試作したプロジェクトファイルを参考までに公開します。とても簡単なプログラムですが、しっかりデバッグした訳ではないので「自己責任」でご利用ください。
「iPhone_RoombaRemote.zip」をダウンロード
アプリの仕組みについては後日投稿します。
【後日追加 動画をこちらに掲載しました。】
« XBee WiFiの電源をテストする | トップページ | ROSのチュートリアル、ちょっと変わったかな? »
「花岡ちゃんのウィークエンド」カテゴリの記事
- レーザー距離センサVL53L0Xを複数使うには(2022.05.01)
- 【訂正!】PIC24Fでレーザー距離センサVL53L0Xを使う(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(おしまい)(2022.04.14)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その3)(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その2)(2022.04.12)
こちらを拝見いたしまして疑問に感じたのですが、iphone側、つまりクライアント側にだけプログラムを書けばTCPコネクションをはることが可能なのですか?xbeewifiの側にもサーバー側のプログラミングがなされているのですか?ネット等でTCPに関する記事ではサーバー、クライアントともにプログラムが必要であると拝見したので疑問に感じました。
ご回答頂けましたら幸いです。
投稿: | 2015年5月30日 (土) 10時49分
ブログオーナーのササガワです。
xbee wifiはTCPレイヤーの通信を通す通路としてのみ働きます。つまりwiftからTCPで送ったメッセージはそのままxbee wifiのシリアルポートから出力されるだけです。サーバなどを構築するのはそのシリアルポートからメッセージを受け取る側です。この場合は、roombaがサーバのように働いてTCPで送られたメッセージ(コマンド)に応答しているわけです。
投稿: ササガワ | 2015年5月30日 (土) 12時39分
ご回答有難うございます。
roombaがサーバのように働いて、とありますがroomba側には一切プログラムを書いていないのですか?プログラムしたマイコンが付いているとか特に必要ないんですか?
度々申し訳ありません。
投稿: | 2015年5月30日 (土) 15時40分
はい。もともとroombaに内蔵のOpen Interface という機能を使っているだけです。これはシリアルポートからコマンドを受けてroombaを動かす機能です。
投稿: ササガワ | 2015年5月30日 (土) 18時31分
遅くなりました。ご返信ありがとうございます。
roombaにそんな機能があったんですね。ところで、xbee wifiには履歴を残すような機能はありませんでしょうか?
マイコンの入力にxbee wifiのDIO2と3を使用していまして、入力時間はわずか0.5秒です。そこで、最後にDIO2と3どっちを出力したかを知りたいのですが、方法はありませんでしょうか?
highの時間はわずか0.5秒で、それが終わってしまえば両方lowでどっちを最後にいじったか分かりません。
xbee wifiにそのようなログを残す機能でもあれば確認する方法もあるのではないかと思いますが、おそらくそのような機能は無いんじゃないかと思っております。
そこでササガワさんなら何か解決策を提示して頂けるのではないかと思いまして、お伺いしてみました。何かアイデアございましたらご返信頂ければ幸いです。よろしくお願い致します。
投稿: | 2015年6月 3日 (水) 22時03分
xbee wifiのシリアルではなくGPIOを使っているのですね。xbeeは基本的に情報の「パイプ」でしかないので、ログの機能はありません。
状況がよくわかりませんが、ポートの状態を見たいならば、2chのオシロでポートを目視するのがいいのではないかと思います。信号は0.5秒と極めてゆっくりなので、特にストレージなどなくとも十分に目視できます。オシロがないならLEDを繋いで目視も出来ると思います。
投稿: ササガワ | 2015年6月 3日 (水) 22時32分
ご返信遅れまして申し訳ございません。また、ご回答ありがとうございます。
xbee wifiは自宅で、制御するのは出先からになるので、目視は不可能でして…。
ところで、macでターミナルからtelnet 192.168.0.13 9750でxbee wifiに接続しましたが、これはTCP接続とは言わないのですか?connectedと表示されるので、TCPコネクションがはれたのかと思いました。
ご返信よろしくお願いいたします。
投稿: | 2015年6月27日 (土) 23時13分
telnetではだめです。windowsのterataermだと直接にTCPのメッセージの送受ができます。僕の「XBee WiFiをWEPルーターに接続する」という投稿を見てください。
投稿: ササガワ | 2015年6月28日 (日) 21時59分
ご返信ありがとうございます。
「XBee WiFiをWEPルーターに接続する」では、teratermからTCPでxbee wifiと直接コネクションを確立したわけだとは思うのですが、このroomba remoteにおいては、TCPコネクションを確立したのは、xbee wifiとではなくroombaとコネクションをはったという認識で間違いないでしょうか?
ご回答よろしくお願いいたします。
投稿: | 2015年6月29日 (月) 20時36分
いいえ。xbee wifiとTCPでコネクションをとれている状態です。僕の使い方ではxbeeはただのTCPからシリアル通信への変換機ですから、TCPで送ったデータをxbee wifiのシリアルポートからroombaへ送り出せる訳です。ご質問の内容から見ると、念のためTCP/IPの基本的な部分(イーサネットを利用してTCPのメッセージをやり取りするsocketの仕組みなど)をご確認いただいた方が良いかと思います。
投稿: ササガワ | 2015年6月29日 (月) 23時20分
追加です。一つ前のコメントで、telnetではダメと書きましたが、teratemをtelnetモードで使うとうまく行かなかったということです。プロトコルをunspecにしないとだめでした。ただ、それ以来telnetで試してないので、そのとき何か他の要因でダメだっただけかもしれません。本来ならtelnetでよいはずです。
投稿: ササガワ | 2015年6月30日 (火) 01時10分
ご返信ありがとうございます。
xbee wifiとTCPコネクションがとれているんですね。それが知れてよかったです。今まで、xbee wifiと直接TCPコネクションをはることは不可能で、xbee wifiに接続したマイコン等にTCPサーバを設けないとTCP接続できないかと思っていました。とても良い情報が頂けました。どうもありがとうございました。
投稿: | 2015年6月30日 (火) 20時57分