- 履歴一覧
- ソース を表示
- 2015a/Member/Y.H/Mission3 は削除されています。
- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#o6391a41]
#contents
*課題について [#d4d18473]
課題3は超音波センサーを使ったロボットの製作。
半径1m以内にある空き缶を探し、25cmの距離からボールを転がしてそれにあてる。ただし、25cm以内に空き缶があるときは30cmまで離れること。
*ロボット本体について [#u3e5a9dd]
課題2では超音波センサーがついていなかったのでまずそれを取り付けた。
また、ボールがまっすぐ転がるように、レールのような補助のパーツを付けることにした。
*プログラムについて [#zfe7b45b]
**定義 [#db88cca1]
#define SPEED 35
#define shoot OnFwd(OUT_A,SPEED);Wait(300);Off(OUT_A);\
OnFwd(OUT_BC,SPEED);Wait(500);
#define sofa Off(OUT_BC);Wait(200);
int kyori=100;
int time=0;
shootの¥は文字化けのようです。バックシュラッシュのつもりです。気にしないでください。
**空き缶を探す [#l5245601]
タイヤの半径やモーターを動かした角度から移動した位置を割り出すより、タイマーを使ったほうが簡単そうだったので、そちらを使うこととした。
sub search(int runtime)
{
long t0=CurrentTick();
OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);
while(CurrentTick()<runtime){
if(SENSOR_4<kyori){
kyori=SENSOR_4;
time=CurrentTick();
}
}
sofa;
OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED);
Wait(runtime-time);
sofa;
}
**本文 [#mf4073ec]
task main()
{
SetSensorLowspeed(S4);
search(600); //空き缶を探す
if(kyori>25){ //ifもし、空き缶が半径25cm以内にないなら
while(true){
OnFwd(OUT_B,SPEED);OnFwd(OUT_C,SPEED+2);
until(SENSOR_4<=30);Off(OUT_BC);
search(300);
shoot; //25cmの位置からボールをあてる
Off(OUT_BC);
}
}else{ //elseさもなくば=空き缶が半径25cm以内にあるとき
while(true){
OnRev(OUT_BC,SPEED); //30cmまで離れてボールをあてる
until(SENSOR_4>=30);
shoot;
Off(OUT_BC);
} //whileのかっことじ
} //elseのかっことじ
} //task mainのかっことじ
*感想 [#kbad753c]
今回はうまくsubを取り入れられた。少しだが、プログラムの軽量化ができてうれしかった。また、どこまでをsubの中に含めるかも重要だと分かった。defineにしてしまったほうがいい長さなど、実感できて面白かった。
ただし遠くにボールがあった時に、当たらないことを防ぐため、二度searchを使ったが、その時間を距離によって変えられればよりよくなると思う。現在は、空き缶が25cm以内になかったときは一律の時間でsearchを実行する。
ほかに、工夫した点としては、searchを流用できるように、回転の向きと反対に少し曲がるようにプログラムを組んだことである。昔読んだ、山道からの復帰の方法を参考にした。