ボールを運びつつ、ライントレースをするロボットを作る。
まず後輪を廃し、後輪の代わりに先端の丸い棒を取り付け、引きずるような形で進む形にしました、これにより小回りの効く走行が可能になります。
更に全体的に車高を低くして車体全体に安定感を出させました。
ボールを運ぶ手段としてアームを採用しました。
空いてたモーターBをギア二つを使い90°向きを変えてアームの動力源としました。
アームの上げ下げによりボールを捕まえ、発射は構造上出来ないのでアームを上げて車体を進めて押し込む形になります。
僕はコースを右側からスタートするプログラムを作りました。
#define THRESHOLD 47 #define go OnFwd(OUT_AC); #define back OnRev(OUT_AC); #define off Off(OUT_ABC); #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 OnFwd(OUT_C); Off(OUT_A); #define turn_right0 OnFwd(OUT_A); Off(OUT_C); #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C); #define STEP 1 #define arm_up OnFwd(OUT_B); #define arm_down OnRev(OUT_B); #define shot arm_up;Wait(100);off;go;Wait(100);back;Wait(200);off;arm_down;Wait(100);off; task main(){ int i=0; int count=0; int angle=36; arm_up; Wait(10); turn_left1; Wait(angle); arm_down; Wait(10); turn_right1; Wait(angle); go; Wait(100); SetSensor(SENSOR_2,SENSOR_LIGHT);
ここからライントレース開始です
turn_right0; SetSensor(SENSOR_2,SENSOR_LIGHT); while (i==3){ if(i==1){ turn_right0; Wait(angle+angle); off; i=0; turn_right0; } if(i==2){ turn_right0; Wait(angle); shot; i=3; } else { if(count<=20){ turn_right0; Wait(angle-count); if(SENSOR_2 < THRESHOLD -3){ i=1; } turn_left0; Wait(angle+angle); if(SENSOR_2 < THRESHOLD -3){ i=2; } } else { if (SENSOR_2 < THRESHOLD -8) { turn_left1; count=0; } else if (SENSOR_2 < THRESHOLD -3) { turn_left0; count=0; } else if (SENSOR_2 < THRESHOLD +3) { go; } else if (SENSOR_2 < THRESHOLD +8) { turn_right0; count++; } else { turn_right1; } Wait(STEP); } } } Wait(STEP); } } } off }
off }
まずライントレース部分ですが、これはほとんどテンプレどうりです。
センサーが白だったら右回り黒だったら左回りに、中間の灰色くらいなら直進と言ったシンプルなライントレースです。
プログラミングで一番苦労したのが恐らくこの終点の判断です。
どうやって終点かどうかの判断をするか考えた時にT字路に突き当たる形で入っていくのは終点だけだと気づきました。
そこで明らかに直角以上の角に差し掛かった時に進行方向の90°ずつ曲がった所が黒なら終点とする判断をするようにしました。
具体的にはライントレース中に白をセンサーが認識するとcountの値が1増えます。
countが20を超えると終点かどうかの判断のためのプログラムに移行します。
countが20を超えるとこちらに移行します。 まず右側に旋回しそこが黒かどうかの判断をします
情工の授業のプログラムとは違った数字を弄るだけでなく実際にどう動くかを考えなければならないのが難しかったが、そこを考えるのもまた楽しかった。