ピンポン玉と紙コップを別々に回収して所定の場所に運ぶ
紙コップをつかむのにモーターを一つ、紙コップを引き上げるのにモーターを一つ使用した。
紙コップを光りセンサーで感知し、右旋回、直進することで紙コップの位置を調節した。
前と下に光センサーをつけ、紙コップの有無の判断とライントレースを可能にした。
上の写真のように二つの本体をつけても通信することが出来なかったため、下の写真のようにして通信を出来るようにした。
#define GO_AHEAD 10 #define MOTION_END 20 #define OWARI 30 #define CYOI 40 //通信の定義 #define mae(w) ;OnRev(OUT_AC);Wait(w);Off(OUT_AC); //前進 #define zennsinn OnRev(OUT_AC); #define usiro(g) OnFwd(OUT_AC);Wait(g);Off(OUT_AC); //後退 #define SHIKIICHI 870 //コップを感知する閾値 #define migisennkai(s) set_power_L;OnFwd(OUT_A);OnRev(OUT_C);Wait(s);Off(OUT_AC); //右旋回 #define hidarisennkai(n) set_power_L;OnFwd(OUT_C);OnRev(OUT_A);Wait(n);Off(OUT_AC); //左旋回
#define shikiichi 48 #define turn_left1 set_power_L;OnFwd(OUT_A);OnRev(OUT_C); //左旋回 #define turn_right1 set_power_L;OnRev(OUT_A);OnFwd(OUT_C); //右旋回 #define turn_left2 set_power_L;Off(OUT_A);OnRev(OUT_C); //左折 #define turn_right2 set_power_L;Off(OUT_C);OnRev(OUT_A); //右折
#define LOWPOWER 1 #define HIGHPOWER 4 #define set_power_H SetPower(OUT_AC,HIGHPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER);
A地点からスタートしてライントレースをし、前につけた光センサーにより一つ目のコップを見つける。その後右旋回して、再びライントレースでB地点まで行き、X地点を目指す。
sub line_l() //紙コップ付近に行く { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=550){ if(SENSOR_2 < shikiichi -7){ turn_right2; } else if (SENSOR_2 < shikiichi -4 ){ turn_right2; } else if (SENSOR_2 < shikiichi -1){ zennsinn; } else if (SENSOR_2 < shikiichi ){ turn_left2; } else { turn_left2; } } PlaySound(SOUND_CLICK); Off(OUT_AC); }
sub line_ll() //3秒間のライントレース { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=300){ if(SENSOR_2 < shikiichi -7){ turn_right1; } else if (SENSOR_2 < shikiichi -4 ){ turn_right2; } else if (SENSOR_2 < shikiichi -1){ zennsinn; } else if (SENSOR_2 < shikiichi ){ turn_left2; } else { turn_left1; } } PlaySound(SOUND_CLICK); Off(OUT_AC); }
sub line_k() { SetSensor(SENSOR_2,SENSOR_LIGHT); //交差点までのライントレース ClearTimer(0); while(FastTimer(0)<=25){ if(SENSOR_2 < shikiichi-6){ turn_right1; } else if (SENSOR_2 < shikiichi -4){ turn_right2; ClearTimer(0); } else if (SENSOR_2 < shikiichi -1){ zennsinn; ClearTimer(0); } else if (SENSOR_2 < shikiichi ){ turn_left2; ClearTimer(0); } else { turn_left2; ClearTimer(0); } } PlaySound(SOUND_CLICK); Off(OUT_AC); }
ピンポン玉を置いたあと再びB地点に戻る。その後ライントレースにより障害物に近づく。光センサーにより障害物を発見し、後退する。そして右に方向を変え、直進し、コップを発見し次第止まり、コップを取る。コップ取得後は右旋回をしてX地点を目指す。
sub line_lll() //コップ付近までのライントレース { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(SENSOR_1 < SHIKIICHI -40){ if(SENSOR_2 < shikiichi -7){ turn_right1; } else if (SENSOR_2 < shikiichi -4 ){ turn_right2; } else if (SENSOR_2 < shikiichi -1){ zennsinn; } else if (SENSOR_2 < shikiichi ){ turn_left2; } else { turn_left2; } } PlaySound(SOUND_CLICK); Off(OUT_AC); }
sub shougaibutsu() //障害物を探す { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); while(SENSOR_1 < SHIKIICHI -130){ mae(10); } Off(OUT_AC); Wait(100); usiro(200); Wait(300); ClearMessage(); SendMessage(OWARI); }
sub search3() //2つ目のコップを探す { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); while(SENSOR_1 < SHIKIICHI -40){ mae(10); } Off(OUT_AC); Wait(100); hidarisennkai(20); Wait(100); mae(30); Wait(300); ClearMessage(); SendMessage(OWARI); }
ピンポン玉を置いたあと、左旋回をし、その後、直進と右旋回を少しずつ繰り返すことにより、コップを探し、一時停止でコップを取り、右旋回でX地点を目指す。
sub search4() //3つ目のコップを探す { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); while(SENSOR_1 < SHIKIICHI -40){ mae(020); migisennkai(010); } Off(OUT_AC); Wait(100); hidarisennkai(20); Wait(100); mae(30); Wait(300); ClearMessage(); SendMessage(OWARI); }
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); mae(050); line_l(); Wait(100); mae(40); SendMessage(CYOI);//1 Wait(50); mae(30); migisennkai(250); line_ll(); line_k(); hidarisennkai(140); SendMessage(CYOI);//2 ClearMessage(); until(Message() == CYOI);//3 mae(160); Wait(100); ClearMessage(); SendMessage(CYOI);//4 1つ目のピンポン玉完了 until(Message() == CYOI);//4.5 usiro(180); ClearMessage(); hidarisennkai(100); line_lll(); shougaibutsu(); migisennkai(60); search3(); mae(030); Wait(100); SendMessage(CYOI);//5 until(Message() == CYOI);//6 SendMessage(CYOI);//7 migisennkai(150); mae(050); SendMessage(CYOI);//8 2つ目のピンポン玉完了 ClearMessage(); until(Message() == CYOI);//9 usiro(060); Wait(50); ClearMessage(); hidarisennkai(120); mae(300); migisennkai(050); mae(060); search4(); Wait(50); mae(020); migisennkai(040); mae(020); SendMessage(CYOI);//10 until(Message() == CYOI);//11 ClearMessage(); usiro(100); migisennkai(180); mae(080); SendMessage(CYOI);//12 until(Message() == CYOI);//13 ClearMessage(); mae(130); SendMessage(CYOI);//14 3つ目のピンポン玉完了 until(Message() == CYOI);//15 ClearMessage(); usiro(100); migisennkai(280); mae(030); SendMessage(CYOI);//16 コップを離す until(Message() == CYOI);//17 usiro(070);
基本点30点、技術点19.7点、合計49,7点 1位になることができた。
今回の課題は今までで一番難しく、時間も少なかったため大変だった。 この授業で初めてプログラミンロボットをつくり、動かすことが出来たので、とても良い経験になった。