目次 #Contents *課題2の内容 [#ifff3ad7] #ref(2016b/Member/god22ila/Mission2/2016b-mission2.png,50%,コース) 今回の課題2の内容は上図のコースにライントレーサーを走らせ、途中に置いてあるピンポン球を掴み、ゴールにシュートするというものである。僕はA地点をスタート→P地点直進→Q地点直進→ピンポン球を掴む→Q地点直進→R地点右折→P地点直進→S地点左折→D地点へシュートというものである。 *ロボットの説明 [#r97767b5] **本体について [#he30576e] なるべくセンサーと紙の間の距離が近くになるようにするため、本体は低めに組み立てた。後ろに小さいタイヤをつけようとしたが、ロボットのバランスが悪くなってしまったのでつけるのをやめた。 **アームについて [#t2a53cfc] アームはショベルカーのような構造にした。ピンポン球は丸くてとても軽いので、アームで本体のほうに引き寄せると途中で球が浮いてアームの上に乗った。アームの左右には球が落ちないように壁を付けた。こうすることによって球が横から落ちなくなる。なので球をとった後に球が落ちるかもしれないということを気にせずにプログラミングができる。 *プログラミングについて [#t3de1858] #define turnright OnFwd(OUT_C,40); #define turnleft OnFwd(OUT_B,40); #define SR OnFwdSync(OUT_BC,40,-100); #define SL OnFwdSync(OUT_BC,40,100); #define gomae OnFwdSync(OUT_BC,40,0); #define XrdTR OnFwd(OUT_C,40); Wait(500);OnFwdSync(OUT_BC,40,-100); Wait(1400);Off(OUT_BC);Wait(300);OnFwdSync(OUT_BC,40,0);Wait(500);Off(OUT_BC);n++; //動作を実行し終わった後にnの値が1増える #define XrdST TR Wait(1000); GF Wait(200);n++; #define armup OnFwd(OUT_A,25);Wait(700);Off(OUT_A); #define armdown OnRev(OUT_A,25);Wait(700);Off(OUT_A); #define XX PlaySound(SOUND_CLICK);Wait(500);Wait(1000); **センサーとタイマーの起動 [#eb19429c] task main() { SetSensorLight(S1);//光センサー起動 int n=0; //nの値を決める。 long t0 = CurrentTick();//時間を測り始める直前の時刻をt0に代入する armup//アームを上げる まず、タイマーと光センサーを起動させる。nについては後程説明する。 while(n<7){ t0 = CurrentTick(); while(CurrentTick()-t0<600){ //CurrentTick()とt0の差が0.6秒以下の時 if(SENSOR_1>42){ //もしセンサーの値が42以上だったら左に旋回してタイマーをリセット senkaileft t0 = CurrentTick(); } else if(SENSOR_1>40){ //もしセンサーの値が40以上なら左に曲がりタイマーをリセット turnleft t0 = CurrentTick(); } else if(SENSOR_1>38){ //もしセンサーの値が38以上なら前進してタイマーをリセット gomae t0 = CurrentTick(); } else if(SENSOR_1>37){ //もしセンサーの値が37以上なら右に曲がりタイマーをリセット turnright t0 = CurrentTick(); } else{ senkairight } } Off(OUT_BC); while(n==6){ XrdST Off(OUT_BC); armup OnFwdSync(OUT_BC,40,0); Wait(300); n++; } アームを上げてそのまま本体で押し込んでシュート while(n==5){ SR Wait(700); n++; //変えた } while(n==4){ XX XrdST } while(n==3){ XrdTR } while(n==2){ XX XrdST } while(n==1){ XX XrdST PlaySound(SOUND_CLICK); Wait(500); t0 = CurrentTick(); while(CurrentTick()-t0<6000){ if(SENSOR_1>42){ SL } else if(SENSOR_1>40){ turnleft } else if(SENSOR_1>38){ GF } else if(SENSOR_1>37){ turnright } else{ SR } } Off(OUT_BC); Wait(500); armdown } while(n==0){ XX XrdST //変えた } } } *感想 [#u6f66e06] 今回の課題はまず黒いラインのしきい値を探すのに何回も数値を測って動かしての繰り返を行ったので苦労した。途中でタイヤが空回りして前に進まなくなることがあった。原因はロボットの本体の重心が後ろによっていたので、前輪が浮いてしまっていたからだ。なのでもう少し機械のほうを本体の前側に持っていってたらスムーズに走っていたかもしれない。