[[2019a/Member]] *課題について [#b7ba7c24] #ref(./image4.png,課題) A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。 *ロボットについて [#w76e15bd] #ref(./image1.jpeg,全体の写真) #ref(./image2.jpeg,アーム部分) ↑全体のバランスを保つため,できるだけ部品を少なく,軽くした.一つのモーターで二つのアームが開閉するように作った. #ref(./image3.jpeg,裏側) ↑急カーブでも小回りがきくように横幅を小さくした.後ろ側のタイヤは摩擦を減らすためだけなので一つだけつけるようにした. *プログラムについて [#g4b8f002] 光センサーの値が36から47の間で得られたので、これを5分割して、~ 47〜…白~ 43〜47…白灰~ 39〜43…灰~ 36〜39…黒灰~ 〜36…黒~ とした。 **定義 [#ncc5009d] プログラムを簡略化するため、defineを用いた。 int black_time=30; //黒色を判別している時間の設定 #define migisenkai OnFwd(OUT_A); OnFwd(OUT_C); //右に旋回 #define usetsu OnFwd(OUT_A); Off(OUT_C); //右折 #define chokushin OnFwd(OUT_A); OnRev(OUT_C); //直進 #define sasetsu Off(OUT_A); OnRev(OUT_C); //左折 #define hidarisenkai OnRev(OUT_A); OnRev(OUT_C); //左に旋回 #define koutai OnRev(OUT_A); OnFwd(OUT_C); //後退 #define close OnFwd(OUT_B); Wait(20); Off(OUT_B); Wait(100); //アームを閉じる(ボールを掴む) #define open OnRev(OUT_B); Wait(20); Off(OUT_B); Wait(100); //アームを開く **サブルーチン [#ke58e0df] -follow_line…交差点まで黒線の左側でライントレースするサブルーチン。 sub follow_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); while(FastTimer(0)<black_time){ //black_timeが30より小さい間繰り返す if(SENSOR_2>=47){ //白色の時 migisenkai ClearTimer(0); //右に旋回、タイマー0をセット }else if((SENSOR_2>=43)&&(SENSOR_2<47)){ //白灰色の時 usetsu ClearTimer(0); //右折、タイマー0をセット }else if((SENSOR_2>=39)&&(SENSOR_2<43)){ //灰色の時 chokushin ClearTimer(0); //直進、タイマー0をセット }else if((SENSOR_2>=36)&&(SENSOR_2<39)){ /黒灰色の時 sasetsu ClearTimer(0); //左折、タイマー0をセット }else if(SENSOR_2<36){ //黒色の時 hidarisenkai } //左に旋回 } Off(OUT_AC); Wait(100); ClearTimer(0); } -follow_line2…交差点まで黒線の右側をライントレースするサブルーチン。 sub follow_line2() { SetSensor(SENSOR_2,SENSOR_LIGHT); while(FastTimer(0)<black_time){ //black_timeが30より小さい間繰り返す if(SENSOR_2<36){ //黒色の時 migisenkai //右に旋回 }else if((SENSOR_2>=36)&&(SENSOR_2<39)){ //黒灰色の時 usetsu ClearTimer(0); //右折,タイマー0をセット }else if((SENSOR_2>=39)&&(SENSOR_2<43)){ //灰色の時 chokushin ClearTimer(0); //直進,タイマー0をセット }else if((SENSOR_2>=43)&&(SENSOR_2<47)){ //白灰色の時 sasetsu ClearTimer(0); //左折,タイマー0をセット }else if(SENSOR_2>=47){ //白色の時 hidarisenkai ClearTimer(0); //左に旋回,タイマー0をセット } } Off(OUT_AC); Wait(100); ClearTimer(0); } -cross_line…交差点を渡るサブルーチン。 sub cross_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); while(SENSOR_2<47){ //白色になるまでの間 chokushin } //直進 while(SENSOR_2>36){ //黒色の間 usetu } //右折 Off(OUT_AC); Wait(100); ClearTimer(0); } **メインプログラム [#j16ef405] task main(){ SetPower(OUT_B,1); アームの開閉はモーターを少し動かすだけでいいので,モーターの出力を下げた. cross_line(); follow_line(); //MからK 最初,follow_lineが作動されなかったので前にcross_lineを書いてみると作動した. cross_line(); //Kの交差点を渡る OnRev(OUT_C); Wait(60); Off(OUT_C); Wait(100); //ピンポン玉の正面への移動 close; //ピンポン玉をつかむ koutai Wait(150); Off(OUT_AC); Wait(100); //Kの,Lと反対の位置まで後退 cross_line(); follow_line(); //Kまで 最初と同じ理由でcross_lineを書いた. follow_line(); //KからJまで black_time=20;follow_line(); //JからIまで cross_line(); //Iの交差点を渡る black_time=20;follow_line(); //IからHまで 直角ではないI,Hの交差点で止まるためにblack_timeを小さくした. cross_line(); //Hの交差点を渡る follow_line(); //HからGまで chokushin Wait(40); Off(OUT_AC); Wait(100); ここからはラインの右側をトレースしたかったので線GFの右側に出るまで直進した. follow_line2(); follow_line2(); //線GFからDまで この部分も最初と同じくfollow_line2ひとつだと動作しなかったので二つ書いてみるとちゃんとライントレースをした. cross_line(); //Dの交差点を渡る follow_line(); //DからBまで open; //アームを開く hidarisenkai Wait(40); Off(OUT_AC); //ピンポン玉を出す } アームを開いた状態で左に旋回することでピンポン玉をゴールにシュートした. *まとめ [#r7c84318] メインプログラムの中でなぜかfollow_lineが動作しないことが三回あった.二回繰り返し書くことなどでちゃんとライントレースしたが,最後まで動作しない理由が分からなかった. defineやサブルーチンを用いて簡潔なプログラムを書けたと思う.