2024年11月7日
002-1.NXT ソフトウェア入門-第4回「ライントレースのプログラム」
レゴマインドストームNXTのプログラム開発環境「NXTソフトウェア」について紹介していくコーナーです。
前回と前々回では「センサー」と「モーター」について紹介をしてきました。そこで、今回はその2つを
組み合わせて、簡単なロボットを作ってみたいと思います(文/松原 拓也)。

簡単に作れるロボットとして、代表的なものが「ライントレースロボット」です。ライントレースロボットとは、線の上をなぞって(トレースして)走るロボットのことです。
この「線の上を走る」という技術は、ロボット競技の世界でも
盛んに取り入れられています。

まずは、ロボットを組み立てます。インテリジェントブロック1個、
モーター2個、ライトセンサー1個を用意してください。
モーターは出力ポートAとポートCに接続します。

ライトセンサーは入力ポート1に接続します。このセンサーを
使って、床面の「白」と「黒」を判別します。
赤い部分のパーツはミニフィグ用の帽子です。一般用のNXTには入っていませんので、似た部品で代用してください。

まずはライトセンサーの特性を調べるために、NXTソフトウェアを使って簡単なプログラムを作ってみました。
[DOWNLOAD]作成したプログラム(NXTソフトウェア用)

プログラムを実行すると、ライトセンサーのカウント値が表示されます。
センサーに入る光が多い(明るい)ほど、カウント値が大きくなります。

製品に付属するライントレース用のシートでカウント値を測ってみた結果がこちらです。
「白」と「黒」で約30カウントの差が見られました。

なお、ライトセンサーと床面の距離は約7mmに合わせています。

これはライトセンサーと床面との距離に対しての測定値の変化を表したグラフです(色は白)。
同じ「白」でも距離が違うだけで、こんなにも測定値が変わってしまいます。
センサーは近付きすぎると正しく測定できません。 センサーの距離はできるだけ均一に保つようにしたほうがようさそうです。
◆ プログラムその1

教育用NXTの場合、「ロボットエデュケーター」に
「ラインの上を進む」というプログラムが紹介されています。
これがライントレースロボットのプログラムです。

そのプログラムを真似をして作ってみたものがこちらです。
[DOWNLOAD]作成したプログラムその1(NXTソフトウェア用)
「スイッチ(分岐命令)」は「光センサー」に設定します。センサーの比較する値は32~62の中間ということで「47」が最適だと思います。

プログラムを実行させてみました。
ロボットがラインの上を進んで移動します。成功です。
ただし、動きがガクガクしています。

ロボットの動きを図にすると、このようになります。
矢印がロボットの進む方向です。線の「白」と「黒」の境界をジグザクに進んでいます。赤い矢印が「黒の検出」、青い矢印が「白の検出」をするための動きです。
◆ プログラムその2~3
先ほど作ったプログラムでは、ロボットの動きがガクガクしていたので直したいと思います。

「次の動作」のラジオボタンを「惰性運転」にセットします。
[DOWNLOAD]作成したプログラムその2(NXTソフトウェア用)
こうすることによって、モーターが停止後も惰性で回転するので
ガクガクした動きが薄れると思います。

さらにプログラムを改良したのがこちらです。
[DOWNLOAD]作成したプログラムその3(NXTソフトウェア用)
スイッチ(分岐)ブロックがなくなって、かわりに2つのループになりました。

「白」のしきい値は「52」としました。実測した白のカウント値=62から10引いた値です。

「黒」のしきい値は「42」としました。実測した黒のカウント値=32に10足した値です。
前回のプログラムでは1つだけの「しきい値」で白/黒を判別していました。
それに対して今回は、黒検出用と白検出用で2つのしきい値を
用意しています。つまり「判定を厳しく」しています。
こうすることによって、動きに確実性が増すというメリットがありますが、反応は鈍くなるというデメリットがあります。
◆ プログラムその4

先のプログラムをさらに改良したのが、こちらです。
[DOWNLOAD]作成したプログラムその4(NXTソフトウェア用)
いったい何が違っているのか分かりますでしょうか?
実は白/黒の判定が2倍に増えています。

このプログラムによるロボットの動きを図にするとこうなります。
赤い矢印が「黒」を探す動き、青い矢印が「白」を探す動きです。
前回は白/黒の境界を「片方だけ」走っていたのに対して、
今回は「両方を」交互に走るようにプログラムしています。
こうすると、1歩あたりの進む距離がかせげるので移動の速度が上がるのでは、、、と思ったのですが、コースアウト(線から飛び出してしまう)の危険が増えてしまいます。
◆ プログラムその5

先のプログラムを改良して、コースアウトを防止する機能を盛り込んだのがこちらです。
処理を増やしたので、かなりの超大作になってしまいました。
[DOWNLOAD]作成したプログラムその5(NXTソフトウェア用)

プログラムには3つの変数が必要です。これらはすべて「ロジック」という形式で、「正」と「偽」の2種類のうちどちらかが入ります。
- 変数名「ロジック1」:偽=白を検出/正=黒を検出
- 変数名「変数_1」:偽=検出中/正=検出終了
- 変数名「変数_2」:偽=左旋回/正=右旋回
プログラムは長いので、3つに分割して紹介します。

序盤の1/3です。
変数の初期化のあと、モーターを回してロボットの右旋回または左旋回を行います。

中盤の2/3です。
白検出または黒検出をしています。 検出が終わると終了フラグが「正」になります。 タイマーのスイッチがコースアウトの判定処理です。もし、1秒以内に白/黒の境界を検出できない場合には強制的にループを終了させます。こうすると、白/黒を探し続けて旋回しすぎるということがなくなるはずです。

終盤の3/3です。
白検出←→黒検出のフラグを反転します。そして、白検出が終了したタイミングで、左右の旋回フラグを反転します。こうすることで線の上をジグザグに進むことができます。

実際に動かしてみました。コースアウトすると、自動的に旋回の向きが戻ります。
ただし、戻りの量が足りず、脱線したラインに復帰できなくなるケースが多いようです。もう一工夫が必要です。
意図的に機首を左右に振るようにしてみましたが、移動の効率はあまり向上していないように思えます。
速くて確実なロボットを作るのは難しいなと思いました。
ロボットをさらに改良するアイデアを紹介します。参考にしてみてください。
- ライトセンサーを左右に2個取り付ける。センサーで反応した時だけ方向転換をさせれば、ジグザグ移動しなくて済むのでは?
- 左右のモーターを完全に止めないようにしてみる。急には曲がれなくなるが、直進性は増すのでは?
- タイヤの角度を動かせる機構を付けて、方向転換をさせる。
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。