- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009b]]
*課題 [#j8fc75ee]
光センサーを使って線上を進むロボットの作成
また障害物に対して、⑴撤去して進む
⑵スタート地点に集める
⑶最寄りの交差点まで運ぶ 、のプログラム作成
*メンバー [#m8296b65]
kata 「撤去して進む」担当
NISHI 「最寄りの交差点まで運ぶ」担当
SHIMA 「スタート地点に集める」担当
*目標 [#labab822]
速度は問わず、正確に進める個性豊かなロボットを製作できたらいいなあ。
*ロボット概要 [#r5a4ee77]
**車体 [#gad521d7]
#ref(body1.png,center)
これが、僕たちが作成したロボットです。仕組みは、上部のアームが回転してパックを捕らえます。アームは、全面のバンパーに取り付けられたタッチセンサーにパックが反応すると、回転し始めます。後ろのバンパーは飾りです。
光センサーは、2個使用し、黒い線を挟み込む方式です。
車体は、なるべく小回りができるよう小型化に心掛けました。
**アーム [#x25eebea]
#ref(arm.jpg,center,75%)
上の写真は、車体上部に設けられているアームの全体図です。このアームは、360度右回転も左回転もできます。車体上部からみて左回転でパックを確保し、右回転でパックを離します。
CENTER:&ref(f.jpg,left,60%);&ref(g.jpg,center,60%);&ref(h.jpg,right,60%);
次にアームの心臓であるギアボックスを解説します。
上の写真は、左よりギアボックスからアームを取り外したもので、右に行くにつれてギアボックスの外装が外れていってます。
このギアボックスの最大の工夫は、「カム」というギアのパーツを使用した点です。
(一番右の写真でいうとモーターから伸びている軸に取り付けられたトルネードしている物体です。)
初めは、アームはいくつかのギアを使用し取り付けていましたが、それだとアームの回転が速すぎました。
しかし、カムを用いることにより、回転速度を抑えられたので、この問題は解決しました。
ちなみに、軸先端に設けられたギアは、手動でアームを回転させるために設けられました。(すごく便利です。)
**バンパー [#qd6cf1d2]
CENTER:&ref(i.jpg,center,60%);&ref(j.jpg,center,60%);
バンパーの工夫点は、反応しすぎず反応させる(!?)ことです。
どういうことかというと、パックが軽すぎるため通常のバンパーでは反応しません。そのためバンパーは、試行錯誤を重ねたほぼオリジナルです。
バンパーの先端は、黒と黄色の棒?を使いパックが当たりやすくなっています。なぜこの組み合わせかというと、アームの回転を妨げないからです。
*プログラム(Kata) [#sa7488f4]
**NISHI,ver [#m7511be6]
#define eye_L SENSOR_1 //SENSOR_1をeye_Lと定義
#define eye_R SENSOR_3 //SENSOR_3をeye_Rと定義
#define touch SENSOR_2 //SENSOR_2をtouchと定義
task main()
{
SetSensor(eye_L,SENSOR_LIGHT);
SetSensor(eye_R,SENSOR_LIGHT);
SetSensor(touch,SENSOR_TOUCH);
repeat(3) { //以下の命令を3回繰り返す
start follow_line; //ライントレースを開始
until (touch == 1); //停止してアームを4秒間左回転
stop follow_line;
Off(OUT_A+OUT_C);
OnFwd(OUT_B); Wait(400);
Off(OUT_B);
}
ClearTimer(0); //タイマーを設定
while(Timer(0) <= 150 ){ //15秒間ライントレース
start follow_line;
}
Float(OUT_A+OUT_C);
}
task follow_line()
{
while(true) {
if ((eye_L >= 36) && (eye_R >=35)) //両方白なら直進
{ OnFwd(OUT_A+OUT_C); }
else if ((eye_L >= 36) && (eye_R <= 35)) //右が黒なら右折
{ OnFwd(OUT_A); OnRev(OUT_C); }
else if ((eye_L <= 36) && (eye_R >= 35)) //左が黒なら左折
{ OnRev(OUT_A); OnFwd(OUT_C); }
else //両方黒なら
{ OnFwd(OUT_A+OUT_C); Wait(65); //0,65秒間直進し
Off(OUT_A+OUT_C); //アームを4秒間右回転
OnRev(OUT_B); Wait(400);
Off(OUT_B); }
Wait(1); }
}
関係ない場所で光センサーが両方反応してしまい、
いきなりアームを回し始めてしまってセンサーの値の調節がたいへんだった。
**SHIMA.ver [#x191c681]
#define THRESHOLD 40
#define RUN_TIME 2000 //稼働時間
task main ()
{
SetPriority(1);
SetSensor(SENSOR_1,SENSOR_LIGHT); //SENSOR1は光センサー
SetSensor(SENSOR_2, SENSOR_TOUCH); //SENSOR2はタッチセンサー
SetSensor(SENSOR_3,SENSOR_LIGHT); //SENSOR3は光センサー
ClearTimer(0); //タイマーの設置
while( Timer(0) <= RUN_TIME )
{
start follow_line; //線に沿って進む。
until(SENSOR_2==1);//reaction_of_banper //タッチセンサーが反応したら
stop follow_line; //線に沿って進むのをやめる。
Off(OUT_A+OUT_C); //いったん停止
OnFwd(OUT_B);Wait(820); //アームを動かし始める。
Off(OUT_B); //アームの停止
}
}
task follow_line() //ラインに沿って進むプログラム
{
while(true)
{
if (SENSOR_1>THRESHOLD) //左側のセンサーが白で
{
if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら
{
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);//go_foward //直進する。
}
else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら
{
Off(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C); //右折する。
}
}
else if(SENSOR_1<THRESHOLD) //左側のセンサーが黒で
{
if (SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら
{
Off(OUT_A+OUT_C);
OnFwd(OUT_C);OnRev(OUT_A); //左折する。
}
else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら
{
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C); //直進する。
}
}
}
}
最初思ったようににアームが回転せず大変でした。
*感想 [#w09e510b]
NISHI: 光センサーの設定でロボ自体の影に反応してしまったり、コースの微妙な位置でラインから逸れてしまったりと、大変なことばかりだったけど、おもしろかった。
SHIMA: タイマーの時間の設置が難しかったです。また、パックが軽いためタッチセンサーの製作に苦労しました。