[Roomba Hack] Spring boot Webアプリからルンバ800(+RooWiFi)を操る

はじめに

ルンバ800をハックしました。 Webアプリからルンバと通信することで掃除をさせたり、音楽を流したり、スケジュールを変更したり、できるようにしました。

準備

ルンバと無線通信するため「RooWiFiルンバ用無線LANモジュール(RB-Roo-01)」をルンバに搭載しました。
http://www.robotshop.com/jp/ja/roowifi-wifi-module-roomba-v2.html

インストール手順はこちらを参照しました。
http://www.roowifi.com/wp-content/uploads/RwRemote_User_Guide_v2_rev15.pdf

ルンバとTCP/IP通信

ルンバを操作するためのインタフェースはThe Roomba Open Interface(OI)として公開されています。 こちらの仕様に記載のコマンドをソケット通信でルンバに送り込めばルンバを好きなように操ることができます。
http://www.irobot.lv/uploaded_files/File/iRobot_Roomba_500_Open_Interface_Spec.pdf

Spring bootアプリの構築

ルンバと通信するためのWebアプリケーション(roomba_client)を構築しました。
日々改良中ですが、形になってきたので公開します。 https://github.com/hiroki-sawano/roomba_clientgithub.com

roomba_clientの起動

アプリケーションを起動し、ブラウザよりアクセスすると次の画面が表示されます。 f:id:hiroki-sawano:20171203174800p:plain

アプリケーションの立ち上げ時にはルンバへの接続が成功したことを示すメッセージが出力されます。
roomba_client/event.log

2017-12-07 05:12:58.522 ... hs.roomba.client.RoombaController : Connected to Roomba

複数コマンドの連続実行

任意のコマンド名と前述したOIの仕様に従ったシリアルシーケンスを入力し、'ADD COMMAND'ボタンでデータテーブルにコマンドを実行順に追加していきます。
シリアルシーケンスは直接入力(Arbitrary Sequence)でもかまいませんが、いくつかセレクトボックス(Selectable Sequence)で選択可能としています。
こちらの例では、①セーフモードへの移行、②曲の登録、③曲の再生を実行し、ルンバから音楽を再生しています。
f:id:hiroki-sawano:20171207052956g:plain

ログ情報は次の通りです。
roomba_client/event.log

2017-12-07 05:16:42.356 ... hs.roomba.client.RoombaController : 
Adding new command : name=start serialSequence=128 131
2017-12-07 05:16:48.832 ... hs.roomba.client.RoombaController : 
Adding new command : name=song serialSequence=140 0 7 76 16 76 32 79 16 79 16 77 16 74 16 72 32
2017-12-07 05:16:55.268  ... hs.roomba.client.RoombaController : 
Adding new command : name=play serialSequence=141 0
2017-12-07 05:16:56.944  ... hs.roomba.client.RoombaController : 
Sending serial sequence : 128 131
2017-12-07 05:16:57.959  ... hs.roomba.client.RoombaController : 
Sending serial sequence : 140 0 7 76 16 76 32 79 16 79 16 77 16 74 16 72 32
2017-12-07 05:16:58.965  ... hs.roomba.client.RoombaController : 
Sending serial sequence : 141 0

単一コマンドの即時実行

コマンドを入力後に'EXECUTE COMMAND'を押下するとデータテーブルにコマンドを登録せずに即実行します。 この例では、③曲の再生を指示するシーケンスを直接入力してルンバに送信しています。
f:id:hiroki-sawano:20171207054704g:plain

roomba_client/event.log

2017-12-07 05:17:07.290 ... hs.roomba.client.RoombaController : 
Sending serial sequence : 141 0

その他機能

データテーブルに一度登録したコマンドは実行、編集、削除が可能です。

環境設定

使用する際にはapplication.ymlにルンバのIP(roomba.ip)とポート番号(roomba.port)を最低限設定することが必要です。
必要に応じて画面中のセレクトボックスで選択可能なシリアルシーケンス(roomba.sequences)を登録することもできます。
application.yml

roomba:
  ip: 192.168.0.19
  port: 9001
  sequences:
    start_and_safe: 128 131
    start_and_full: 128 132
    clean: 135
    max: 136
    spot: 134
    seek_dock: 143
    song: 140 0 7 76 16 76 32 79 16 79 16 77 16 74 16 72 32
    play: 141 0
    end: 128
    daily_schedule: 167 62 0 0 12 0 12 0 12 0 12 0 12 0 0 0

さいごに

今でも少し遊ぶ分には十分ですが実際に日常で役立つような使い方ができるように、組み立てたシーケンスの保存やコマンドの実行間隔の指定など今後改良を加えていきます。