Linux上のRubyからBluetooth経由でLEGO MINDSTORMS NXTを制御♪

どうやらMINDSTORMSを教材にするらしく、しかもそれをプログラミングで制御させるとかいう荒技を強行するらしく、・・・らしく・・・らしく・・・らしく。
しかも安価に、比較的簡単なプログラム環境を望むらしいので、


RubyMINDSTORMS NXTを制御する試み。
(LinuxRubyならハード代だけでなんとかなるかな、と)


ネット上を徘徊していても、どうにも素直に成功する説明が見つからないので、各所の説明を継ぎ接いだりして結果的に成功したので覚え書き。


ちなみにディストリビューションはUbuntu7.10



ここのgemファイル(現在ruby-nxt-0.8.1.gem)をローカルにダウンロードして

http://rubyforge.org/frs/?group_id=2166&release_id=7723


gemでインストール

$gem install ruby-nxt-0.8.1.gem


このライブラリにはシリアルポートライブラリが必要らしいので、シリアルポートライブラリをインストール。

apt-get install libserialport-ruby


以下のページを参考に

Tony Buser (@tbuser) | Twitter


/etc/bluetooth/rfcomm.confを

rfcomm0 {
        bind yes;
        # Bluetooth address of the device
        device 00:16:53:04:B3:46;
        # RFCOMM channel for the connection
        channel 1;
        # Description of the connection
        comment "NXT";
}

てな感じに書き換える。
このときのdeviceは

$hcitool scan

で返ってくるMINDSTORMS NXTのデバイスIDを記述。


登録情報を確認したければ

$rfcomm

で見れる。


そのあととりあえずBluetoothをリスタート。

$/etc/init.d/bluetooth restart

そしたらMINDSTORMS本体から[bluetooth]-[My contacts]-[PC名]-[connect]-[1]で接続。
PC側に接続要求がくるので、Bluetoothのパスワードを入力(MINDSTORMS側で設定しているはず)。


この時点でPCとMINDSTORMSの接続は確立されているはずなので、ついにRubyスクリプトを書き始める。

require 'rubygems'
require 'nxt_comm'

@nxt = NXTComm.new("/dev/rfcomm0")

def motor_a(rot)
   a = Commands::Motor.new(@nxt)
   a.port = :a
   a.duration = {:rotations => rot}
   a.control_power = true
   a.start
end

motor_a(1)


このプログラムでソケットAに接続したモーターが1回転するはず。


あとはシェルから、いつも通りRubyを実行。(ちゃんとBluetooth接続が確立されているのを確認して)
(今回はnxt.rbで保存した。)

$ruby nxt.rb


うまくいっていればモーターが回る。
その他の制御が知りたければ、ruby-nxtのパッケージ内のexamplesディレクトリ内のソースを見れば分かる。
今回実行したプログラムはcommands.rbのソースを参考に書いた。
センサーや音の再生もこの参考ソースに書いてあった。



多くの紹介ページでは、Bluetoothのシリアルポートを登録する際(/etc/bluetooth/rfcomm.confを書き換える時)、rfcomm0で登録しているのにも関わらず、Rubyのプログラム中で

@nxt = NXTComm.new("/dev/rfcomm0")

の様にrfcomm0を指定していなかった(別のデバイスを指定していた)。
同じ手順で作業しているのに、これを利用せずに動いているのが不思議でならない。
少なくとも自分の環境ではそれらのページのデバイス指定では動かなかったので、恐らく魔法を使っているのであろう・・・