〜コースの黒い線に沿って動き、350mlの空き缶を移動させるロボットを製作せよ〜
作成したロボットの写真
マニュアルにあった基本形にアーム、光センサーのパーツを取り付けた。アームは上からかぶせるようにして缶を捕まえるような形にしている。
また、 回転半径 をなるべく小さくするため、光センサーは車体近くに取り付けた。
ライントレースにおいて重要なのが回転半径である。回転半径は、上図の様に光センサーとモーターがついている方のタイヤとを結んだ線で、片方のタイヤのみを回して移動するとき、これを半径とし、動かさない方のタイヤを中心とした円を描く。
つまり、片方のタイヤを回して軌道修正しようとしたとき、回転半径の円より小さい半径のカーブはトレースでは曲がり切れず、課題に沿わなくなってしまうため、ロボットを作る際は気にしなくてはいけない。
ロボットはラインのどちらか片側をトレースするため、曲がり角、交差点に必ず突っ込んでしまう。これを利用して、何回黒の部分に突っ込んだかをカウントして、交差点と曲がり角の区別をつけようとした。
最終的に、完成させることがはきなかった。 成功していたA→空き缶キャッチ までのプログラムは以下のように書いた。
/*値定義*/ #define PaleGray 47 /*白よりの灰の値*/ #define DarkGray 34 /*黒よりの灰の値*/ #define Black 32 /*黒の値*/ #define White 48 /*白の値*/ #define Gray 44 /*灰の値*/ #define ROTATION 40 /*旋回時間*/ #define CHEAK_TIME 110 /*交差点かどうかの判断*/ #define REVERCE 110 #define LOWPOWER 2 #define GRIPPOWER 6
/*動作定義*/ #define rot_L OnFwd(OUT_C);OnRev(OUT_A);Wait(ROTATION);SetPower(OUT_AC,LOWPOWER); /*左旋回*/ #define rot_R OnFwd(OUT_A);OnRev(OUT_C);Wait(ROTATION);SetPower(OUT_AC,LOWPOWER); /*右旋回*/ #define go_st OnFwd(OUT_AC);SetPower(OUT_AC,LOWPOWER); /*直進*/ #define back OnRev(OUT_AC); SetPower(OUT_AC,LOWPOWER); /*後退*/ #define turn_R OnFwd(OUT_A);Off(OUT_C);SetPower(OUT_AC,LOWPOWER); /*右へ*/ #define turn_L OnFwd(OUT_C);Off(OUT_A);SetPower(OUT_AC,LOWPOWER); /*左へ*/ #define reverce_L OnRev(OUT_C);Off(OUT_A);SetPower(OUT_AC,LOWPOWER); /*右へ後回転*/ #define reverce_R OnRev(OUT_A);Off(OUT_C);SetPower(OUT_AC,LOWPOWER); /*左へ後回転*/ #define pause Off(OUT_AC);Wait(50); /*一時停止*/ #define alert PlaySound(SOUND_DOUBLE_BEEP);PlaySound(SOUND_DOUBLE_BEEP);Wait(100); /*交差点の合図*/ #define grip OnFwd(OUT_B);Wait(200);SetPower(OUT_B,GRIPPOWER); /*缶をつかむ*/ #define put OnRev(OUT_B);Wait(200);SetPower(OUT_B,GRIPPOWER); /*缶を置く*/
task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int AtoJ=0; /*AからJまでの動作の区切り*/ int BLACK=0; /*黒に入った回数をカウント*/
while(AtoJ<1){ if(SENSOR_2>=PaleGray){ /*白よりの灰なら左へ*/ turn_L; }else if(SENSOR_2>=Gray){ /*灰なら直進*/ go_st; }else if(SENSOR_2>=DarkGray){ /*黒よりの灰なら右へ*/ turn_R; }else if(SENSOR_2<=Black){ /*黒に入った回数によって分岐*/ if(BLACK==1){ /*二回目の黒 交差点と判断 合図して停止*/ pause; alert; AtoJ++; }else if(BLACK==0){ /*一回目の黒 曲がり角と判断 無視して直進*/ rot_R; Wait(ROTATION); go_st; Wait(20); BLACK++; } } }
go_st; /*缶をつかむ動作へ*/ Wait(50); pause; grip; pause; /*缶をつかむ*/ Off(OUT_B); back; Wait(50); pause; rot_L; /*バック、旋回してJ〜Hルートへ*/ Wait(30);
交差点の判断を、黒い部分に入った回数をカウントさせて操作を変えさせようと思ったが、コース が手書きのため、色ムラがあり、うまくできなかった。
素直にタイマーを使って時間で判断するものにすればよかったと思う。