
code of robot bike
Dependencies: SDFileSystem mbed
Fork of Robot_Bicycle by
Diff: main.cpp
- Revision:
- 3:197b748a397a
- Parent:
- 2:ec30613f2b2b
- Child:
- 4:b0967990e390
--- a/main.cpp Tue Jun 21 18:47:22 2016 +0000 +++ b/main.cpp Wed Jun 22 04:35:18 2016 +0000 @@ -4,45 +4,79 @@ #include "SensorFusion.h" #include "SPI_9dSensor.h" #include "RobotBicycleConst.h" -/**************************** -Wiring Map +#include "ZTC.h" +//************************************************// +//**************** Wiring Map ********************// +//CK3 PC_10 | PC_11 MI3||re PC_9 | PC_8 rw +//MO3 PC_12 | PD_2 || |-----------------| +// 3.3V | E5V ||rs |PB_8 D15 | PC_6 |TX6 +// BOOT0 | GND ||ra |PB_9 D14 | PC_5 | +// |---------------| || |AVDD | U5V | +// |NC | NC | || |GND | NC | +// |NC | IOREF | ||rk |PA_5 D13 | PA_12|RX6 +// |PA_13 | NRST | || |PA_6 D12 | PA_11| rl +// |PA_14 | 3.3V | || |PA_7 D11 | PB_12| +// |PA_15 | 5.0V | ||rb |PB_6 D10 | NC | +// |GND | GND | || |PC_7 D9 | GND | +// |PB_7 | GND | ||lb |PA_9 D8 | PB_2 |CSG +// |PC_13 | VIN | || |-----------------| +// |---------------| || |-----------------| +// PC_14 | NC ||ll |PA_8 D7 | PB_1 |CSX +// |---------------| ||lk |PB_10 D6 | PB_15|MO2 +// |PC_15 | PA_0 A0| ||la |PB_4 D5 | PB_14|MI2 +// |PH_0 | PA_1 A1| ||ls |PB_5 D4 | PB_13|CK2 +// |PH_1 | PA_4 A2| ||le |PB_3 D3 | AGND | +// |VBAT | PB_0 A3| ||lw |PA_10 D2 | PC_4 | +// |PC_2 | PC_1 A4| ||TX2|PA_2 D1 | NC | +// |PC_3 | PC_0 A5| ||RX2|PA_3 D0 | NC | +// |---------------| || |-----------------| +//************************************************// -CK3 PC_10 | PC_11 MI3||re PC_9 | PC_8 rw -MO3 PC_12 | PD_2 || |-----------------| - 3.3V | E5V ||rs |PB_8 D15 | PC_6 |TX6 - BOOT0 | GND ||ra |PB_9 D14 | PC_5 | - |---------------| || |AVDD | U5V | - |NC | NC | || |GND | NC | - |NC | IOREF | ||rk |PA_5 D13 | PA_12|RX6 - |PA_13 | NRST | || |PA_6 D12 | PA_11| rl - |PA_14 | 3.3V | || |PA_7 D11 | PB_12| - |PA_15 | 5.0V | ||rb |PB_6 D10 | NC | - |GND | GND | || |PC_7 D9 | GND | - |PB_7 | GND | ||lb |PA_9 D8 | PB_2 |CSG - |PC_13 | VIN | || |-----------------| - |---------------| || |-----------------| - PC_14 | NC ||ll |PA_8 D7 | PB_1 |CSX - |---------------| ||lk |PB_10 D6 | PB_15|MO2 - |PC_15 | PA_0 A0| ||la |PB_4 D5 | PB_14|MI2 - |PH_0 | PA_1 A1| ||ls |PB_5 D4 | PB_13|CK2 - |PH_1 | PA_4 A2| ||le |PB_3 D3 | AGND | - |VBAT | PB_0 A3| ||lw |PA_10 D2 | PC_4 | - |PC_2 | PC_1 A4| ||TX2|PA_2 D1 | NC | - |PC_3 | PC_0 A5| ||RX2|PA_3 D0 | NC | - |---------------| || |-----------------| -****************************/ +#define IR_FILT_CONST 1.0f * 2.0f * 3.14159f / 250.0f + +#define CNT2ZTCm 250 +#define CNT2ZTCh 5 +#define CNT2STRT 1250 + AnalogIn analog_value(A5);//When using the ADC module, those pins connected to AnalogIn can't be used to output. Ticker timer1; Ticker timer2; Timeout timeout; -//Serial pc(D1, D0) declared in SPI_9dSensor.h Serial BT(PC_6, PA_12); SPI spi3(PC_12, PC_11, PC_10); -float meas, L_inver; +//**** Variables from Arduino ****// +int counter = 0; +int i = 0; +int8_t c = FIRST_POS; +bool s = 0; +int fusion_init = 0; +int state_count = 0; +uint8_t state_change = 0; +uint16_t brake_count = 0; +float V_meas = 0; +float L_inver = 0; +bool toggle = 0; +//********************************// + +//***** Variables from RasPi *****// +char BTCharR = 0; + +float Vx = 0.0; +float Vx_old = 0.0; + +unsigned char pedal_state = 0; +unsigned char sys_state = S_S; +unsigned int count2ztc_h = 0; +unsigned int count2ztc_m = 0; +unsigned int count2straight = 0; +unsigned int count_isr = 0; +float T_total = 0.0; +//********************************// + bool resetting = 0; void timer1_interrupt(void); @@ -64,24 +98,140 @@ spi3.format(8, 3); pc.printf("System ready.\r\n"); -// pc.printf("\nAnalogIn example\r\n"); + reset_pos(); + lookuptable_steering(HANDLE_START); - while(1) { -// pc.printf("measure: %f V,\t%f cm\r\n", meas, 1/L_inver); -// wait(0.1); // 200 ms + while(!interrupt) + { + if(BT.readable()) + { + BTCharR = BT.getc(); + switch(BTCharR) + { + case 's': lookuptable_pedaling(FIRST_POS); + lookuptable_steering(HANDLE_STRAIGHT); + wait(1.5f); + pedal_state = 1; sys_state = L_PD; gamma_ref = 0.0; + s = 1; break; ///start + case 'a': pedal_state = 0; sys_state = S_S; Vx = 0.0; Vx_old = 0.0; gamma_ref = 0.0; count2ztc_h = 0; count2ztc_m = 0; + s = 0; state_count = 0; break; ///stop +// case 'm': pedal_state = 2; sys_state = M_PD; gamma_ref = 0.0; if(count2ztc_m >= CNT2ZTCm){sys_state = M_ZTC;} break; +// case 'h': pedal_state = 3; sys_state = H_PD; gamma_ref = 0.0; if(count2ztc_h >= CNT2ZTCh){sys_state = H_ZTC;} break; + case 'l': gamma_ref = DLT_GAMMA_REF; roll_ref = 0.0; count2straight = 0; break; ///left + case 'r': gamma_ref = -DLT_GAMMA_REF; roll_ref = 0.0; count2straight = 0; break; ///right + case 'f': gamma_ref = 0.0; roll_ref = 0.0; break; ///forward + case 'c': gamma_ref = 0.0; reset_offset(); break; ///clear + default: break; + } + BTCharR = 0; + } + + L_inver = 0.0063f * V_meas - 0.005769f; } } void timer1_interrupt(void) { - meas = analog_value.read(); // Converts and read the analog input value (value from 0.0 to 1.0) - meas = meas * 3.3f; // Change the value to be in the 0 to 3300 range - L_inver = 0.0063f * meas - 0.005769f; + V_meas = (analog_value.read() * 3.3f) * IR_FILT_CONST + V_meas * (1.0f - IR_FILT_CONST); } void timer2_interrupt(void) { - ; + if(s == 1) // bluetooth start + { + i ++; + if(i == Z_PEDAL_DIVIDER && state_change == 0) //start + { + i = 0; + lookuptable_pedaling(c); + c++; + if(c == (FIRST_POS + TOT_STOP_POS)){c = FIRST_POS + TOT_STOP_POS + TOT_STOP_POS - 1;} + else if(c >= TOT_FOOT_POS){c = 0;} + state_count++; + } + else if(i == L_PEDAL_DIVIDER && state_change == 1) //low_v + { + i = 0; + lookuptable_pedaling(c); + c++; + if(c == FIRST_POS){c = FIRST_POS + TOT_STOP_POS;} + else if(c >= TOT_FOOT_POS){c = 0;} + state_count++; + } + else if(i == M_PEDAL_DIVIDER && state_change == 2) //mid_v + { + i = 0; + lookuptable_pedaling(c); + c++; + if(c == FIRST_POS){c = FIRST_POS + TOT_STOP_POS;} + else if(c >= TOT_FOOT_POS){c = 0;} + state_count++; + } + else if(i == M_PEDAL_DIVIDER && state_change == 3) //high_v + { + i = 0; + lookuptable_pedaling(c); + c++; + if(c == FIRST_POS){c = FIRST_POS + TOT_STOP_POS;} + else if(c >= TOT_FOOT_POS){c = 0;} + } + + if(state_count == COUN2_LOW_V) + { + state_change = 1; + } + else if(state_count == COUN2_MID_V) + { + state_change = 2; + } + else if(state_count == COUN2_HIGH_V) + { + if(state_change == 2) + { +// pc.printf("\nm"); + pedal_state = 2; + sys_state = M_PD; + gamma_ref = 0.0; + if(count2ztc_m >= CNT2ZTCm) + { + sys_state = M_ZTC; + } + } + state_change = 3; + } + } + else //s is 0 + { + if(c == FIRST_POS) + { + if(state_change > 0) + { + stop_pos(); + brake_count++; + if(brake_count >= 3*244) + { + state_change = 0; + brake_count = 0; + } + } + else + { + reset_pos(); + } + } + else + { + i++; + if(i == M_PEDAL_DIVIDER) + { + i = 0; + lookuptable_pedaling(c); + c++; + if(c > FIRST_POS && c < (FIRST_POS + TOT_STOP_POS)){c = FIRST_POS;} + else if(c >= TOT_FOOT_POS){c = 0;} + } + } + } } void reset_offset(void)