各デバイスは、何ができるのかを知っておかないと、それらを組み合わせて何ができるのかを考えることができません。また、同じように見える光センサーや、ジャイロセンサーでも、それぞれの個体差があります。これらもしっかりと把握しておく必要があるでしょう。
すべてのセンサーやモーターについて調査しておくことが望ましいですが、ここでは、光センサーや超音波センサーを例に取って調べてみましょう。
光センサーの距離特性
光センサーは、発光ダイオードが照射した反射光の強さから明るさを数値で返してくれるセンサーです。この光センサーの特性を計測してみました。
コースとの距離を変えて、実際に計測できる値がどの様な値になるかをグラフに表しました(図4)。

|
図4:光センサーは対象物に近すぎると正しい値を取得できない |
ここからわかるように、光センサーは、対象物に近すぎると正しい値を取得できません。また、光センサーの値は、同じ対象物の明るさを測定していても、対象物との距離によって大きく変化するということがわかります。「シーソー」や「階段」「坂道」では、光センサーとコースとの距離が変わるため、影響がありそうだということがわかります。
超音波の距離特性
超音波センサーは、ある物体までの距離を返してくれるセンサーです。この超音波センサーの特性を計測してみました。
物体との距離を変えて、実際に計測できる値がどの様な値になるかをグラフに表しました(図5)。
 |
 |
|
 |
図5:壁までの距離によって超音波センサーが正しい値を読み取れない場合がある
左はセンサーが超音波を反射するイメージ |
ここからわかるように、壁までの距離が近すぎると、正しい値を読み取ることができません。さらに、85cm~100cmのところで計測不能になることがあるので、この時の値を考慮しないと誤動作を起こす可能性があります。
今回は、光センサーと超音波センサーの特性を紹介しましたが、これら以外のデバイスに関しても、特性を把握しておくと良いでしょう。そして、先ほど考えたユニットは、これらのデバイスの特性を考慮した上で、それぞれの役割を達成する様に作成する必要があります。
競技をこなせるようにロボットを構成する
難所をクリアするのは、チャレンジャーになった時に考えるとして、まずはライントレース競技をこなせるようにモデル図を考えてみましょう。
ライントレース競技は、スタートスイッチを押すと走行を始めます。それまでは動きません。走行を始める前に、ジャイロセンサーなどの初期値の設定をしておきます。さらに、もう一度スタートスイッチを押すと止まる様にしておきます。これをステートマシン図で表してみましょう(図6)。

