前回の記事では Mac に ruby-nxt をインストールして NXT をコントロールすることに成功したわけですが、今度は Windows マシンに ruby-nxt をインストールしてみたいと思います。
Windows 上で Ruby を使う方法はいくつかあると思いますが、今回は Cygwin の Ruby を使ってみたいと思います。
それから、Bluetooth 接続を前提にしていますので、Bluetooth 対応の PC を使用するか、Bluetooth のドングルを購入しておいてください。(ただ、NXT との相性問題がけっこうあるようです。私は PLANEX の BT-MiniEDR で一応は動作を確認しました。が、ちょっと調子が悪いのでこのあたりの詳しい話は後ほど。)
Ruby のバージョンチェック
まずは Cygwin の setup.exe を使って、Ruby を最新版にアップデートしておきましょう。
今回は Ruby のパッケージは 1.8.6-1 になりました。
$ ruby --version
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-cygwin]
ruby-serialport のインストール
それでは、Mac の時と同様、まずは ruby-serialport をインストールしましょう。
ruby-serialport プロジェクトのページから、ruby-serialport-0.6.tar.gz をダウンロードします。
ダウンロードしたら展開し、以下の順にコマンドを実行します。(Mac 編と同様ですね)
$ ruby extconf.rb
$ make
$ make install
RubyGems のインストール
ruby-nxt は RubyGems を使ってインストールしようと思いますので、Cygwin の Ruby 環境にまだ RubyGems をインストールしていない場合、以下のような手順でインストールします。すでに RubyGems がインストール済みならこのステップを飛ばしてください。
RubyGems プロジェクトのページから最新版をダウンロードして展開します。
今回は rubygems-0.9.5.zip をダウンロードして展開しました。
展開したディレクトリに移動して、
$ ruby setup.rb
を実行します。
ruby-nxt のインストール
いよいよ ruby-nxt をインストールします。
ruby-nxt プロジェクトのページから最新版の gem をダウンロードしてきます。
今回は ruby-nxt-0.8.1.gem をダウンロードしてきました。
(例によって、リモートから直接インストールがうまくいかなかったので・・・コマンドの入力の仕方が間違ってるだけのような気もしますが。うまくいった方がいらっしゃったらご教授ください)
gem をダウンロードしたら、インストールを行います。
$ gem install ruby-nxt-0.8.1.gem
Successfully installed ruby-nxt-0.8.1
1 gem installed
Installing ri documentation for ruby-nxt-0.8.1...
Installing RDoc documentation for ruby-nxt-0.8.1...
NXT と Bluetooth で接続
今回一番苦労したのはここです。
正確には Bluetooth 接続自体はあっけなく完了したのですが、テストプログラムによる COM ポート経由のアクセスがまったくうまくいきませんでした。
当初、VAIO に標準搭載の Bluetooth を使っていたのですが、何度やっても COM ポートへのアクセスが Permission Denied となってしまいました。
NXT 用には COM40 というちょっと大きな数字の COM ポートが割り当てられていたので、
Cygwin で /dev/com40 に対して /dev/tty.NXT-DevB-1 というシンボリックリンクを作成しました。
その状態でテストプログラムを実行すると、どうしても Permission Denied となってしまいます。
もちろん、dev ファイルの permission は何度も確認しました。
ネット上で情報を捜し求めると、どうやら Toshiba 製の Bluetooth スタック(ドライバ)と NXT は相性が悪いようです。ドライバを Microsoft 製にするとよいという情報も見つけました。
確かに VAIO に搭載されている Bluetooth のドライバは東芝製でした。しかしながら、その標準のドライバをアンインストールして MS 製に変更するのはなんとなく危険な感じがしてイヤだったので、以前デスクトップマシン用に購入した BT-miniEDR を VAIO に装着してみました。
すると、Microsoft 製のドライバがインストールされ、仮想 COM ポート 5 が NXT に割り当てられました。
(ちなみに、この VAIO の OS は Windows XP です。Windows Vista だとまた別のドライバがインストールされるかもしれません)
この状態でテストプログラムを動かしてみたところ、Permission Denied からは一歩前進して、コマンドの送信は行われているようなのですが、結果の受信でエラーが起きている様子です。
うーん、と悩んでしまったのですが、デバイスマネージャ等でよく見てみると、
COM5 MS 製ドライバ
COM6 Toshiba 製ドライバ
COM7 MS 製ドライバ
という順に並んでいて、なんだかこの COM6 が悪さをしているような気がしましたので、COM6 と COM7 をデバイスマネージャで削除してから「ハードウェア変更のスキャン」をしてみたところ、ドライバが再度インストールしなおされて
COM5 MS 製ドライバ
COM6 MS 製ドライバ
COM7 Toshiba 製ドライバ
の順に並び変わりました。
ただ、この後もいつの間にか COM7 にしたはずの Toshiba のポートが COM6 に戻っていたりしたので、このポートだけは無効にしておいたほうがいいかもしれません。
[追記]
コントロールパネルの Bluetooth Local COM を開き、Toshiba に割り当てられている COM6 を削除したらうまくいくようになりました。
(COM6 の [説明] の欄が Toshiba BT Port だったのが空欄になり、COM5, COM6 がともに [所有者] の欄が "システム" になりました)
デバイスファイルの作成
Cygwin では、NXT と接続するための仮想 COM ポートのデバイスファイルへのシンボリックリンクを自分で作成する必要があります。(これは一度だけ実行すれば十分です。)
ln -s /dev/com5 /dev/tty.NXT-DevB-1
というコマンドを実行してください。
com5 のところは、各自の環境に合わせて適切な数字に変更してください。
テストプログラムを実行
ruby-nxt に付属のテストプログラムを実行します。
/usr/lib/ruby/gems/1.8/gems/ruby-nxt-0.8.1/ にインストールされているテストプログラムをホームディレクトリ等にコピーしてきて使いましょう。
実行する前に、Mac 編の時と同様、テストプログラムを修正する必要があります。
まずは test/test.rb を修正します。
require 'rubygems'
という行を先頭のほうに追加しておいてください。
それでは Bluetooth で接続されていることを確認したら、test/test.rb を実行してみましょう。
$ ruby test.rb
NXT からピッと聞こえたら成功です。
一度成功した後に、もう一度実行しようとしたら Permission Denied になってしまうことがたまにありますが、そのときは NXT 側の Bluetooth を一度 OFF にして再度 ON にするとうまくつながることがあります。
もうひとつのテストプログラム実行
つぎは test/unit ディレクトリに含まれている nxt_comm_test.rb を実行しましょう。
これも先ほどと同様 require 'rubygems' を追加しておいてください。
$ ruby nxt_comm_test.rb
Loaded suite nxt_comm_test
Started
............ERROR: Data contains out-of-range values
F...ERROR: No active program
F.ERROR: Data contains out-of-range values
F
Finished in 16.751 seconds.
1) Failure:
test_play_sound_file(NXTCommTest) [nxt_comm_test.rb:45]:
<false> is not true.
2) Failure:
test_start_stop_program(NXTCommTest) [nxt_comm_test.rb:31]:
<false> is not true.
3) Failure:
test_stop_sound_playback(NXTCommTest) [nxt_comm_test.rb:125]:
<false> is not true.
19 tests, 40 assertions, 3 failures, 0 errors
こんどはなにやらエラーが3件ほど表示されてしまいました。
Bluetooth 接続に関していろいろと試行錯誤している間に、NXT のファームウェアのバージョンを 1.0.2 から 1.0.5 に上げたりしたのが原因でしょうか。
これについては追って原因を調査したいと思います。