memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

iRobot Roomba 530をmbedとArduinoで動かしてみた

こちらを参考にmbedで動かしたのが以下。

そして、そのコードをArduinoに移植したのが以下。

意外と簡単に動かすことができます。実は学生と一緒に今日の昼に挑戦していたのですが動きませんでした。その理由はNewSoftSerialライブラリが古かったことと(1バイト送信用のwriteメソッドが使えない版)、ArduinoRoombaのGNDを結線していなかったことでした。

NewSoftSerialライブラリの最新はこちらにあります。ただし、これをダウンロードしても使えません(2011/11/7現在)。フォルダ名とクラス名をSoftwareSerialからNewSoftSerialに変更しなければなりません。よくわからない人はこちらに変更したライブラリを置きました。利用してください。

なちなみにArduinoに移植したコードは以下です。

#include <NewSoftSerial.h>

NewSoftSerial device(2, 3);

void setup()  
{
  device.begin(115200);

  // Start
  device.write(128);   // Start -&gt; Passive Mode
  delay(50);
  device.write(130);   // Safe Mode
  delay(50);
  
  delay(1000);

  // Forward
  device.write(137);   // Drive
  device.write(0x00);  // Velocity: 0x00c8 = 200
  device.write(0xc8);
  device.write(0x80);  // Radius: 0x8000 = Straight
  device.write(0x00);

  delay(1000);

  // Stop
  device.write(137);   // Drive
  device.write(0x00);
  device.write(0x00);
  device.write(0x00);
  device.write(0x00);

  delay(500);

  // Backward
  device.write(137);   // Drive
  device.write(0xff);  // Velocity: 0xff38 = -200
  device.write(0x38);
  device.write(0x80);  // Radius: 0x8000 = Straight
  device.write(0x00);

  delay(1000);

  // Stop
  device.write(137);   // Drive
  device.write(0x00);
  device.write(0x00);
  device.write(0x00);
  device.write(0x00);

  delay(500);

  // Turn in place counter-clockwise
  device.write(137);   // Drive
  device.write(0x00);  // Velocity: 0x00c8 = 200
  device.write(0xc8);
  device.write(0x00);  // Radius: 0x0001 = Turn in place counter-clockwise
  device.write(0x01);

  delay(500);

  // Turn in place clockwise
  device.write(137);   // Drive
  device.write(0x00);  // Velocity: 0x00c8 = 200
  device.write(0xc8);
  device.write(0xff);  // Radius: 0x0001 = Turn in place clockwise
  device.write(0xff);

  delay(1000);

  // Turn in place counter-clockwise
  device.write(137);   // Drive
  device.write(0x00);  // Velocity: 0x00c8 = 200
  device.write(0xc8);
  device.write(0x00);  // Radius: 0x0001 = Turn in place counter-clockwise
  device.write(0x01);

  delay(500);

  // Passive Mode
  device.write(128);   // Start -&gt; Passive Mode
}

void loop()           // run over and over again
{
}