|
図6:走行体の動作を制御するステートマシン図(クリックで拡大) |
このステートマシン図は、先ほどのクラス図のRunnerクラスがやりたかった、競技をするということを表しています。
さて、ここからは前回連載した、マインドストーム活用のエンジニア教育「第4回 プログラムはモデルとルールで作る」を参考にして、プログラムを作成してみましょう。
イベントの監視とイベントの発生を処理して現在の状態を更新するという部分のソースコード
01 | <!--//--><![CDATA[// ><!-- |
07 | void RN_watch_switch() { |
08 | if (SS_is_clicked()) { //スタートスイッチがクリックされたら |
10 | case (RN_STATE_RADY): //準備中状態の時 |
11 | RN_set_state(RN_STATE_RUN); //走行中状態に遷移する |
14 | case (RN_STATE_RUN): //走行中状態の時 |
15 | RN_set_state(RN_STATE_STOP); //停止中状態に遷移する |
18 | case (RN_STATE_STOP): //停止中状態の時 |
19 | RN_set_state(RN_STATE_RUN); //走行中状態に遷移する |
遷移が起きた時の処理は、別の周期タスクで実行するという部分のソースコード
01 | <!--//--><![CDATA[// ><!-- |
09 | case (RN_STATE_RADY): //準備中状態の時 |
12 | case (RN_STATE_RUN): //走行中状態の時 |
13 | TR_linetrace(25, 100); //ライントレースする |
16 | case (RN_STATE_STOP): //停止中状態の時 |
Tracerクラスのライントレースをする部分のソースコード
01 | <!--//--><![CDATA[// ><!-- |
06 | void TR_linetrace(int forward_speed, int turn_speed) { |
10 | BLNU_forward(forward_speed); |
12 | /* ラインの状態を判断して回転方向を決める */ |
14 | light_value = LMU_is_online(); |
16 | if (TRUE != light_value) { //オフラインの時 |
17 | BLNU_turn_right(turn_speed); //右に曲がる |
19 | BLNU_turn_left(turn_speed); //左に曲がる |
今回のサンプルプログラムは、ここからダウンロードできます。
ダウンロードが完了したら、まず次の環境設定をしてください。
nxtOSEKインストールディレクトリのecrobot/c/ectobot_interface.hの74行目付近にある
1 | <!--//--><![CDATA[// ><!-- |
3 | /* NXT servo motor API */ |
4 | extern S32 ecrobot_get_motor_rev(U8 port_id); extern void |
5 | ecrobot_set_motor_speed(U8 port_id, S8 speed); extern void |
6 | ecrobot_set_motor_mode_speed(U8 port_id, S32 mode, S8 speed); |
というところの最後に、
1 | <!--//--><![CDATA[// ><!-- |
3 | extern void ecrobot_set_motor_rev(U8 port_id, S32 rev); |
という宣言を追加して、
1 | <!--//--><![CDATA[// ><!-- |
3 | /* NXT servo motor API */ |
4 | extern S32 ecrobot_get_motor_rev(U8 port_id); extern void |
5 | ecrobot_set_motor_speed(U8 port_id, S8 speed); extern void |
6 | ecrobot_set_motor_mode_speed(U8 port_id, S32 mode, S8 speed); extern |
7 | void ecrobot_set_motor_rev(U8 port_id, S32 rev); |
のように編集して、ファイルを保存してください。
サンプルプログラムの動かし方
- ダウンロードしたファイルを解凍します。Runnerというフォルダが作成されます。
- 解凍したファイルをnxtOSEK\samples_jspというフォルダの配下にコピーします。
※通常は、c:\cygwin\nxtOSEK\samples_jsp です。
- Cygwinを立ち上げて、Runner_thinkIT_v1フォルダをカレントフォルダにします。
- Cygwin で make clean all を実行して、コンパイルをします。
- コンパイルが成功すると、rxeflash.sh が作成されます。
- 教育用レゴ マインドストームNXTの電源を入れて、コンピュータとUSBケーブルで接続します。
- Cygwin で ./rxeflash.sh を実行して、プログラムをダウンロードします。
- ロボットを動かさないようにして、RunnerThinkIT を実行します。この時、ジャイロセンサーの初期値が設定されますので、動かさないということがポイントです。
ロボットを立ててタッチセンサーを押すとライントレースを始めます。もう一度タッチセンサーを押すと倒立したまま停止します。
ロボットの構成は、次のようになっています。違うポートにセンサーをつなげている時には、プログラムかロボットを対応するようにしてください。
右モーター |
Bポート |
左モーター |
Cポート |
タッチセンサー |
1番ポート |
超音波センサー |
2番ポート |
光センサー |
3番ポート |
ジャイロセンサー |
4番ポート |
実際には、このように動くでしょう。
今回は、 ETロボコンの紹介と、ライントレースをする部分をやってみました。次回は、もうちょっとスムーズに動かしてみたいと思います。お楽しみに。
(写真協力:ETロボコン実行委員会)
- [*1]「教育用レゴ マインドストームNXT」は、レゴグループの登録商標です。
- [*2]教育用LEGO Mindstorms NXTにレゴ社純正ファームウエア以外のファームウエアを使用すると、レゴ社の製品保証を受け受けることができなくなります。利用者の責任において利用してください。
- [編集部注] 3ページ目の図4に一部誤りがあったため修正いたしました。(2010.08.18)
- [編集部注] 3ページ目にサンプルプログラムの環境設定を加えました。(2010.09.01)