#contents
* 課題2 黒い線に沿って動くロボット [#o7171aef]
作成したコースに沿って動くロボットを作成。~
‖さと正確さを追求すること~
交差点で優先側を走っていない場合には、一時停止すること~
A以にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと~
ぅ魁璽垢3周したら自動的に止まること
**ロボット本体 [#qbe7bb47]
ロボット本体は基本のドライブベースを使用しました。
***ロボにセンサーを付ける [#j6fb8df1]
最初に光センサーのみを取り付けました。~
まず、安直に上から固定してみました。
#ref(零号機横から.jpg)
#br
#ref(零号機斜めから.jpg)
しかし、地面から離れているためか、ラインの読み取りがうまく出来ませんでした。~
なので次に本体頭の下部につけました。
#ref(初号機横から.jpg)
これでしっかりとラインを読み取ることが出来るようになりました。
#br
#br
次にもう一台のロボットに当たった場合に反応できるようにタッチセンサーを取り付けました。~
またもや安直に上から取り付けてみました。
#ref(弐号機横から.jpg)
これでは不安定なうえに、タッチセンサーが当たる前にもう一台のタイヤにこちらの本体の下の部分が接触してしまう問題が発生しました。~
そこで光センサーを固定しているシャフトの中心にタッチセンサーも取り付けることにしました。
#ref(解説.jpg)
左右の青いブロックが光センサー、真ん中の黄色いバーがタッチセンサーに繋がっています。
#br
#ref(参号機横から.jpg)
#br
#ref(参号機前から2.jpg)

これでもう一台のロボットと接触するときは、最初にタッチセンサーから接触するようになりました。
#br
最後に(無駄な)飾りをつけて完成です。
#ref(走行中.jpg)
交差点で一時停止をしている時と、もう一台のロボットに接触したとき回転します。
***センサーの機構 [#ie2c205f]
タッチセンサーを横から見たものを模式的に表したものです。
#ref(タッチセンサー.jpg)
,離弌爾物にあたって押されると、~
△離札鵐機爾押されて、物に当たったことを認識します。~
の輪ゴムによって軽く留められているので、バーに物が当たっていないときはバーはセンサーにあたりません。また、センサーが押されたあと、押されていない状態に戻ることができます。
**プログラム [#ma05552c]

 #define LIGHT 40   //閾値の決定
 int stop_line ;  //停止線の数を数える変数を定義

 task main()
   {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  SetSensor(SENSOR_3,SENSOR_LIGHT); //3つのセンサーを定義
  stop_line = 0 ;  //停止線の数を数える変数の値を0にする

 while(stop_line < 10){   //停止線を10回通ったら止まるようにします。
#br
ロボットが直線上にあるとき
 if((SENSOR_1>LIGHT)&&(SENSOR_3>LIGHT))  // 2つの光センサーがともにラインに乗っていない
     { OnFwd(OUT_A+OUT_C); }            //左右のタイヤとも正回転
#ref(直進1.jpg)
黒の線はラインを表し、赤の点は光センサーを表しています。
このとき
#ref(直進2.jpg)
のように進みます。
#br
ロボットが曲がり角に来たとき
 if((SENSOR_1>LIGHT)&&(SENSOR_3<LIGHT)) //右のセンサーのみがライン上にある
     { OnFwd(OUT_A);                    //左のタイヤを正回転
       OnRev(OUT_C);}          //右のタイヤを逆回転
    if((SENSOR_1<LIGHT)&&(SENSOR_3>LIGHT)) //左のセンサーのみがライン上にある
     { OnFwd(OUT_C);          //右のタイヤを正回転
       OnRev(OUT_A); }         //左のタイヤを逆回転
#ref(右折1.jpg)
このとき
#ref(右折2.jpg)
のように進み
#ref(右折3.jpg)
のような状態になります。~
これを繰り返すことで曲がり角を曲がります。~
左折時は左右が反対になります。

ロボットが交差点に来たとき
 if((SENSOR_1<LIGHT)&&(SENSOR_3<LIGHT)) //左右のセンサーが両方ともライン上にある
     {stop_line = stop_line + 1 ;       //停止線を数える変数に1をプラスする
     Off(OUT_A+OUT_C);                  //一時停止をする
     OnFwd(OUT_B);           //一時停止している間飾りを回転させる
     Wait(200);
     Off(OUT_B);
     OnFwd(OUT_A+OUT_C);        //前進する
     Wait(100); }
#ref(停止線1.jpg)
停止線が無いほうが優先側です。~
停止線をセンサーが見つける(両方のセンサーがライン上にある状態になる)と~
まず停止線をカウントします。~
次に優先側ではないので一時停止します。~
そして優先側のラインに反応しないように一秒間センサーに関係なく前進させます。
#br
ロボットがもう一台に接触したとき
 if(SENSOR_2==1)                       //タッチセンサーが押される
     {OnRev(OUT_A+OUT_C);       //少し後退
     Wait(60);
     Off(OUT_A+OUT_C);         //一時停止
     OnFwd(OUT_B);          //一時停止している間飾りを回転させる。
      Wait(500);
      Off(OUT_B);}          //飾りを停止させる
 
 }                   // whileから始まる繰り返し動作のプログラムを閉じる
#br
ロボットがコースを三周する(停止線を10回通る)と
 PlaySound(SOUND_FAST_UP) ;
 Off(OUT_A+OUT_C);}
により止まります。
**コース [#w54504a3]
#ref(コース.jpg)
コースは交差点が3つある比較的単純な形です。
**苦労した点 [#jb92649c]
ロボットにセンサーを付けるのに苦労しました。シンプルな形というのは思いつきにくいものです・・・。
**感想 [#g7278d4a]
発表会の時二台のロボットの開始位置が悪く(良く?)て最初に一度衝突した後、最後まで衝突しませんでした。衝突時に飾りが回転するようにしていたので、残念でした。~
前回の時に比べると、誤差の修正が必要なく、センサーもしっかりと反応してくれたため、プログラムした通りに動いてくれたのでストレスなく楽しむことができました。
**コメント [#e053f4bf]
コメントをどうぞ
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS