
test
Dependents: MouseHybridSenseCode
main.cpp
- Committer:
- JamieBignell
- Date:
- 2018-04-28
- Revision:
- 7:11dd5581c763
- Parent:
- 6:a652deaae134
File content as of revision 7:11dd5581c763:
#include <mbed.h> #include <funcdef.h> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Initialise Global Variables int sensorValue[] = {0,0,0,0,0,0,0,0}; int sensorMinValue[] = {0,0,0,0,0,0,0,0}; int sensorMaxValue[] = {0,0,0,0,0,0,0,0}; int sensorMinValue1[] = {0,0,0,0,0,0,0,0}; int sensorMaxValue1[] = {0,0,0,0,0,0,0,0}; int sensorMinValue2[] = {0,0,0,0,0,0,0,0}; int sensorMaxValue2[] = {0,0,0,0,0,0,0,0}; int sensorThreshold[] = {0,0,0,0,0,0,0,0}; int sensorErrorsdiscrete[] = {0,0,0,0,0,0,0,0}; float sensorErrors[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; float linearOffset[106][2]={ { 6.8275 , -26.0300 }, { 6.6497 , -25.4700 }, { 6.4960 , -24.9800 }, { 6.2632 , -24.4900 }, { 5.9921 , -23.9900 }, { 5.8196 , -23.4700 }, { 5.7159 , -22.9600 }, { 5.5201 , -22.4600 }, { 5.4829 , -22.0000 }, { 5.3919 , -21.4900 }, { 5.2843 , -20.9700 }, { 5.2686 , -20.4500 }, { 5.2052 , -19.9900 }, { 5.1198 , -19.5200 }, { 5.0410 , -19.0000 }, { 4.9476 , -18.4500 }, { 4.8565 , -18.0300 }, { 4.6842 , -17.5100 }, { 4.5375 , -16.9800 }, { 4.4060 , -16.4400 }, { 4.3064 , -16.0200 }, { 4.1894 , -15.4500 }, { 3.9800 , -14.9600 }, { 3.8762 , -14.5200 }, { 3.7609 , -13.9800 }, { 3.6261 , -13.4800 }, { 3.5013 , -13.0300 }, { 3.3357 , -12.4800 }, { 3.3057 , -12.0000 }, { 3.2587 , -11.4900 }, { 3.2009 , -11.0000 }, { 3.1255 , -10.4100 }, { 3.0409 , -9.9600 }, { 2.9758 , -9.4600 }, { 2.8237 , -9.0000 }, { 2.7329 , -8.4500 }, { 2.5944 , -7.9500 }, { 2.4453 , -7.4300 }, { 2.1612 , -6.9500 }, { 2.1333 , -6.5100 }, { 1.9384 , -6.0200 }, { 1.7274 , -5.4800 }, { 1.4727 , -4.9600 }, { 1.2838 , -4.4900 }, { 1.0132 , -3.9800 }, { 0.7237 , -3.3500 }, { 0.6065 , -3.0000 }, { 0.4716 , -2.4700 }, { 0.3420 , -1.9700 }, { 0.2302 , -1.4900 }, { 0.1598 , -0.9700 }, { 0.0632 , -0.4900 }, { -0.0137 , 0.0000 }, { -0.0542 , 0.4800 }, { -0.1547 , 1.0000 }, { -0.1795 , 1.4900 }, { -0.2608 , 1.9900 }, { -0.3267 , 2.5000 }, { -0.4297 , 2.9900 }, { -0.5448 , 3.5600 }, { -0.6416 , 4.0900 }, { -0.8621 , 4.5000 }, { -1.0357 , 5.0000 }, { -1.2421 , 5.4700 }, { -1.5076 , 6.0300 }, { -1.8054 , 6.5500 }, { -2.0865 , 7.0300 }, { -2.2763 , 7.4700 }, { -2.5454 , 8.0000 }, { -2.7537 , 8.5600 }, { -2.8835 , 8.9900 }, { -3.0262 , 9.5000 }, { -3.2092 , 10.0000 }, { -3.3651 , 10.5600 }, { -3.4420 , 10.9900 }, { -3.5348 , 11.5000 }, { -3.5697 , 11.9900 }, { -3.6499 , 12.5300 }, { -3.7035 , 13.0000 }, { -3.7264 , 13.4700 }, { -3.8294 , 14.0100 }, { -3.9171 , 14.5100 }, { -4.0666 , 15.1100 }, { -4.1025 , 15.4700 }, { -4.3145 , 16.0300 }, { -4.4127 , 16.4800 }, { -4.5864 , 17.0500 }, { -4.6950 , 17.4700 }, { -4.8164 , 18.0300 }, { -4.9033 , 18.5300 }, { -5.0180 , 19.0200 }, { -5.1011 , 19.5400 }, { -5.2195 , 20.0200 }, { -5.3131 , 20.4700 }, { -5.3823 , 21.0200 }, { -5.4816 , 21.5200 }, { -5.5606 , 21.9800 }, { -5.6365 , 22.5000 }, { -5.7055 , 23.0900 }, { -5.7591 , 23.4700 }, { -5.9464 , 23.9900 }, { -6.1486 , 24.5400 }, { -6.3176 , 25.0000 }, { -6.4417 , 25.5000 }, { -6.6916 , 25.9800 }, { -6.9624 , 26.5600 }}; float motorLookup[11][2]={ { 0.000 , 0.000 }, { 20.000 , 100.000 }, { 300.000 , 200.000 }, { 520.000 , 300.000 }, { 660.000 , 400.000 }, { 750.000 , 500.000 }, { 820.000 , 600.000 }, { 860.000 , 700.000 }, { 920.000 , 800.000 }, { 940.000 , 900.000 }, { 1000.000, 1000.000}}; float Prop=0; float Inte=0; float Dere=0; float errorVar=0; float largestpositiveerrorvar=0; float largestnegativeerrorvar=0; int errorVardiscrete=0; int previousErrordiscrete=0; float previousError=0; float PIDs=0; int newPIDs=0; int accumulator=0; bool stopMotors=false; int leftMotorValTemp=0; int rightMotorValTemp=0; int initialMotorspeed = 550;//IF THIS IS CHANGED, CHANGE IT IN TICKER int errorDetectthres=100;//IF THIS IS CHANGED, CHANGE IT IN BLACK ENDGE DETECTION Ticker ticker1; Ticker ticker2; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Main Code void tracker() { //IF THE ERROR IS EQUAL TO THE LAST ERROR, START A COUNTING VARIABLE AND ADD THIS TO THE NOMINAL MOTOR SPEED (IE WHEN ERROR OF 0), IF CASE NOT TRUE, DO NOTHING/RETURN TO NORMAL SPEED FOR CORNER. if (abs(PIDs)<=errorDetectthres) { accumulator++; LEDVal=1; } else { accumulator=0; errorDetectthres=65; LEDVal=0; } if (accumulator>=14) { initialMotorspeed = 975; } else if (accumulator>=12) { initialMotorspeed = 975; errorDetectthres=300; } else if (accumulator>=10) { initialMotorspeed = 950; } else if (accumulator>=8) { initialMotorspeed = 900; errorDetectthres=150; } else if (accumulator>=6) { initialMotorspeed = 600; errorDetectthres=125; } else if (accumulator>=4) { initialMotorspeed = 550; } else if (accumulator>=2) { initialMotorspeed = 550; } else { initialMotorspeed = 550; } } void calculations() { //USE ERROR TO CALCULATE PID VALUES Prop = errorVar; Inte = Inte + errorVar; Dere = ((errorVar) - (previousError)); //BECAUSE THE CURRENT ERROR IS CALCULATED IN A FUNCTION BEFORE THIS, ON THE NEXT ITERATION WE WANT TO REMEMBER THE PREVIOUS VARIABLE previousError=errorVar; previousErrordiscrete=errorVardiscrete; //FORMULATE OFFSET VALUE FROM ERROR, PID VALUES AND CONSTANTS PIDs = (Kp*Prop)+(Kd*Dere)+(Ki*Inte); newPIDs=PIDs; } int main() { //CONFIGURE MOTORS & TURN OFF LED LEDVal=0; leftMotorVal.period_us(1000); rightMotorVal.period_us(1000); leftMotorVal.pulsewidth_us(0); rightMotorVal.pulsewidth_us(0); wait_ms(1000); //TURN LED ON LEDVal=1; //BEGIN CALIBRATION CalibrateFunc(); //TURN OFF LED AND SET PULSES TO 2 HZ LEDVal=0; //FIND LINE findLineFunc(); //ONCE FOUND, HAND OVER TO MAIN ALGORITHM ticker1.attach(&tracker, 0.2); ticker2.attach(&calculations, 0.002); while(1) { senseFunc(); CountingVar=!CountingVar; //calculateFunc(); driveFunc(); } return 0; }