2010a

目次

課題2の内容

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

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

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

ただし、

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

メンバー紹介

 しょうご、カズ、マコト

コース紹介

A2左のコースと同じ

SN3L0001.jpg

ロボット紹介

 三人で一台のロボットを作りました。

ロボット1(失敗作)

20100621140444.jpg

前。光センサーの間隔が狭く、コースに沿ってうまく進みませんでした。
またアームの強度が弱く、うまく動かすことができませんでした。

DVC00015.jpg

光センサー。間隔が狭く、曲がり角をうまく曲がれませんでした。

ロボット2(成功作)

DVC00011.jpg

前。光センサーの間隔を広げました。

DVC00010.jpg

左横です。アームはこちら側が主になります。

DVC00012.jpg

右横です。タイヤを3つにすることでバランスをとりました。

a.jpg

タッチパネルです。タッチパネルの前に缶に当たるものを置くことでセンサーがより反応するようにしました。

SN3L00020001.jpg

光センサーです。2つ使うことでうまく進むようになりました。

失敗作と成功作の違いについて

・光センサーの間隔を失敗作に比べて成功作では広げることで曲がり角をスムーズに曲がれるようにしました。
・アームの長さが足りなかったのでより缶をつかみやすくするために長くしました。
・アームの強度についても支えを増やしました。

ロボット制作での工夫、問題点

工夫

・タッチパネルをより押しやすくするためにタッチセンサーの前に部品を置いたこと。
・アームの強度をなるべく上げるために部品を多く用いたこと。
・前のほうに重心がかかってもいいようにタイヤを右側に1つ増やし、バランスをとったこと。

問題点

.◆璽爐鬚匹里茲Δ防佞韻襪。→強度に問題があったため。
光センサーの間隔をどうするか。→曲がり角がうまく進めなかったため。
タッチセンサーがうまく反応しなかったこと。

問題点の改善点

・、支える部分を増やし、強度を上げました。
・□何度も同じ個所の曲がり角で走らせ、適当な間隔にしました。
・→タッチセンサーの力のモーメントを考え、一番小さな力でセンサーが反応するように棒などを配置しました。

それぞれのプログラムの紹介

それぞれ順番に1、2、3となっています。

しょうごのプログラム

#define go OnFwd(OUT_A+OUT_C);                             //進む
#define turn_right OnFwd(OUT_C);OnRev(OUT_A);Wait(1);   //右に回る
#define turn_left OnFwd(OUT_A);OnRev(OUT_C);Wait(1);    //左に回る
#define tomaru Off(OUT_A+OUT_C);              //止まる
#define back OnRev(OUT_A+OUT_C);              //戻る
#define goes OnFwd(OUT_A+OUT_C);Wait(40);                  //進む
#define turn_leftb OnFwd(OUT_A);OnRev(OUT_C);        //右に回るtime free
#define turn_rightb OnFwd(OUT_C);OnRev(OUT_A);             //左に回るtime free
#define arm_on  OnFwd(OUT_B);Wait(8);Off(OUT_B);           //缶を掴む
#define arm_off     OnRev(OUT_B);Wait(8);Off(OUT_B);       //缶を離す

  上の定義を用いました。

task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT);

int move_time = 10 ;

while (move_time < 18){       //両センサー白の時進む
 if (SENSOR_1>39 && SENSOR_3>39){
	go;
 }else if(SENSOR_3>39){       //右に回る
	turn_right;
 }else if(SENSOR_1>39 ){             //左に回る
	turn_left;
 } 

else{
	tomaru;           //交差点          
	Wait(150);       
	go; 
       Wait(30);  
      move_time  = move_time + 1;
 }

if(SENSOR_2 == 1){          //缶をタッチしたとき
arm_on;
PlaySound(SOUND_UP) ;
turn_rightb;Wait(100);
  go;
   Wait(70);
  arm_off;              //缶を離し後退
  back;
   Wait(70);
    turn_leftb;Wait(100);
 }
}

go;                  //交差点8つ通過後少し進み止まる
Wait(20);
tomaru;
}

 

カズのプログラム

#define START OnFwd(OUT_A+OUT_C);                                     //前進
#define STOP Off(OUT_A+OUT_C);                                        //停止
#define BACK OnRev(OUT_A+OUT_C);                                      //後退
#define arm_l OnFwd(OUT_B);Wait(30);Off(OUT_B);                       //アーム操作
#define BORDER 39                                                     //閾値
#define RIGHT OnFwd(OUT_C);OnRev(OUT_A);                              //右折
#define LIGHT OnFwd(OUT_A);OnRev(OUT_C);                              //左折
#define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(220);Off(OUT_A+OUT_C);    //180°回転

  上の定義を用いました。

task main()
{  
  SetSensor(SENSOR_1,SENSOR_LIGHT);                //光センサー(左)
  SetSensor(SENSOR_2,SENSOR_TOUCH);                //タッチセンサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);                //光センサー(右) 

  SetPower(OUT_B,1);                               //センサーBのパワーを1とする

  int flag=0;                         

  while(flag<8){                                   //ライントレース開始
     if(SENSOR_1>BORDER && SENSOR_3>BORDER){       //光センサーが両方白のとき
           START;}                                 //前進      
     else if(SENSOR_1>BORDER){                     //光センサー3が黒のとき
       LIGHT;}                                     //左折
     else if(SENSOR_3>BORDER){                     //光センサー1が黒のとき
       RIGHT;}                                     //右折
     else{                                         //光センサーが両方黒のとき
       STOP;Wait(150);                             //停止
       START;Wait(30);
       flag++;}                                    //flagに1を追加

     if(SENSOR_2==1){                              //タッチセンサー反応
      arm_l;                                       //アーム操作
      START;Wait(20);flag++;
      until((SENSOR_1<BORDER)&&(SENSOR_3<BORDER));         
     if(SENSOR_1>BORDER && SENSOR_3>BORDER) 
      { 
           START;}                              
     else if(SENSOR_1>BORDER){
       LIGHT; }
     else if(SENSOR_3>BORDER){
       RIGHT;}
     else{
       STOP;Wait(150);                             //停止
       START;Wait(100);                            //前進
       STOP;                                       //停止
       turn;                                       //回転
       STOP;                                       //停止
       START;Wait(100);                            //前進
       STOP;                                       //停止
       OnRev(OUT_B);                               //アーム操作
       Off(OUT_B);                     
       BACK;Wait(100);                             //後退
       turn;                                       //回転
       STOP;                                       //停止
       START;Wait(20);flag++;
  }
  }
  }           
        STOP;                                      //停止
  }

マコトのプログラム

#define go_front OnFwd(OUT_A+OUT_C);                    //前進
#define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);  //左折
#define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); //右折
#define stay Off(OUT_A+OUT_C);                                            //止まる
#define THRESHOLD 40                                                      //閾値

  上の定義を用いました。

task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);                          //センサー1を光センサー
  SetSensor(SENSOR_2,SENSOR_TOUCH);                         //センサー2をタッチセンサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);                          //センサー3を光センサー
  
while(true)                                                    //whileは常に真
{start follow_line;                                            //ライントレース開始
int n=0;                                                       //nの値を定義
while(n==1){                                                   //nが1の時
   if(SENSOR_2==1)                                             //タッチセンサーが反応
   turn_left(200);                                             //反転
   n++;//nを1増やす
}
while(n==2){                                                   //nが2の時
   if(SENSOR_2==1)                                             //センサーが反応
   go_front;                                                   //直進
   n--;                                                        //nを1減らす
}
int turn_count=0;                                              //turn_countを定義
sub follow_line()                                              //ライントレースのプログラム
{
while(turn_count<10){                                          //9回交差点に当たったら停止
go_front;                                                      //直進
until((SENSOR_1<THRESHOLD)||(SENSOR_3<THRESHOLD))              //光センサーが黒になるまで
stay;
if(SENSOR_1<THRESHOLD){                                        //左の光センサーが黒
OnFwd(OUT_C);OnRev(OUT_A);                                     //右折
until(SENSOR_1>THRESHOLD)                                      //ライン上に戻るまで
stay;}
else if(SENSOR_3<THRESHOLD){                                   //右の光センサーが黒
OnFwd(OUT_A);OnRev(OUT_C);                                     //左折
until(SENSOR_3>THRESHOLD)                                      //ライン上に戻るまで
stay;
else if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){           //両方のセンサーが黒
Wait(100);                                                     //一旦停止
turn_count++;                                                  //カウントを増やす
go_front;                                                      //前進
until((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))              //両方のセンサーが白になるまで
stay;}
stay;}
}
}

全体の反省点

・偶数回目、奇数回目というのがどうやればいいのか分からずに苦戦した。  マコト 
・カンを運ぶプログラムをどのように作ればいいか考えるのに苦労した。  カズ
・止まり方を考えるのに苦労した。                       
・交差点での缶を運ぶのが難しくどうすれば線の上に缶を置けるか苦労した。解決法としてはコースの右に90度曲がり置くという方法で解決した。  しょうご

感想

・前回よりもロボットやプログラムを作るのが難しくて苦労したけどまたいろんなプログラムの方法や工夫を学べてよかったです。
・時間はかかったけど、完成してよかったです。

コメント

  • 失敗作と成功作との違い、問題点に対する改善策などを書いてください -- TAKA? 2010-07-02 (金) 17:14:58
  • ロボットの違いや工夫がわかりやすく書かれています。プログラムの工夫、課題1のように動きの説明を加えるとさらに良くなると思います -- TAKA? 2010-07-09 (金) 16:44:28
  • ロボットに関してはきちんと書いていると思います。プログラムに関してはいくつか疑問点があります。一つ目に関しては、閾値には定数を用いたほうが調整するときにらくだと思います。また、一つ目、二つ目ではラインとレースの際に場合わけがきちんとされてているほうがきれいだと思います。三つ目に関しては、taskとsub等の違いについて考えてみてください。また、untilはいるのでしょうか?もし曲がってもまだラインの上になければ、またそのif内の命令が適応されるのではないかと思います。indentした方がプログラムは見やすくなります -- FI? 2010-07-12 (月) 17:18:43

コメントをよろしくお願いします。


添付ファイル: fileDVC00015.jpg 160件 [詳細] fileDVC00012.jpg 176件 [詳細] fileDVC00011.jpg 164件 [詳細] fileDVC00010.jpg 149件 [詳細] fileDVC00009.jpg 90件 [詳細] filea.jpg 155件 [詳細] fileSN3L00050002.jpg 87件 [詳細] fileSN3L00030001.jpg 90件 [詳細] fileSN3L00020001.jpg 168件 [詳細] fileSN3L0007.jpg 78件 [詳細] fileSN3L0001.jpg 151件 [詳細] file20100621140553.jpg 198件 [詳細] file201006211405212.jpg 183件 [詳細] file201006211404445.jpg 185件 [詳細] file20100621140444.jpg 264件 [詳細]

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