curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

ルンバにスピッツを演奏させてみた

 

お疲れ様です。高橋です。

家にあるルンバにArduinoを挿して、スピッツの「涙がキラリ☆」のサビ部分だけ演奏させてみました。

ルンバのシリアルポート

うちの780は、取っ手の裏側にシリアルポートが出ています。

IMG_5869

シリアル通信で自由にルンバを動かしたり出来たら、きっと楽しい。それがwi-fiやbluetooth経由だと、きっともっと楽しい。

とりあえず有線で実験してみる事にしました。

ルンバのシリアル通信インターフェイス仕様

ルンバの製造元であるiRobot社は、Roomba Open Interface (ROI)という、インターフェイス仕様を公開しています。

iRobot® Roomba 500 Open Interface (OI) Specification

仕様をざーっと斜め読みしていたら、こんなページを発見。

070501

こいつ(ルンバ)、音楽を自由に演奏出来るのか!?

更に読み進めていくと、こんなページと・・・

070502

こんなページがありました。

070503

つまり、

  • 曲登録命令(code:140)で、16小節からなる曲を5つ登録出来る。
  • 曲演奏命令(code: 141)で、登録した曲を別途演奏する事が出来る。

って事です。

曲を演奏してみる事にしました。

ルンバ-Arduino間のシリアルケーブル自作

ルンバ側のシリアルポートはミニDINの7pinですので、千石の2号館の2階でプラグを買ってきました。1個155円です。

バラすとこんな感じ。

IMG_5879

くっつけると、こんな感じ。

IMG_5878

プラグだけでは役に立たないので、そこから伸びる線を、ケーブル屋で買ってきます。7pin全部使わず、RX, TX, GNDの3線だけあれば事足りるので、3芯の線を1メートル90円で売っていたので、2メートル買います。180円。

先っちょをカッターで剥きます。

IMG_5876

シールドにくるまれている3芯の先を剥きます。なんか、リッツ線との格闘を思い出してしまいました。。

IMG_5877

そして、ミニDINと線を半田付けです。

位置を固定させて・・・

IMG_5880

ジワーっと半田のノリが良く、吸い付く感じで半田付け出来ました。

IMG_5881

こんな調子で3芯全て半田付けを終え。

IMG_5882

グルーガンで固定させます。

IMG_5883

ケースをかぶせて出来上がり。線の反対側には、Arduinoに挿すためのジャンパー線を半田付けします。

IMG_5884

3線を半田付けし、熱収縮チューブでいい感じに包んでやります。

IMG_5885

完成。

IMG_5886

スケッチ

最終的に動作したスケッチは下記の通りです。

#include <SoftwareSerial.h>;
byte song_buffer01[24] = {140, 1, 10, 66, 16, 67, 16, 69, 16, 67, 32, 66, 32, 62, 16, 64, 16, 66, 16, 67, 16, 66, 64};
byte song_buffer02[22] = {140, 2, 9, 66, 16, 67, 16, 69, 16, 67, 32, 66, 32, 71, 32, 59, 16, 62, 16, 61, 64};
byte song_buffer03[20] = {140, 3, 8, 62, 16, 64, 16, 61, 16, 62, 16, 64, 16, 66, 16, 62, 16, 64, 16};
byte song_buffer04[14] = {140, 1, 5, 66, 16, 67, 16, 64, 16, 66, 16, 71, 64};
byte song_buffer05[18] = {140, 2, 7, 71, 16, 67, 16, 64, 16, 62, 16, 61, 48, 62, 16, 62, 64};

SoftwareSerial device(10, 12);

void setup() {
 device.begin(115200);
 device.write(128);
 delay(20);
 device.write(130);
 delay(20);
 device.write(song_buffer01, 24);
 delay(20);
 playMeasure(4000, 1);
 device.write(song_buffer02, 22);
 delay(20);
 playMeasure(4000, 2);
 playMeasure(4000, 1);
 playMeasure(4000, 2);
 device.write(song_buffer03, 20);
 delay(20);
 playMeasure(2000, 3);
 device.write(song_buffer04, 14);
 delay(20);
 playMeasure(2000, 1);
 device.write(song_buffer05, 18);
 delay(20);
 playMeasure(4000, 2);
}
void playMeasure(int wait, byte song) {
 device.write(141);
 device.write(song);
 delay(wait);
}
void loop() {
}
  • シリアルでデバッグしながらの作業を行ったため、ルンバとの通信はsoftwareserialを使っています。
  • 曲を書き込んだ後は、20msec程度のdelayを掛けないと、再生が上手く行きませんでした。EEPROMをいじっていた時も似たような現象があったので、割りと時間掛からずに原因を絞れました。
  • 115200は780のデフォルトのbpsです。

ルンバ-Arduino間に、作ったケーブルを配線し、スケッチを書き込んで実行すると、冒頭の動画のように演奏されます。

IMG_5888

応用

曲の登録と演奏を小刻みに繰り返せば、おそらくキーボードからのMIDI OUTをArduino側で受け付け、ルンバで演奏出来るはずです。

070504

ルンバのMIDI音源化に挑戦したい所です。出来れば無線経由で。

 

 

以上、よろしくお願い致します。

 - 電子工作

  関連記事

マウスの位置座標を使った電子楽器を作ってみた。

お疲れ様です。高橋です。 先日分解したマウスを使って、位置座標の取り出しと、取り …

USBカメラ+Raspberry Pi

お疲れ様です。高橋です。 USBカメラをRaspberryPiに装着し、ストリー …

PCとArduino間でのシリアル通信を介したEEPROM書き込み(難航)

お疲れ様です。高橋です。 Arduino Pro MiniでI2C EEPROM …

遠隔でRaspberryPi+DCモーターを制御 #2

お疲れ様です。高橋です。 WiMAXが上限オーバー 私の家の自宅回線はWiMAX …

マウスを分解してみた。

お疲れ様です。高橋です。 壊れたマウスを貰った 先日、壊れたマウスを貰いました。 …

上司離着席検知システムと空巣検知

お疲れ様です。高橋です。 前回のおさらいと課題 前回の「上司離着席検知システムの …

EEPROM書き込みシールドの作成

お疲れ様です。高橋です。 先日成功したPCからのEEPROM書き込みですが、ジャ …

100均で買ったボリュームコントロール付きステレオ延長コードを、バブ型スピーカーに搭載してみた。

お疲れ様です。高橋です。 先日作ったバブ型スピーカーですが、実は裏側がとても汚い …

Arduino nano互換機でオナラ検知デバイス

お疲れ様です。高橋です。 今日のお昼、会社の大先輩から、綺麗にケーシングした自作 …

耳コピミキサー 試作

お疲れ様です。高橋です。 iPhoneから流す音と電子ピアノから流す音を合成する …