閲覧総計:10925  (本日:1  昨日:0)

ライントレースカー(コースアウト処理追加)

「基本機能のみ搭載」では、カーブの際、ラインセンサ2ケ共が黒ラインから
はずれ、車がラインから外れてしまいました。
この問題を解決する為、今回はラインの外れ方の履歴をold_flagに持たせ
ラインセンサ2ケ共に外れた際の動作指示を定義しました。
【結果】ライントレースカーは常に正しくラインに沿って走行出来る様に
なりました。 06/11/05

/** 
* ライントレースカー(コースアウト処理追加)
* 
* PIC 16F628A 
* 発信器:内臓4MHz 
* 電源:PIC 乾電池4本(6.0V) モータ 乾電池3本(4.5V) 
* ライトセンサー:RA0, RA1 
* モーター:左 RB6,RB7 右 RB0,RB1 
* 
* Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON 
*    _WDT_OFF _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT 
* 
* プログラム言語:MikroC v6.0 
*/ 
void main() { //メインプログラム 

  unsigned short int old_flag; //完全コースアウト前の状況を記録flag

 //マイコンの初期化 
 PORTA = 0b00000000; //PORTAの中身をきれいにする 
 PORTB = 0b00000000; //PORTBの中身をきれいにする 

 CMCON = 0b00000111; //PORTAをデジタル入出力使用に設定 

 TRISA = 0b00000011; //PORTAをRA0,1を1:入力に、他は0:出力に設定 
 TRISB = 0b00000000; //PORTBを8つ全て0:出力に設定 
 //マイコンの初期化終わり 

 do{ //doとwhileの間を繰り返す 
  if(PORTA.F1 == 1) { //左センサー黒 
   if(PORTA.F2 == 1) { //右センサー黒 
    //車がラインの上にある 
    //左右モーター前進 
    PORTB.F2 = 1; //左モーター前進 
    PORTB.F3 = 0; 
    PORTB.F5 = 1; //右モーター前進 
    PORTB.F4 = 0; 
        
        old_flag = 0; //両センサコース上
        
   } else { //右センサ白 
    //右にコースアウト 
    //左モーター停止、右モーター前進で 
    //コースにもどる 
    PORTB.F2 = 0; //左モーター停止 
    PORTB.F3 = 0; 
    PORTB.F5 = 1; //右モーター前進 
    PORTB.F4 = 0; 
        
        old_flag = 1; //右にコースアウト
        
   } 
  } else { //左センサー白 
   if(PORTA.F2 == 1) { //右センサー黒 
    //左にコースアウト 
    //左モーター前進、右モーター停止で 
    //コースにもどる 
    PORTB.F2 = 1; //左モーター前進 
    PORTB.F3 = 0; 
    PORTB.F5 = 0; //右モーター停止 
    PORTB.F4 = 0; 
        
        old_flag = 2; //左にコースアウト
        
   } else { //右センサー白 
    //左右センサー共に白、完全コースアウトした場合 
        if(old_flag == 1) {
      //右にコースアウト 
      //左モーター停止、右モーター前進で 
      //コースにもどる 
      PORTB.F2 = 0; //左モーター停止 
      PORTB.F3 = 0; 
      PORTB.F5 = 1; //右モーター前進 
      PORTB.F4 = 0; 
          
          old_flag = 1; //右にコースアウト
          
        } else {
      //左にコースアウト 
      //左モーター前進、右モーター停止で 
      //コースにもどる 
      PORTB.F2 = 1; //左モーター前進 
      PORTB.F3 = 0; 
      PORTB.F5 = 0; //右モーター停止 
      PORTB.F4 = 0; 
          
          old_flag = 2; //左にコースアウト
          
        }
   } 
  } 
 } while(1); //doとwhileの間を繰り返す 
} //メインプログラム終わり 

★この情報は役に立ちましたか?

選択肢 投票
はい 5  
いいえ 5