2010a

目次

1、[課題2]の内容

  各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空き缶を2個以上おき、紙パックにぶつかった時には次のような動作するプログラムを作成せよ。
  (他のメンバーと重ならないように一人一つのプログラムを作成する)

    1. 空き缶をコース上に戻して再びコースに戻って進む。
    2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む。
    3. 奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む。

  *ただし、マインドストーム基本セット2.0を用いて製作したロボットと独自に作成したコースのみを使って以下のことに注意する。

   •速さと正確さを追求すること
   •コースを1周したら自動的に止まること
   •交差点では一時停止すること

空き缶

左の写真は使用する空き缶の写真です。

2、メンバー紹介

  ヤマモトと、カワシマの二人です。

3、作成したコース

コース

できるだけ複雑なものになるように意識して作りました。(少し複雑になりすぎました)

4、ロボットの紹介

  二人で一台のロボットを製作しました。

一号機(輪掛け式):失敗作

  光・センサと、タッチ・センサと、3つのモーターを用いて製作しました。また、このロボットは3つの部分( 銑)に分けることができます。(運びやすくするためです。)

各部分の説明

   【 

一号機

この部分には、黄色い矢印部に光・センサ、赤い矢印部にタッチ・センサが搭載されています。

   【◆

一号機

この部分には、モーターを1つ使用しました。

   【】

一号機

この部分は、マインドストーム基本セット2.0の組み立てガイド(LEGO)を参考にしました。また、この部分にはモーターを2つ使用しました。

一号機の動き

   《上方》

一号機

モータを、二つ使って四輪駆動にすることにより、前後左右の動きを可能にしました。

   《正面》  

一号機

赤い丸の部分にあるタッチ・センサに空き缶が触れると…

   《前方其の一(右側面)》

一号機

赤い矢印で示したように、紫の輪が動き空き缶をとらえます。

   《前方其の二(右側面)》

一号機

また、目的地に空き缶を運び終えると、紫の輪が青い矢印のように動き、空き缶を離します。

反省点

  ・紫の輪が空き缶の下から三分の二までしか掛からなかったため、ロボットが後進すると空き缶が倒れて運ぶことが不可能になってしまった。
  ・輪の位置をもう少し下にすればよかった。
  ・タッチ・センサがうまく反応しなかった。

  一号機は実用化には至りませんでした。 

二号機(輪掛け式):失敗作

  一号機の失敗を糧にして、二号機を作りました。二号機も一号機同様、光・センサと、タッチ・センサと、3つのモーターを用いて製作しました。
   《外見》

二号機

モーターを、一号機よりも上の位置に取り付けました。  

二号機の動き

   《前方(左側面アップ)》

二号機

赤〇の部分にあるタッチ・センサに空き缶が触れると・・・  

   《前方其の一(左側面)》

二号機

一号機同様、紫の輪が下りてきて(青色の矢印)空き缶を捕えます。    

   《前方其の二(左側面)》

二号機

また、空き缶を目的地まで運ぶと紫の輪を下ろして(赤色の矢印)缶を離します。  

   《真上》

二号機

空き缶を紫の輪の中に捕えたまま前後左右に動くことが可能です。  

改善点(一号機からの)

  ・空き缶の下から三分の一のところに紫の輪が来るようにすること(ロボットが空き缶を捕えた段階)で、ロボットが前後左右に動いても空き缶が倒れなくなりました。
  ・タッチ・センサがより反応するように前にブロックを設置しました。

反省点(一号機からの)

  ・一号機よりも強度が落ちました。
  ・ロボットのバランスが悪い。
  ・ラインをトレースする際に問題点有り。

  結局、二号機も実用化には至りませんでした。  

三号機(ハサミ式):成功作

  一号機、二号機とは大きくロボットの作りは変更しましたが、三号機も一号機、二号機同様、光・センサと、タッチ・センサと、3つのモーターを用いて製作しました。
   《上部》

三号機:上部

   《左側面》

三号機:左側面

工夫点

  ・今までの輪掛け式からハサミ式に缶を掴むデバイスを変更しました。
  ・クワガタ虫をモデルにしました。あと、目(白くて丸い、比較的大きな部品の中央に黒い小さな部品を取り付けた部分)も付けてみました。

