目次
コースで黒い線に沿って動き、紙コップを移動させるロボットを制作せよ。
自分は第1コースを走行した。第1コースは、
Aをスタート→Bを直進→Cを右折→Fを直進→Rを左折(一時停止)→Pを直進→Xの紙コップゲット→Qを左折→
Sを直進(一時停止)→Yに紙コップを置く→Sを直進(一時停止)→Fを左折(一時停止)→Cを右折→ゴール
試行錯誤を重ねた結果このような形になった。
今回はスムーズにラインをトレースできるように、できるだけコンパクトな車体を目指した。
前輪が2つ、後輪が1つである。
アーム部分がかなり重いので写真のように補強した。
後輪としてプラスチックの車輪を用いた。ゴムのタイヤだと摩擦が強く、上手く旋回することができなかった。
紙コップをつかむアームの部分は輪のようになっていて、この部分を上下させることでつかむことができる。安定して紙コップをつかむことができたが、かなり重さがあるのでアームが下がったときに壊れないように、固定する必要があった。
アーム部分に黄色い棒をつけることで安定して紙コップを運ぶことができた。
まず、以下のように定義した。
#define SHIKIICHI 48 //しきい値 #define turn_left1 set_power_L;OnFwd(OUT_A);OnRev(OUT_C); //左旋回 #define turn_right1 set_power_L;OnRev(OUT_A);OnFwd(OUT_C); //右旋回 #define turn_left2 set_power_L;Off(OUT_A);OnRev(OUT_C); //左に回る #define turn_right2 set_power_L;Off(OUT_C);OnRev(OUT_A); //右に回る #define zennsinn set_power_H;OnRev(OUT_AC);//前進 #define LOWPOWER 1 #define HIGHPOWER 4 #define set_power_H SetPower(OUT_AC,HIGHPOWER); //強めの力で(前進時に使用) #define set_power_L SetPower(OUT_AC,LOWPOWER); //弱めの力で(旋回、曲がるときに使用) #define migisennkai(t) set_power_L;OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_AC); //t秒右旋回 #define hidarisennkai(s) set_power_L;OnFwd(OUT_A);OnRev(OUT_C);Wait(s);Off(OUT_AC); //s秒左旋回 #define migi(u) set_power_L;Off(OUT_C);OnRev(OUT_A);Wait(u);Off(OUT_AC); //u秒右に回る #define hidari(v) set_power_L;Off(OUT_A);OnRev(OUT_C);Wait(v);Off(OUT_AC); //v秒左に回る #define mae(w) set_power_L;OnRev(OUT_AC);Wait(w);Off(OUT_AC); //w秒前進 #define usiro(z) set_power_L;OnFwd(OUT_AC);Wait(z);Off(OUT_AC); //z秒後退 #define sageru set_power_L;OnFwd(OUT_B);Wait(10);Off(OUT_B); //アームを下げる #define ageru set_power_L;OnRev(OUT_B);Wait(30);Off(OUT_B); //アームを上げる
正確にライントレースできるように、旋回、曲がるときは弱めの力で進むようにした。
コースの関係上、線の右側と左側をトレースするプログラムをそれぞれ作った。
sub line_r(){ //線の右側をトレース SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=30){ //右旋回が0.3秒以内なら繰り返す if(SENSOR_1 < SHIKIICHI -7) //右旋回 turn_right1; } else if (SENSOR_1 < SHIKIICHI -4){ //右に回る turn_right2; ClearTimer(0); } else if (SENSOR_1 < SHIKIICHI -1 ){ //前進 zennsinn; ClearTimer(0); } else if (SENSOR_1 < SHIKIICHI ){ //左に回る turn_left2; ClearTimer(0); } else { //左旋回 turn_left1; ClearTimer(0); } } PlaySound(SOUND_CLICK); //音を出す Off(OUT_AC); } //止まる
sub line_l(){ //線の左側をトレース SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=30){ //左に回るのが0.3秒以内なら繰り返す if(SENSOR_1 < SHIKIICHI -7){ //左に回る turn_left2; } else if (SENSOR_1 < SHIKIICHI -4){ //左に回る turn_left2; ClearTimer(0); } else if (SENSOR_1 < SHIKIICHI -1){ //前進 zennsinn; ClearTimer(0); } else if (SENSOR_1 < SHIKIICHI ){ //右に回る turn_right2; ClearTimer(0); } else { //右に回る turn_right2; ClearTimer(0); } } PlaySound(SOUND_CLICK); //音を出す Off(OUT_AC); } //止まる
線の左側をトレースするプログラムでは、旋回を無くし、ただの回転にすることで上手くいくようになったので、急遽変更した。
また、コース上のヘアピンカーブは交差点と認識されてしまうので、その部分だけ特別にプログラムを作成した。
sub line_pin(){ //11秒間(ヘアピンカーブを通り抜けるのにかかる時間)ライントレース SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=1100){ if(SENSOR_1 < SHIKIICHI -7){ turn_right1; } else if (SENSOR_1 < SHIKIICHI -4){ turn_right2; } else if (SENSOR_1 < SHIKIICHI -1 ){ zennsinn; } else if (SENSOR_1 < SHIKIICHI ){ turn_left2; } else { turn_left1; } } Off(OUT_AC); }
task main(){ mae(100); line_r(); hidari(50); line_r(); migisennkai(80); line_r(); hidari(100); line_pin(); line_r(); migisennkai(50); line_r(); Wait(100); //A〜Rまで hidarisennkai(110); mae(20); line_l(); mae(30); hidarisennkai(65); mae(40); usiro(40); //RからXまで sageru; //紙コップをつかむ mae(20); migisennkai(170); mae(40); hidari(40); line_l(); mae(25); hidarisennkai(50); line_r(); Wait(100); hidarisennkai(30); mae(50); line_r(); //XからYまで migisennkai(60); ageru; //紙コップを放す hidarisennkai(60); usiro(35); line_r(); Wait(100); hidarisennkai(20); mae(20); hidari(20); line_r(); Wait(100); hidarisennkai(60); mae(30); line_r(); Wait(100); migisennkai(50); mae(150); //Yからゴールまで Off(OUT_AC);} //止まる
かなりごちゃごちゃしてしまった。紙コップをつかむ、放す周辺のプログラムは、もっとまとめることができたと思う。
前回の課題より、プログラミングが難しくかなり時間がかかった。特に明るさの値を何度も微調整する必要があり、大変だった。本番の直前に本体が壊れるというハプニングもあった。 ただ、本番でミスなくゴールした時は、達成感があった。 今回の経験を生かして、最後の課題も成功させられるように頑張りたい。