2016a/Member 目次
このロボットはコップを掴み上げてから運び、積み上げる場所までたどり着いたら下ろすように動かしました。もう一方のロボットは運ばれたコップを倒れないように支えておくようにする予定でした。
コップを認識するために光センサーを使ったためライントレース用とコップの判断用の2つの光センサーを使った。写真のように光センサーを真ん中に2つつけることに気を付けた。真ん中につけることで、ライントレースはずれが少なくなるし、コップを真ん中で認識するためつかむときにつかみやすくなった。
#define SIGNALON 121 //通信用 #define MIDDLE 50 //ライントレース用の中間値 #define WHITE 50 //紙コップ認識用の値 #define turn_left1 SetPower(OUT_AC,2); Off(OUT_A); OnFwd(OUT_C); //左 #define turn_left2 SetPower(OUT_A,1); OnRev(OUT_A); OnFwd(OUT_C); //左旋回 #define turn_right1 SetPower(OUT_AC,2); OnFwd(OUT_A); Off(OUT_C); //右 #define turn_right2 SetPower(OUT_C,1); OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define go_forward SetPower(OUT_AC,7); OnFwd(OUT_AC); //前進
int cup_count=0; //コップのカウント
sub trace() //ライントレース { while(FastTimer(0) < 26) //左旋回が一定時間続くまでループ { if(SENSOR_2 < MIDDLE-5) //黒 { turn_left2; //左旋回 } else { if(SENSOR_2 < MIDDLE-2) //中間に近い黒 { turn_left1; //左曲がり } else if(SENSOR_2 < MIDDLE+3) //中間 { go_forward; //直進 } else if(SENSOR_2 < MIDDLE+6) //中間に近い白 { turn_right1; //右曲がり } else //白 { turn_right2; //右旋回 } ClearTimer(0); } } }
sub i_forward() //直進 { turn_right2; Wait(30); go_forward; Wait(50); Off(OUT_AC); }
sub i_left() //左折 { turn_left2; Wait(45); Off(OUT_AC); }
sub i_right() //右折 { turn_right2; Wait(30); go_forward; Wait(30); turn_right2; Wait(80); Off(OUT_AC); }
sub cup1() //CとDのそれぞれの1つ目のコップ { turn_right2; //紙コップまで方向調整 Wait(25); SetPower(OUT_AC,1); //紙コップまで移動 OnFwd(OUT_AC); while(SENSOR_3 <= WHITE); Off(OUT_AC); OnRev(OUT_B); //紙コップをつかむ Wait(150); Off(OUT_B); turn_right2; //ラインまで移動 Wait(180); go_forward; Wait(20); }
sub cup2() //2つ目のコップ { SetPower(OUT_AC,1); //紙コップまで移動 OnFwd(OUT_AC); while(SENSOR_3 <= WHITE); Off(OUT_AC); OnRev(OUT_B); //紙コップをつかむ Wait(150); Off(OUT_B); turn_right2; //ラインまで移動 Wait(180); go_forward; Wait(120); }
sub cup3() //3つ目のコップ { turn_right2; //紙コップまで方向調整 Wait(45); SetPower(OUT_AC,1); //紙コップまで移動 OnFwd(OUT_AC); while(SENSOR_3 <= WHITE); Off(OUT_AC); OnRev(OUT_B); //紙コップをつかむ Wait(150); Off(OUT_B); turn_right2; //ラインまで移動 Wait(170); go_forward; Wait(100); }
sub cup_down() //コップを下すときの動作 { turn_left2; //コップを下す位置まで移動 Wait(5); OnRev(OUT_AC); Wait(5); Off(OUT_AC); if(cup_count == 1) //最初のコップを置くとき { SendMessage(SIGNALON); //もう一台の動作を再開する } OnFwd(OUT_B); Wait(50); Off(OUT_B); if(cup_count == 1) //最初のコップを置いたとき { OnFwd(OUT_AC); //コップを少し前に押す Wait(10); } OnRev(OUT_AC); //ラインまで移動 Wait(60); turn_left2; Wait(120); go_forward; Wait(50); }
task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); int c=1; //交差点の確認 int d=0; //1になったら動作停止 int course_check=0; //0ならC地点へ、1ならD地点へ SetPower(OUT_B,1); //コップをつかむときのモータをできるだけ弱くする go_forward; //ラインまで直進 Wait(80); while(d == 0) { ClearTimer(0); trace(); //ライントレース Off(OUT_AC); //交差点確認 PlaySound(SOUND_UP); Wait(100); switch(c) { case 1: //最初の交差点 i_left(); //S地点へ break; case 2: //S地点の交差点 if(course_check == 0) { i_right(); //C地点へ } else { i_left(); //D地点へ } break; case 3: //C地点かD地点 if(cup_count < 2) //集めたコップが2つより少ないなら { cup1(); } else if(cup_count < 4) //集めたコップが4つより少ないなら { cup2(); } else //集めたコップが4つ以上なら { cup3(); } cup_count++; break; case 4: if(course_check == 0) //C地点から戻ってきたら { i_left(); //P地点へ course_check = 1; //次はD地点へ } else //D地点から戻ってきたら { i_right(); //P地点へ course_check = 0; //次はC地点へ } break; case 5: //P地点の交差点 i_left(); //Q地点へ break; case 6: //Q地点の交差点 cup_down(); if(cup_count == 6) //コップを集め終わったら { d = 1; //動作停止 } break; case 7: //P地点の交差点 i_right(); //S地点へ c = 1; //case 2に戻る break; } c++; } Off(OUT_ABC); }
#define SIGNALON 121 //通信用
task main() { ClearMessage(); ClearTimer(0); OnRev(OUT_AC); //Q地点まで移動 Wait(450); Off(OUT_AC); OnRev(OUT_A); //向き調整 OnFwd(OUT_C); Wait(5); Off(OUT_AC); until(Message() == SIGNALON); //通信するまで動作停止 Wait(150); //紙コップが置かれたらアームで調整 OnFwd(OUT_B); Wait(10); Off(OUT_B); Wait(30000); //紙コップが確実に集め終わるまで動作停止(あまりよくない) OnRev(OUT_B); //アームを広げる Wait(20); Off(OUT_B); OnRev(OUT_AC); //紙コップから離れる Wait(30); Off(OUT_AC); }
コップを運ぶロボットは1つコップを運んでくれたが、2つ目を取りに行く際にライントレースができずに1つ運ぶだけで終わってしまった。壁として使う予定だったロボットはセンサーをつけないで時間のみで判断させていたため場所が合わずに失敗した。