課題2:ライントレースをして缶を移動させるロボットの作成 †指定のコースを指定の順にたどり缶を移動させる。 選んだコース †コース2。詳細はhttp://yakushi.shinshu-u.ac.jp/robotics/?2018a%2FMission2 車体構造 † 画像のような形にした。それぞれ、Aが左車輪、Cが右車輪、Bがつかむ機構、2が光センサとなっている。
車輪 † 2輪駆動にし、前輪をなくした。代わりに下の画像のようにして滑らせるようにした。
センサ †センサは前輪(滑らせるところ)の直前につけ3mm程度浮かせた。 アームの機構 † アームの機構はクワガタのようにしてつかみ取る形にした。2つのアームが連結された真ん中部分を引っ張ることでつかむことのことのできる様になっている。
車体考察 †
プログラム †#define mid 45 //センサーが白と黒の境目の上 境界の上値 #define OVER 4 //カーブか直進以外だと断定するまでの探査時間 #define STOP Off(OUT_AC);PlaySound(SOUND_FAST_UP);Wait(100); #define OPEN OnRev(OUT_B);Wait(7);Off(OUT_B); #define CLOSE OnFwd(OUT_B); Wait(7); Off(OUT_B); #define turnL OnRev(OUT_A);OnFwd(OUT_C);Wait(100);OnFwd(OUT_AC);while(SENSOR_2>mid){} #define turnR OnFwd(OUT_A);while(SENSOR_2>mid){}; int S; //何回目の読みすぎなのか数える関数 int LR=1; //1で右側をトレースそれ以外で左側をトレース(今回は左側はー1を使用) task main(){ //コース2 int a=0; SetSensor(SENSOR_1,SENSOR_TOUCH); SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); SetSensor(SENSOR_2,SENSOR_LIGHT); SetPower(OUT_B,7); //アーム用のモータの力を上げた SetPower(OUT_A,2); //タイヤは細かい動作でぶれてしまうので出力を多少下げた SetPower(OUT_C,2); while(a<17){ trace(LR); CLOSE Wait(10); PlaySound(SOUND_DOUBLE_BEEP); //曲がりすぎるたびに音を鳴らす switch (a){ case 0: //Bを右折 way(90); a++; LR=-1; //左読みに切り替え OPEN break; case 1: //Jで止まってYを回収してJに戻る STOP cat(); a++; break; case 2: //Jを左折 way(90); OnRev(OUT_AC); //進みすぎてしまうので下がる Wait(40); Off(OUT_AC); a++; break; case 3: //Kを直進 way(1); a++; break; case 4: //Lを直進 way(1); a++; break; case 5: //Iを左折 OnFwd(OUT_AC); //調整 Wait(30); Off(OUT_AC); way(90); OnFwd(OUT_C); //調整 Wait(10); Off(OUT_AC); a++; break; case 6: //Hで一時停止 左折 STOP way(90); OnFwd(OUT_C); //調整 Wait(10); Off(OUT_AC); a++; break; case 7: //小回り 左 turnL a++; LR=1; //右読みに切り替え break; case 8: //小回り 右 turnR a++; LR=-1; break; case 9: //G前を左折 way(90); a++; LR=1; break; case 10: //Gを一時停止して右折 STOP way(90); a++; break; case 11: //Fで一時停止して右折 STOP way(90); a++; LR=-1; break; case 12: //Eを直進 way(1); a++; break; case 13: //Dで一時停止してXにおいて(おそらくアームが引っかかるので)そのまま直角までバックしてr=5の後まで STOP put(); a++; LR=1; break; case 14: //Dのあとの直角を右に way(90); OnRev(OUT_AC); //進みすぎてしまうので下がる Wait(40); Off(OUT_AC); a++; break; case 15: //r=5を曲がる turnL a++; break; case 16: //Cを一時停止後直進 STOP way(1); a++; break; case 17: //Aの敷居を読んだら中にはいって終了 OnFwd(OUT_AC); Wait(100); } } Off(OUT_AC); } void trace(int LR){ ClearTimer(0); while(Timer(0)<OVER){ //黒がずっと続いたらトレースをやめる S=SENSOR_2; if(S>mid+3){ //黒なら if(LR==1){ Off(OUT_A);OnFwd(OUT_C); //左 }else{ OnFwd(OUT_A);Off(OUT_C); //右 } ClearTimer(0); }else{ //白なら if(LR==1){ OnFwd(OUT_A);Off(OUT_C); //右 }else{ Off(OUT_A);OnFwd(OUT_C); //左 } } } } void way(int drct){ //drct(direction)が90ならラインをトレースしてる側へ曲がる 1なら直進。 drct=LR*drct; //直進か曲がるかの値に今どっちをトレースしてるかの情報を付加 OnFwd(OUT_AC); while(SENSOR_2<mid-3){} //白まで前進 Wait(30); //少し多めに Off(OUT_AC); Wait(100); if(drct==90||drct==(-1)){ //右側トレースで90なら右へ行ってライン復帰すれば90度曲がれる 左側トレースで1なら右に行ってラインに復帰すると直進する。 OnFwd(OUT_A); OnRev(OUT_C); } if(drct==(-90)||drct==1){ //左側トレースで90なら左へ行ってライン復帰すれば90度曲がれる 右側トレースで1なら左に行ってラインに復帰すると直進する。 OnFwd(OUT_C); OnRev(OUT_A); } while(SENSOR_2>mid){} //ライン復帰するまで曲がり続ける。 Off(OUT_AC); } void cat(){ //defineしようと思ったが長くなりすぎたので仕方なく。 OnRev(OUT_C); Wait(40); OPEN OnFwd(OUT_AC); Wait(50); CLOSE OnRev(OUT_AC); while(SENSOR_2>mid){} //黒まで下がって Wait(95); //少し多めに下がって } void put(){ //defineしようと思ったが長くなりすぎたので仕方なく。 OnRev(OUT_A); while(SENSOR_2<mid-5){} //白まで Wait(30); Off(OUT_AC); OPEN OnRev(OUT_AC); while(SENSOR_2<mid-3){} //黒まで下がって Off(OUT_AC); //Dまで戻った OnFwd(OUT_A); OnRev(OUT_C); Wait(150); OnFwd(OUT_C); while(SENSOR_2<mid-3){} Off(OUT_AC); } プログラム説明 †
Defineの説明。 †
サブルーチンの説明。 †
プログラムについて考察 †
全体を通して †
以下追加 †
|