マイコンボードとドライブ基板にDIPスイッチと呼ばれる切り替えて使うスイッチがあります。
マイコンボードのDIPスイッチ↓
ドライブ基板のDIPスイッチ↓
関係する部分を抜粋します。
全体を見る場合はプログラムを開いてください。
下にも記載されています。
①unsigned char dipsw_getf( void ){
unsigned char sw;
sw = p1 & 0x01; /*P1_0読み込み */ マイコンボードのDIPスイッチの内、
1のみを使っている
return sw;
}
②const int dipswf_pattern[] = { 0, 1};
③if( M_FreeMoter == 1 ) {
motor_mode_f( FREE, FREE ); //BRAKE
motor_mode_r( FREE, FREE );
acceleFree = 0;
accele_l = acceleFree;
accele_r = acceleFree;
}
else {
accele_l = accele_l2;
accele_r = accele_r2;
}
上の3つからあるスイッチを切り替えるとモータが一切回転しなくなるフリーモードになります。
そのスイッチはマイコンボードのDIPスイッチの1です。
このサイトに掲載されているプログラムをそのまま書き込んで動かないという方がいます。
基板等が全く同じ条件の場合でプログラムを書き込んで動かないとして考えられる原因としてDIPスイッチの切替があげられます。
このプログラムでは、スイッチは1か所のみしか使っていないため、それ以外のスイッチは切り替える必要がありません。
ドライブ基板のDIPスイッチは全て内側、マイコンボードのDIPスイッチは外側に切り替えてください。
マイコンボードの書き込み端子に近いDIPスイッチ(画像では1)のみ使うため、モータを回転させる際に気を付けてください。
電源を入れただけではモータは回転しません。
電源を入れた後にタクトスイッチを押してください。
解説等は青文字で行います。
/************************************************************************/
/* マイコンボード上のディップスイッチ値読み込み */
/* 引数 なし */
/* 戻り値 スイッチ値 0~15 分けている */
/************************************************************************/
unsigned char dipsw_get( void ){
unsigned char sw;
sw = p1 & 0x0e; /* P1_3~P1_1読み込み */ マイコンボードのDIPスイッチの内、
2から4を使っている
DIPスイッチのポートを見ると太字斜体の部分が該当している
/* センサ中心 スタートバー RxD0 TxD0
DIPSW3 DIPSW2 DIPSW1 DIPSW0 */
pur0 |= 0x04; /* P1_3~P1_0のプルアップON */
p1 = 0x00; すべて入力
pd1 = 0x10;
数値はポート参照 以下のスイッチのプログラムも仕組みは同じであるため省略
return sw;
}
unsigned char dipsw_getf( void ){
unsigned char sw;
sw = p1 & 0x01; /*P1_0読み込み */ マイコンボードのDIPスイッチの内、
1のみを使っている
return sw;
}
/************************************************************************/
/* モータドライブ基板TypeS Ver.3上のディップスイッチ値読み込み */
/* 引数 なし */
/* 戻り値 スイッチ値 0~255 意味なし */
/************************************************************************/
unsigned char dipsw_get2( void ){
/* 実際の入力はタイマRB割り込み処理で実施 */
unsigned char sw;
sw = p8 & 0xf0; /*P8_7~P8_4読み込み */
return sw;
// return types_dipsw;
}
unsigned char dipsw_get3( void ){
/* 実際の入力はタイマRB割り込み処理で実施 */
unsigned char sw;
sw = p8 & 0x03; /* P8_1~P8_0読み込み */
return sw;
// return types_dipsw;
}
unsigned char dipsw_get4( void ){
/* 実際の入力はタイマRB割り込み処理で実施 */
unsigned char sw;
sw = p8 & 0x0c; /* P8_3~P8_2読み込み */
return sw;
// return types_dipsw;
}
/* ポートの入出力設定 */
/* センサ中心 スタートバー RxD0 TxD0
DIPSW3 DIPSW2 DIPSW1 DIPSW0 */
pur0 |= 0x04; /* P1_3~P1_0のプルアップON */
p1 = 0x00; すべて入力
pd1 = 0x10;
/* DIPSWorLED DIPSWorLED DIPSWorLED DIPSWorLED
DIPSWorLED DIPSWorLED DIPSWorLED DIPSWorLED */
pur2 |= 0x03; /* P8_7~P8_0のプルアップON */
p8 = 0x00; すべて入力
pd8 = 0x00;
上の段は左から8 4 2 1
下の段は左から8 4 2 1となっている。全て足すと15になる。16進数だとF。
2進数で表して0の部分が入力、1は出力になっていると思われる。
p1とp8は16進数で表してして0x00である。右2つの00の内右が下の段、左が上の段となる。
16進数を2進数に変換すると00000000になる。
どのような数値になるかはプログラムを見て判断してください。
const int dipsw1_pattern[] = { 9, 10, 11, 12, 13, 14, 15, 16};
const int dipsw2_pattern[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
const int dipsw3_pattern[] = { 10, 11, 12, 13};
const int dipsw4_pattern[] = { 5, 6, 7, 8};
const int dipswf_pattern[] = { 0, 1};
case 0:
/* プッシュスイッチ押下待ち */
gain = 0;
servoPwmOut( 0 );
lEncoderTotal = 0;
lEncoderCrank = 0;
causeout = 0;
iAngleBefore2 = 0;
M_FreeMoter = 0;;
streetspeed = (dipsw2_pattern[dipsw_get2()]+5); //直線
cornerspeed = dipsw2_pattern[dipsw_get2()]; //曲線
lanechangespeed = dipsw3_pattern[dipsw_get3()]; //車線変更
crankspeed = dipsw4_pattern[dipsw_get4()];//クランク
プログラム上では書いてあるけど、使ってはいません。
プログラムを読んでいただければわかると思います。
if( pushsw_get() && cnt1 >= 100){
M_FreeMoter = dipswf_pattern[dipsw_getf()]; //1でフリーモード 0で通常
モータを回転させるか決めます。
setBeepPatternS( 0xcc00 );
cnt1 = 0;
pattern = 1;
break;
}
i = (cnt1/200) % 2 + 1;
led_out( i ); /* LED点滅処理 */
break;
DIPスイッチの使い道はここぐらいです。
以下でも使われてはいますが、この関数を使ってはいません。
速度やモータの回転は手打ちで決めています。
/************************************************************************/
/* 前輪の速度制御 */
/* 引数 左モータ:-100~100 , 右モータ:-100~100 */
/* 0で停止、100で正転100%、-100で逆転100% */
/* 戻り値 なし */
/************************************************************************/
void motor2_f( int accele_l, int accele_r ){
int sw_data, acceleFree;
if( M_FreeMoter == 1 ) {
motor_mode_f( FREE, FREE ); //BRAKE
motor_mode_r( FREE, FREE );
acceleFree = 0;
accele_l = acceleFree;
accele_r = acceleFree;
}
sw_data = dipsw2_pattern[dipsw_get2()] + 5; /* ディップスイッチ読み込み */
accele_l = accele_l * sw_data / 20;
accele_r = accele_r * sw_data / 20;
// 左前モータ
if( accele_l >= 0 ) {
p2_0 = 0;
} else {
p2_0 = 1;
accele_l = -accele_l;
}
if( accele_l <= 5 ) {
trcgrb = trcgrb_buff = trcgra;
} else {
trcgrb_buff = (unsigned long)(TRC_MOTOR_CYCLE-2) * accele_l / 100;
}
// 右前モータ
if( accele_r >= 0 ) {
p2_7 = 0;
} else {
p2_7 = 1;
accele_r = -accele_r;
}
if( accele_r <= 5 ) {
trcgrd = trcgrd_buff = trcgra;
} else {
trcgrd_buff = (unsigned long)(TRC_MOTOR_CYCLE-2) * accele_r / 100;
}
}
モータの回転に関しては以下の関数を使っています。
フリーモードにする時のみ上記の
M_FreeMoter = dipswf_pattern[dipsw_getf()]; //1でフリーモード 0で通常
が影響されます。
/************************************************************************/
/* 前輪の速度制御2 ディップスイッチには関係しないmotor関数 */
/* 引数 左モータ:-100~100 , 右モータ:-100~100 */
/* 0で停止、100で正転100%、-100で逆転100% */
/* 戻り値 なし */
/************************************************************************/
void motor_f( int accele_l2, int accele_r2 ){
int accele_l,accele_r, acceleFree;
if( M_FreeMoter == 1 ) {
motor_mode_f( FREE, FREE ); //BRAKE
motor_mode_r( FREE, FREE );
acceleFree = 0;
accele_l = acceleFree;
accele_r = acceleFree;
}
else {
accele_l = accele_l2;
accele_r = accele_r2;
}
/* 左前モータ */
if( accele_l >= 0 ) {
p2_0 = 0;
} else {
p2_0 = 1;
accele_l = -accele_l;
}
if( accele_l <= 5 ) {
trcgrb = trcgrb_buff = trcgra;
} else {
trcgrb_buff = (unsigned long)(TRC_MOTOR_CYCLE-2) * accele_l / 100;
}
/* 右前モータ */
if( accele_r >= 0 ) {
p2_7 = 0;
} else {
p2_7 = 1;
accele_r = -accele_r;
}
if( accele_r <= 5 ) {
trcgrd = trcgrd_buff = trcgra;
} else {
trcgrd_buff = (unsigned long)(TRC_MOTOR_CYCLE-2) * accele_r / 100;
}
}