目次

課題

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

各チームで作成したコースを1周するロボットを製作せよ。

交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には 次のような動作するプログラムを作成せよ。

1.空き缶をコース上に戻して再びコースに戻って進む。
2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む。
3.奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む。
ただし、
・速さと正確さを追求すること。
・コースを1周したら自動的に止まること。
・交差点では一時停止すること。

メンバー

タツヤ、オレンジの二名により構成されています。

ロボット

タツヤの開閉するアームへの必要以上の執着によりこのロボットは創造されました。

全体

CIMG0021.JPG

これが僕らのロボットです。前方についた開閉アームーにより全体対的にゴツイ印象を与えます

アーム

〜澗

CIMG0024.JPG

これがアームの全体になります。
一つのモーターで二つのアームを動かせるようにするのには大変苦労しました

中心部分

CIMG0038.JPG

これはアームの中心のアップです。
この部分に製作時間の大半を費やすことになりました。


CIMG0034.JPG
CIMG0036.JPG

 中心部分の詳しい説明をします。
 左図はモーターから左右に回転を分けるための上図に見える黒い部分を外したものです。ここは正面から見ると左右対称になっているのが分かります。

 次に右図は取り外した部分です。
 ここは左右でギア数が違います。それはギアの数が同じ場合アームが左右で同じ動きをしてしまい、物を挟むことができません。ここでギアの数を変えることでアームが左右対称に動き、物を挟めるようになります。
 またこの図で赤で囲われている部分には初め少し小さいギアを使ってしまい、左右で回転数が異なりアームの動きがずれていました。ここに同じ大きさのギアを用いることで左右の回転数をそろえました。
 この部分は小さいですが、案外重要な役割を果たしています。

Bμ

CIMG0033.JPG

アームの側面です。
この赤で囲われている部分によりモータ−からの横の回転を、アームが開閉する縦の回転に変換しています。

CIMG0039.JPG

縦に伸ばし立体的にすることで、より缶を掴みやすくしました。

バンパー

CIMG0026.JPG
CIMG0029.JPG

バンパーは図のようにアーム中心部分に取り付けられています。(うっかり右図アームのギア部分を付け忘れていることは気にしない)
アームの構造上タッチセンサーのコードが前に出ているので、上手く反応させるには工夫が必要でした。

CIMG0028.JPG

図のようにバンパー内側にでっぱりを作ることでタッチセンサーが反応しやすいようにしました。

光センサー

CIMG0031.JPG

赤枠内が光センサーです。
車体の前面に設置されており普段はアームの後ろにあるので正面からでは見えません。
反応しやすように地面に近く、ライントレースがしやすいように間隔を狭く設置しました。

工夫した点、苦労した点

 まずアームが開閉するようにするにはとても苦労した。なるべく簡単な構造を考えたり、ギアがうまくハマる、また回転数がそろうように組み方を考えるのにとても時間がかかった。さらにこのアームに合うバンパーを作るのにも苦労した。タッチセンサーのコードを避けたり、スイッチを押すのにでっぱりを付けるなど工夫した。
 障害は多かったがなんとか試行錯誤を続け完成に至ることができた。

コース

CIMG0040.JPG

オレンジとA4右の岩切氏によって作成されたコースです。
シンプルなデザインですがロボを走らせてみると案外難しかったです。

プログラム

タツヤのプログラム

#define eye_L SENSOR_1  //SENSOR_1をeye_Rと定義
#define eye_R SENSOR_3  //SENSOR_3をeye_Lと定義
#define touch SENSOR_2  //SENSOR_2をtouchと定義
#define THRESHOLD 40   // 閾値
#define go(t) OnFwd(OUT_A+OUT_C);Wait(t); //前進
#define back(t) OnRev(OUT_A+OUT_C);Wait(t); //後退
#define turn_R(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t); //右回転
#define turn_L(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t); //左回転

task main()
{
    SetSensor(eye_R, SENSOR_LIGHT);//センサ端子1に接続されたセンサが光センサーと宣言
    SetSensor(eye_L, SENSOR_LIGHT);//センサ端子3に接続されたセンサが光センサーと宣言
    SetSensor(touch, SENSOR_TOUCH);//センサ端子2に接続されたセンサがタッチセンサーと宣言

  while (true)
    {   start follow_line;//ライントレース開始
       
        until(touch==1);//タッチセンサーが反応したら以下のプログラムを実行
        stop follow_line;//ライントレース停止
          Float(OUT_B);  //缶を掴む
              Wait(30);
             Off(OUT_B);
            OnRev(OUT_A+OUT_B);  //缶を掴みつつ回転,缶を後方へ
           OnFwd(OUT_C);
              Wait(180);
             Off(OUT_B);
              back(40);      //位置修正
           OnFwd(OUT_B);    //缶を放す
              Wait(30);
            back(50);      //缶から離れる
            turn_R(160);
              
           
     }
}