ハサミの工夫点

   《ハサミのギア》

三号機:ハサミのギア

ハサミの動きをより精密にできるようなギアを選びました。オレンジ色の矢印の方向にギアが回るとハサミが閉じます。

   《ハサミの前方(空き缶捕獲時)》

三号機:ハサミ

ピンクの矢印で示した青い部品は、ロボットが後ろに動いた時に空き缶が倒れないように取り付けたものです

   《ハサミの左側面》

三号機:ハサミ

水色の矢印で示した紫の部品は、ロボットが右に旋回した時に空き缶が倒れないように取り付けました。  

   《ハサミの右側面》

三号機:ハサミ

水色の矢印で示した紫の部品は、ロボットが左に旋回した時に空き缶が倒れないように取り付けました。

車体の工夫点

   《車体のみ》

三号機:車体

一号機の「各部分の説明の」の写真と比べてもらえれば解りますが、従来より小型化しました。(より動きが細やかになるように)

光・センサについての工夫点

   《光・センサ搭載部》

三号機:裏側

黄色の矢印部から解るように、光・センサを黒い棒状の部品に取り付けることによって、二つの光・センサの幅を調節することができ、そのことにより自分たちのコースだけでなく他の人のコースにも対応することを可能にしました。

その他の工夫点

  ・ハサミの部分が重すぎたために、後ろにタイヤを付けることによってバランスを保ちました。   

三号機の動き

   《裏側》

三号機:裏側

・二つのオレンジの矢印で示された部分にある光・センサで黒いラインをトレースします。
・オレンジの輪で示された部分のタッチ・センサが搭載されています。

   《開いた時》  

三号機:裏側

上記のタッチ・センサに空き缶が触れることによって・・・

   《閉じた時》

三号機:裏側

開いていたハサミが閉じて空き缶を捕獲します。

反省点

  ・もう少し小型化したかった。
  ・強度が少し低いと感じた。

四号機(三号機からさらに改善):完成作

 三号機からさらに改善しました。

改善点

   《全体》

四号機

・オレンジの輪で囲った部分のようにブロックを付けることによってロボットの起動時のバランスをより良いものにしました。(ぶれ防止)
  

   《センサ部》

四号機

・三号機よりさらに設置部のブロックを減らすことにより、光・センサ調節部の可動範囲拡大に成功しました。(赤矢印:調節可動方向)
 

   《正面》

四号機

・赤ライン部にあったゴムを取り外すことで空き缶接触時のタッチ・センサの反応を良くしました。
  

5、メンバーそれぞれが作成したプログラムの紹介

  ここからは、メンバーそれぞれが[課題2]の中から課題を一つ選んで作成したプログラムを、個人的な反省と感想を交えて、顱像鬚望匆陲靴討いたいと思います。

顱▲筌泪皀箸離廛蹈哀薀

  私は、[課題2]の「1. 空き缶をコース上に戻して再びコースに戻って進む。」を選びました。

#define ss1 SENSOR_1                    // 光・センサ
#define ss2 SENSOR_2                    // タッチ・センサ
#define ss3 SENSOR_3                    // 光・センサ
#define go_front OnFwd(OUT_A+OUT_C);    // 前進
#define STOP Off(OUT_A+OUT_C);          // 停止
#define move OnFwd(OUT_B);Wait(150);Off(OUT_B);OnFwd(OUT_A);OnRev(OUT_C);Wait(90);Off(OUT_A+OUT_C);OnRev(OUT_B);Wait(150);Off(OUT_B);OnRev(OUT_A);OnFwd(OUT_C);Wait(90);Off(OUT_A+OUT_C);       // 空き缶を掴むアームに関するプログラム
#define RUN_TIME 730           //  73秒間動く

  上記は定義に関するものです。

task main()
{
  SetSensor(ss1,SENSOR_LIGHT);          // ss1を光・センサに
  SetSensor(ss2,SENSOR_TOUCH);          // ss2をタッチ・センサに
  SetSensor(ss3,SENSOR_LIGHT);          // ss3を光・センサに
  ClearTimer(0);              //  Timer(0) をリセット

 while ( Timer(0) <= RUN_TIME ) {       //  タイマー0がRUN_TIME(73秒)以下の時に繰り返す 
  while (true)
  {
    Wait(100);
    start line;             // ライントレースを始める
    until(ss2 == 1);
    stop line;
    STOP;
    move;
   }
  }
 }

  上記は、全体のプログラムです。

task line()
{
  while (true)
  {
    go_front;
    until((ss1<45)||(ss3<45));                  // ss1とss3が45以下になるまで前進
    STOP;
   
    if(ss1<45)                  // もしss1が45以下なら
    {
      OnRev(OUT_A);
      OnFwd(OUT_C);
      until((ss1>45)||((ss1<45)&&(ss3<45)));      // ss1が45以上または、ss1とss3が45以下になるまで回転
      STOP;
    }
   
    if(ss3<45)                  // もしss3が45以下なら
    {
      OnFwd(OUT_A);
      OnRev(OUT_C);
      until((ss3>45)||((ss1<45)&&(ss3<45)));      // ss3が45以上または、ss1とss3が45以下になるまで回転
      STOP;
    }
   
    if((ss1<45)&&(ss3<45))            // もしss1とss3が45以下なら
    {
      go_front;
      until((ss1>45)&&(ss3>45));                  // ss1とss3が45以上になるまで前進
      STOP;
    }
  }
}

  上記は、ラインをトレースするためのプログラムです。

工夫点

  なるべくtaskの中がシンプルになるように心がけました。
  「一周して止まる」のにタイマーを用いました。

反省点

  何パターンかプログラムを作りましたがほとんど失敗しました。
  「一周して止まる」ことを忘れていました。

感想

  ちょっと高度になってうまく作れるか不安だったけどなんとか形にはなったので良かったです。

髻▲ワシマのプログラム

  私は、[課題2]の「2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む。」を選びました。

プログラムの構想(主にtask lineについて)

  task lineの構想を機銑困両豺腓吠けて、大雑把に説明したいと思います。(*赤い丸が光・センサの位置、黒い部分がラインを表しています。)

   

説明


光・センサが左図のような状態ならロボットは黒いラインに沿って直進します。
  

   

説明


ロボットが左図上部から下方に進行してきて図のような状態になった時、少し停止した後さっきと同じ方向(下方)に直進します。
  

   

説明


ロボットが左図上部から下方に進行してきて図のような状態になった時、黒いラインの上に乗っている光・センサを白い部分に移動させるように、ロボットの進行方向(下方)からみて右に曲がり、光・センサを白い部分に出します。その後、図の左方向に伸びた黒いラインに沿って図の左に進みます。
  

   

説明


靴箸曚榮瑛佑砲靴董▲蹈椒奪箸左図上部から下方に進行してきて図のような状態になった時、黒いラインの上に乗っている光・センサを白い部分に移動させるように、ロボットの進行方向(下方)からみて左に曲がり、光・センサを白い部分に出します。その後、図の右方向に伸びた黒いラインに沿って図の右に進みます。
  

   

説明


ラインに沿って図の上方に直進中にずれてラインに図の右の光・センサがかかってしまったら、光・センサをラインから外すように進行方向からみて右に曲がります。
  

   此  

説明


ラインに沿って図の上方に直進中にずれてラインに図の左の光・センサがかかってしまったら、光・センサをラインから外すように進行方向からみて左に曲がります。
  

  以上の機銑困里茲Δ米阿を可能にするようにプログラムを組みました。

プログラム

  実際に動かしたプログラムと、実際には動かしていないが改善したプログラムをそれぞれ き△房┐靴泙靴拭

#define GO OnFwd(OUT_A);OnRev(OUT_C);          // 直進する
#define STOP Off(OUT_A+OUT_C);                 // 止まる
#define REV OnFwd(OUT_A+OUT_C);                // 右に旋回する
#define CIR OnRev(OUT_A+OUT_C);                // 左に旋回する
#define BACK OnFwd(OUT_C);OnRev(OUT_A);        // 後進する
#define pika_L SENSOR_1                        // 光・センサ
#define ossu SENSOR_2                          // タッチ・センサ
#define pika_R SENSOR_3                        // 光・センサ
#define HAS OnFwd(OUT_B);Wait(35);Off(OUT_B);  // アームで空き缶を掴む
#define THR OnRev(OUT_B);Wait(35);Off(OUT_B);  // 空き缶を離す     
#define RUN_TIME 850              // 85秒間動く

  上記の定義を用いてプログラミングしました。

  実際に使用したプログラムです。

task main()
{
  SetSensor(pika_L,SENSOR_LIGHT);              // センサ『pika』を光・センサに
  SetSensor(ossu,SENSOR_TOUCH);         // センサ『ossu』をタッチ・センサに
  SetSensor(pika_R,SENSOR_LIGHT);        // センサ『pika』を光・センサに

  ClearTimer(0);                 // Timer(0) をリセット

 while ( Timer(0) <= RUN_TIME ) {              // タイマー0がRUN_TIME(85秒)以下の時に繰り返す

 repeat(5){
           start line;                         // ライントレースを始める
           until (ossu == 1);                  // ライントレースをタッチ・センサが反応するまでし続ける
           stop line;                          // ライントレースをやめる
           start kan;                          // [空き缶を交差点まで運ぶ]動作を始める
           stop kan;                           // [空き缶を交差点まで運ぶ]動作をやめる
             }
                                         }
}          

  全体のプログラム(上記)

task kan()
{
    HAS;                                       // 空き缶を掴む
    GO;                                        
    Wait(40);                                  // 0.4秒間直進する
    STOP;                                      // 停止する
    start line;                  // ライントレースを始める
while (true)
   {
    if ((pika_L <= 45) && (pika_R <= 45))      // 交差点を感知
    {
    stop line;                                 // ライントレースをやめる
    REV;                                       
    Wait(140);                                 // 1.4秒間右に旋回する
    STOP;                                      // 停止する
    THR;                                       // 空き缶を離す
    BACK;
    Wait(50);                                  // 0.5秒間後進する
    STOP;                                      // 停止する
    CIR;                                       
    Wait(150);                                 // 1.5秒間左に旋回する
    STOP;                                      // 停止する
    }
   }
}

  空き缶の移動に関するプログラム(上記)

task line(){

while(true){ 
      
           if ((pika_L >= 45) && (pika_R >=45))            // 左右の光・センサが45以上なら
           { GO; }                       // 直進する
           else if ((pika_L >= 45) && (pika_R <= 45))      // 左の光・センサが45以上で、右の光・センサが45以下なら
           { REV; }                                          // 右に旋回する
           else if ((pika_L <= 45) && (pika_R >= 45))      // 左の光・センサが45以下で、右の光・センサが45以上なら
           { CIR; }                                          // 左に旋回する
           else if ((pika_L <= 45) && (pika_R <= 45))      // 左右の光・センサが45以下なら
           { STOP; Wait(50); GO; Wait(10); STOP;}            // 0.5秒間停止する,0.1秒間直進する,停止する
}
}

  ライントレースに関するプログラム(上記)

  FIさんのアドバイスを参考にしてtask kanを使わずサブルーチンを使用したプログラムを作ってみました。

task main()
{
  SetSensor(pika_L,SENSOR_LIGHT);              // センサ『pika』を光・センサに
  SetSensor(ossu,SENSOR_TOUCH);         // センサ『ossu』をタッチ・センサに
  SetSensor(pika_R,SENSOR_LIGHT);        // センサ『pika』を光・センサに

  ClearTimer(0);                 // Timer(0) をリセット

 while ( Timer(0) <= RUN_TIME ) {              // タイマー0がRUN_TIME(85秒)以下の時に繰り返す

 repeat(5){
           start line;                         // ライントレースを始める
           until (ossu == 1);                  // ライントレースをタッチ・センサが反応するまでし続ける
           stop line;                          // ライントレースをやめる
           kan();                              // [空き缶を交差点まで運ぶ]一連の動作を始動
             }
                                         }
}          

  全体のプログラム(上記)

