〜課題2の目次〜
各チームで指定されたコースを作り、「ミッション」を遂行するためのロボットを作成する。
詳しくはhttp://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMission2を参照のこと。
最初は光センサーを車輪より後ろに取り付けていたがうまくライン上を走らせることができなかったので一番前に取り付けた。
そのため、光センサーの後ろにはタッチセンサーが付いており、光センサーにボールがぶつかることでタッチセンサーが反応し、アームが下がりボールを捕まえる。ボールを捕まえた後はアームはそのまま下がった状態でゴールするようになっている。
#define IKICHI_BLACK 45 #define SPEED_HIGH 35 #define SPEED_LOW 30 #define turn_left OnFwd(OUT_B,SPEED_HIGH);Off(OUT_C); #define turn_left1 OnRev(OUT_C,SPEED_LOW);OnFwd(OUT_B,SPEED_LOW); #define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED_HIGH); #define turn_right1 OnRev(OUT_B,SPEED_LOW);OnFwd(OUT_C,SPEED_LOW); #define STEP 1 #define nMax 30 #define short_break Off(OUT_BC);Wait(2000); #define go_forward OnFwd(OUT_BC,SPEED_HIGH);
sub catch_ball() //ボールを捕まえる { SetSensorTouch(S2); if (SENSOR_2 == 1) { OnFwd(OUT_A,SPEED_HIGH); Wait(200); Off(OUT_A); } }
task main () { SetSensorLight(S1); int nOnline=0; while (true) { while (nOnline < nMax) { if (SENSOR_1 < IKICHI_BLACK-15) { //閾値が45-15のとき左旋回、カウンターを増やす turn_left1; nOnline++; } else if (SENSOR_1 < IKICHI_BLACK-7) { //閾値が45-7のとき左折 turn_left; } else if (SENSOR_1 < IKICHI_BLACK+7) { //閾値が45+7のとき前進 go_forward; } else if (SENSOR_1 < IKICHI_BLACK+15) { //閾値が45+15のとき右旋回 turn_right1; } else { //その他の場合は右折 turn_right; } nOnline=0; } Wait(STEP); } short_break; //2秒間の停止 turn_right1; //右へ旋回する catch_ball(); }
whileのループから抜け出すことができていなかったため、思っているようにロボットを動かすことができなかったのだと思われる。カウントもうまく使いこなせていなかった。カウントはwhile文の最後のnOnline=0;を書いているためリセットされてしまっている。
whileやカウントの使い方を練習問題などでマスターできていれば良かったと思う。
C地点からA地点へライントレースをするプログラムは製作できたが、交差点での2秒間の停止やボールを捕まえることがうまくいかなかったので残念だった。
もっとプログラムが正確に書ければミッションを成功させることができたと思う。
今回のコースやロボットの製作は楽しんで取り組むことができたので良かった。