Takeshi Nishimura
/
X-Boardtest2018
X-BoardV2の動作テストプログラムです
main.cpp@0:425a3be343d7, 2018-04-22 (annotated)
- Committer:
- MCR_Xavier
- Date:
- Sun Apr 22 04:33:15 2018 +0000
- Revision:
- 0:425a3be343d7
?????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MCR_Xavier | 0:425a3be343d7 | 1 | #include "mbed.h" |
MCR_Xavier | 0:425a3be343d7 | 2 | |
MCR_Xavier | 0:425a3be343d7 | 3 | //シンボル定義 |
MCR_Xavier | 0:425a3be343d7 | 4 | #define FW 1 //前進 |
MCR_Xavier | 0:425a3be343d7 | 5 | #define BW 0 //後進 |
MCR_Xavier | 0:425a3be343d7 | 6 | |
MCR_Xavier | 0:425a3be343d7 | 7 | AnalogIn LineL(PA_0); //アナログラインセンサ |
MCR_Xavier | 0:425a3be343d7 | 8 | AnalogIn LineR(PA_1); //アナログラインセンサ |
MCR_Xavier | 0:425a3be343d7 | 9 | DigitalOut led1(PB_7); //LED_1 |
MCR_Xavier | 0:425a3be343d7 | 10 | DigitalOut led2(PB_6); //LED_2 |
MCR_Xavier | 0:425a3be343d7 | 11 | DigitalOut led3(PB_5); //LED_3 |
MCR_Xavier | 0:425a3be343d7 | 12 | DigitalOut led4(PB_4); //LED_4 |
MCR_Xavier | 0:425a3be343d7 | 13 | DigitalOut L_Dir(PB_1); //左モータ回転方向 |
MCR_Xavier | 0:425a3be343d7 | 14 | DigitalOut R_Dir(PA_9); //右モータ回転方向 |
MCR_Xavier | 0:425a3be343d7 | 15 | DigitalOut MotorDA(PA_11); //モーター出力EN |
MCR_Xavier | 0:425a3be343d7 | 16 | DigitalIn SW_IN(PB_3); //スイッチ入力 |
MCR_Xavier | 0:425a3be343d7 | 17 | PwmOut PWM_L(PA_8); //左モータPWM |
MCR_Xavier | 0:425a3be343d7 | 18 | PwmOut PWM_R(PA_10); //右モータPWM |
MCR_Xavier | 0:425a3be343d7 | 19 | Serial pc(PA_2,PA_15); //tx, rx |
MCR_Xavier | 0:425a3be343d7 | 20 | |
MCR_Xavier | 0:425a3be343d7 | 21 | |
MCR_Xavier | 0:425a3be343d7 | 22 | //割り込み定義 |
MCR_Xavier | 0:425a3be343d7 | 23 | Ticker flipper; //汎用タイマー |
MCR_Xavier | 0:425a3be343d7 | 24 | |
MCR_Xavier | 0:425a3be343d7 | 25 | //プロトタイプ宣言 |
MCR_Xavier | 0:425a3be343d7 | 26 | void init(void); //マイコン初期設定 |
MCR_Xavier | 0:425a3be343d7 | 27 | void led_out(void); //LED出力 |
MCR_Xavier | 0:425a3be343d7 | 28 | void MotorCtrl(void); //モータ管理 |
MCR_Xavier | 0:425a3be343d7 | 29 | void SensUp(void); //センサー値更新 |
MCR_Xavier | 0:425a3be343d7 | 30 | |
MCR_Xavier | 0:425a3be343d7 | 31 | //グローバル変数の宣言 |
MCR_Xavier | 0:425a3be343d7 | 32 | int timer1=0; //汎用タイマー |
MCR_Xavier | 0:425a3be343d7 | 33 | int ledval=1; //LED出力値 |
MCR_Xavier | 0:425a3be343d7 | 34 | int MotorL_Rev=0,MotorR_Rev=0; //モータの回転方向 |
MCR_Xavier | 0:425a3be343d7 | 35 | int MotorL=0,MotorR=0; //モータPWMデューティ比 |
MCR_Xavier | 0:425a3be343d7 | 36 | int ErrFlg=0; //エラー判定フラグ |
MCR_Xavier | 0:425a3be343d7 | 37 | int SensValBuf=0; //センサ値のバッファ |
MCR_Xavier | 0:425a3be343d7 | 38 | int SensorR,SensorL; //ラインセンサ |
MCR_Xavier | 0:425a3be343d7 | 39 | //----------センサ値更新----------------- |
MCR_Xavier | 0:425a3be343d7 | 40 | void SensUp(void){ |
MCR_Xavier | 0:425a3be343d7 | 41 | SensorR = LineR.read_u16()>>8; |
MCR_Xavier | 0:425a3be343d7 | 42 | SensorL = LineL.read_u16()>>8; |
MCR_Xavier | 0:425a3be343d7 | 43 | } |
MCR_Xavier | 0:425a3be343d7 | 44 | //------------モータ管理-------------------- |
MCR_Xavier | 0:425a3be343d7 | 45 | void MotorCtrl(void){ |
MCR_Xavier | 0:425a3be343d7 | 46 | int RMotorVal,LMotorVal; |
MCR_Xavier | 0:425a3be343d7 | 47 | if(ErrFlg){ //異常判定 |
MCR_Xavier | 0:425a3be343d7 | 48 | PWM_L.pulsewidth_us(0); //左PWM出力0 |
MCR_Xavier | 0:425a3be343d7 | 49 | PWM_R.pulsewidth_us(0); //右PWM出力0 |
MCR_Xavier | 0:425a3be343d7 | 50 | } |
MCR_Xavier | 0:425a3be343d7 | 51 | else{ //通常時 |
MCR_Xavier | 0:425a3be343d7 | 52 | if(MotorL < 0 ){ |
MCR_Xavier | 0:425a3be343d7 | 53 | LMotorVal = MotorL * (-1); |
MCR_Xavier | 0:425a3be343d7 | 54 | MotorL_Rev = BW;} |
MCR_Xavier | 0:425a3be343d7 | 55 | else{ |
MCR_Xavier | 0:425a3be343d7 | 56 | LMotorVal = MotorL; |
MCR_Xavier | 0:425a3be343d7 | 57 | MotorL_Rev = FW;} |
MCR_Xavier | 0:425a3be343d7 | 58 | |
MCR_Xavier | 0:425a3be343d7 | 59 | if(MotorR < 0 ){ |
MCR_Xavier | 0:425a3be343d7 | 60 | RMotorVal = MotorR * (-1); |
MCR_Xavier | 0:425a3be343d7 | 61 | MotorR_Rev = BW;} |
MCR_Xavier | 0:425a3be343d7 | 62 | else{ |
MCR_Xavier | 0:425a3be343d7 | 63 | RMotorVal = MotorR; |
MCR_Xavier | 0:425a3be343d7 | 64 | MotorR_Rev = FW;} |
MCR_Xavier | 0:425a3be343d7 | 65 | |
MCR_Xavier | 0:425a3be343d7 | 66 | if(LMotorVal >= 1000) MotorL = 1000; |
MCR_Xavier | 0:425a3be343d7 | 67 | if(RMotorVal >= 1000) MotorR = 1000; |
MCR_Xavier | 0:425a3be343d7 | 68 | PWM_L.pulsewidth_us(LMotorVal); //左PWM (0~1000) |
MCR_Xavier | 0:425a3be343d7 | 69 | PWM_R.pulsewidth_us(RMotorVal); //右PWM (0~1000) |
MCR_Xavier | 0:425a3be343d7 | 70 | } |
MCR_Xavier | 0:425a3be343d7 | 71 | |
MCR_Xavier | 0:425a3be343d7 | 72 | L_Dir = MotorL_Rev; //右モータ回転方向(H:CW) |
MCR_Xavier | 0:425a3be343d7 | 73 | R_Dir = !MotorR_Rev; //左モータ回転方向(L:FW) |
MCR_Xavier | 0:425a3be343d7 | 74 | } |
MCR_Xavier | 0:425a3be343d7 | 75 | //-------------LED出力------------------ |
MCR_Xavier | 0:425a3be343d7 | 76 | void led_out(void){ |
MCR_Xavier | 0:425a3be343d7 | 77 | if(ledval & 0x01) led1 = 1; |
MCR_Xavier | 0:425a3be343d7 | 78 | else led1 = 0; |
MCR_Xavier | 0:425a3be343d7 | 79 | if(ledval & 0x02) led2 = 1; |
MCR_Xavier | 0:425a3be343d7 | 80 | else led2 = 0; |
MCR_Xavier | 0:425a3be343d7 | 81 | if(ledval & 0x04) led3 = 1; |
MCR_Xavier | 0:425a3be343d7 | 82 | else led3 = 0; |
MCR_Xavier | 0:425a3be343d7 | 83 | if(ledval & 0x08) led4 = 1; |
MCR_Xavier | 0:425a3be343d7 | 84 | else led4 = 0; |
MCR_Xavier | 0:425a3be343d7 | 85 | } |
MCR_Xavier | 0:425a3be343d7 | 86 | |
MCR_Xavier | 0:425a3be343d7 | 87 | //----------タイマー割り込み--------------- |
MCR_Xavier | 0:425a3be343d7 | 88 | void flip(){ |
MCR_Xavier | 0:425a3be343d7 | 89 | timer1++; |
MCR_Xavier | 0:425a3be343d7 | 90 | MotorCtrl(); |
MCR_Xavier | 0:425a3be343d7 | 91 | led_out(); |
MCR_Xavier | 0:425a3be343d7 | 92 | SensUp(); |
MCR_Xavier | 0:425a3be343d7 | 93 | } |
MCR_Xavier | 0:425a3be343d7 | 94 | |
MCR_Xavier | 0:425a3be343d7 | 95 | //----------マイコン初期設定--------------- |
MCR_Xavier | 0:425a3be343d7 | 96 | void init(void){ |
MCR_Xavier | 0:425a3be343d7 | 97 | //I/O設定 |
MCR_Xavier | 0:425a3be343d7 | 98 | SW_IN.mode(PullUp); //スイッチ入力ピンプルアップ |
MCR_Xavier | 0:425a3be343d7 | 99 | MotorDA = 1; //モータ出力無効 |
MCR_Xavier | 0:425a3be343d7 | 100 | |
MCR_Xavier | 0:425a3be343d7 | 101 | //割り込み処理開始 |
MCR_Xavier | 0:425a3be343d7 | 102 | flipper.attach_us(&flip,1000); //汎用タイマー割り込み |
MCR_Xavier | 0:425a3be343d7 | 103 | |
MCR_Xavier | 0:425a3be343d7 | 104 | //PWM周期設定 |
MCR_Xavier | 0:425a3be343d7 | 105 | PWM_L.period(0.001); |
MCR_Xavier | 0:425a3be343d7 | 106 | PWM_R.period(0.001); |
MCR_Xavier | 0:425a3be343d7 | 107 | } |
MCR_Xavier | 0:425a3be343d7 | 108 | |
MCR_Xavier | 0:425a3be343d7 | 109 | //---------------メイン-------------------- |
MCR_Xavier | 0:425a3be343d7 | 110 | int main() { |
MCR_Xavier | 0:425a3be343d7 | 111 | init(); //マイコン初期設定 |
MCR_Xavier | 0:425a3be343d7 | 112 | wait(1); |
MCR_Xavier | 0:425a3be343d7 | 113 | MotorDA = 0; //モータ出力有効 |
MCR_Xavier | 0:425a3be343d7 | 114 | while(1) { |
MCR_Xavier | 0:425a3be343d7 | 115 | if(! SW_IN)ledval=0; |
MCR_Xavier | 0:425a3be343d7 | 116 | if(ledval >= 16) ledval=0; |
MCR_Xavier | 0:425a3be343d7 | 117 | pc.printf("%d\r\n",ledval); |
MCR_Xavier | 0:425a3be343d7 | 118 | wait(1); |
MCR_Xavier | 0:425a3be343d7 | 119 | ledval++; |
MCR_Xavier | 0:425a3be343d7 | 120 | |
MCR_Xavier | 0:425a3be343d7 | 121 | } |
MCR_Xavier | 0:425a3be343d7 | 122 | } |