Linux上のRubyからBluetooth経由でLEGO MINDSTORMS NXTを制御♪
どうやらMINDSTORMSを教材にするらしく、しかもそれをプログラミングで制御させるとかいう荒技を強行するらしく、・・・らしく・・・らしく・・・らしく。
しかも安価に、比較的簡単なプログラム環境を望むらしいので、
RubyでMINDSTORMS NXTを制御する試み。
(LinuxでRubyならハード代だけでなんとかなるかな、と)
ネット上を徘徊していても、どうにも素直に成功する説明が見つからないので、各所の説明を継ぎ接いだりして結果的に成功したので覚え書き。
ちなみにディストリビューションはUbuntu7.10
ここのgemファイル(現在ruby-nxt-0.8.1.gem)をローカルにダウンロードして
gemでインストール
$gem install ruby-nxt-0.8.1.gem
このライブラリにはシリアルポートライブラリが必要らしいので、シリアルポートライブラリをインストール。
apt-get install libserialport-ruby
以下のページを参考に
/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を指定していなかった(別のデバイスを指定していた)。
同じ手順で作業しているのに、これを利用せずに動いているのが不思議でならない。
少なくとも自分の環境ではそれらのページのデバイス指定では動かなかったので、恐らく魔法を使っているのであろう・・・