2018年4月29日日曜日

Alexa と Raspberry Piでルンバに掃除してもらう:(おまけ)ArduinoからROI経由でルンバを動かす

前回まででAlexaからNode-RED経由でArduinoを呼び出せるようになりました。
で、Arduinoからルンバを動かすにはいくつかの方法があります。

1つが今回紹介するROI(Roomba Open Interface)です。
この方法のメリットはルンバ側にArduinoを載せるので、ルンバが移動しても通信し続けることができることでしょうか。
一方で、当然ながらルンバに出っ張りが出来てしまうので、掃除中に引っかかるリスクがあります。

もう一つの方法として、ルンバから離してArduinoを設置して赤外線経由で操作することもできます。
この方法の場合はルンバに何も付ける必要はありません。
その代わり、ドックにいる時にしかコマンドを送れません。

通常、ルンバは掃除が終われば自動的にドックに戻ってくるので、掃除中にコマンドを送りたいケースは少ないように思います。
そのため、普通に掃除させたいだけなら赤外線経由の方が本命だと思います。

そのような理由から、ROI経由での制御は「おまけ」として紹介します。
  1. 材料を揃える。
  2. 母艦のRaspberry PiにNode-REDをセットアップしてAmazon Echo Dotに認識させる
  3. Raspberry Pi Zero WをヘッドレスでWiFi対応セットアップする
  4. Raspberry Piで赤外線リモコンのコードをコピーする
  5. Node-REDから赤外線機能を呼び出してテレビを操作する
  6. FlashAirのGPIO機能でArduinoをHTTP API経由で制御する
  7. (おまけ)ArduinoからROI経由でルンバを動かす【今回】
  8. Arduinoから赤外線経由でルンバを動かす
  9. Node-REDからFlashAir/Arduino経由でルンバを動かす

ROIとは?

ROIは外部機器からルンバを制御するためのシリアルインターフェイスです。
ROIの詳細についてはiRobotのサイトに仕様書があります。

コネクタが付いている場所は機種によって微妙に異なるのですが、我が家にあるルンバ760では上部ハンドルの裏に付いています。

他の機種だと天板パネルを剥がした中に隠されている場合もあるようです。

Arduinoとルンバを接続する

ROIは7ピンのミニDINコネクタです。
秋葉原などに行くとプラグが売っているようですが、ジャンパピンを挿して接続しても何とかなります。

ピンアサインはROIの仕様書に載っています。


今回の場合、3番(RXD), 4番(TXD), 6番(GND) だけ接続すれば通信できます。
Arduino側のRX,TXは0番,1番ですが、それを使ってしまうとPCとのシリアル通信ができなくてデバッグしにくいです。
そのため、Arduinoの0番,1番を避けて、他のピンに繋ぎ、ソフトウェアシリアルで通信させます。

また、ルンバの電源でArduinoを駆動する場合はルンバの1番ピンから引き出してレギュレータを通してからArduinoのVinピンに入れれば良いと思います。

Arduinoからコマンドを送る

前回、FlashAirと接続するようにしたArduinoのコードにルンバとのシリアル通信を追加します。
下記の例ではArduinoの12番,13番ピンにルンバのTXDとRXDを繋いでいます。
ちなみに、ルンバのデフォルトのボーレートは115200らしいです。
#include <softwareserial.h>

#define PIN_SD_CLEAN 11

SoftwareSerial device(12, 13);

void setup() {
  Serial.begin(9600);
  pinMode(PIN_SD_CLEAN, INPUT);
}

// Arduino起動直後は全てHIGHになっているが無視させる
// 一旦LOWに落ちてからHIGHになると清掃開始
volatile bool clean_flag = HIGH;
void loop() {
  if ( clean_flag == LOW && digitalRead(PIN_SD_CLEAN) == HIGH ){
    Serial.println("Run Roomba with clean mode");
    device.begin(115200);
    byte buffer[] = {
      byte(128), // Start
      byte(135)  // Clean
    };
    device.write(buffer, 2);
  }
  clean_flag = digitalRead(PIN_SD_CLEAN);
  delay(1000);
}
はい、これだけ。
ROIは1コマンドが1バイトになっていて、コマンド順に並べたバイト列を送り込めばその順に実行されます。
ルンバはいくつかのモードを持っていて、低レベルコマンドを送るにはモードを切り替える必要があります。
128が起動なのですが、起動後のデフォルトはPassiveモードになっています。
Passiveモードではルンバのセンサ読み込みと掃除スタートができます。
今回は掃除したいだけなので、いきなりCleanコマンド(135)を送っています。

モードとコマンドについてはROIの仕様書に書かれています。
駆使すると、ルンバをラジコン化したり音を鳴らしたりインジケータを表示したり色々できます。

完成

出来上がると、こんな感じになります。

次回はROIではなく赤外線で起動します。

0 件のコメント:

コメントを投稿