anybaro_
Dependencies: mbed
main.cpp
- Committer:
- Bhoney
- Date:
- 2019-08-22
- Revision:
- 19:67584cb64b9c
- Parent:
- 15:e5e34512a00e
File content as of revision 19:67584cb64b9c:
#include "mbed.h" #include "MotorControl.h" #include "ForceRead.h" #define QUALIFYING_MODE Serial bt(PA_2,PA_3); // USART1 Bluetooth (Tx, Rx) // Serial pc(PA_2,PA_3); // USART2 pc (Tx, Rx) //Serial pc(USBTX,USBRX); // USART2 pc (Tx, Rx) InterruptIn up(PC_8); // Button Interrupt Motor control InterruptIn down(PC_9); InterruptIn bt_ml(PC_10); // Millking action button InterruptIn nFault(PB_15); // Motor Driver DRV DigitalOut led(PA_5); // Operating LED signal AnalogIn disSensor(PA_7); // Distance Sensor Timeout ResetTimer; // Reset angle 0 position #ifdef QUALIFYING_MODE Timer Qtimer; // timer for qualifying test int Qtime; // Qtime stores result from Qtimer bool Qflag; // Qflag rises when result is stored #endif DigitalOut enable(PB_12); DigitalOut nreset(PC_6); PwmOut p1(PB_13); PwmOut p2(PB_14); Ticker timer0; Ticker timer1; // Control Angle By Using Distance Sensor Ticker timer2; // Force Sensor Ticker timer3; // Millking Action Mode //Ticker timer4; /*----------------------- Global Variables ------------------------*/ char rxData[7]; bool flagRx = 0; int targetDis; // Target Of Distance int milLoop; // Number of Millking Action int onewayNum=0; // Counting Turning Point int sysStatus=0; bool mkOn = 0; bool nFaultFlag = true; float parA = 73.671f; float parB = -1*206.25f; float parC = 106.43f; /*----------------------- Callback Function Prototypes ------------------------*/ void nFaultLow(); void nFaultHigh(); void ButtonSys(); void ManualMk(); void OperateLED(); void ModeSelect(int mode); void ReadAng(); void stop(); void ReadData(); void Test(); /*----------------------- Main function ------------------------*/ int main() { bt.baud(115200); // pc.baud(115200); #ifdef QUALIFYING_MODE bt.puts("START 190822 Q_MODE\r\n"); #else bt.puts("START 190822 Ver.9\r\n"); #endif // pc.puts("START 190703 Ver.9\r\n"); int modeNum = 0; int modeMotor = 0; char tmpCommand[4]={0,}; // [ADD] command int rxVal; nFault.mode(PullUp); nFault.fall(&nFaultLow); nFault.rise(&nFaultHigh); up.mode(PullNone); down.mode(PullNone); bt_ml.mode(PullNone); // [ADD] Setup Millking Action Manual Button up.fall(&ButtonSys); up.rise(&ButtonSys); down.fall(&ButtonSys); down.rise(&ButtonSys); bt_ml.fall(&ManualMk); // [ADD] Interrupt Millking Action Manual Button timer0.attach(&OperateLED,0.2); // timer4.attach(&Test,0.1); bt.attach(&ReadData, Serial::RxIrq); while(1) { #ifdef QUALIFYING_MODE if(Qflag){ Qflag = false; bt.printf("%dus from btn to motor output\r\n",Qtime); } #endif if(!nFaultFlag) { enable = 0; nreset = 0; p1=0; p2=0; wait(0.01f); } if (1 == flagRx) { flagRx = 0; tmpCommand[0] = rxData[0]; tmpCommand[1] = rxData[1]; tmpCommand[2] = rxData[2]; rxVal = atoi(rxData+3); if (0 == strcmp(tmpCommand,"MOD")) { bt.puts("<MOD>\r\n"); modeNum = rxVal; // 1 ~ 6 sysStatus = rxVal; // Why this value are assigned directly? // assigning sys variable after checking condition is correct progress, i think. ModeSelect(modeNum); } else if (0 == strcmp(tmpCommand,"MOT")) { bt.puts("<MOT>\r\n"); modeMotor = rxVal; MotorTest(modeMotor); } else if (0 == strcmp(tmpCommand,"POS")) { bt.puts("<POS>\r\n"); targetDis = rxVal; timer1.attach(&ControlAng,0.01); } if (0 == strcmp(tmpCommand,"MIL")) { bt.puts("<MIL>\r\n"); sysStatus = 5; targetDis = atoi(rxData+5); // [ADD] return 2 characters in the back of 4 characters milLoop = 0.01*(atoi(rxData+3)-atoi(rxData+5)); // [ADD] return 2 cahracters in the front of 4 characters timer3.attach(&MkAction,0.1); if ( 0 == mkOn) mkOn = 1; } } } } /*----------------------- Callback Functions ------------------------*/ void Test() { float d1 = disSensor.read(); float d2 = parA*d1*d1+parB*d1+parC; bt.printf("%1.3f\n",d2); } void ReadData() { char inChar; static char rxCount = 0; static char rxBuf[7]; while(1 == bt.readable()) { inChar = bt.getc(); bt.putc(inChar); if('<' == inChar) { rxCount = 1; } else if (rxCount > 0 && rxCount <8) { rxBuf[rxCount-1] = inChar; rxCount++; } else if ( 8 == rxCount && '>' == inChar) { rxCount = 0; flagRx = 1; memcpy(rxData, rxBuf, 7); } else{ rxCount = 0; flagRx = 0; } } } void stop() { MotorTest(0); } void ReadAng() { float d1 = disSensor.read(); float d2 = parA*d1*d1+parB*d1+parC; bt.printf("<DIO%1.2f>",d2); } void ModeSelect(int mode) { switch(mode) { case 0 : //Standard Mode timer1.detach(); timer2.detach(); timer3.detach(); break; case 1 : //Reset Mode { timer3.detach(); timer2.detach(); timer1.detach(); onewayNum = 0; milLoop = 0; float d1 = disSensor.read(); float d2 = parA*d1*d1+parB*d1+parC; MotorTest(2); ResetTimer.attach(&stop,0.5f+d2/3.0f); break; } case 2 : //Read Force timer2.attach(&ReadForce,0.05); break; case 3 : //Read Angle timer2.detach(); ReadAng(); // return only one message break; case 4 : //Pause Temporarily MotorTest(0); break; } } void OperateLED() { led =!led; } void ManualMk() { if( 1 == sysStatus | 2 == sysStatus) { bt.puts("Please Wait Moving Anybaro"); //<STA> } else { sysStatus = 6; MkActionManual(); } } void ButtonSys() { #ifdef QUALIFYING_MODE Qtimer.reset(); Qtimer.start(); Qflag = false; #endif if( 1 == sysStatus | 2 == sysStatus) { bt.puts("Please Wait Moving Anybaro"); //<STA> 또는 ifdef debug 처리? } else { MotorButton(); } } void nFaultHigh(){ nFaultFlag = true; } void nFaultLow(){ nFaultFlag = false; } //---------------------- end -------------