task follow_line ()  //ライントレースのプログラムです
{
     int k=0 ;    //整数kを定義(交差点にいく度に1増える)
   
    while(k<8) //交差点を通った回数が8回より小さいとき
      {
        if ((eye_R > THRESHOLD)&&(eye_L >THRESHOLD))   //両方白の時前進
           {  
           go(10)
           } 
       else if ((eye_L< THRESHOLD)&&(eye_R > THRESHOLD))   // 1が黒線上の時左に回転
           {   
            turn_L (10)
           }
       else if ((eye_L > THRESHOLD)&&(eye_R < THRESHOLD))  //3が黒線上の時右に回転
           {    
           turn_R(10)                
           }
        else if ((eye_R< THRESHOLD)&&(eye_L < THRESHOLD))  //両方黒線上一時停止し前身
         {     Off(OUT_A+OUT_C);
                 Wait(100);
                     k++;   //交差点にきたらkに1をたす    
                   go(10);
            }
       }
    Off(OUT_A+OUT_C);
}

缶があったら缶を掴み、後方に回し、ライン上に戻してからライントレースを続けるプログラムです。そして8回交差点に着たら停止します。
缶をどかしててから本体をコースに戻すための微調整が大変でした。

オレンジのプログラム

#define get() OnRev(OUT_B);%缶を持つプログラム
#define go(t) OnFwd(OUT_A+OUT_C);Wait(t);%前へ
#define turn_R(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);%右へ
#define turn_L(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);%左へ
#define release() OnFwd(OUT_B);%缶を放す
#define light_R SENSOR_3%センサー3はセンサーライト
#define light_L SENSOR_1%センサー1はセンサーライト
#define THRESHOLD 40%40に設定
task main()
{
SetSensor(light_R,SENSOR_LIGHT);
SetSensor(light_L,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
while(true){
  start follow_line;%開始
  until(SENSOR_2==1);%
  stop follow_line;%停止
  get();缶を持って
  start follow_line;再び開始
  until((light_R<THRESHOLD)&&(light_L<THRESHOLD));%交差点に行くまで
  go(200);%交差点に行った後
  turn_R(200);%
  go(80);%
  release();%
  OnRev(OUT_A+OUT_C);Wait(50);%
  turn_L(200);%缶を再びおいて
  start follow_line;%スタート
                       }}
task follow_line()
{
while(true){
if((light_R>THRESHOLD)&&(light_L>THRESHOLD)){
go(5);}%黒線上にいるとき
if(light_R<THRESHOLD)
 {turn_R(5);
  }%ずれた場合
if(light_L<THRESHOLD)
 {turn_L(5);
   }
 if((light_R<THRESHOLD)&&(light_L<THRESHOLD))
    {
     Off(OUT_A+OUT_C);
     Wait(50);
     go(5);%交差点のとき
    }}
}

感想

タツヤ

 今回は前回の反省をふまえ早くから製作に取り掛かったが結局完成がギリギリになってしまった。
 しかし早く始めただけあってロボットは自分では工夫を凝らした良いものができたと思う。もっとプログラムに時間をかけて試行錯誤できなかったのは残念だが、それなりに満足のいくものが仕上がってよかった。
 次はさらに良いものができるように頑張りたい。

オレンジ

 前よりも早めに取りかかったから時間的には余裕があったが、課題が思っていたよりも難しくなかなか思い通りに動かなかった。次回はさらにしっかりとしたものを作っていきたい。

コメント

コメントをどうぞ

  • 工夫した点、苦労した点を分け、さらに具体的にすると良いと思います。また、特にこだわったアームの動作も解説してみてください -- TAKA? 2010-07-02 (金) 17:41:25
  • ロボットの説明など、書くべきことをきちんとかけていると思います。後は、工夫した点や考察などオリジナルな点を前面に出していくと良いです -- FI? 2010-07-12 (月) 17:49:45


添付ファイル: fileCIMG0040.JPG 198件 [詳細] fileCIMG0032.JPG 102件 [詳細] fileCIMG0031.JPG 182件 [詳細] fileCIMG0028.JPG 176件 [詳細] fileCIMG0029.JPG 177件 [詳細] fileCIMG0026.JPG 185件 [詳細] fileCIMG0039.JPG 201件 [詳細] fileCIMG0033.JPG 174件 [詳細] fileCIMG0036.JPG 169件 [詳細] fileCIMG0034.JPG 196件 [詳細] fileCIMG0038.JPG 171件 [詳細] fileCIMG0024.JPG 201件 [詳細] fileCIMG0021.JPG 194件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-12 (月) 17:49:45