2018b/Member

課題

指定されたコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。

ロボット

コース

ボールを投げる腕をつけた

まっすぐボールを飛ばしやすく転がしやすくするように腕のスピードが大事

コース

ボールを持った時の様子

移動の振動でボールが落ちないように幅を調整した。

自分ができた・できなかったこと

・交差点を認識して止まるプログラミングが二種類できた。

・超音波センサを使って缶の位置を探るプログラミングができなかった。(なんとなくぐらいしか理解できなかった。)

ライントレースのプログラミング(交差点を認識する)

黒が一定時間以上になた場合交差点を認識(自分で作ったプログラム)

#define TR_R OnFwd(OUT_B,15);OnRev(OUT_C,15); //右旋回
#define GO_R Float(OUT_B);OnFwd(OUT_C,30);  //右折
#define GO_S OnFwd(OUT_BC,30);   //直進
#define GO_L OnFwd(OUT_B,30);Float(OUT_C);  //左折
#define TR_L OnFwd(OUT_C,15);OnRev(OUT_B,15);  //直進
#define MIDL 40 //中間色

task main()
{
SetSensorLight(S1);
long t0=CurrentTick();
 while (CurrentTick()-t0<1000) {  //黒が1秒続くまで行う
              if(SENSOR_1>MIDL+20){TR_R
                                 t0=CurrentTick();}  //真っ白なら右旋回・リセット
              else if(SENSOR_1>MIDL+10){GO_R
                                      t0=CurrentTick();} //ちょい白なら右折・リセット 
              else if(SENSOR_1>MIDL){GO_S
                                    t0=CurrentTick();}  //グレーなら直進・リセット
              else if(SENSOR_1>MIDL-10){GO_L
                                      t0=CurrentTick();}  //ちょい黒なら左折・リセット
              else{TR_L
                  CurrentTick();}  //真っ黒なら左旋回・数える
                }
Off(OUT_BC);
}

変数を用いた場合(自分で作ったもの)

#define TR_R OnFwd(OUT_B,15);OnRev(OUT_C,15); //右旋回
#define GO_R Float(OUT_B);OnFwd(OUT_C,30);  //右折
#define GO_S OnFwd(OUT_BC,30);   //直進
#define GO_L OnFwd(OUT_B,30);Float(OUT_C);  //左折
#define TR_L OnFwd(OUT_C,15);OnRev(OUT_B,15);  //直進
#define MIDL 45 //中間色
 
task main()
{
SetSensorLight(S1);
int n=0;
while(true){
             if(SENSOR_1>MIDL+8){TR_R}  //真っ白なら右旋回
             else if(SENSOR_1>MIDL+6){GO_R}  //ちょい白なら右折
             else if(SENSOR_1>MIDL){GO_S}  //グレーなら直進
             else if(SENSOR_1>MIDL-4){GO_L}  //ちょい黒なら左折
             else do{
                     TR_L
                     Wait(1);
                     n++;}while (n<28);  //真っ黒なら0.001秒左旋回・28回繰り返したら終了
               }
Off(OUT_BC);
}

缶を見つけるプログラミング(相方のプログラム)

void mitsukeru()
{
 ResetTachoCount(OUT_ABC);
 OnFwd(OUT_A,50);
 OnRev(OUT_C,50);
 SetSensorLowspeed(S4);            
 int d1;
 d1=1000;//仮の最小値  
 long t0=CurrentTick();
 long t1=CurrentTick();
 long t2=CurrentTick();
 while(t2-t0<=3570){  //3.57秒間サーチする
     t2=CurrentTick();
     if(SensorUS(S4)<d1){
         d1=SensorUS(S4);//最小値より小さい値が出た時、そこを新しい最小値とする
         t1=CurrentTick();//時間をリセットする
     }
     t2=CurrentTick();
 }
 t0=CurrentTick();
 Off(OUT_AC);
 OnFwd(OUT_C,50);
 OnRev(OUT_A,50);
 Wait(t0-t1);//最後に、最小値をとった場所まで回る
}

ある値を設定してその値より小さくなった時の時刻を記憶し、逆戻りして進んでいると思われる。

完成したプログラミング(相方のプログラム)

task main()
{
Line();//AからBまでライントレース
RIGHT(15);//Bを右折
Line();//BからKまでライントレース
Wait(1000);//一時停止
LEFT(15);//Kを左折
Line();//KからJまでライントレース
go(50);//微調節
Line();//KからJまでライントレース
go(100);//微調節
mitsukeru();//缶を探す
OnFwd(OUT_B,30);//缶を落とす
Wait(2000);
Off(OUT_B);
Line();//JからIまでライントレース
go(50)//微調節
Line();//IからHまでライントレース
LEFT(15);//左に曲がる
Line();//HからGまでライントレース
Wait(1000);//一時停止
LEFT(15);//Gで左折
Line2();//ある場所まで進み続ける
Line();//そこからEmまでライントレース
Wait(1000);//一時停止
RIGHT(15);//Eを曲がる
Line();//Lまで行く
go(100);//ゴールに入る
Off(OUT_BC);// 
}

ライントレース→交差点(右折・直進・左折)→ライントレース …を操作してゴールに向かっている。

まとめ

結局のところ課題を解決することはできなかった。次回はチームの人に聞いたり、役割分担しながら課題をクリアしたい。超音波センサーはなるべく駆動輪間の上・位置は下にあると正確な計測・認知がしやすくなる。


添付ファイル: fileKIMG0093.jpg 18件 [詳細] fileKIMG0094 (2).jpg 16件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-02-20 (水) 14:33:37