DIPスイッチの扱い

DIPスイッチの位置

マイコンボードとドライブ基板に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;

}

 


DIPスイッチのポート

 /* ポートの入出力設定 */

    /*  センサ中心      スタートバー         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};


DIPスイッチの使われている場所

 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;

    }

}