サブルーチンを用いたプログラム †
プログラム内容 †
#define THRESHOLD 42
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int pt = 0;
while(1){
if((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD)){ // センサーがどちらも白と判断している場合、staight()へ行き処理を行う
straight();
}else if((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD)){ // センサーの左側が黒と判断している場合、left()へ行き処理を行う
left();
}else if((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD)){ // センサー右側が黒と判断している場合、right()へ行き処理を行う
right();
}else if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)){ // センサーがどちらも黒と判断している場合、right()へ行き処理を行う
right();
}
if(SENSOR_2 == 1){ // タッチセンサー押された場合、turn()へ行き処理を行う
turn();
}
}
}
void straight(void){ // 直進処理
OnFwd(OUT_A+OUT_C);
}
void left(void){ // 左にハンドルをきる処理
OnFwd(OUT_C);
OnRev(OUT_A);
}
void right(void){ // 右にハンドルをきる処理
OnFwd(OUT_A);
OnRev(OUT_C);
}
void turn(void){ // 追い越しを行う処理
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(175);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(175);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(50);
OnFwd(OUT_A+OUT_C);
}
プログラムの説明 †
- このプログラムでは、サブルーチンを使用しています。
- まず、define文で閾値を設定します。このプログラムでは前者の反転するプログラムと統一性を見せるためにTHRESHOLDを閾値に用いています。
- その後、各センサーのタイプを設定し、while(1)で無限ループを作り出しています。
無限ループ内では、if文の中で各処理を行っています。
- センサーがどちらも白と判断している場合、straight()へ行きその中でAとCモーターを正転させる、つまり直進の処理を行っています。
- 左側のセンサーのみが黒と判断している場合、left()へ行きその中でCモーターに正転・Aモーターに逆転をさせる、つまり左側にハンドルをきる処理をおこなっています。
- 右側のセンサーのみ黒と判断している場合、right()へ行きその中でAモーターを正転・Cモーターを逆転、つまり右側にハンドルをきる処理をおこなっています。
- どちらのセンサーも黒と判断している場合も、right()へ行きその中で右側にハンドルをきる処理をおこなっています。
- 最後に、タッチセンサーが反応した場合、つまり他のマシンと接触した場合、turn()へ行きその中でまず右側にハンドルをきり追い越した後に線上に復帰するという、追い越す処理を行っています。ちなみに追い越しなのにturnというサブルーチン名になっているかというと、追い越しに関して名前が思い浮かばなかったわけではなく、ただ単にプログラム制作者が勘違いをして書いたためです。
06.06.15更新