コース上の黒線をたどりながら途中にあるピンポン球を回収し、目的地まで移動。そして、ピンポン球をゴールにシュートする。今回はB地点からA地点まで移動する。ただし、交差点、三叉路は直進する。
今回はBからAに向かって移動。道中にはピンポン球があり、それをつかんでAまで持って行き、ゴールへシュートを打つ。
ロボットはシステム部分、車輪部分、アーム&光センサー部分の3つの構造から成り立っている。それぞれバラバラにすることができ、組み立てることによってロボットができる。光センサーは車体正面から見て少し左側にある。
このロボットのアームは挟む、放すことができる。しかし、シュートは自動でできないのでプログラミングでロボットをうまく動かしてシュートする必要がある。
今回はサブルーチンを用いてプログラミングした。
#define BLACK 39 //しきい値(黒の部分の最高値) #define WHITE 50 //しきい値(白の部分の最低値) #define Bcount 14 //線上における反応回数の上限 #define turn_L OnFwd(OUT_C); Off(OUT_A); //左に曲がる #define turn_R OnFwd(OUT_A); Off(OUT_C); //右に曲がる #define spin_L OnRev(OUT_A); Off(OUT_C); //左に旋回 #define STEP 1 //一回の判定によって行動する時間 #define junction OnRev(OUT_A); Wait(60); Off(OUT_A);\ Wait(200); OnFwd(OUT_AC); Wait(60); Off(OUT_AC); //交差点にあたった時の行動 #define arm_open OnFwd(OUT_B); Wait(7); Off(OUT_B); //アームを開く #define arm_close OnRev(OUT_B); Wait(7); Off(OUT_B); //アームを閉じる #define STOP Off(OUT_AC); Wait(200); //一時停止
sub linetrace_A() { SetSensor(SENSOR_2, SENSOR_LIGHT); int line_in=0; int junction_count=0; while(junction_count < 1){ //交差点一回まで動く while(line_in < Bcount) { //線上連続反応回数で交差点を認識 if(SENSOR_2 < BLACK){ //黒なら右 turn_R; line_in++; } else { if (SENSOR_2 < WHITE){ //境界線上なら左 turn_L; } else { //白なら右旋回 spin_L; } line_in=0; } Wait(STEP); } Off(OUT_AC); //交差点を渡る Wait(200); junction; line_in=0; junction_count++; } }
このライントレースは最初の直角がきちんと曲がれるように製作。交差点を一回渡るごとに停止する。しかし、曲線にはめっぽう弱く、うまく働かないので次のようなプログラムも製作。
sub linetrace_B() { SetSensor(SENSOR_2, SENSOR_LIGHT); int line_in=0; int junction_count=0; while(junction_count < 1){ //交差点一回まで動く while(line_in < Bcount - 7){ //線上連続反応回数で交差点を認識 if(SENSOR_2 < BLACK){ OnFwd(OUT_A); OnRev(OUT_C); //黒なら右旋回 line_in++; } else { OnFwd(OUT_C); OnRev(OUT_A); //白なら左旋回 line_in=0; } Wait(STEP); } Off(OUT_AC); //交差点を渡る Wait(200); junction; line_in=0; junction_count++; } }
左右の車輪を前回転、後回転それぞれに回すことで急なカーブも曲がれるようにしている。この二つのライントレースを組み合わせて走る。
sub shoot() { arm_open; OnFwd(OUT_AC); Wait(10); Off(OUT_AC); }
Aまで来たらボールをそのまま押し込んでゴールに入れる。
task main() { arm_open; // アームを開く Wait(100); linetrace_A(); //B地点からQ地点まで Wait(100); arm_close; //アームを閉じてボールをキャッチ Wait(100); linetrace_B(); //Q地点からP地点まで linetrace_A(); //P地点からA地点まで Wait(100); //シュート shoot(); }
・しっかり直角カーブを曲がれた ・ロボットを前回よりできる限り軽く、簡単な作りにできた
・ロボットが壊れやすかった ・ライントレースのプログラムを直角も急カーブもうまく対応できるものを作れたらよかった ・音を付けて次にどのような動きをするかを解かりやすくするべきだった