- 追加された行はこの色です。
- 削除された行はこの色です。
[[2012a/Member]]
*課題2 ライントレース [#re0618f5]
ルール
・コースを1周半以上まわる
・交差点を2つ
・直角カーブを1つ
・ニアピンカーブを1つ
*ロボット本体 [#w1998edb]
#ref(2012a/A4/SanChan/M2/201206151616091.jpg,100%,ロボット)
ロボット本体は簡単な構造で、コンパクトな車になりました。
#ref(2012a/A4/SanChan/M2/20120615161647_2.jpg,100%,ロボット)
本体で工夫した点は光センサーとタイヤの距離関係です。これをできるだけ近くすることで、コースを正確に読み取り、ロボットが間違った方向に進まないようにしました。
#ref(2012a/A4/SanChan/M2/20120615161709_2.jpg,100%,ロボット)
コースはルールに従って作りました。しかし、必要なものが上のほうにかたよってしまったので難しかったです。
プログラミングのの説明としては、動き出した時にタイマーをセットして、時間に合わせてコースの様々な部分をクリアしていくようにしました。また、より正確に動けるように白と黒の間を読み取り、少しずれただけでも修正できるようなプログラミングにしました。そのおかげで、なめらかな動きでラインをトレースすることができました。
反省点:
タイマーを動き始めにセットしているので入口によってタイマーをセットしなければならない・・・
次はコースの形に応じてプログラミングを変えることができるようにしたい!!
*プログラミング [#u2f2daa1]
#define THRESHOLD 52
#define THRESHOLD_K 32
#define THRESHOLD_W 65
#define THRESHOLD 52
#define THRESHOLD_K 32
#define THRESHOLD_W 65
task main()
{
SetSensorLight(IN_1);
long t0,time;
t0=CurrentTick();
task main()
{
SetSensorLight(IN_1);
long t0,time;
t0=CurrentTick(); //タイマーを0にする
do //ラインをトレースするプログラミング
{
int mode=1 //モードに1を代入
while(1){
switch(mode) //モードに応じた動きをする
{
case 1: //ラインをトレースするプログラミング
time=CurrentTick()-t0;
if(THRESHOLD+5>SENSOR_1&&SENSOR_1>THRESHOLD-5)
{
if(THRESHOLD+5>SENSOR_1&&SENSOR_1>THRESHOLD-5) //白黒の間を読み取る
{
Float(OUT_AC);
OnFwd(OUT_A,40);
OnFwd(OUT_C,40);
Wait(5);
}
if(THRESHOLD_K<SENSOR_1&&SENSOR_1<THRESHOLD_K+10)
{
if(THRESHOLD_K<SENSOR_1&&SENSOR_1<THRESHOLD_K+10) //少し黒寄りになったときにコースに戻る
{
Float(OUT_AC);
OnFwd(OUT_A,40);
OnFwd(OUT_A,40);
OnFwd(OUT_C,10);
Wait(5);
}
if(THRESHOLD_W-10<SENSOR_1&&SENSOR_1<THRESHOLD_W)
{
if(THRESHOLD_W-10<SENSOR_1&&SENSOR_1<THRESHOLD_W) //少し白寄りになったときにコースに戻る
{
Float(OUT_AC);
OnFwd(OUT_A,10);
OnFwd(OUT_A,10);
OnFwd(OUT_C,40);
Wait(5);
}
if(SENSOR_1<THRESHOLD_K)
{
if(SENSOR_1<THRESHOLD_K) //黒になったときコースに戻る
{
Float(OUT_AC);
OnFwd(OUT_A,40);
OnRev(OUT_C,30);
OnFwd(OUT_A,40);
OnFwd(OUT_C,40);
Wait(5);
}
if(SENSOR_1>THRESHOLD_W)
{
if(SENSOR_1>THRESHOLD_W) //白になったときコースに戻る
{
Float(OUT_AC);
OnRev(OUT_A,30);
OnRev(OUT_A,40);
OnFwd(OUT_C,40);
Wait(5);
}
}
while(time<3000);
}
if(time>21000)
{
mode=2; //モードに2を代入
}
break;
case 2://交差点を通過するプログラミング
{
time=CurrentTick()-t0;
if(THRESHOLD+5>SENSOR_1&&SENSOR_1>THRESHOLD-5) //白黒の間を読み取る
do //交差点を通過するプログラミング
{
time=CurrentTick()-t0;
if(THRESHOLD+5>SENSOR_1&&SENSOR_1>THRESHOLD-5)
{
{
Float(OUT_AC);
OnFwd(OUT_A,40);
OnFwd(OUT_C,40);
Wait(5);
}
if(THRESHOLD_K<SENSOR_1&&SENSOR_1<THRESHOLD_K+10)
{
if(THRESHOLD_K<SENSOR_1&&SENSOR_1<THRESHOLD_K+10) //少し黒寄りになったときにコースに戻る
{
Float(OUT_AC);
OnFwd(OUT_A,40);
OnFwd(OUT_A,40);
OnFwd(OUT_C,10);
Wait(5);
}
if(THRESHOLD_W-10<SENSOR_1&&SENSOR_1<THRESHOLD_W)
{
if(THRESHOLD_W-10<SENSOR_1&&SENSOR_1<THRESHOLD_W) //少し白寄りになったときにコースに戻る
{
Float(OUT_AC);
OnFwd(OUT_A,10);
OnFwd(OUT_A,10);
OnFwd(OUT_C,40);
Wait(5);
}
if(SENSOR_1<THRESHOLD_K)
{
if(SENSOR_1<THRESHOLD_K) //黒になったときコースに戻る
{
Float(OUT_AC);
OnFwd(OUT_A,40);
OnFwd(OUT_C,40);
OnFwd(OUT_A,40);
OnRev(OUT_C,40);
Wait(5);
}
if(SENSOR_1>THRESHOLD_W)
{
if(SENSOR_1>THRESHOLD_W) //白になったときコースに戻る
{
Float(OUT_AC);
OnRev(OUT_A,30);
OnFwd(OUT_C,40);
OnFwd(OUT_A,40);
OnRev(OUT_C,30);
Wait(5);
}
}
while(time<100000);
Off(OUT_AC);
}
while(21000<time&&time<23000);
Off(OUT_AC);
}
}