モーターを回転させ,ただ移動するだけではロボットとは言えません。ロボットと車や他の機械を分けるものは何でしょうか。人間には,視覚,聴覚,触覚,…の五感があります。第六感というのもありますね。人間は無意識の内に目でみた情報,手で触って得た情報により行動を決定しています。ロボットでは,センサーが人間の五感にあたります。LEGO MindStorms Robotics Invention Systemには標準でタッチセンサーとライトセンサーが付属しています。オプションとして,角度センサーや温度センサーを買い足すこともできます。センサーは1,2,3と刻印された3つのグレーの入力ポート(2ポッチ×2ポッチのブロック)に接続して使います。
6-1.タッチセンサー
ロボットを改造しました。三輪車にして先端にタッチセンサーを取り付けました。小さなタイヤはロボットが曲がりやすいように固定していません。タッチセンサーに黄色い突起がついており,押すと引っ込むようになっています。押されている時と,いない時で違う値を返します。
さて,このタッチセンサーと前章のuntil文を使って何かにぶつかったら止まるロボットを作成してみましょう。
motor5.nqc
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetPower(OUT_A+OUT_C,OUT_LOW);
OnFwd(OUT_A+OUT_C);
until(SENSOR_1 == 1);
Off(OUT_A+OUT_C);
}
タッチセンサーは入力ポートの1番に繋がっています。1行目のSetSensorで1番のポート(SENSOR_1)に接続しているのは,タッチセンサー(SENSOR_TOUCH)であると指定しています。 until(SENSOR_1 = = 1)でセンサーが押されているかどうかチェックしています。このセンサーは押されていない時は0を返し,押されている時は1を返します。センサーが1になるまで,つまり何かにぶつかるまでこのロボットは前進します。平らなものにぶつかるようにして実験してみてください。タッチセンサーは黄色い突起を確実に押し込めないとセンス(感知)しませんので。
やわらかいものにぶつかった場合でも確実に止まるようにしたいと思います。どうすれば良いでしょうか?
バンパーを使います。バンパーを作り,どこにぶつかっても確実にタッチセンサーを押し込めるようにします。
黒いブロックがバンパーです。ここが,何かにぶつかるとタッチセンサーの黄色い突起が押し込まれるようにしています。
ソファーなどのやわらかいものにぶつかるように走らせて実験してみましょう。
6-2.ライトセンサー
ライトセンサーは光を発し,その反射を読み取ることで,光の量つまり明るさを0から100の数値で返します。(実際には20から70程度の範囲の値を返します。)明るい時は大きな値を,暗い時は小さな値を返します。
ライトセンサーを使って黒い線上をトレース(追跡)して走るロボットを作成します。
無限軌道車(ゴム製のキャタピラで走る車)を作成し,先端にライトセンサーを付けました。MindStorms付属のテストシート上を走らせるので,センサー部を下向きにしてあります。テストシートには楕円状に黒い線が印刷されています。
lightsn1.nqc
#define BUNKITEN 30
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
OnFwd(OUT_A+OUT_C);
while(true)
{
if (SENSOR_1 > BUNKITEN)
{
OnRev(OUT_C);
until(SENSOR_1 <= BUNKITEN);
OnFwd(OUT_A+OUT_C);
}
}
}
明るいと暗いの分岐点を30とし,BUNKITENという名前で定数定義しました。センサー1の返す値が30を超えたら明るい場所に来たと判断し,モーターCを逆転させ黒い線を探します。センサー1の返す値が30以下になったら,黒い線の上に戻ったと判断しモーターの回転方向を正方向に設定します。これでロボットは黒い線の上をトレースするように走ります。
もちろん,分岐点の数値は部屋の照明の明るさによって調整する必要があります。
6-3.角度(ローテーションセンサー)
角度センサーを使うとモーターの回転を厳密にコントールすることができます。角度センサーには小さな穴があいており,
この穴にモーターの軸を挿して回転量をはかります。1回転(360度)は16ステップに分割されます。逆方向への回転は-(マイナス)で表されます。角度センサーを使うと,ちょうど金庫のダイアルを回すような精密な動作を実現できます。
無限軌道車の上にモーターをつけ,モーターから伸ばした軸を角度センサーに通し,アームのようなものを作ってみました。下記のプログラムを実行するとアームが右に3回まわり,1秒間停止した後,左に2回まわります。
rota.nqc
task main()
{
SetSensor(SENSOR_1,SENSOR_ROTATION);
ClearSensor(SENSOR_1);
OnFwd(OUT_B);
until (SENSOR_1 > (16 * 3));
Off(OUT_B);
Wait(100);
ClearSensor(SENSOR_1);
OnRev(OUT_B);
until (SENSOR_1 < (-16 * 2));
Off(OUT_B);
}
SetSensor(SENSOR_1,SENSOR_ROTATION);で角度センサーとして入力ポート1を使用すると宣言し,ClearSensor(SENSOR_1);でセンサーの値を0に初期化しています。
OnFwd(OUT_B);でモーターを正回転させ,センサー1の値が3回転(16 * 3)になるまで回転させます。until (SENSOR_1 > (16
* 3));
(*は掛け算を行う符号です。)
次にOnRev(OUT_B);でモーターを逆方向に,2回転回します。until (SENSOR_1 < (-16 * 2));です。
もしテストしてうまく行かなかった場合,例えば同じ方向にまわり続けるような時は,モーターか出力ポートにつないだコード付のブロックを反対方向につなぎ替えてみて下さい。