[[2017b/Member]]
目次
#contents
*課題 2 [#lf7f25f1]
#ref(2017b/Member/kazuki/Mission2/2017b-mission2.jpg,100%,コース)

黒い線のコースに沿って動き、紙コップを移動させるロボットを製作せよ。 (相棒と違うコースを選ぶこと。ただし第3コースは3名チーム用とする。)
私は第2コースで課題に挑戦した。
***第2コース [#w1e7dea2]
Dをスタート
→Cを直進
→Bを左折
→Pを左折(一時停止)
→Qを直進
→Rを左折
→Fを左折
→Sを直進(一時停止)
→Y地点の紙コップを取得してコースに戻る
→Sを直進(一時停止)
→Qを左折(一時停止)
→Rを直進
→X地点に紙コップを置いてコースに戻る
→Pを左折
→B を左折(一時停止)
→A地点へ(ゴール)


*ロボットの説明 [#fabe6e83]
#ref(2017b/Member/kazuki/Mission2/IMG_4633.jpg,70%,ロボットの説明)

はじめは4輪のロボットだったが細かい旋回がうまくいかないときがみられたので3輪のロボットにした。

光センサーは旋回時に大きく揺れるのを防ぐために前輪に近づけた。地面とセンサーの距離は1.7cm。
**後輪部 [#y2526e24]
#ref(2017b/Member/kazuki/Mission2/IMG_4638.jpg,70%,後輪部)
今回の課題では「何秒旋回するか」が1つの重要のポイントであり、旋回秒数にズレが生じないことが求められた。よって旋回するときに紙との抵抗を小さくするためにプラスティックの車輪を使用した。
**アーム部分 [#nf2da228]
#ref(2017b/Member/kazuki/Mission2/IMG_4640.jpg,70%,アーム部分)
試行錯誤を繰り返した結果画像のようになった。コップをキャッチできる範囲を増やすため大きめのモデルにした。その結果画像のように立てた状態からでないとおろすことができない。

先端の車輪はおろしたときに紙との抵抗を小さくするために取り付けた。

脇についている黄色い棒はコップが横からすり抜けてしまったり、倒れてしまったりするのを防ぐために取り付けた。
***アーム部分の土台の補強 [#hd18346f]
#ref(2017b/Member/kazuki/Mission2/IMG_4634.jpg,70%,補助部分)
アームを大きいモデルにしたためアームを起こした時に衝撃で土台の部分が壊れてしまうという問題が生じたがは補強パーツを取り付け解決した。


*プログラム [#uc315582]
まず以下のように定義した。

 #define shikiichi 45//閾値45
 #define HIPOWER 7//ハイパワーを7と定義
 #define LOWPOWER 1//ローパワーを1と定義
 #define set_power_H SetPower(OUT_ABC,HIPOWER);
 #define set_power_L SetPower(OUT_ABC,LOWPOWER);
 #define mae set_power_H;OnRev(OUT_AC); //前進する
 #define hidari set_power_L;OnRev(OUT_C);Off(OUT_A); //左折する
 #define migi set_power_L;OnRev(OUT_A); Off(OUT_C); //右折する
 #define hidarisennkai set_power_L;OnFwd(OUT_A); OnRev(OUT_C); //左旋回する
 #define migisennkai set_power_L;OnRev(OUT_A); OnFwd(OUT_C); //右旋回する
 #define go(s) OnRev(OUT_AC);Wait(s);Off(OUT_AC); //s秒前進する
 #define tomaru Off(OUT_AC);Wait(100); //交差点で1秒止まる
 #define back(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //t秒後退する
 #define turnleft(u) OnFwd(OUT_A);OnRev(OUT_C);Wait(u);Off(OUT_AC); //u秒左旋回する
 #define turnright(v) OnFwd(OUT_C);OnRev(OUT_A);Wait(v);Off(OUT_AC); //v秒右旋回する
 #define right(w) OnRev(OUT_A);Wait(w);Off(OUT_A); //w秒右折する
 #define ageru set_power_H;OnRev(OUT_B);Wait(035);Off(OUT_B); //アームを上げる
 #define sageru set_power_H;OnFwd(OUT_B);Wait(010);Off(OUT_B); //アームを下げる
ライントレースをスムーズに行うため前進するときはハイパワー、左右に行くときはローパワーにした。
**ライントレース [#e2483685]
ラインの左側を走行するようにした~
白ー右旋回~
白っぽいー右折~
中間ー直進~
黒っぽいー左折~
黒ー左旋回~
の五段階にすることでスムーズなライントレースを実現。

1つのプログラムでは対応しきれない部分があったのでサブルーチンを3つ作成した。
***通常時 [#i89c71ea]
 sub line()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  ClearTimer(0); 
  while (FastTimer(0)<=028) {      //タイマーが0.28になったら止まる
         if (SENSOR_1 < shikiichi -3)  //閾値が42以下の時
   {
      hidarisennkai;            //左旋回する
   
    } 
     else if (SENSOR_1 < shikiichi -1 )  //閾値が44以下の時
    {
      hidari;              //左折する  
      ClearTimer(0);          //タイマーを0にする
    } 
    else if (SENSOR_1 < shikiichi+2 )  //閾値が47以下の時
    { 
      mae;              //前進する
      ClearTimer(0);           //タイマーを0にする
   } 
      else if (SENSOR_1 < shikiichi+4 )  //閾値が49以下の時
    {
      migi;              //右折する
      ClearTimer(0);              
    } 
      else               //上記の条件以外の時
    {            
      migisennkai;         //右旋回する
       ClearTimer(0);                  
    }
  }
    PlaySound(SOUND_CLICK);    //ピッと音を鳴らす
    Off(OUT_AC);         //止まる
 }

***浅い進入角度で左折する[#g151535d]
私の場合ラインの左側を走行するためP-Q区間のようにい左折するポイントに浅い角度で進入すると0.28秒以内に左折し終わってしまう。そこで新たにサブルーチンを作成した。

P-Q缶などの半円で黒に侵入しすぎてしまうとFastTimerを短くしているため止まってしまうので右旋回をなくし、白よりを走行するようにした。
 sub line_q()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  ClearTimer(0); 
  while (FastTimer(0)<=024) {     //タイマーが0.24になったら止まる
         if (SENSOR_1 < shikiichi -3) //閾値が41以下の時
   {
       hidarisennkai;          //左旋回する
    } 
     else if (SENSOR_1 < shikiichi -1 ) //閾値が44以下の時
    {
      hidari;               //左折する
       ClearTimer(0);         //タイマーを0にする
    } 
    else if (SENSOR_1 < shikiichi +2 )  //閾値が47以下の時
    { 
      mae;              //前進する
      ClearTimer(0);           //タイマーを0にする
    } 
      else if (SENSOR_1 < shikiichi+4 ) //閾値が44以下の時
    {
      migi;               //右折する
      ClearTimer(0);            //タイマーを0にする
          
    } 
      else   //閾値が上記の条件以外の時
    {            
      migi;              //右折する
       ClearTimer(0);                //タイマーを0にする   
    }
  }
    PlaySound(SOUND_CLICK);     //ピッと音を鳴らす
    Off(OUT_AC);          //止まる
 }


***ヘアピンカーブ (E-F間)[#f6a3afee]
ヘアピンカーブでは交差点と判断してしまうので別にプログラミングを作成し、時間による制限で次のプログラムに移るようにした。

 sub line_pin()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  ClearTimer(0); 
  while (FastTimer(0)<=1000) {      //10秒たつと次のプログラムに移る
         if (SENSOR_1 < shikiichi -7)    //閾値が38以下の時
   {
       hidarisennkai;                    //左旋回する
    } 
     else if (SENSOR_1 < shikiichi -5 )  //閾値が40以下の時
    {
      hidari;                            //左折する
    } 
    else if (SENSOR_1< shikiichi-2 )     //閾値が43以下の時
    { 
      mae;                              //前進する
    } 
      else if (SENSOR_1 < shikiichi +1 )//閾値が46以下の時
    {
      migi;                           //右折する
    } 
      else                             //閾値が上記の条件以外の時
    {            
      migisennkai;                    //右旋回する
    }
  }
    PlaySound(SOUND_CLICK);          //ピッと音を鳴らす
    Off(OUT_AC);           //止まる
 }

**コップをキャッチ・リリース [#o9b446f7]
***キャッチ [#q0948180]
 sub toru()
 {
    tomaru;
    turnleft(080);
    sageru;
    back(023);
    tomaru;
    turnright(080);
    tomaru; 
 }
***リリース [#ve0eb50e]
 sub hanasu()
 {
    turnleft(060);
    ageru;
    back(035);
    tomaru;
    turnright(050);
    tomaru;
 }

**メインプログラム [#va23da39]

 task main()
 {
    go(200);    //C地点を通過
    line();    //C-B間
    turnleft(020);
    line();    //B-P間
    tomaru;    //一時停止
    turnleft(035);
    line_q();   //P-Q間
    right(050);
    line_q();   //Q-R間
    turnleft(020);
    line();    //R-E間
    turnleft(025);
    Off(OUT_AC);
    line_pin();  //E-F間(ヘアピンカーブ)
    line();    
    turnleft(030);
    line();    //F-S間
    tomaru;    //一時停止
    go(080);
    toru();      //コップをキャッチ
    line();    //S-S間
    tomaru;    //一時停止
    right(100);
    line();        //S-Q間
    turnleft(020);
    line_q();   //Q-R間
    go(060);
    hanasu();   //コップをリリース
    line();    //R-P間
    turnleft(020);
    line();    //P-B間
    turnleft(075);
    go(230);    
    Off(OUT_AC);
    Off(OUT_AC); //止まる
 }


*反省点 [#a2901229]
**アーム部分 [#abed0ac4]
#ref(2017b/Member/kazuki/Mission2/IMG_4635.jpg,70%,反省点 アーム部分)
今回の発表会では画像のようにいギア比を1:1にしてしまい、アームの動きがかなり早くなってしまった。

**前輪 [#h4a12641]
#ref(2017b/Member/kazuki/Mission2/IMG_4637.jpg,70%,反省点 前輪)
小回りが利くと考え前輪の幅を短くしたが、長くした方が旋回が低速になりFastTmerの調節がしやすくやりやすかったと思った。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS