• 2022/12/01
  • ルンバ

Roomba

②ルンバとのIF

「iRobot® Create® 2 Open Interface」について

ラズパイとルンバを接続したり、ESP32とルンバを接続してリモート操作する事例が数多く報告されています。ルンバを操作するインターフェースコマンドがiRobotから公開されています。そのインターフェース仕様書を日本語にメモしました。ただただ本当にメモです

・インターフェースコマンドのダウンロード

692で使用できなかったコマンド

ルンバのインターフェース仕様が変わっているのか不明ですが、
・スタートコマンドで、PassiveModeではなくSafeModeになる
・セーフコマンドで、SafeModeでなくFullModeになる
・フルコマンドで、未定義モードになる
・リセットコマンドは全く効かない

また、ルンバがホームベースにいてバッテリ充電が低いときには、アスキーコードでルンバの状態を連続して送信してきます。電圧が低すぎるときは、セーフコマンドを送信しても全く無視されます。ルンバなりに問題ない状態でないとリモート操作はできないようです

スリープ状態からの起動・・・その1

ルンバIFの5番ピンはスリープからの起動にも用いられるようなので、トランジスタ経由で回路を組みました。RMB_WAKEUP信号にHi→Loを出力することで起動されます

スリープ状態からの起動・・・その2

ルンバがホームベースに入っていてスリープ状態になってしまった場合、何をしても起動できません。この場合は、ホームベースの電源をオフしてオンします。オフとオンの間隔は5秒としました
回路のイメージとしては、100Vラインにリレー回路を入れることになります

ルンバからの電源供給回路

ルンバのピン1と2から24V未満の電源が出てます。ただ200mA以上の電流を流してはいけないことになってますので、5V変換回路と電流カット回路を通し電気2重層コンデンサをつけてあげれば、200mA以上のピーク電流に対応可能です
例えばESP32をルンバIFに接続し、ESP32でWifi通信を行うと、500mA程度のピーク電流が流れますが、2F程度の電気2重層コンデンサを入れてあげれば問題なく動作します

ただし、ラズパイのようなものへの電源供給は、定常的に1[A]前後(もしくはそれ以上)の電流が必要になるので、どう考えても無理です

ルンバとIFでの留意点・・・その1

ルンバとのIFは、UART接続で、115200bps、ストップ1で、コマンドを送ればルンバのタイミングで応答を返してきます。例えばバッテリ電圧の要求は「センサコマンド+バッテリ電圧のパケットID」をPCから送信しますが、このバッテリ電圧に限らず不明なコードを応答までの間に差し込んでくることがたまにあります
これでは、不明なコードを応答として受信してしまうことになるので実質使えません。横軸が時間で右から左に流れる波形と考えてください

これに対しストリーム形式での送受信を採用すると、この不明コードの混入はありません。ストリームコマンド(148)につづいてパケット数とパケットIDを送信すると、ルンバは15ms間隔で、ヘッダ(19)につづいてパケット数とパケットIDに対応した応答、チェックサムを返してきます
チェックサムは、ヘッダからチェックサムを合計すると0となる値がチェックサムとして送られてきます。ルンバへのストリーム要求は一回だせば、ルンバからのストリーム応答は15ms間隔で連続して返してきます。横軸が時間で右から左に流れる波形と考えてください

ルンバとIFでの留意点・・・その2

ルンバと接続する機器としてはラズパイなど選ばれることがおおいですが、ストリーム受信を行う場合当たり前ですが15ms毎に受信できるようなCPU時間での余裕が必要です
私の場合は30ケくらいのパラメータを受信(50バイト前後)させていたので、受信だけで5ms程度かかりますが、ラズパイで受信を行う関数をコールすると丸々5ms関数から戻ってきません
RL-78などは、受信をハードウエアに任せ(受信割込み)られるので、送受信にかかる時間的なコストはほぼありません
OSを使うようなものはタスクという考えでやっていたとしても結局はCPU時間の分割でしかないので、時間的なコストが削減されるわけではありません。ルンバを制御することを考えると、常に5msは通信にかかってしまうので時間的には不利ともいえます。ラズパイはその他のリソースに対する処理が入ってくるので、そちらに時間をとられ時間的にシビアな制御をしようとするとかなり難しくなると思います。ただROS2のようなものを使ったことがないので、この辺りも検討したいと思います

【参考】
外部センサをI2Cのデバイスドライバとして読めるようにした時も、読んでいる間はドライバアクセスから戻ってきませんでした。ラズパイを中心にして、ルンバとUART通信、外部センサとI2C通信させたら、もう制御に利用できる時間がなくなってしまいました→結局②を採用しました

UART回路

ルンバからのTxDラインは5Vと3.3Vの電圧差もあるのでフォトカプラでアイソレーションします。トランジスタをかましてるのは反転信号を反転させてます
RxDラインは分圧の意味ではありませんが、結果的に分圧に見えてしまいます。RxDはルンバから5Vが出力されていて、10kΩのプルダウンをしたら0Vに落ちたのでプルダウンを入れました。でも何故0Vになる?

そのまま流れに身を任せ、510Ωの3.3Vプルアップしてとりあえずできたので、そのままにした次第です。多分デジトラでRxDラインをオンオフするだけでいいのかも?(ルンバ側の回路があればいいのに・・・10kΩのプルダウンをしたら0Vになるのが分からない)