AやA'を出発して各点にあるピンポン玉をつかみ,ゴールのプラ容器に入れる.途中でうまく動かなくなった場合、1回限り再スタートすることができる.また,ロボットが、ゴールのプラ容器に触れていてはいけない.
↑制作途中の写真だが,アームの足を平行四辺形のように作り,それを倒すと上についているアームが地面まで届き,ピンポン玉をつかめるようにした.機体を課題2の時より大きくしすぎるとライントレースが上手くいかないと思い,この形にすることで全体的にコンパクトにできた.これによって,ライントレースのサブルーチンやプログラムを課題2と同じものを使えた.
↑アームの中のアップ写真
↑ピンポン玉を一個つかむごとにゴールまで運んでいると時間がかかるし,うまく動かない可能性も上がると考えた.そこで,アームでピンポン玉をつかみ,上にあげると右につけたピンポン玉を乗せる部分がアームの真下に,90度回ってくるようにした.そしてゴールにつくと,この機構の横につけたモーターを回し,歯車が噛み合いこの機構を支えている二本の棒の後ろの方だけが少し上あがる.この動きでピンポン玉が乗った部分が傾き,乗っていたピンポン玉がプラ容器に入るように作った.そうすることで一度に数個のピンポン玉を運べるようになった.
↑しかし最終的に,アーム部分が重すぎたせいで下に行ってから上にもどらなくなってしまったため,上下に動くシステムを取り除いた.
プラ容器に入ってるピンポン玉を運ぶプログラムを書いた.
43〜…白
40〜43…白灰
36〜40…灰
33〜36…黒灰
〜33…黒
とした。
black_timeについて・・・黒色を判別している時間をblack_timeとして定義して,交差点の大きさや曲がり角の角度によって時間を変えた.何度も試した結果,Kなどの直角で270度の交差点で止まりたいときは30,つまり0,3秒に設定した.
int black_time=20; //黒色を判別している時間の設定 #define migisenkai OnFwd(OUT_A); OnFwd(OUT_C); //右に旋回 #define usetsu Off(OUT_A); OnFwd(OUT_C); //右折 #define chokushin OnRev(OUT_A); OnFwd(OUT_C); //直進 #define sasetsu OnRev(OUT_A); Off(OUT_C); //左折 #define hidarisenkai OnRev(OUT_A); OnRev(OUT_C); //左に旋回 #define koutai OnFwd(OUT_A); OnRev(OUT_C); //後退
黒線の右側をライントレースするサブルーチン.
sub follow_line2() { SetSensor(SENSOR_2,SENSOR_LIGHT); while(FastTimer(0)<black_time){ //黒色を判別している時間が30より小さい間繰り返す if(SENSOR_2<33){ //黒色の時 migisenkai //右に旋回 }else if((SENSOR_2>=33)&&(SENSOR_2<36)){ //黒灰色の時 usetsu ClearTimer(0); //右折,タイマー0にセット }else if((SENSOR_2>=36)&&(SENSOR_2<40)){ //灰色の時 chokushin ClearTimer(0); //直進,タイマー0にセット }else if((SENSOR_2>=40)&&(SENSOR_2<43)){ //白灰色の時 sasetsu ClearTimer(0); //左折,タイマー0にセット }else if(SENSOR_2>=43){ //白色の時 hidarisenkai ClearTimer(0); //左に旋回,タイマー0にセット } } Off(OUT_AC); Wait(100); ClearTimer(0); }
task main(){ SetPower(OUT_AC,7); //モーターの出力を7に設定
機体が重いのでモーターのパワーを最大の7にした.
follow_line2(); //AからKまでのライントレース follow_line2();
課題2と同様,follow_lineが一つだとなぜか動かなかったので二つ書いた.
migisenkai Wait(75); Off(OUT_AC); Wait(100); //正面をプラ容器に向ける chokushin; Wait(25); Off(OUT_AC); Wait(100); //距離を調整 OnRev(OUT_B); Wait(36); Off(OUT_B); Wait(100); //ピンポン玉をつかむ migisenkai; Wait(60); Off(OUT_AC); Wait(100); //機体をゴールのプラ容器に向ける chokushin; Wait(240); Off(OUT_AC); Wait(100); //距離を調整 migisenkai; Wait(75); Off(OUT_AC); Wait(100); //機体をゴールに向ける OnFwd(OUT_B); Wait(50); Off(OUT_B); //アームを開いてピンポン玉を放す }
結局,時間的に一つのピンポン玉を運ぶプログラムしか書けなかった.
失敗の一番大きな原因は,時間が足りなかったことだと思う.ロボットを作るのに時間がかかり,動かせるかを試す時間が少なくなってしまった.最初はマスター,スレイブ両方のプログラムを書き,通信して動かすのにも成功していたが,アームが重すぎてモーターの力であげることができないとが分かり,思い切ってRIS本体を一つにし,マスター側だけでピンポン玉をつかみ,運ぶようにした.