決められたコースで黒い線に沿って動き,350㎖の空き缶を移動させるロボットを作る.このレポートではミッションの第一コースを走る.
最初の機体は後ろ側の二輪だけが動く二輪駆動のものだったが,急なカーブが曲がり切れなかったため,前側の二輪も動く四輪駆動のものに変更した.
左右のギアのサイズを同じにすることで力や速さに差が出ないようにしている.また,トルクギアを組み込むことによって缶の大きさに関係なくつかめるうえに,回し続ければアームに常に力を加えることも可能である.
#define RESET ClearTimer(0) #define sasetu OnFwd(OUT_C) #define usetu OnFwd(OUT_A) #define tyokusin OnFwd(OUT_AC) #define STOP Off(OUT_AC) #define kaitenR OnFwd(OUT_A);OnRev(OUT_C) #define kaitenL OnFwd(OUT_C);OnRev(OUT_A) #define SOUND PlaySound(SOUND_UP)
sub lineL() { RESET; while(FastTimer(0)<50){ if(SENSOR_1<50){ sasetu; Wait(5); STOP; } else{ usetu; RESET; Wait(5); STOP; } } SOUND; }
黒いラインの左側をトレースするプログラム.
sub lineR() { RESET; while(FastTimer(0)<50){ if(SENSOR_1<50){ usetu; Wait(5); STOP; } else{ sasetu; RESET; Wait(5); STOP; } } SOUND; }
黒いラインの右側をトレースするプログラム. 両方終わったことが分かるように最後に音が鳴るようにしている.
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); tyokusin; Wait(100); STOP;//Aを出る
lineL(); OnRev(OUT_C); Wait(30); STOP; Wait(100); tyokusin; Wait(30);//Cをこえる STOP;
このときラインの左側をトレースしているため,Bの交差点には反応しない.
lineL(); kaitenL; Wait(50); OnRev(OUT_B);//念のためアームを開いておく lineL();//Dに到達
OnRev(OUT_C); Wait(40); STOP; Wait(100); OnFwd(OUT_B); Wait(50);//缶を掴む Off(OUT_B); tyokusin; Wait(10); STOP; kaitenL; Wait(40); STOP;
缶を掴む一連の動きのプログラミング.次の動きに入りやすいように円のD地点の接線方向に向きを変えるまでをこのプログラムとしている.
lineL(); OnRev(OUT_C); Wait(60); STOP; tyokusin; Wait(20);//Eをこえる
lineL(); kaitenL; Wait(20);//Fを左折
lineL(); Wait(100); kaitenL; Wait(40);//Gを左折 STOP; tyokusin; Wait(30); STOP;
半円のカーブが内側をトレースしていては曲がり切れないため,少し直進をはさみ,ラインの外側トレースするようにしている.
lineR(); kaitenR; Wait(50); STOP;//直角カーブを曲がる
lineR(); tyokusin; Wait(20); STOP; kaitenR; Wait(30); STOP;
前の半円カーブと同様に,内側をトレースしていては曲がり切れないため,直進をはさみライン外側をトレースするようにしている.
lineL(); OnRev(OUT_C); Wait(30); STOP; Wait(100); usetu; Wait(160);//Hを右折 STOP;
lineR(); Wait(100); kaitenR; Wait(20);//Iを右折 STOP;
lineR(); OnRev(OUT_A); Wait(40); STOP; tyokusin; Wait(20);//Lを越える
lineR(); OnRev(OUT_A); Wait(40); STOP; tyokusin; Wait(20);//Kを越える
lineR(); OnRev(OUT_A); Wait(30); STOP; Wait(100); kaitenL; Wait(70);//90度回転 STOP; OnRev(OUT_B); Wait(50); Off(OUT_B);//缶を離す OnRev(OUT_AC); Wait(70); STOP; kaitenR; Wait(70); STOP; tyokusin; Wait(60); STOP; kaitenR; Wait(70); STOP;
lineL(); Wait(100); kaitenL; Wait(60);//Bを左折
lineL(); OnRev(OUT_C); Wait(30); STOP; tyokusin; Wait(150); STOP;//Aに到達 }
一回は成功することができた.だが,成功率が低くほとんど失敗に終わった.
今回のロボットはアームを前に出しすぎたため,缶の抵抗で動きにくくなってしまったり,アームが外れかけるといった問題が発生した.プログラミングは調子が良い時と悪い時で差が大きく出るものとなってしまった.
今回の課題は機体は改良を繰り返し,いいものになったが,プログラミングが難しかった.電池の具合や機体の場所などによって,成功したり,失敗したりしてしまった.微調整を繰り返したがなかなか成功率が上がらなかった.これからプログラミングの技術をもっと身につけ,できることを多くしていきたい.