課題2 黒い線に沿って動くロボット

作成したコースに沿って動くロボットを作成。
‖さと正確さを追求すること
交差点で優先側を走っていない場合には、一時停止すること
A以にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
ぅ魁璽垢3周したら自動的に止まること

ロボット本体

ロボット本体は基本のドライブベースを使用しました。

ロボにセンサーを付ける

最初に光センサーのみを取り付けました。
まず、安直に上から固定してみました。

零号機横から.jpg
 
零号機斜めから.jpg

しかし、地面から離れているためか、ラインの読み取りがうまく出来ませんでした。
なので次に本体頭の下部につけました。

初号機横から.jpg

これでしっかりとラインを読み取ることが出来るようになりました。

 
 

次にもう一台のロボットに当たった場合に反応できるようにタッチセンサーを取り付けました。
またもや安直に上から取り付けてみました。

弐号機横から.jpg

これでは不安定なうえに、タッチセンサーが当たる前にもう一台のタイヤにこちらの本体の下の部分が接触してしまう問題が発生しました。
そこで光センサーを固定しているシャフトの中心にタッチセンサーも取り付けることにしました。

解説.jpg

左右の青いブロックが光センサー、真ん中の黄色いバーがタッチセンサーに繋がっています。

 
参号機横から.jpg
 
参号機前から2.jpg

これでもう一台のロボットと接触するときは、最初にタッチセンサーから接触するようになりました。

 

最後に(無駄な)飾りをつけて完成です。

走行中.jpg

交差点で一時停止をしている時と、もう一台のロボットに接触したとき回転します。

センサーの機構

タッチセンサーを横から見たものを模式的に表したものです。

タッチセンサー.jpg

,離弌爾物にあたって押されると、
△離札鵐機爾押されて、物に当たったことを認識します。
の輪ゴムによって軽く留められているので、バーに物が当たっていないときはバーはセンサーにあたりません。また、センサーが押されたあと、押されていない状態に戻ることができます。

プログラム

#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回通ったら止まるようにします。
 

ロボットが直線上にあるとき

if((SENSOR_1>LIGHT)&&(SENSOR_3>LIGHT))  // 2つの光センサーがともにラインに乗っていない
    { OnFwd(OUT_A+OUT_C); }            //左右のタイヤとも正回転
直進1.jpg

黒の線はラインを表し、赤の点は光センサーを表しています。 このとき

直進2.jpg

のように進みます。

 

ロボットが曲がり角に来たとき

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); }         //左のタイヤを逆回転
右折1.jpg

このとき

右折2.jpg

のように進み

右折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); }
停止線1.jpg

停止線が無いほうが優先側です。
停止線をセンサーが見つける(両方のセンサーがライン上にある状態になる)と
まず停止線をカウントします。
次に優先側ではないので一時停止します。
そして優先側のラインに反応しないように一秒間センサーに関係なく前進させます。

 

ロボットがもう一台に接触したとき

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から始まる繰り返し動作のプログラムを閉じる
 

ロボットがコースを三周する(停止線を10回通る)と

PlaySound(SOUND_FAST_UP) ;
Off(OUT_A+OUT_C);}

により止まります。

コース

コース.jpg

コースは交差点が3つある比較的単純な形です。

苦労した点

ロボットにセンサーを付けるのに苦労しました。シンプルな形というのは思いつきにくいものです・・・。

感想

発表会の時二台のロボットの開始位置が悪く(良く?)て最初に一度衝突した後、最後まで衝突しませんでした。衝突時に飾りが回転するようにしていたので、残念でした。
前回の時に比べると、誤差の修正が必要なく、センサーもしっかりと反応してくれたため、プログラムした通りに動いてくれたのでストレスなく楽しむことができました。

コメント

コメントをどうぞ



添付ファイル: fileタッチセンサー.jpg 209件 [詳細] file解説.jpg 208件 [詳細] fileコース.jpg 200件 [詳細] file走行中.jpg 206件 [詳細] file停止線1.jpg 210件 [詳細] file右折2.jpg 206件 [詳細] file右折3.jpg 210件 [詳細] file右折1.jpg 212件 [詳細] file直進2.jpg 260件 [詳細] file直進1.jpg 197件 [詳細] file零号機斜めから.jpg 217件 [詳細] file零号機横から.jpg 210件 [詳細] file弐号機横から.jpg 215件 [詳細] file初号機横から.jpg 209件 [詳細] file参号機前から2.jpg 199件 [詳細] file参号機横から.jpg 214件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-24 (火) 11:32:57 (4079d)