
toyama-NCT hongo seiyaho_main
main.cpp
- Committer:
- Komazawa_sun
- Date:
- 2016-12-26
- Revision:
- 0:7f0b090897bc
File content as of revision 0:7f0b090897bc:
#include "mbed.h" #define PWMMAX 0.33 #define stMAX 1023 #define stMIN 0 #define daMAX 255 #define SERVO_MIN_ANG 1020 //us 0.0 Serial comUSB(USBTX,USBRX); Serial com1(p9,p10); //Serial com1(p13, p14); DigitalIn angMAX(p18); DigitalIn angMIN(p19); DigitalOut bufcheck(LED1); DigitalOut dirR(p28); DigitalOut dirL(p29); DigitalOut dirA(p20); DigitalOut shoter(p11); DigitalOut loader(p12); PwmOut servo(p24); PwmOut pwrR(p26); PwmOut pwrL(p25); PwmOut pwrA(p21); const float angpwr = 0.18; int buf_count = -1; union Get_data{ char alldata[6]; struct{ char header :8; unsigned int x :8; unsigned int y :8; unsigned int t :8; int au :1; int ad :1; int h :1; int set :1; int s :1; int vx :1; int vy :1; int vt :1; }data; }buf_data; union union_data{ char alldata[9]; struct{ char header :8; signed int x :16; signed int y :16; signed int t :16; int au :1; int ad :1; int h :1; int set :1; int s :1; }data; }act_data; void Serialsetup(){ comUSB.baud(9600); com1.baud(115200); } void interface(){ char data; bufcheck = 1; while(com1.readable()){ data = com1.getc(); bufcheck = 1; //comUSB.printf("%d\r\n",data); if(data == 0xFE){ buf_count = 0; } if(buf_count < 6 && buf_count != -1){ buf_data.alldata[buf_count] = data; buf_count++; } } if(buf_count == 6 && buf_data.alldata[0] == 0xFE){ if(buf_data.data.vx == 0){ act_data.data.x = (signed int)buf_data.data.x * -1; }else{ act_data.data.x = buf_data.data.x; } if(buf_data.data.vy == 0){ act_data.data.y = (signed int)buf_data.data.y * -1; }else{ act_data.data.y = buf_data.data.y; } if(buf_data.data.vt == 0){ act_data.data.t = (signed int)buf_data.data.t * -1; }else{ act_data.data.t = buf_data.data.t; } act_data.data.au = buf_data.data.au; act_data.data.ad = buf_data.data.ad; act_data.data.h = buf_data.data.h; act_data.data.set = buf_data.data.set; act_data.data.s = buf_data.data.s; } } void drive_mech(){ float power,lduty,turn; power = act_data.data.y * (PWMMAX / daMAX); lduty = act_data.data.x * (PWMMAX / daMAX); turn = act_data.data.t * (PWMMAX / daMAX); if(power == 0.00){ if(turn < 0){ dirR = 1; dirL = 1; pwrR = turn * -1; pwrL = turn * -1; }else if(turn >= 0){ dirR = 0; dirL = 0; pwrR = turn; pwrL = turn; } }else{ if(power <= 0){ power = power * -1; dirR = 1; dirL = 0; }else if (power > 0){ dirR = 0; dirL = 1; } if(lduty <= 0){ pwrR = power; pwrL = power - (lduty * -1) / 2; }else if(lduty > 0){ pwrR = power - lduty / 2; pwrL = power; } //comUSB.printf("p %f, l %f,t %f\r\n",power,lduty,turn); } } void seiyaho(){ if(act_data.data.au == 1){ if(angMAX != 1){ dirA = 1; pwrA = angpwr; }else if(angMAX == 1){ pwrA = 0.00; } }else if(act_data.data.ad == 1){ if(angMIN != 1){ dirA = 0; pwrA = angpwr; }else if(angMIN == 1){ pwrA = 0.00; } }else if(act_data.data.au != 1 && act_data.data.ad != 1) { pwrA = 0.00; } } void hold(){ if(act_data.data.h == 1 && act_data.data.s != 1 && act_data.data.s != 1){ servo.pulsewidth_us(SERVO_MIN_ANG + 900); }else if(act_data.data.h != 1 && act_data.data.set != 1){ servo.pulsewidth_us(SERVO_MIN_ANG + 500 * (0 / 90)); }else if(act_data.data.set == 1 && act_data.data.s != 1 && act_data.data.s != 1){ servo.pulsewidth_us(SERVO_MIN_ANG + 1280); } } void fire(){ if(act_data.data.s == 1 && act_data.data.h != 1 && act_data.data.set != 1){ loader = 0; shoter = 1; }else if(act_data.data.s == 0 && act_data.data.h != 1 && act_data.data.set != 1){ loader = 1; shoter = 0; } } int main() { Serialsetup(); servo.period_ms(20); while(1) { bufcheck = 0; com1.attach(interface,Serial::RxIrq); fire(); drive_mech(); seiyaho(); hold(); /*comUSB.printf("x %d,y %d,t %d,u %d,d %d,h %d,%d,s ,%d %d,%d,%d\r\n", act_data.data.x,act_data.data.y,act_data.data.t, act_data.data.au,act_data.data.ad,act_data.data.h,act_data.data.set, act_data.data.s,buf_data.data.vx,buf_data.data.vy,buf_data.data.vt);*/ } }