- 追加された行はこの色です。
- 削除された行はこの色です。
[[戻る>2013b/Member]]
#contents
*課題 [#f8d8effa]
自作したコース(下図)に沿って一周するロボットを作成せよ。
-次のステップでプログラムを作成すること。
交差点をきちんと認識し、正しく判断して通過できるようにする。
--確実に一周できるようにする。スタート地点から出発して元にもどるようにする。
--空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。
--1個の空き缶でうまくいったら、2個の空き缶でやってみる。
(下図は、授業で示された松本先生画のコース図)
~(下図は、授業で示された松本先生画のコース図)&br;
#ref(zu.jpg)
#ref(zu.jpg)&br;
筆者は反時計回りを担当した。
*ロボット [#r5a0698c]
-ドライブベースを小型化した。
-光センサーをより駆動部に近づけた。
-車輪を2つに減らした。
~→小回りがきくようになった。&br;&br;
~→小回りがきくようになった。&br;
-支えとして、車輪ではなく底の丸いパーツを使用した。
~→可動部を減らし、故障しうる箇所を減らした。
~→可動部を減らし、故障しうる箇所を減らした。&br;&br;(ドライブベースの写真)
#ref(image_1.jpeg)
#ref(image_2.jpeg)
(ロボットの写真)
#ref(image.jpeg)
*プログラム [#s5e6edef]
#define THRESHOLD 45 //ライントレースの閾値
#define set_H SetPower(OUT_AC,7); //直進用速度
#define set_L SetPower(OUT_AC,1); //カーブ用速度
#define turn_l1 set_L;OnFwd(OUT_C);OnRev(OUT_A); //反時計回り旋回
#define turn_l0 set_L;OnFwd(OUT_C);Off(OUT_A); //反時計回り移動
#define turn_r0 set_L;OnFwd(OUT_A);Off(OUT_C); //時計回り移動
#define turn_r1 set_L;OnFwd(OUT_A);OnRev(OUT_C); //時計回り旋回
#define go_fwd set_H;OnFwd(OUT_AC); //前進
#define STEP 1 //ライントレースの各動作時間
#define C1 1300 //1つ目の交差点までの時間(仮)
#define C2 2100 //2つ目の交差点までの時間(仮)
#define C3 2900 //3つ目の交差点までの時間(仮)
#define TROAD_G 5150 //ゴール探索を始めるまでの時間(仮)
#define TURN_T 72 //90°回転するにあたっての所要時間
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー定義
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0); //タイマーリセット・スタート
int n=0; //カウンタ定義
go_fwd;until(SENSOR_2>=THRESHOLD+10);PlaySound(2);Wait(5);Off(OUT_AC); //スタート直後の交差点を超えるまで前進
turn_r0;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OUT_AC); //黒いところを感知するまで時計回り移動
turn_r0;until(SENSOR_2>=THRESHOLD+10);PlaySound(2);Off(OUT_AC); //もう一度白いところを感知するまで移動を続ける
turn_l0;until(SENSOR_2<=THRESHOLD+5);PlaySound(2);Off(OUT_AC); //ラインの境界まで反時計回り回転
while(n==0){ //ゴールを感知するまで
if(FastTimer(0)==C1){go_fwd;Wait(50);} //交差点を通る時間になったら直進
if(FastTimer(0)==C2){go_fwd;Wait(50);}
if(FastTimer(0)==C3){go_fwd;Wait(50);}
if(FastTimer(0)>TROAD_G&&SENSOR_2<THRESHOLD-1){ //ゴール前の直線部に入る時間になったらゴール探索,ラインから外れたら通常のライントレースに戻す
PlaySound(2);turn_r1;Wait(TURN_T);Off(OUT_AC); //90°回転
if(SENSOR_2<THRESHOLD-3){PlaySound(3);go_fwd;Wait(100);n++;} //ゴールを発見したら向きを変えずに直進し、停止用のカウンタに+1
else{turn_l1;Wait(TURN_T);Off(OUT_AC);go_fwd;Wait(10);} //ゴールを発見できなければ元の向きに戻って探索を続行
}
else{ //ライントレース
if(SENSOR_2<THRESHOLD-7){turn_l1;} //黒い部分を感知したら反時計回り旋回
else if(SENSOR_2<THRESHOLD-5){turn_l0;} //黒寄りの境界を感知したら反時計回り移動
else if(SENSOR_2<THRESHOLD+3){go_fwd;} //境界を探知したら直進
else if(SENSOR_2<THRESHOLD+5){turn_r0;} //白寄りの境界を感知したら時計回り移動
else{turn_r1;} //白い部分を感知したら時計回り旋回
Wait(STEP); //決定した動作を10ミリ秒間行う
}
}
while(n>0){Off(OUT_AC);} //カウンタが0でなくなったら停止する
}
*反省点 [#s5f73126]
-プログラム制作の所要時間を甘く見積もりすぎた結果、プログラムが完成しなかった。
--交差点を判別するプログラムが出来ず、時間による判定となってしまった。
--缶を移動するプログラムが出来なかった。