課題2(ライントレース)目次
#contents
*課題の内容 [#kafaddec]
**課題の目的 [#o08b8387]
交差点においてあるボールをAゾーンからBゾーンに運ぶ。
**コース [#d267ed20]
#raf(./コース写真.jpg)
#ref(./コース写真.jpg)
*ロボットの説明 [#r15edcbb]
**ロボットの概形 [#i389a9a4]
#ref(./ロボット写真3.jpg)
**動きの説明 [#z1e98fbc]
2回目の交差点までタイマーを用いて1回目の交差点を直進しライン上を動きボールをキャッチした後、交差点を直進しそのままゴールまで運ぶ。
*プログラミング [#xccb4c86]

 #define THRESHOLD 43
 #define HIPOWER 5
 #define LOWPOWER 3
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define go   set_power_H; OnFwd(OUT_AC); Wait(5); Off(OUT_AC)
 #define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C);  // 左旋回
 #define turn_left0  set_power_L; Off(OUT_A); OnFwd(OUT_C);   // 左折
 #define turn_right0 set_power_L; Off(OUT_C); OnFwd(OUT_A);         // 右折
 #define turn_right1 set_power_L; OnRev(OUT_C); OnFwd(OUT_A); // 右旋回 
 
  
 #define STEP 5  // 1回の判断で動作させる時間
 #define nMAX 4  // 通常のカーブとして許容できる繰り返しの最大値 (調整する)
 #define short_break Off(OUT_AC); Wait(200); // 小休止
 #define CROSS_TIME 15  // 交差点通過にかかる時間 //40
 /* 交差点を渡る */
 #define cross_line  OnFwd(OUT_AC);Wait(CROSS_TIME);short_break;
 
   task line_trace ()
 { 
   
   int nOnline=0; // 続けて黒になった回数 (カウンタ)
   
   
   while (true) {
                   /* 黒を続けてnMAX回繰り返さない間、通常のライントレースをする */
     while (nOnline < nMAX) {
       if ( SENSOR_1 <= THRESHOLD-4) {  //39 makkuro
         turn_left1;
         nOnline++;  // カウンタを増やす
         } else {
    if ( SENSOR_1 < THRESHOLD) { //
           turn_left0;
          nOnline++;  // カウンタを増やす kaihen
         } else if ( SENSOR_1 <= THRESHOLD+2) {
           go;
         } else if ( SENSOR_1 < THRESHOLD+4) {
           turn_right0; // karukumagaru
         } else {
           turn_right1;
         }
         nOnline=0;  // カウンタをリセット
       }
       Wait(STEP); // nagarenoato matu
     } //while nmax kakko
     short_break; // 小休憩 nmax 4ijo
     PlayTone(488,15); Wait(20);
     turn_right1; Wait(nMAX*STEP*3/2);  // 進行方向修正
     cross_line;  // 交差点を渡る
     nOnline=0; //カウンタをリセット
   } //while true
 } //taskmain
     
 
  
 task main()
 
 { 
    SetSensor(SENSOR_1, SENSOR_LIGHT);
 SetSensor(SENSOR_3, SENSOR_TOUCH);
    ClearTimer(0);
     while( true ) {
         start line_trace;     // ライントレースを開始
 
         until (SENSOR_3 == 1);   // 
         stop line_trace;      // 一旦 line_trace_line のタスクを停止
         Off(OUT_A+OUT_C); Wait(50);   // 2秒間停止 (この時、main のタスクのみがモータを制 御)
        OnFwd(OUT_B);Wait(10); OnRev(OUT_B);Wait(10);Off(OUT_B); //catch
 
 }
 }

*反省 [#pd02170e]
動きが遅く同じところで留まることも多少あるところを直せなかったのが気がかりです。次回は動きにも気を使ってプログラミングしたいです。触覚センサーのきき具合を改善できなかったのも次回への課題です。

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