目次

ルート

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2017b%2FMission2&src=2017b-mission2.png

1.Dをスタート

2.Cを直進

3.Bを左折

4.Pを左折(一時停止)

5.Qを直進

6.Rを左折

7.Fを左折

8.Sを直進(一時停止)

9.Y地点の紙コップを取得してコースに戻る

10.Sを直進(一時停止)

11.Qを左折(一時停止)

12.Rを直進

13.X地点に紙コップを置いてコースに戻る

14.Pを左折

15.B を左折(一時停止)

16.A地点へ(ゴール)

反省点

後の感想で言うが、止まってしまう現象である。

他にもある。s字カーブで何度も交差点判断してしまうことだ。

あとはコップをつかむことができるものの、所定の位置に持っていけないことだ。

この辺りはもっと考えてプログラムを作るべきだった。

全体像

はさみの部分は大きくし、体全体はごつくなった。はさみは両方動かずに片方だけ動かすようにした。

片方のはさみをでかくし、そこをコップに引っ掛けて取るという予定にした。先を曲げてる方にして、コップが掴みやすいようにした。

はさみに使ったギアは2枚。かみ合わせた。

トレース用のセンサーは先頭につけた。なるべく下につけることで値を安定させた。

hasa.jpg

マクロ

定義は次のようにしました。(t:秒数)

   #define THRESHOLD 46
   #define go_forward ; OnRev(OUT_AC);//直進
   #define turn_right1 OnFwd(OUT_A);OnRev(OUT_C);//右旋回
   #define turn_right0 OnFwd(OUT_A);Off(OUT_A);//右回り
   #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A);//右旋回(秒数あり)
   #define turn_left0 OnFwd(OUT_C);Off(OUT_C);//左回り
   #define turn_left1 OnFwd(OUT_C);OnRev(OUT_A);//左旋回
   #define turn_left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_C);//左旋回(秒数あり)
   #define go(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//直進(秒数あり)
   #define back(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//後退(秒数あり)
   #define cross_stop Off(OUT_AC);Wait(100);//交差点判断後停止
   #define close SetPower(OUT_B,0);OnFwd(OUT_B);Wait(70);Off(OUT_B);//はさむ部分閉じ
   #define open SetPower(OUT_B,0);OnRev(OUT_B);Wait(70);Off(OUT_B);//はさむ部分開け
   #define STEP 1

サブルーチン

ライントレースするためのプログラムを作りました。

交差点判断は連続して黒を感知することで行う。黒の平均的な値のマクロを作り、それに+、−で値を変えている。

   sub Line()
   {
       ClearTimer(0);
       while(FastTimer(0)<20){//0.2秒以内黒の線を連続して感知した場合ループ、以上は次の動作へ
           if(SENSOR_2>THRESHOLD +6) {
                turn_right1;
                ClearTimer(0);//値52より大きい時右旋回 (真っ白の時)
            } else if (SENSOR_2>THRESHOLD +3) {
                turn_right0;
                ClearTimer(0);//値49より大きい時右回り (線付近の白の時)
            } else if (SENSOR_2>THRESHOLD ) {
                go_forward;
                ClearTimer(0);//値46より大きい時前進 (黒の線と白の境目付近)
            } else if (SENSOR_2>THRESHOLD -4) {
                turn_left0;
                ClearTimer(0); //値42より大きい時左回り (線付近の黒の時)
            } else {
                turn_left1;//左旋回 (真っ黒の時)
             }
       Wait(STEP);
        }
       Off(OUT_AC);
   }

またFSPQは交差点判断の秒数がうまくかみあわなかったのでLine()とは違うプログラムを作った。変更した点は、Timerを20から17に変えた。

   sub LineFSPQ()
   {
       ClearTimer(0);
       while(FastTimer(0)<17){//0.17秒以内黒の線を連続して感知した場合ループ、以上は次の動作へ
           if(SENSOR_2>THRESHOLD +6) {
                turn_right1;
                ClearTimer(0);//値52より大きい時右旋回
            } else if (SENSOR_2>THRESHOLD +3) {
                turn_right0;
                ClearTimer(0);//値49より大きい時右回り
            } else if (SENSOR_2>THRESHOLD ) {
                go_forward;
                ClearTimer(0);//値46より大きい時前進
            } else if (SENSOR_2>THRESHOLD -4) {
                turn_left0;
                ClearTimer(0); //値42より大きい時左回り
            } else {
                turn_left1;//左旋回
             }
       Wait(STEP);
        }
       Off(OUT_AC);
   }

プログラム

工夫した点はLine()が4つあるところで、一度止まってもトレースするようにした。

   task main ()
   {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      Line();
      cross_stop;
      go(20);
      turn_right(20);
      Line();
      turn_left(25);//CB間
      go(13);
      Line();
      cross_stop;
      turn_left(25);
      go(30);//BP間
      LineFSPQ();
      go(30);
      turn_right(50);//PQ間
      Line();
      turn_left(10);//QR間
      go(15);
      Line();
      cross_stop;
      turn_left(10);//RE間
      Line();
      cross_stop;
      turn_left(18);
      go(8);
      Line();
      Line();
      Line();
      Line();
      turn_left(20);//EF間
      go(10);
      LineFSPQ();
      cross_stop;
      go(30);
      turn_right(60);//FS間
      go(50);
      close;
      back(40);
      turn_left(60);
      Line();
      cross_stop;
      go(30);//S回る
      turn_right(20);
      LineFSPQ();
      cross_stop;//QR間
      turn_left(25);
      go(20);
      LineFSPQ();
      cross_stop;//RP間
      go(30);
      turn_right(105);
      go(23);
      open;
      back(25);
      turn_left(90);
      Line();
      Line();
      cross_stop;
      turn_left(50);
      go(10);
      Line();
      go(20);//ゴール
   }

感想

今回の課題では本番失敗してしまった。つまずいたところは多々ある。

まず最初の交差点。ガガガという音を立て、その場で後退した。この現象は、プログラムのミスであるらしい。

2つ以上のプログラムが決行されていたらしい。いまだにどの点が悪かったのかわからない。ここは反省すべき点である。

次の課題ではもっとプログラミングをしっかりしたい。


添付ファイル: filehasa.jpg 222件 [詳細] fileimage2.JPG 97件 [詳細] fileimage1 (1).JPG 101件 [詳細] fileimage1.JPG 101件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-15 (木) 20:53:20