ETロボコンを仕事に役立てる

2010年8月2日(月)
軽部 禎文

各デバイスは、何ができるのかを知っておかないと、それらを組み合わせて何ができるのかを考えることができません。また、同じように見える光センサーや、ジャイロセンサーでも、それぞれの個体差があります。これらもしっかりと把握しておく必要があるでしょう。

すべてのセンサーやモーターについて調査しておくことが望ましいですが、ここでは、光センサーや超音波センサーを例に取って調べてみましょう。

光センサーの距離特性

光センサーは、発光ダイオードが照射した反射光の強さから明るさを数値で返してくれるセンサーです。この光センサーの特性を計測してみました。

コースとの距離を変えて、実際に計測できる値がどの様な値になるかをグラフに表しました(図4)。

図4:光センサーは対象物に近すぎると正しい値を取得できない

ここからわかるように、光センサーは、対象物に近すぎると正しい値を取得できません。また、光センサーの値は、同じ対象物の明るさを測定していても、対象物との距離によって大きく変化するということがわかります。「シーソー」や「階段」「坂道」では、光センサーとコースとの距離が変わるため、影響がありそうだということがわかります。

超音波の距離特性

超音波センサーは、ある物体までの距離を返してくれるセンサーです。この超音波センサーの特性を計測してみました。

物体との距離を変えて、実際に計測できる値がどの様な値になるかをグラフに表しました(図5)。

図5:壁までの距離によって超音波センサーが正しい値を読み取れない場合がある
左はセンサーが超音波を反射するイメージ

ここからわかるように、壁までの距離が近すぎると、正しい値を読み取ることができません。さらに、85cm~100cmのところで計測不能になることがあるので、この時の値を考慮しないと誤動作を起こす可能性があります。

今回は、光センサーと超音波センサーの特性を紹介しましたが、これら以外のデバイスに関しても、特性を把握しておくと良いでしょう。そして、先ほど考えたユニットは、これらのデバイスの特性を考慮した上で、それぞれの役割を達成する様に作成する必要があります。

競技をこなせるようにロボットを構成する

難所をクリアするのは、チャレンジャーになった時に考えるとして、まずはライントレース競技をこなせるようにモデル図を考えてみましょう。

ライントレース競技は、スタートスイッチを押すと走行を始めます。それまでは動きません。走行を始める前に、ジャイロセンサーなどの初期値の設定をしておきます。さらに、もう一度スタートスイッチを押すと止まる様にしておきます。これをステートマシン図で表してみましょう(図6)。

図6:走行体の動作を制御するステートマシン図(クリックで拡大)

このステートマシン図は、先ほどのクラス図のRunnerクラスがやりたかった、競技をするということを表しています。

さて、ここからは前回連載した、マインドストーム活用のエンジニア教育「第4回 プログラムはモデルとルールで作る」を参考にして、プログラムを作成してみましょう。

イベントの監視とイベントの発生を処理して現在の状態を更新するという部分のソースコード

01<!--//--><![CDATA[// ><!--
02 
03/**
04 * StartswitchUnitの監視
05 * イベントの監視をする
06 */
07void RN_watch_switch() {
08    if (SS_is_clicked()) { //スタートスイッチがクリックされたら
09        switch (RN_state) {
10        case (RN_STATE_RADY): //準備中状態の時
11            RN_set_state(RN_STATE_RUN); //走行中状態に遷移する
12            break;
13 
14        case (RN_STATE_RUN): //走行中状態の時
15            RN_set_state(RN_STATE_STOP); //停止中状態に遷移する
16            break;
17 
18        case (RN_STATE_STOP): //停止中状態の時
19            RN_set_state(RN_STATE_RUN); //走行中状態に遷移する
20            break;
21 
22        default:
23            /* DO NOTHING*/
24            break;
25        }
26    }
27}
28 
29//--><!

遷移が起きた時の処理は、別の周期タスクで実行するという部分のソースコード

01<!--//--><![CDATA[// ><!--
02 
03/**
04 * Runnerの状態遷移
05 * 遷移が起きたときの処理を実行する
06 */
07void RN_play_game() {
08    switch (RN_state) {
09    case (RN_STATE_RADY): //準備中状態の時
10        break;
11 
12    case (RN_STATE_RUN): //走行中状態の時
13        TR_linetrace(25, 100); //ライントレースする
14        break;
15 
16    case (RN_STATE_STOP): //停止中状態の時
17        TR_stop(); //停止する
18        break;
19 
20    default:
21        /* DO NOTHING*/
22        break;
23    }
24}
25 
26//--><!

Tracerクラスのライントレースをする部分のソースコード

01<!--//--><![CDATA[// ><!--
02 
03/**
04 * ライントレースする
05 */
06void TR_linetrace(int forward_speed, int turn_speed) {
07    /* バランスを開始する */
08    BLNU_balance_start();
09    /* 前進する */
10    BLNU_forward(forward_speed);
11 
12    /* ラインの状態を判断して回転方向を決める */
13    int light_value = 0;
14    light_value = LMU_is_online();
15 
16    if (TRUE != light_value) {            //オフラインの時
17        BLNU_turn_right(turn_speed);      //右に曲がる
18    } else {                                   //オンラインの時
19        BLNU_turn_left(turn_speed);        //左に曲がる
20    }
21}
22 
23//--><!

今回のサンプルプログラムは、ここからダウンロードできます。

ダウンロードが完了したら、まず次の環境設定をしてください。

nxtOSEKインストールディレクトリのecrobot/c/ectobot_interface.hの74行目付近にある

1<!--//--><![CDATA[// ><!--
2 
3/* NXT servo motor API */
4extern  S32 ecrobot_get_motor_rev(U8 port_id); extern void
5ecrobot_set_motor_speed(U8 port_id, S8 speed); extern void
6ecrobot_set_motor_mode_speed(U8 port_id, S32 mode, S8 speed);
7 
8//--><!

というところの最後に、

1<!--//--><![CDATA[// ><!--
2 
3extern void ecrobot_set_motor_rev(U8 port_id, S32 rev);
4 
5//--><!

という宣言を追加して、

1<!--//--><![CDATA[// ><!--
2 
3/* NXT servo motor API */
4extern  S32 ecrobot_get_motor_rev(U8 port_id); extern void
5ecrobot_set_motor_speed(U8 port_id, S8 speed); extern void
6ecrobot_set_motor_mode_speed(U8 port_id, S32 mode, S8 speed); extern
7void ecrobot_set_motor_rev(U8 port_id, S32 rev);
8 
9//--><!

のように編集して、ファイルを保存してください。

サンプルプログラムの動かし方

  1. ダウンロードしたファイルを解凍します。Runnerというフォルダが作成されます。
  2. 解凍したファイルをnxtOSEK\samples_jspというフォルダの配下にコピーします。
    ※通常は、c:\cygwin\nxtOSEK\samples_jsp です。
  3. Cygwinを立ち上げて、Runner_thinkIT_v1フォルダをカレントフォルダにします。
  4. Cygwin で make clean all を実行して、コンパイルをします。
  5. コンパイルが成功すると、rxeflash.sh が作成されます。
  6. 教育用レゴ マインドストームNXTの電源を入れて、コンピュータとUSBケーブルで接続します。
  7. Cygwin で ./rxeflash.sh を実行して、プログラムをダウンロードします。
  8. ロボットを動かさないようにして、RunnerThinkIT を実行します。この時、ジャイロセンサーの初期値が設定されますので、動かさないということがポイントです。

ロボットを立ててタッチセンサーを押すとライントレースを始めます。もう一度タッチセンサーを押すと倒立したまま停止します。

ロボットの構成は、次のようになっています。違うポートにセンサーをつなげている時には、プログラムかロボットを対応するようにしてください。

右モーター Bポート
左モーター Cポート
タッチセンサー 1番ポート
超音波センサー 2番ポート
光センサー 3番ポート
ジャイロセンサー 4番ポート

実際には、このように動くでしょう。

今回は、 ETロボコンの紹介と、ライントレースをする部分をやってみました。次回は、もうちょっとスムーズに動かしてみたいと思います。お楽しみに。

(写真協力:ETロボコン実行委員会)

  • [*1]「教育用レゴ マインドストームNXT」は、レゴグループの登録商標です。
  • [*2]教育用LEGO Mindstorms NXTにレゴ社純正ファームウエア以外のファームウエアを使用すると、レゴ社の製品保証を受け受けることができなくなります。利用者の責任において利用してください。
  • [編集部注] 3ページ目の図4に一部誤りがあったため修正いたしました。(2010.08.18)
  • [編集部注] 3ページ目にサンプルプログラムの環境設定を加えました。(2010.09.01)
株式会社アフレル
(株)アフレル所属。システム開発の経験を積んだ後に、ロボットを使った教育教材の開発や指導に従事。子供から大人まで、いかに楽しく学んでもらえるか悩みながら、日々、精進中。
http://www.afrel.co.jp/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています