''ロボット作成 課題2''

設計

センサー

☆光センサー
光センサーは2つつけました。最初は1つの予定でしたが、2つのほうがちゃんと黒い線の上をトレースするので変更しました。

センサー下から
005.jpg

☆タッチセンサー
タッチセンサーは1つです。

006.jpg

赤い部分を支点にして、テコの原理を利用してタッチします。↓↓

タッチセンサー横から

車体

車体

赤い部分がタッチセンサーで
黄色い部分が光センサーです。
できるだけ大きめの車輪を使うことで、光センサーがしっかり感知するようになったし、テコの原理も作りやすくなりました!

走るライン

とにかくシンプルなものにしました。
カーブの時にうまく光センサーが感知するかどうかが問題でした。

車体1

問題点

センサー

☆光センサー
車体がどんどんズレていって黒い線の上を走らなくなってしまいました。 2つの光センサーの感覚を狭めることで、カーブ後もちゃんとトレースするようになりました。
☆タッチセンサー
最初は牛乳パックに反応しなかったので、センサーを高くしてテコの原理を利用したら反応するようになりました。

車体

改良に改良を重ねました(泣)
最初の車体のときはタッチセンサーが反応しなかったり、光センサーの感覚が広くなってしまったりと問題点が多かったですが、車体の高さを高くしたことにより、それらの問題は解決しましたー!!

車体2
車体3

プログラム

パック回避 Ver.

#define  THRESHOLD 39                                                    //閾値を定義
#define  go_straight(t)  {OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);} //以下回避時の定義
#define  GO_S            {OnFwd(OUT_A+OUT_C); Wait(20);}
#define  go_back         {OnRev(OUT_A+OUT_C);Wait(80);Off(OUT_A+OUT_C);}
#define  turn_left     {OnFwd(OUT_C);OnRev(OUT_A);Wait(70);Off(OUT_A+OUT_C);}    
#define  turn_right      {OnFwd(OUT_A);OnRev(OUT_C);Wait(55);Off(OUT_A+OUT_C);} 
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);   //センサー2をタッチセンサーとする
SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサ−1を光センサーとする
SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサ−3を光センサーとする
SetPower(OUT_A,1)                   //A出力を制限
SetPower(OUT_C,1)                   //C出力を制限
int n;                              //交差点を定義        
n=0;                                //まだ交差点は通ってないことを定義
while(n<2){ //交差点を4回通る
if((SENSOR_1>THRESHOLD)&&( SENSOR_3>THRESHOLD)){ //センサ−1と3が黒線上にないとき
OnFwd(OUT_A+OUT_C);                               //まっすぐ進む
}
if(SENSOR_1<THRESHOLD)       //センサー1が黒線上にきてしまったら
OnRev(OUT_A);                //左へ行くよう調節
OnFwd(OUT_C);   
}
if(SENSOR_3<THRESHOLD){     //センサー3が黒線上にきてしまったら
OnFwd(OUT_A);               //右へ行くよう調節
OnRev(OUT_C);
}
if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //センサー1と3が黒線上→交差点にきたら
Off(OUT_A+OUT_C);                               //1回止まって待ってから再び進む
Wait(150); 
GO_S
n=n+1;                                          //通った交差点の数を足していく
}
if(SENSOR_2==1){                  //タッチセンサーが反応したら
go_back                       //下がって
turn_left                      //左へよけて
go_straight(90)                  // 
turn_right                     //右に曲がって
go_straight(150)                  //
turn_right                     //黒線上に復帰
n=n+1;
if(n==2)                        //2回目の交差点にきたら
{
OnFwd(OUT_A+OUT_C);            //少し進んで止まる
Wait(50);
Off(OUT_A+OUT_C);
}
}
}

作成者:k山


パック運搬 Ver.

#define  THRESHOLD 39                             //閾値を定義
#define  go_straight(t)  {OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);} //以下回避時の定義
#define  GO_S(t)     {OnFwd(OUT_A+OUT_C); Wait(t);}
#define  GO_b(t)     {OnRev(OUT_A+OUT_C); Wait(t);}
#define  go_back(t)     {OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);}
#define  turn_left(t){OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);}    
#define  TL          {OnFwd(OUT_C); OnRev(OUT_A); Wait(15);}
#define  turn_right(t) {OnFwd(OUT_A);OnRev(OUT_C);Wait(100);Off(OUT_A+OUT_C);} 
#define  TR          {OnFwd(OUT_A); OnRev(OUT_C); Wait(30);}
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);   //センサー2をタッチセンサーとする
SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサ−1を光センサーとする
SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサ−3を光センサーとする
SetPower(OUT_A,1)                   //A出力を制限
SetPower(OUT_C,1)                   //C出力を制限
int n;                              //交差点を定義        
n=0;                                //まだ交差点は通ってないことを定義
             
while(n<4){ //交差点を4回通る
if((SENSOR_1>THRESHOLD)&&( SENSOR_3>THRESHOLD)){ //センサ−1と3が黒線上にないとき
OnFwd(OUT_A+OUT_C);                   //まっすぐ進む
}
if(SENSOR_1<THRESHOLD)                 //センサー1が黒線上にきてしまったら
OnRev(OUT_A);                    //左へ行くよう調節
OnFwd(OUT_C);
}
if(SENSOR_3<THRESHOLD){       //センサー3が黒線上にきてしまったら
OnFwd(OUT_A);             //右へ行くよう調節
OnRev(OUT_C);
}
if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //センサー1と3が黒線上→交差点にきたら
Off(OUT_A+OUT_C);                //1回止まって待ってから再び進む
Wait(150); 
GO_S(20) 
n=n+1;                       //通った交差点の数を足していく
}
if(n==4){                 //4回目の交差点の時
go_back(80)                //下がって
turn_left(70)               //左へよけて
go_straight(100)            
turn_right(80)               //右に曲がって進み
go_straight(250) 
turn_right(100)              //ライン上に復帰して
go_straight(120)
turn_left(90)
go_back(140)              //牛乳パックを元の位置に戻す
n=n+1;                 //通った交差点の数を足していく
}
}

作成者:竹

感想

K山の感想

ロボットもプログラムもかなり難しくて大変だった。 今回の課題はだいぶ疲れました。

竹の感想

前回の何百倍も難しくなってヒイヒイしてます。
光センサーとタッチセンサーをうまく使っていかないと、
課題がこなせないので本当に大変だと思いました。

コメント

コメントお願いします

  • プログラムにインデント(ifなどの階層ごとに行う字下げ)を入れると見やすくなると思います。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか? 2009-07-02 (木) 22:13:26
  • ロボットのほうは問題点などをきちんと書いていて良かったです。一人目のプログラムに関しては、最後の2つ目の交差点のときの行動の意味と3周するための方法をもう一度考えてみてください。(今のままでは、3周目に入った時に止まりますし、始める場所によって距離が変わってきます。)2人目のプログラムに関しては、3周するための方法とタッチセンサが生かされていないことを改善しましょう(4個目の交差点に紙パックが必ず置いてあるのでしょうか?) -- FI? 2009-07-03 (金) 02:44:18


添付ファイル: file10.jpg 233件 [詳細] file5.jpg 226件 [詳細] file4.jpg 117件 [詳細] file010.jpg 116件 [詳細] file009.jpg 223件 [詳細] file008.jpg 220件 [詳細] file007.jpg 222件 [詳細] file006.jpg 213件 [詳細] file005.jpg 204件 [詳細] file004.jpg 116件 [詳細] file003.jpg 109件 [詳細] file002.jpg 207件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-03 (金) 02:45:07 (3700d)