VirtualBox(Host OS=Mountain Lion, Guest OS=Ubuntu 12.04)上でArduino UNOと通信する方法

長ったらしいタイトルだが、すっかりハマってしまったのと、かなり特殊な事例のようなので書き残しておく。

まず、目的を述べておくと、MacBookAir上のMountain Lionで動作させたVirtualBox上のUbuntu 12.04LTSで、Arduino UNOのプログラムを開発できるようにすること。なんでこんなことをしたいかというと、Ubuntu上でROSを動かしており、rosserialでArduinoと通信させたいからである。

当初は簡単に思えたが、結構ハマって時間がかかってしまった。

最初に思いついたのは、VirtualBoxの方でUSBコントローラを生かしておき、ArduinoのUSBデバイスをUbuntu側で認識させるというもの。このやり方だと認識はうまくいきUbuntu側のArduino IDEでコンパイルまではうまくいくものの、プログラムを転送する段になってエラーで止まってしまう。
ググってみても解決方法は見当たらないので、別の方法を試すことにした。

次の案は、VirtualBoxの仮想シリアルポートの機能を使うこと。VirtualBox VMの設定を見回したところ、シリアルポートを有効化して「ホストデバイス」なる指定を行うとうまくいきそうな感じである。実際、Host=Windowsであればうまくいく例もあるようだ。

Macの場合、シリアルポートのポート1を有効化してポートモードをホストデバイスに切り替え、ポート/ファイルパスを「/dev/cu.usbmodem621」に設定したところ、みごとUbuntuで/dev/ttyS0として認識され、問題なくプログラムが転送されるようになった。
ハマったのは最初はMac上のArduino IDEで認識される「/dev/tty.usbmodem621」を設定したところ、VirtualBox VMが起動せずにフリーズする現象にあったことだ。まだcuとttyの違いがよくわからない。
なお、621という数値部分は環境によって変わるかもしれない。うまくいかなければターミナル等で「ls /dev/cu.*」を実行して似たようなのを探すべきだろう。

とりあえずすっきりした。rosserialについては別記事にまとめる予定。