sub kan()
{
    HAS;                                       // 空き缶を掴む
    GO;                                        
    Wait(40);                                  // 0.4秒間直進する
    STOP;                                      // 停止する
    start line;                  // ライントレースを始める
while (true)
   {
    if ((pika_L <= 45) && (pika_R <= 45))      // 交差点を感知
    {
    stop line;                                 // ライントレースをやめる
    REV;                                       
    Wait(140);                                 // 1.4秒間右に旋回する
    STOP;                                      // 停止する
    THR;                                       // 空き缶を離す
    BACK;
    Wait(50);                                  // 0.5秒間後進する
    STOP;                                      // 停止する
    CIR;                                       
    Wait(150);                                 // 1.5秒間左に旋回する
    STOP;                                      // 停止する
    }
   }
}

  空き缶の移動に関するプログラム(上記)

task line(){

while(true){ 
      
           if ((pika_L >= 45) && (pika_R >=45))            // 左右の光・センサが45以上なら
           { GO; }                       // 直進する
           else if ((pika_L >= 45) && (pika_R <= 45))      // 左の光・センサが45以上で、右の光・センサが45以下なら
           { REV; }                                          // 右に旋回する
           else if ((pika_L <= 45) && (pika_R >= 45))      // 左の光・センサが45以下で、右の光・センサが45以上なら
           { CIR; }                                          // 左に旋回する
           else if ((pika_L <= 45) && (pika_R <= 45))      // 左右の光・センサが45以下なら
           { STOP; Wait(50); GO; Wait(10); STOP;}            // 0.5秒間停止する,0.1秒間直進する,停止する
}
}

  ライントレースに関するプログラム(上記)

   《コース(空き缶の配置)》

コース説明

・赤い丸:空き缶を設置する位置
・赤い矢印:ロボットの出発地点とその進行方向  

工夫点 ,改善点

  ・定義を用いてできるだけシンプルになるように心掛けました。
  ・モーターの動きが普通のものの逆だったのでかなり戸惑いました。(RCXが不調でした。)
  ・taskを多く用いました。(そのせいで、のちにうまくいかなくなりましたが・・・。)
  ・タイマーを用いて一周すると止まるようにしました。
  ・repeatを用いることで簡略化しました。
  ・タイマーを用いることで一周したら止まるようにしました。

説明


・コースにおいて左のような部分を、図の下方から上方に黒いラインに沿って進行してきたロボットが進行方向左に曲がるのが困難でしたが、ロボットの光センサの幅を変更可能なロボットにしておいたので、幅を調節することで何とか克服することが出来ました。
  

  ・kanの中で動作を5回繰り返す意味は、一周したら止まるようにするのを、タイマーに頼っているのでもし早く一周してもう一度空き缶に到達してしまったときに、これ以上空き缶を移動させないようにする制限という意味を持っています。
  ・FIさんのアドバイスのおかげでサブルーチンの使い方とその効果について知ることができました。何度も詳しい書き込みありがとうございます。特に、「stop等の命令がないとずっとそのtaskが実行されて制御の優先権などが面倒」との情報は、自分があまり理解していなかったところなので大いに役に立ちました。

反省点

  ・キットの異常に気付くのに時間がかかりました。
  ・ラインをトレースするためのプログラムに時間をかけすぎました。
  ・ロボットを完成させるのに時間を費やしてしまいました。
  ・空き缶を移動するプログラムが少し原子的になってしまいました。(時間指定であるために、ずれが生じる。)
  ・「早くサブルーチンの使い方を知っておけば、使用できたのに・・・」と後悔しています。

感想

  ・前回より課題のレベルが上がったので少しと惑いました。ライントレースは完成しましたが、課題を完全に完成させることができませんでした。また、自分にしてはプログラムを簡略化できたと思います。
  ・ロボット作りに失敗して、4回も作りなおすことになるとは夢にも思いませんでした。でも失敗を恐れないように失敗になれるという点で良い経験になったと思います。
  ・次の課題も頑張ろうと思います。

