課題2での紙を用いてA.Bのいずれかまたは両方からロボットを動かしC.Dに3つずつ置かれた紙コップをQで囲まれた枠内に収めることのできるようにする。
私のチームの作戦としては当初色々な案が挙がったが、最終的には積むロボットと運ぶロボットの2つに分けることでそれぞれの動きが単純になる様にした。
積むロボットはA地点からSP間までライントレースしそこで運ぶロボが紙コップを持ってくるのを待ち持って来たら所定の位置に紙コップを持っていき積み上げるようにする。
運ぶロボはB地点からC地点までライントレースし、紙コップを1つ回収しSP間に運び詰むロボットに渡し、その後D地点に向かい回収し運び、C地点に向かい、といった具合に繰り返す。
まず、運ぶロボについて紙コップを押して運ぶだけの仕組みでタイヤ2つと1点の3点で支えるようになっており、ロボのちょうど中心のあたりになるところに光センサを付けた。
続いて積むロボについて上下に動かせるようにすることで紙コップを積む動作を行いタイヤ2つと2点の計4点で支え動かせるようにした。
まず定義について
#define turn_right_SENKAI OnFwd(OUT_A); OnRev(OUT_C); //旋回 #define turn_right OnFwd(OUT_A); Off(OUT_C); //片方のみ動かす #define turn_left_SENKAI OnFwd(OUT_C); OnRev(OUT_A); //旋回 #define turn_left OnFwd(OUT_C); Off(OUT_A); //片方のみ動かす #define go_forward(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC); #define cross_straight_R turn_left; Wait(50); #define cross_straight_L turn_right; Wait(50); #define cross_right turn_right; Wait(130); #define cross_left turn_left; Wait(130); #define Black 43 //これより小さかったら黒 #define White 52 //これより大きかったら白 #define STEP 1 //一回の判断の時間 #define turn_time 400 //RからR or LからL (180°回転) #define turn_time_change 290 //RからL or LからR (90°ぐらい回転) #define closs_P 1 //closs Pを曲がる許可 #define GO_cupC 2 //Cを取りに行け #define GO_cupD 3 //Dを取りに行け #define COME_cupC 4 //Cを持って来い #define COME_cupD 5 //Dを持って来い
続いてサブルーチンについて
sub trace_line_for_cross_R() { ClearTimer(0); while (FastTimer(0) < 36) { if (SENSOR_2 <= Black) { //黒 turn_right_SENKAI; } else if (SENSOR_2 < Black +2) { //黒に近いグレー turn_right; } else if (SENSOR_2 > White -2) { //白に近いグレー turn_left; ClearTimer(0); } else if (SENSOR_2 >= White) { //白 turn_left_SENKAI; ClearTimer(0); } else { //グレー OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); PlaySound(SOUND_FAST_UP); Wait(100); } sub trace_line_for_cross_L() { ClearTimer(0); while (FastTimer(0) < 36) { if (SENSOR_2 <= Black) { //黒 turn_left_SENKAI; } else if (SENSOR_2 < Black +2) { //黒に近いグレー turn_left; } else if (SENSOR_2 > White -2) { //白に近いグレー turn_right; ClearTimer(0); } else if (SENSOR_2 >= White) { //白 turn_right_SENKAI; ClearTimer(0); } else { //グレー OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); PlaySound(SOUND_FAST_UP); Wait(100); } sub trace_line_to_start_R() { ClearTimer(0); while (FastTimer(0) < 50) { //要調整 if (SENSOR_2 <= Black) { //黒 turn_right_SENKAI; } else if (SENSOR_2 < Black +2) { //黒に近いグレー turn_right; } else if (SENSOR_2 > White -2) { //白に近いグレー turn_left; } else if (SENSOR_2 >= White) { //白 turn_left_SENKAI; } else { //グレー OnFwd(OUT_AC); } Wait(STEP); } } sub trace_line_to_start_L() { ClearTimer(0); while (FastTimer(0) < 50) { //要調整 if (SENSOR_2 <= Black) { //黒 turn_left_SENKAI; } else if (SENSOR_2 < Black +2) { //黒に近いグレー turn_left; } else if (SENSOR_2 > White -2) { //白に近いグレー turn_right; } else if (SENSOR_2 >= White) { //白 turn_right_SENKAI; } else { //グレー OnFwd(OUT_AC); } Wait(STEP); } }
上の定義とサブルーチンを用いてメインプログラム
task main() { SetSensor(SENSOR_1, SENSOR_TOUCH); SetSensor(SENSOR_2, SENSOR_LIGHT); ClearMessage(); int n = 0; int cupC = 0; int cupD = 0; Wait(1000); OnFwd(OUT_AC); Wait(100); for_cross(); OnRev(OUT_B); Wait(100); while (n < 1) { if (Message() == closs_P) { crossP(); n++; } else { Off(OUT_AC); } Wait(STEP); } while (n < 2) { if (SENSOR_1 == 0) { trace_line(); } else { Off(OUT_AC); n++; } Wait(STEP); } repeat (3) { tumutumu_C(); tumutumu_D(); } turn_right; Wait(200); OnFwd(OUT_AC); Wait(400); Off(OUT_AC); }
結果は、一つも入れられなかった。
寸前で最低1つだけでも入れられたらいいと考え2.3回やって1つはできる様にしていたはずだったのだが、本番いざやってみると1つもできないという結果になってしまった。
忙しくない時期であればもっとじっくり工夫して作りたかったとも思った。
講義全体を踏まえて、ロボのハードの面もプログラムの面も両方ちゃんとできなければならず、片方のみではもう片方にとても大きな負担がかかってしまうのだと分かった。また、個人的に最も苦戦したのはプログラム自体に間違いはないが途中でうまくいかなくなる時だった。どれだけプログラムを頑張ってもロボットはその通り動いてくれず、気まぐれで成功したり失敗したりとなったことが、この講義を受ける前と後で印象が正反対になったことだった。