目次
前
次
ファームウエア仕様検討
ファームウエアの全体フローは、以下とします。
全体フローを、コードに変換します。
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
- センサーデータ生成 generate_sensor_data
- 走行パターン生成 generate_driving_pattern
- モーター制御 set_pwm
- 必要時間待ち delay_driving
- 全モーター停止 stop_machine
ファームウエアは、各関数に分けて検討します。
画像データ入力
画像データ入力は、関数get_code_from_cameraが担当します。
処理内容は、「カメラ制御」で説明します。
スイッチトリガー入力
「スイッチトリガー入力」は、関数get_switch_stateが担当します。
ポートBの値を入力し、PB7、PB6の論理値から
返値を確定します。
PB7、PB6の組み合わせによる、返値は以下とします。
- (PB7,PB6)=(0,0) NONE_TRG
- (PB7,PB6)=(1,0) START_TRG
- (PB7,PB6)=(0,1) STOP_TRG
- (PB7,PB6)=(1,1) NONE_TRG
関数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変数を以下とします。
- サーボモータ servo_duty
- 左モータ left_duty
- 右モータ right_duty
関数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);
}
目次
前
次