結果

  ・プログラム,砲いて、ライントレースを一周して止まることは出来ましたが、空き缶を次の交差点まで運ぶのがうまくいきませんでした。
  ・プログラム△盪遒靴燭ったです。

6、全体の反省

  ・ロボットの製作に時間をかけすぎました。
  ・もう少しメンバーで集まる時間を取りたかったです。
  ・少しプログラムに関して不十分な点がありましたが、ロボットを壊してしまいました。ちゃんと完成させたかったです。

7、コメント欄

  私たちのページを見て、感じたことを自由に投稿して下さい。

  • まだ途中だと思いますが、プログラムに説明、反省点の原因などを書いてみてください。写真はわかりやすく説明されています -- TAKA? 2010-07-02 (金) 17:17:35
  • 可能な限り、しきい値など調整が必要な値は定数として定義しておきましょう。 -- 松本 2010-07-09 (金) 14:22:17
  • ロボットの説明はよく書けていますが、プログラムへの説明を書いてください -- TAKA? 2010-07-09 (金) 16:50:40
  • ロボットの説明はとても見やすくてよいです。プログラムの説明がないなど、未完成みたいなのでまた後で見ます -- FI? 2010-07-12 (月) 17:24:27
  • 写真に説明が入り、ロボットの説明は丁寧になされています。※ヤマモトさんは、プログラムについて具体的な説明を入れてください -- TAKA? 2010-07-16 (金) 16:38:21
  • 書くべきポイントはちゃんとおさえていると思います。ロボットの説明もわかりやすいですし。あとは、一人目はちゃんと1周したら止まる仕組みについて考えましょう。2人目に関しても、時間で止まるならどうして缶を動かす回数を指定するのかの説明、taskとサブルーチンの違い(今のままでkanをtaskにして大丈夫なのか)について考えましょう。-- FI? 2010-07-23 (金) 17:14:12
  • ロボットの説明はとても良いです。ただ、上に書いたとおり、一人目はちゃんと1周したら止まるようにしましょう。(課題の一部です)二人目は、taskとサブルーチンの違いを考えた方が良いかもしれません。taskはライントレースさせながら音楽を流すなど並行した命令を出す際に有効ですが、stop等の命令がないとずっとそのtaskが実行されて制御の優先権などが面倒です。サブルーチンは完了すると、自動的に元のtaskに制御が戻ります。制御がめちゃくちゃにならないように、必要ないならtaskを使わない方が良いと思います -- FI? 2010-07-31 (土) 10:09:49


添付ファイル: filennnr.png 223件 [詳細] filennnz.png 85件 [詳細] filennny.png 180件 [詳細] filennnx.png 203件 [詳細] filennnh.png 177件 [詳細] filennni.png 208件 [詳細] filennnk.png 204件 [詳細] filennnp.png 86件 [詳細] filennno.png 189件 [詳細] file0004.jpg 233件 [詳細] file0003.JPG 226件 [詳細] file0001.JPG 93件 [詳細] file0002.JPG 202件 [詳細] file0000.jpg 323件 [詳細] file021.JPG 230件 [詳細] file078.JPG 239件 [詳細] file077.JPG 223件 [詳細] file072.JPG 280件 [詳細] file070.JPG 223件 [詳細] file081.JPG 256件 [詳細] file080.JPG 225件 [詳細] file079.JPG 247件 [詳細] file074.JPG 240件 [詳細] file075.JPG 247件 [詳細] file073.JPG 209件 [詳細] file025.JPG 105件 [詳細] file020.JPG 109件 [詳細] file019.JPG 139件 [詳細] file105.jpg 189件 [詳細] file104.jpg 185件 [詳細] file103.jpg 167件 [詳細] file102.jpg 201件 [詳細] file101.jpg 185件 [詳細] file112.jpg 64件 [詳細] file002.JPG 188件 [詳細] file000.jpg 199件 [詳細] file015.JPG 93件 [詳細] file014.JPG 223件 [詳細] file011.JPG 217件 [詳細] file010.JPG 198件 [詳細] file008.JPG 216件 [詳細] file007.JPG 212件 [詳細] file005.JPG 202件 [詳細] file003.JPG 213件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-08-08 (日) 13:07:33 (3243d)