- 追加された行はこの色です。
- 削除された行はこの色です。
[[2008b]]
*課題 ライントレースロボットの作成 [#g6b30392]
**内容 [#x94a5a38]
チームで作成したコースに沿って動くロボットを作成
**注意点 [#m7891c87]
- 速さと正確さを追求すること
- 交差点で優先側を走っていない場合には、一時停止すること
- 前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
- コースを2周したら自動的に止まること
*目次 [#g3a535b4]
#contents
*コース [#r9174158]
コースは変則的にカーブを織り交ぜ、交差点が4つあるコースを作った。
写真
*ロボット製作 [#o6767f3d]
**ベース製作 [#cc4a812c]
今回のベースはドライブベースをもとに製作した。
製作当初からコースに大きなカーブが多くタイヤの摩擦が大きいことが考えられたので、
四輪ではなく三輪で制作することに決定した。
**センサー取り付け [#kf25bd5e]
光センサーは二つ取り付けた。
その光センサーの前方にタッチセンサーを取り付けた。
**キャスター [#ye3cc248]
キャスターは十分に動くスペースを確保し、車体が傾かないように高さを調節した。
*プログラム [#kc01ac0c]
#define THRESHOLD 40
#define THRESHOLD 40 //閾値
#define RUN_TIME 5
int move_count;
int move_count; //変数
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_LIGHT);
move_count = 0;
while(move_count <= 8){
if(SENSOR_2==0)
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサ−1は光センサー
SetSensor(SENSOR_2, SENSOR_TOUCH); //センサ−2はタッチセンサー
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ−3は光センサー
move_count = 0; //変数に0を代入
while(move_count <= 8) //値が8以下の間
{
if(SENSOR_2==0) //値が0なら
{
if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD))
if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) //光センサーが二つとも白の上にある場合直進する。
{
OnFwd(OUT_A+OUT_C);
}
if(SENSOR_3 < THRESHOLD)
if(SENSOR_3 < THRESHOLD) //右のセンサーが黒の上にある場合タイマー0をリセット・スタート。
タイマー0が0.05秒以下なら左タイヤのみで曲がる。
タイマー0が0.05秒を超えたら右タイヤも後転させて曲がる。
{ClearTimer(0);
while(FastTimer(0) <= RUN_TIME)
{
(SENSOR_3 < THRESHOLD);
Off(OUT_C);
OnFwd(OUT_A);}
OnRev(OUT_C);OnFwd(OUT_A);}
if (SENSOR_1 < THRESHOLD)
if (SENSOR_1 < THRESHOLD) //左のセンサーが黒の上にある場合タイマー1をリセット・スタート。
タイマー1が0.05秒以下なら右タイヤのみで曲がる。
タイマー1が0.05秒を超えたら左タイヤも後転させて曲がる。
{ClearTimer(1);
while(FastTimer(1) <= RUN_TIME)
{
(SENSOR_1 < THRESHOLD);
Off(OUT_A);
OnFwd(OUT_C);}
OnRev(OUT_A);OnFwd(OUT_C);}
if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))
if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //センサーが二つとも黒の上にある場合2秒停止。その後0.7秒直進。このとき変数の値を+1する。
{
Off(OUT_A+OUT_C);Wait(200);
OnFwd(OUT_A+OUT_C);Wait(70);(move_count);
move_count = move_count +1;
}}
if(SENSOR_2==1){
OnRev(OUT_A+OUT_C);Wait(100);
Off(OUT_A+OUT_C);Wait(100);
OnFwd(OUT_A+OUT_C);Wait(100);
}
}Off(OUT_A+OUT_C);}
if(SENSOR_2==1) //タッチセンサーに何かが触れた場合0.8秒後進。
0.5待機し、0.8秒前進し、元の位置に戻る。
{
OnRev(OUT_A+OUT_C);Wait(80);
Off(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_A+OUT_C);Wait(80);
}
}Off(OUT_A+OUT_C); //変数の値が8を超えた場合停止する。
}