富山県のITセンターで小学生向けのロボットプログラミング講習会をはじめたことがきっかけで,富山市のテクノホールで10月25,26日に開かれるITフェアの会場で実施される大人のロボコンの審判を務めることになった。競技は長い紆余曲折のあるコースをライントレースして進み,壁にぶつかったら,スタート位置まで折り返すというものだ。ライントレースの正確性を期すために,ラインのそばにペットボトルを配置したり,コースにしかけを設け,大人向きにする。ソフト開発,情報関連会社の社員のほかに富山商船高専の学生さんが競技に参加する。
これから作るコースのレイアウトをイメージしながら,ロボットを試作してみた。ライントレース用に,光センサーを下向きに二つ取り付けてある。その前にタッチセンサーを取り付けてあるのは,壁にぶつかったことをセンスし反転するためだ。
EclipseでJavaのプログラムを作ってみた。LeJOSのBehavior APIを使っている。ライントレースと壁にぶつかったときの反転処理はほぼ出来た。まだまだ考えの足りないプログラムだが,かと言ってここで紹介するわけにはいかない。
2002年に買った洋書を頼りに,Buttonを扱うプログラムを作ってみた。4年も経つのに,MindStromsのプログラム環境にはあまり変わりがない。バージョンアップが少ないのは教材としては利点であるが,MINDSTORMS NXTが出回ると大きく変わるかもしれない。
外からの光が差し込む会場でライントレース競技を行う場合,時間の経過とともに,コースが返す値が違ってくることが考えられる。競技会参加者のロボットが意図通りの動作をしないときに,コースの各色を自分のRCXで測り,状況の変化がないことを確かめることも審判の役割だ。ライトセンサーだけをつないだRCXを計測用に使うのだが,スマートに計測できるように,ボタンで光センサーをアクティブ/非アクティブ化し,他のボタンを押すと計測する,こんなプログラムを考えてみた。
---------------------------------------------------------- mport josx.platform.rcx.Button; public class WatchLight2 { public static void main (String[] args) { try { Button.PRGM.addButtonListener(new PrgmButtonListener()); Button.VIEW.addButtonListener(new ViewButtonListener()); Button.RUN.waitForPressAndRelease(); } catch (InterruptedException ie) { } } } ----------------------------------------------------------WatchLight2クラスはプログラムの実行を開始するmainメソッドを持っている。RCXには4つのボタンがある。赤いOn/Offのボタンを押すと電源が切れてしまうので使えない。Button.RUN.waitForPressAndRelease();は緑のRunボタンが押されるのを待つ。Runボタンを押すとプログラムは終了する。残りのボタンは二つである。プログラムを切り替えるPrgmボタンとViewボタンである。これらのボタンをListenerに追加している。
---------------------------------------------------------- import josx.platform.rcx.Button; import josx.platform.rcx.ButtonListener; import josx.platform.rcx.Sensor; import josx.platform.rcx.SensorConstants; import josx.platform.rcx.TextLCD; public class PrgmButtonListener implements ButtonListener { private boolean onOff; public PrgmButtonListener() { Sensor.S1.setTypeAndMode (SensorConstants.SENSOR_TYPE_LIGHT,SensorConstants.SENSOR_MODE_PCT); onOff = false; } public void buttonPressed(Button b) { if (onOff) { Sensor.S1.passivate(); onOff = false; TextLCD.print("pass"); } else { Sensor.S1.activate(); onOff = true; TextLCD.print("actv"); } } public void buttonReleased(Button b) { } } ----------------------------------------------------------Prgmボタンを押すとアクティブ化(activate())と非アクティブ化(passivate())をトグルするようにプログラムした。
LCD上にアクティブなのかそうでないのかを表示する。重要なのはactivate()したときに光センサーが点灯し,passivate()すると消えることだ。
---------------------------------------------------------- import josx.platform.rcx.Button; import josx.platform.rcx.ButtonListener; import josx.platform.rcx.LCD; import josx.platform.rcx.Sensor; public class ViewButtonListener implements ButtonListener { public void buttonPressed(Button b) { LCD.showNumber(Sensor.S1.readValue()); } public void buttonReleased(Button b) { } } ----------------------------------------------------------Viewボタンを押すと,readValue()で光センサーの値を読み取りLCDに表示する。
45という値を返している。passivate()した状態でViewボタンを押すと81や80という値を返すのだが,これは何の値なのだろうか?