今回は,brickOSのC言語で光(ライト)センサーを使う方法を説明したい。といっても,実は筆者もすっきりしていないところがあるのだが。
------------------------------------------------------------------
#include
#include
#include

int main(int argc, char *argv[]) {
ds_active(&SENSOR_3);
while(1){
lcd_int(LIGHT_3);
sleep(1);
}
return 0;
}
------------------------------------------------------------------
 ライトセンサーを使うには,ヘッダー・ファイルdsensor.hをインクルードする。ds_active関数に,&SENSOR_3のようにセンサーのアドレスを渡し,ライトセンサーをアクティブにする。アドレスを渡すところがC言語らしい。

 一般にライトセンサーのモードは二種類ある。アクティブ・モードとパッシブ・モードだ。日本語にすると能動モードと受動モードとなる。具体的に言うと,アクティブ・モードではライトセンサーに付いたLEDを発光させ,反射光を読み取る。これに対し,パッシブ・モードでは発光せずに,周囲の明るさを読み取る。

 10進数の整数を表示するlcd_int関数でライトセンサーの値を表示させている。

 テストシートの白い部分では,lcd_int(LIGHT_3)は48という値を返した。

 黒い線の上では,32となった。これらの値は他の開発環境,たとえばROBOLABやNQCと同じである。
------------------------------------------------------------------
#include
#include
#include

int main(int argc, char *argv[]) {
ds_passive(&SENSOR_3);
while(1){
lcd_int(LIGHT_3);
sleep(1);
}
return 0;
}
------------------------------------------------------------------
 次に,パッシブ・モードを試してみる。ds_passive関数で3番のポートにつないだセンサーをパッシブにする。

確かにLEDは発光しなくなった。

 地面の色に関係なく,73か74という値を返す。たった1だけだが,返す値に変化があるので,ライトセンサーは働いていると判断できるのだが,ベッドの下や暗くした部屋に持っていっても値は変化しなかった。

 //ds_passive(&SENSOR_3);

 上記のように,ds_passiveをコメントアウトしても,73か74の値を返した。タッチセンサーと同様に何もしなくてパッシブ・モードで使えるようになっていると考えることができる。しかし,周囲の明るさを読み取っているとは思えない。うーん,どう使うのだろうか?

 気を取り直して,バッテリの残量を表示してみた。
------------------------------------------------------------------
#include
#include
#include

int main(int argc, char *argv[]) {
lcd_int(get_battery_mv ());
return 0;
}
------------------------------------------------------------------
 get_battery_mv関数で電圧値を知ることができる。

 この値も他の開発環境が返す値と同じである。

 7月14日,市内の小学校でロボット・プログラミング講習会を実施した。ライントレースのロボットを作る子供たちと一緒にルマンのコースでライントレースをしてみた。ルマンに似せて,マジックでダッーと黒い線を描いたコースはなかなか高難度だ。

 256話で作成したエッジくんもどきは,前回説明したモータースピードの最大値を示す定数MAX_SPEEDを3で割ったくらいのスピードだと,なんとか周回できるが,タッチセンサーを利用して加速するとすぐにコースアウトしてしまう。

 しかし,このままだと小学生の作った一番速いロボットと差がないので,加速より,こまめに減速するようにプログラムを改良してみようと思う。