[[2013a/Member]]
*ロボットの紹介 [#v3b5afde]
#ref(mission1-1.jpg)
最初は二本の腕にモーターを取り付けて缶を挟む構造にしていたのですが、このままだと腕がぶらぶらして缶を倒してしまうので、缶を安定させるために二本の下あごのようなものを取り付けました。このことによって、缶は倒れることがほとんどなくなりました。
#ref(mission1-4.jpg)

*コース攻略 [#i071f523]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013a%2FMission1&openfile=robotics-2013a-mission1.jpg~
タイマーを駆使することによって、角度の難しい交差点に対応できるようにしました。また、缶をつかむ時間や離す時間をタイマーで対応しようとしたのですが、これはうまくいかず、缶を話す位置が定まりませんでした。なので、交差点を直進するプログラムを改良して、カウンタを使って、缶をつかんだり離したりできれば良かったです。

*プログラムの作成 [#qffed974]
 #define THRESHOLD 42
 #define HIPOWER 9 // 直線用の強めのパワー
 #define LOWPOWER 1 // カーブ、旋回用の弱めのパワー
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define go_forward set_power_H; OnFwd(OUT_AC); // 前に進む動作
 #define turn_left1 set_power_L; Off(OUT_A); OnFwd(OUT_C); // 左にカーブする動作
 #define turn_right1 set_power_L; OnFwd(OUT_A); Off(OUT_C); // 右にカーブする動作
 #define turn_left2 set_power_L; OnRev(OUT_A); OnFwd(OUT_C); // 左に旋回する動作
 #define turn_right2 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); // 右に旋回する動作
 #define STEP 1 // 1回の判断で動作させる時間
 #define nMAX 7 // 通常のカーブとして許容できる繰り返しの最大値
 #define short_break Off(OUT_AC); Wait(100); // 小休止
 #define CROSS_TIME 20 // 交差点通過にかかる時間
 #define cross_line go_forward;Wait(CROSS_TIME);short_break; // 交差点を通過する動作
 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT); // 「2」に光センサーを設置
    ClearTimer(0); // タイマーをリセット
   while (FastTimer(0) <= 1000) { // 10秒間通常のライントレース(線の右側)
     if (SENSOR_2 < THRESHOLD-3) { // 光センサーの値が39未満の時、右に旋回
       turn_right2;
     } else 
       if (SENSOR_2 < THRESHOLD-1) { // 光センサーの値が41未満の時、右にカーブ 
         turn_right1;       
       } else if (SENSOR_2 < THRESHOLD+2) { // 光センサーの値が44未満の時、直進
         go_forward;
       } else if (SENSOR_2 < THRESHOLD+10) { // 光センサーの値が52未満の時、左にカーブ
         turn_left1;
       } else { // その他の時は左に旋回
         turn_left2;
        } 
       Wait(STEP);
     }
    int nOnline=0; // 続けて黒になった回数を数える  
    PlaySound(SOUND_UP); // ピロピロ〜と高い音を鳴らす
     Off(OUT_AC); // タイヤを止める
     OnRev(OUT_B);Wait(120);Off(OUT_B); // 上あごを動かして、缶を挟む→1.2秒で停止
      ClearTimer(0); // タイマーをリセット
       while (FastTimer(0) <= 1600) { // 16秒間交差点のプログラム→線の右側をライントレース
     if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD-3)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が39未満の時、右に旋回
       turn_right2;
       nOnline++; // カウンタを増やす
     } else {
       if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD-1)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が41未満の時、右にカーブ
         turn_right1;       
       } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD+2)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が44未満の時、直進
         go_forward;
       } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD+10)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が52未満の時、左にカーブ
         turn_left1;
       } else if ((nOnline < nMAX)&&(SENSOR_2 >= THRESHOLD+10)){ // 黒がnMAX回繰り返さない、かつ、光センサーの値が52以上の時、左に旋回
         turn_left2;
        } 
       nOnline=0; // カウンタをリセット
       }  if(nOnline >= nMAX) { // 黒がnMAX回繰り返された時、交差点を渡る動作
         short_break; // 小休憩
         turn_left2; Wait(nMAX*STEP); // 進行方向修正
         cross_line; // 交差点を渡る
         nOnline=0; // カウンタをリセット
       }
     }
    PlaySound(SOUND_UP); // ピロピロ〜と高い音を鳴らす
     Off(OUT_AC); タイヤを止める
     OnRev(OUT_B);Wait(120);Off(OUT_B); // 上あごを動かして、缶を挟む→1.2秒で停止
     OnFwd(OUT_AC);Wait(50);Off(OUT_AC); // 0.5秒間前進(次の左沿いにライントレースする動作をしやすくするため)
    ClearTimer(0); // タイマーをリセット
    while (FastTimer(0) <= 3500) { // 35秒間交差点のプログラム→線の左側をライントレース
     if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD-3)) { 黒がnMAX回繰り返さない、かつ、光センサーの値が39未満の時、左に旋回
       turn_left2;
       nOnline++; // カウンタを増やす
     } else {
       if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD-1)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が41未満の時、左にカーブ
         turn_left1;       
       } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD+2)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が44未満の時、直線
         go_forward;
       } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD+10)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が52未満の時、右にカーブ
         turn_right1;
       } else if ((nOnline < nMAX)&&(SENSOR_2 >= THRESHOLD+10)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が52以上の時、右に旋回
         turn_right2;
        } 
       nOnline=0; // カウンタをリセット
       }  if(nOnline >= nMAX) { // 黒がnMAX回繰り返された時、交差点を渡る動作
         short_break; // 小休憩
         turn_right2; Wait(nMAX*STEP); // 進行方向修正
         cross_line; // 交差点を渡る
         nOnline=0; // カウンタをリセット
       }
     }
    PlaySound(SOUND_UP); // ピロピロ〜と高い音を鳴らす
     Off(OUT_AC); // タイヤを止める
     OnRev(OUT_B);Wait(120);Off(OUT_B); // 上あごを動かして缶を挟む→1.2秒で停止
     OnFwd (OUT_AC);Wait (50); // 0.5秒間前進(次の右沿いにライントレースする動作をしやすくするため)
      ClearTimer(0); // タイマーをリセット
    while (FastTimer(0) <= 1800) { // 18秒間交差点のプログラム→線の右側をライントレース
     if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD-3)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が39未満の時、右に旋回
       turn_right2;
       nOnline++; // カウンタをリセット
     } else {
       if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD-1)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が41未満の時、右にカーブ
         turn_right1;       
       } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD+2)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が44未満の時、直進
         go_forward;
       } else if ((nOnline < nMAX)&&(SENSOR_2 < THRESHOLD+10)) { // 黒がnMAX回繰り返さない、かつ、光センサーの値が52未満の時、左にカーブ
         turn_left1;
       } else if ((nOnline < nMAX)&&(SENSOR_2 >= THRESHOLD+10)){ // 黒がnMAX回繰り返さない、かつ、光センサーの値が52以上の時、左に旋回
         turn_left2;
        } 
       nOnline=0;
       }  if(nOnline >= nMAX) { // 黒がnMAX回繰り返された時、交差点を渡る動作
         short_break; // 小休憩
         turn_left2; Wait(nMAX*STEP); // 進行方向修正
         cross_line; // 交差点を渡る
         nOnline=0; // カウンタをリセット
       }
     }
    PlaySound(SOUND_UP); // ピロピロ〜と高い音を鳴らす
     Off(OUT_AC); // タイヤを止める
    OnRev(OUT_B);Wait(120);Off(OUT_B); // 上あごを動かして缶を挟む→1.2秒で停止
     ClearTimer(0); // タイマーをリセット
   while (FastTimer(0) <= 1600) {
     if (SENSOR_2 < THRESHOLD-3) {
       turn_right2;
     } else 
       if (SENSOR_2 < THRESHOLD-1) {
   while (FastTimer(0) <= 1600) { // 16秒間通常のライントレース(線の右側)
     if (SENSOR_2 < THRESHOLD-3) { // 光センサーの値が39未満の時、右に旋回
       turn_right2; // 光センサーの値が41未満の時、右にカーブ
         turn_right1;       
       } else if (SENSOR_2 < THRESHOLD+2) {
       } else if (SENSOR_2 < THRESHOLD+2) { // 光センサーの値が44未満の時、直進       
         go_forward;
       } else if (SENSOR_2 < THRESHOLD+10) {
       } else if (SENSOR_2 < THRESHOLD+10) { // 光センサーの値が52未満の時、左にカーブ
         turn_left1;
       } else {
       } else { その他の時は左に旋回
         turn_left2;
        } 
       Wait(STEP);
     }
    PlaySound(SOUND_UP);
    OnFwd(OUT_A); OnRev(OUT_C);OnRev(OUT_B);Wait(50);Off(OUT_ABC);
     ClearTimer(0);  
   while (FastTimer(0) <= 500) {
     if (SENSOR_2 < THRESHOLD-3) {
    PlaySound(SOUND_UP); // ピロピロ〜と高い音を鳴らす
    OnFwd(OUT_A); OnRev(OUT_C);OnRev(OUT_B);Wait(50);Off(OUT_ABC); // 缶をつかみながら0.5秒間右に旋回(ターンして缶を置きに行くのに缶を倒さないようにするため)
     ClearTimer(0); // カウンタをリセット
   while (FastTimer(0) <= 500) { // 5秒間通常のライントレース(線の左側)
     if (SENSOR_2 < THRESHOLD-3) { // 光センサーの値が39未満の時、左に旋回
       turn_left2;
     } else 
       if (SENSOR_2 < THRESHOLD-1) {
       if (SENSOR_2 < THRESHOLD-1) { // 光センサーの値が41未満の時、左にカーブ
         turn_left1;       
       } else if (SENSOR_2 < THRESHOLD+2) {
       } else if (SENSOR_2 < THRESHOLD+2) { // 光センサーの値が44未満の時、直進
         go_forward;
       } else if (SENSOR_2 < THRESHOLD+10) {
       } else if (SENSOR_2 < THRESHOLD+10) { // 光センサーの値が52未満の時、右にカーブ
         turn_right1;
       } else {
       } else { // その他の時は右に旋回
         turn_right2;
        } 
       Wait(STEP);
     }
    PlaySound(SOUND_UP);
     Off(OUT_AC);
     OnFwd(OUT_B);
     Wait(100);
     Off(OUT_B);
     OnRev(OUT_AC);
     Wait(100);
     Off(OUT_AC);
     OnRev(OUT_A); OnFwd(OUT_C);Wait(80);Off(OUT_AC);
     ClearTimer(0);
   while (FastTimer(0) <= 2000) {
     if (SENSOR_2 < THRESHOLD-3) { 
    PlaySound(SOUND_UP); // ピロピロ〜と高い音を鳴らす
     Off(OUT_AC); // タイヤを止める
     OnFwd(OUT_B);Wait(100);Off(OUT_B); // 1秒間上あごを動かして缶を離す
     OnRev(OUT_AC);Wait(100);Off(OUT_AC); // 1秒間後進
     OnRev(OUT_A); OnFwd(OUT_C);Wait(80);Off(OUT_AC); // 0.8秒間左に旋回
     ClearTimer(0); // タイマーをリセット
   while (FastTimer(0) <= 2000) { // 20秒間通常のライントレース(線の右側)
     if (SENSOR_2 < THRESHOLD-3) { // 光センサーの値が39未満の時、右に旋回
       turn_right2;
     } else 
       if (SENSOR_2 < THRESHOLD-1) {
       if (SENSOR_2 < THRESHOLD-1) { // 光センサーの値が41未満の時、右にカーブ
         turn_right1;       
       } else if (SENSOR_2 < THRESHOLD+2) {
       } else if (SENSOR_2 < THRESHOLD+2) { // 光センサーの値が44未満の時、直進
         go_forward;
       } else if (SENSOR_2 < THRESHOLD+10) {
       } else if (SENSOR_2 < THRESHOLD+10) { // 光センサーの値が52未満の時、左にカーブ
         turn_left1;
       } else {
       } else { // その他の時は左に旋回
         turn_left2;
        } 
       Wait(STEP);
     }
 }


*まとめ [#eb7c792e]
今回は発表が残念な結果に終わり、期限内に完璧なプログラムを作成することができませんでしたが、タイマーの使い方や交差点を通過する技術は向上したと思うので、これらの技術を次の最後の課題に生かしていきたいです。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS