Robotics Discovery Set を入手して最初にやったのが Ruputer での SCOUT 制御だった。何故なら LEGO 純正リモコンで SCOUT が制御出来るという話を聞いていたので、これは Ruputer でもコントロールできる!と確信していた。早速 Ruputer を取り出して実験してみたが、SCOUT は無反応だった。一体 Ruputer によるリモコン制御と LEGO 純正リモコンの動きはどこが違うのだろう....
そう思っていた矢先、くるとんさんから LEGO 純正リモコンが使用している制御コード情報を教えてもらった。今までは Kekoa さんの RCX Internal で解析されているモータ制御コード 0x21 を用いてモータの ON/OFF を行なっていた。しかし純正リモコンでは 0xd2 というリモコン専用コードが使われているのだ。
このコードを RCX に送ると、パラメータで指定したモータがしばらくの間回る。コードを RCX に送り続けることでモータを回し続けることが出来るようだ。なるほど純正リモコンは、ボタンを押している間だけモータが回り、離すと止まる。押している間だけコードが送信され続けているのだろう。今までの Ruputer でのコントロール方法は、モータ回転開始のコードを送り、その後回転停止のコードを送るまでモータが回り続けるしくみだった。そのためモータ回転停止のコードが RCX に届かなかった場合、RCX は暴走してしまうのだ。ああ、このしくみがもうちょっと早く分かっていれば、8月の LEGO-MUG Festival では恥をかかずに 済んだのに....(ToT)
早速 Ruputer プログラムを作ってみた。今までと違って Ruputer のカーソルポインタを倒している間だけ動くようになる。また SCOUT の制御と共用できるように Motor A と B を制御対象とするようにした。今までのように Motor A と C ではないので注意してもらいたい。
スティックを前に倒すと Motor A と B が正転で ON、後ろに倒すと Motor A と B が逆転で ON、左右に倒すとそれぞれ Motor A のみ、B のみが正転で ON する。
Ruputer ソフトの内部も作り替えた。キーの入力を直接読取るように変更した。そのためイベントを受け取る部分を削除してしまったので、もしかしたら時間の進みが変わるなど他に影響を与えるかもしれない。
リモコン用コード 0xd2 は、他のコードのように送信の度に bit3 を反転する必要が無いようだ。というか、SCOUT では bit3 を反転してもしなくても同じ動きをしたのだが、RCX の方が bit3 を反転させるとコマンドを認識しなかったので、0xd2 コードの時には反転させないようにした。また SCOUT はコマンド受信の ACK を返していないようなので、0xd2 コードの時には赤外線の受信を行なわないようにした。
今回の成果は全てくるとんさんの情報にかかっていた。この場を借りて深く深く感謝したい。
リモコン用コードにはプログラムの開始やメッセージ通知も含まれている。単なるモータの制御だけでなく、真に LEGO 純正リモコンの代わりになるようなアプリを早く構築したい。