この項を学習する前に今一度、ライトセンサの測定や応答について復習しておきましょう。
1.ライトセンサの取り付け
ロボットは1.で作ったものを引き継ぎます。今回はライトセンサを路面側に向けるように作りましょう。
ここでは、ロボット組立て図のp32〜34に記載されたものを用います。この時、前回取り付けたバンパーは外して下さい
今回はライトセンサを入力ポート3に接続します。
ここでは、ロボット組立て図のp32〜34に記載されたものを用います。この時、前回取り付けたバンパーは外して下さい
今回はライトセンサを入力ポート3に接続します。
2.ライトセンサを使用する
ここでは白を検知するとモーターが回り、黒を検知するとモータが止まるという動作を実現します。
次のプログラムを作成してください。ここではファイル名をlight.cとします。
今回は、センサポートIDを指定する箇所が多いため、マクロを使用しています。
新しく使用したAPIの解説をします。
ecrobot_get_light_sensor()で得られる値は0〜1023となっています。
白や黒の基準はプログラムの最初に定義した『BLACK』の値によって決まります。
従って、実際のコースの状況や周りの照明、センサと地面の間の距離によって正しく判別できない可能性があります。 このような場合は、HelloWorldなどのサンプルプログラムにより実際の値を測定し、それぞれの値を書き換えましょう。
次のプログラムを作成してください。ここではファイル名をlight.cとします。
light1.c
#include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" DeclareTask(Task1); /* Task1を宣言 */ #define BLACK 580 /* 黒の値を定義するマクロ */ #define PORT_LIGHT NXT_PORT_S3 /* ライトセンサのポートIDを定義するマクロ */ void ecrobot_device_initialize(){ /* OSEK起動時の処理 */ nxt_motor_set_speed(NXT_PORT_B,0,1); nxt_motor_set_speed(NXT_PORT_C,0,1); ecrobot_set_light_sensor_active(PORT_LIGHT); /* ライトセンサ点灯 */ } void ecrobot_device_terminate(){ /* OSEK終了時の処理(モータ停止)*/ nxt_motor_set_speed(NXT_PORT_B,0,1); nxt_motor_set_speed(NXT_PORT_C,0,1); ecrobot_set_light_sensor_inactive(PORT_LIGHT); /* ライトセンサ消灯 */ } void user_1ms_isr_type2(void){} TASK(Task1) { int sensorvalue; /* ライトセンサ値を格納する変数を定義 */ display_clear(0); /*LCD表示用バッファのクリア*/ while(1){ sensorvalue = ecrobot_get_light_sensor(PORT_LIGHT); /* ライトセンサ値を変数に代入 */ if( sensorvalue >= BLACK ){ /* 黒であれば真 */ nxt_motor_set_speed(NXT_PORT_B,0,1); nxt_motor_set_speed(NXT_PORT_C,0,1); }else{ /* 白(黒以外)であれば真 */ nxt_motor_set_speed(NXT_PORT_B,60,1); nxt_motor_set_speed(NXT_PORT_C,60,1); } display_goto_xy(0, 1); /* 表示位置をx=0,y=1に移動 */ display_string("light value="); /* "light value="と表示 */ display_int(sensorvalue, 1); /* sensorvalue変数の中身を表示 */ display_update(); /* LCD表示用バッファから画面更新 */ } /*----------------これより下に進むことはない-------------------------*/ TerminateTask(); /* 処理終了 */ } |
今回は、センサポートIDを指定する箇所が多いため、マクロを使用しています。
新しく使用したAPIの解説をします。
ecrobot_set_light_sensor_active(PORT_LIGHT)
PORT_LIGHTにライトセンサをアクティブモード(投光照明をONにするモード)で設定します。
第1の引数は入力ポートを記述します。指定方法は、タッチセンサの場合と同じです。
ecrobot_set_light_sensor_inactive(PORT_LIGHT)第1の引数は入力ポートを記述します。指定方法は、タッチセンサの場合と同じです。
PORT_LIGHTのライトセンサをインアクティブモード(投光照明をOFFにするモード)で設定します。
通常、ライトセンサは照明ONで用いますが、OFFで使用することで、周囲の明るさを読み取ることも出来ます。
今回は、プログラム終了時に照明をOFFにするのにこのAPIを用います。
第1の引数は入力ポートを記述します。
ecrobot_get_light_sensor(PORT_LIGHT)通常、ライトセンサは照明ONで用いますが、OFFで使用することで、周囲の明るさを読み取ることも出来ます。
今回は、プログラム終了時に照明をOFFにするのにこのAPIを用います。
第1の引数は入力ポートを記述します。
PORT_LIGHTのライトセンサの値を読み取ります。値の範囲は0〜1023の間です。
値が大きいほど、反射率が低い(暗い)ことを示します。 第1の引数は入力ポートを記述します。
値が大きいほど、反射率が低い(暗い)ことを示します。 第1の引数は入力ポートを記述します。
ecrobot_get_light_sensor()で得られる値は0〜1023となっています。
白や黒の基準はプログラムの最初に定義した『BLACK』の値によって決まります。
従って、実際のコースの状況や周りの照明、センサと地面の間の距離によって正しく判別できない可能性があります。 このような場合は、HelloWorldなどのサンプルプログラムにより実際の値を測定し、それぞれの値を書き換えましょう。
3.課題
1.サンプルプログラム light1.c の動作を確認せよ。
2.サンプルプログラムを改造し、黒い線または、白と黒の境(エッジ)をたどりながら走るロボットを製作せよ。
【ヒント】
3.タッチセンサをNXT本体に取り付け、前項の「タッチセンサの使用」を参考に、タッチセンサ押下でスタート出来るようにせよ。
2.サンプルプログラムを改造し、黒い線または、白と黒の境(エッジ)をたどりながら走るロボットを製作せよ。
【ヒント】
エッジ走行させる場合は、白と黒の両方の光センサ値の中間値を基準にして、左右のモータの速度指令値を変更する。
3.タッチセンサをNXT本体に取り付け、前項の「タッチセンサの使用」を参考に、タッチセンサ押下でスタート出来るようにせよ。