目次

ファームウエア仕様検討

 ファームウエアの全体フローは、以下とします。



 全体フローを、コードに変換します。
    get_code_from_camera(OFF);
    sw_state = OFF ;
    /* wait start trigger */
    while ( ON ) {
      sw_state = get_switch_state() ;
      if ( sw_state == START_TRG ) break ;
    }
    /* driving */
    while ( ON ) {
      get_code_from_camera(ON);
      generate_sensor_data();
      generate_driving_pattern();
      set_pwm();
      delay_driving();
      sw_state = get_switch_state() ;
      if ( sw_state == STOP_TRG ) break ;
    }
    /* dynamic stop */
    stop_machine();
    while ( ON ) {
    }

 必要となる関数をリストします。

 ファームウエアは、各関数に分けて検討します。


画像データ入力

 画像データ入力は、関数get_code_from_cameraが担当します。  処理内容は、「カメラ制御」で説明します。

スイッチトリガー入力

 「スイッチトリガー入力」は、関数get_switch_stateが担当します。  ポートBの値を入力し、PB7、PB6の論理値から  返値を確定します。  PB7、PB6の組み合わせによる、返値は以下とします。  関数get_switch_stateを定義します。 #define NONE_TRG 0 #define STOP_TRG 1 #define START_TRG 2 #define MASKC0 0xc0 UBYTE get_switch_state(void) { UBYTE tmp ; UBYTE result ; /* default */ result = NONE_TRG ; /* get switch state */ tmp = PBDR & MASKC0 ; tmp >>= 6 ; /* judge */ if ( tmp == STOP_TRG ) { result = STOP_TRG ; } if ( tmp == START_TRG ) { result = START_TRG ; } return result ; }

センサーデータ生成

 「センサーデータ生成」は、関数generate_sensor_dataが担当します。  処理内容は、「画像処理検討」で説明します。

走行パターン生成

 「走行パターン生成」は、関数generate_driving_patternが担当します。  処理内容は、「走行パターン生成」で説明します。

モーター制御

 「モーター制御」は、関数set_pwmが担当します。  走行パターン生成が作成した、左右モータ、サーボモータ  のDuty比率を設定します。  左右モータ、サーボモータを示す3変数を以下とします。  関数set_pwmを定義します。 #define M_FRONT 0 #define M_LEFT 1 #define M_RIGHT 2 void set_pwm(void) { set_duty(M_FRONT,servo_duty); set_duty(M_LEFT ,left_duty ); set_duty(M_RIGHT,right_duty); }  関数set_pwmの下で動く、関数set_dutyを定義します。 void set_duty(UBYTE which,UBYTE x) { if ( which == M_FRONT ) { fcnt = x ; } if ( which == M_LEFT ) { lcnt = (x << 1) ; } if ( which == M_RIGHT ) { rcnt = (x << 1) ; } }

必要時間待ち

 「必要時間待ち」は、関数delay_drivingが担当します。  走行パターン生成が作成した待ち時間を利用します。  待ち時間は、変数ddelayとして、関数delay_drivingを定義します。 void delay_driving(void) { delay_ms(ddelay); }

全モーター停止

 「全モーター停止」は、関数stop_machineが担当します。  左右のモータは、Duty比を0%に設定します。  サーボモータは、中央位置とします。  関数stop_machineを定義します。 void stop_machine(void) { set_duty(M_FRONT,SMD_CENTER); set_duty(M_LEFT ,0); set_duty(M_RIGHT,0); }
目次

inserted by FC2 system