#freeze
 閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)
 
 *ライントレースカー(コースアウト処理追加) [#p3d7b6a5]
 
 「基本機能のみ搭載」では、カーブの際、ラインセンサ2ケ共が黒ラインから
 はずれ、車がラインから外れてしまいました。
 この問題を解決する為、今回はラインの外れ方の履歴をold_flagに持たせ
 ラインセンサ2ケ共に外れた際の動作指示を定義しました。
 【結果】ライントレースカーは常に正しくラインに沿って走行出来る様に
 なりました。 06/11/05
 
 |&attachref(,zoom,150x150,button){新しい写真添付};|&attachref(,zoom,150x150,button){新しい写真添付};|
 
  /** 
  * ライントレースカー(コースアウト処理追加)
  * 
  * 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の間を繰り返す 
  } //メインプログラム終わり 
 
 ★この情報は役に立ちましたか?
 #vote(はい[32],いいえ[32])
 #vote(はい[33],いいえ[32])