Ian Colwell / Mbed 2 deprecated RoboticsProject

Dependencies:   mbed-rtos mbed

Fork of Project by Thomas Elliott

Committer:
IanTheMBEDMaster
Date:
Sat Apr 13 21:42:56 2013 +0000
Revision:
24:f4f933d9194b
Parent:
23:806c9b8af77c
Finished up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanTheMBEDMaster 2:1c5cc180812d 1 // Robot Control Code
IanTheMBEDMaster 2:1c5cc180812d 2 // Tom Elliott and Ian Colwell
IanTheMBEDMaster 2:1c5cc180812d 3
IanTheMBEDMaster 14:669f2f1566b0 4 /* TODO on a sunny day
IanTheMBEDMaster 14:669f2f1566b0 5 - reduce the amount of global variables
IanTheMBEDMaster 14:669f2f1566b0 6 - try increasing bluetooth buad rate
IanTheMBEDMaster 14:669f2f1566b0 7 */
IanTheMBEDMaster 2:1c5cc180812d 8
LtBarbershop 1:3a40c918ff41 9 #include "mbed.h"
LtBarbershop 1:3a40c918ff41 10 #include "rtos.h"
LtBarbershop 1:3a40c918ff41 11
LtBarbershop 13:aaac0105a486 12 extern "C" void mbed_reset();
LtBarbershop 13:aaac0105a486 13
IanTheMBEDMaster 2:1c5cc180812d 14 // --- Constants
IanTheMBEDMaster 2:1c5cc180812d 15 #define Dummy 0
IanTheMBEDMaster 6:5200ce9fa5a7 16
IanTheMBEDMaster 7:751d5e3e9cab 17 //#define PWMPeriod 0.0005 // orignally 0.001 (gave a high pitched whine)
IanTheMBEDMaster 7:751d5e3e9cab 18 const float PWMPeriod = 0.00005;
LtBarbershop 5:7108ac9e8182 19 // Control Update = 50ms (time should be 609/610) (if we want to change this we also have to change the way feedback speed is calculated)
IanTheMBEDMaster 6:5200ce9fa5a7 20 //#define ControlUpdate 0.05
LtBarbershop 21:c5713aafdc9d 21 const float ControlUpdate = 0.04;
LtBarbershop 4:03bf5bdca9fb 22 #define EncoderTime 610
LtBarbershop 5:7108ac9e8182 23
LtBarbershop 1:3a40c918ff41 24
IanTheMBEDMaster 2:1c5cc180812d 25 // --- Function prototypes
LtBarbershop 1:3a40c918ff41 26 void PiControllerISR(void);
LtBarbershop 1:3a40c918ff41 27 void WdtFaultISR(void);
LtBarbershop 1:3a40c918ff41 28 void ExtCollisionISR(void);
LtBarbershop 1:3a40c918ff41 29 void PiControlThread(void const *argument);
LtBarbershop 1:3a40c918ff41 30 void ExtCollisionThread(void const *argument);
LtBarbershop 1:3a40c918ff41 31 void Watchdog(void const *n);
IanTheMBEDMaster 2:1c5cc180812d 32 void InitializeSystem();
IanTheMBEDMaster 2:1c5cc180812d 33 void InitializeEncoder();
IanTheMBEDMaster 2:1c5cc180812d 34 void InitializePWM();
IanTheMBEDMaster 2:1c5cc180812d 35 void PwmSetOut(float d, float T);
IanTheMBEDMaster 7:751d5e3e9cab 36 void GetSpeeds();
IanTheMBEDMaster 2:1c5cc180812d 37 void SetLeftMotorSpeed(float u);
IanTheMBEDMaster 2:1c5cc180812d 38 void SetRightMotorSpeed(float u);
LtBarbershop 11:521c3e8e6491 39 void DisplayMenu();
LtBarbershop 11:521c3e8e6491 40 void Ramp(float speed, unsigned int time, unsigned short motor);
LtBarbershop 11:521c3e8e6491 41 void IRChecker();
LtBarbershop 10:a3ecedc8d9d7 42 void BTInit();
LtBarbershop 1:3a40c918ff41 43
IanTheMBEDMaster 6:5200ce9fa5a7 44 // Global variables
LtBarbershop 5:7108ac9e8182 45 float u1 = 0;
LtBarbershop 5:7108ac9e8182 46 float u2 = 0;
IanTheMBEDMaster 7:751d5e3e9cab 47 float cSetL = 0;
IanTheMBEDMaster 7:751d5e3e9cab 48 float cSetR = 0;
LtBarbershop 5:7108ac9e8182 49 float userSetL = 0;
LtBarbershop 5:7108ac9e8182 50 float userSetR = 0;
LtBarbershop 4:03bf5bdca9fb 51 int startup = 0;
LtBarbershop 4:03bf5bdca9fb 52 float aeL = 0;
LtBarbershop 4:03bf5bdca9fb 53 float aeR = 0;
LtBarbershop 23:806c9b8af77c 54 float RecV[200]; // Record Feedback Speed
LtBarbershop 23:806c9b8af77c 55 float RecU[200]; // Record Motor Input
LtBarbershop 23:806c9b8af77c 56 float RecX[200]; // Record Integrator Output
LtBarbershop 23:806c9b8af77c 57 float RecE[200]; // Record Error
LtBarbershop 8:d65cba3bfc0e 58 int RecCount = 0; // Record Counter
LtBarbershop 11:521c3e8e6491 59 unsigned short action;
LtBarbershop 13:aaac0105a486 60 float DF = 0;
LtBarbershop 13:aaac0105a486 61 float DR = 0;
LtBarbershop 13:aaac0105a486 62 float TSpeedL = 0;
LtBarbershop 13:aaac0105a486 63 float TSpeedR = 0;
LtBarbershop 23:806c9b8af77c 64 float Turn = 0.1;
IanTheMBEDMaster 14:669f2f1566b0 65 float aeW = 0;
IanTheMBEDMaster 17:bc13550f673b 66 float eW = 0;
IanTheMBEDMaster 17:bc13550f673b 67 float uW = 0;
IanTheMBEDMaster 17:bc13550f673b 68 float prevuW = 0;
IanTheMBEDMaster 19:b9c4952f4acc 69
IanTheMBEDMaster 19:b9c4952f4acc 70 float Nominal = 35;
IanTheMBEDMaster 19:b9c4952f4acc 71 float Kpos = 0.01;
LtBarbershop 23:806c9b8af77c 72 float Kor = 0.01;
LtBarbershop 23:806c9b8af77c 73 float KpW = 0.3;
LtBarbershop 21:c5713aafdc9d 74 float KiW = 0.0;
LtBarbershop 23:806c9b8af77c 75 int autoSpeed = -1;
IanTheMBEDMaster 14:669f2f1566b0 76
IanTheMBEDMaster 6:5200ce9fa5a7 77 Mutex Var_Lock;
IanTheMBEDMaster 6:5200ce9fa5a7 78
IanTheMBEDMaster 6:5200ce9fa5a7 79 // global variables to eventually be removed
IanTheMBEDMaster 7:751d5e3e9cab 80 short dPositionLeft, dTimeLeft, dPositionRight, dTimeRight;
IanTheMBEDMaster 6:5200ce9fa5a7 81 float fbSpeedL, fbSpeedR;
LtBarbershop 5:7108ac9e8182 82 float eL = 0;
LtBarbershop 5:7108ac9e8182 83 float eR = 0;
IanTheMBEDMaster 2:1c5cc180812d 84
IanTheMBEDMaster 2:1c5cc180812d 85 // --- Processes and threads
LtBarbershop 1:3a40c918ff41 86 int32_t SignalPi, SignalWdt, SignalExtCollision;
LtBarbershop 1:3a40c918ff41 87 osThreadId PiControl,WdtFault,ExtCollision;
LtBarbershop 1:3a40c918ff41 88 osThreadDef(PiControlThread, osPriorityNormal, DEFAULT_STACK_SIZE);
LtBarbershop 1:3a40c918ff41 89 osThreadDef(ExtCollisionThread, osPriorityNormal, DEFAULT_STACK_SIZE);
LtBarbershop 1:3a40c918ff41 90 osTimerDef(Wdtimer, Watchdog);
LtBarbershop 1:3a40c918ff41 91
IanTheMBEDMaster 2:1c5cc180812d 92 /* PIN-OUT
IanTheMBEDMaster 2:1c5cc180812d 93
IanTheMBEDMaster 2:1c5cc180812d 94 MOSI Quad Enc 5|-|
IanTheMBEDMaster 2:1c5cc180812d 95 MISO Quad Enc 6|-|
IanTheMBEDMaster 2:1c5cc180812d 96 SCK Quad Enc 7|-|
IanTheMBEDMaster 2:1c5cc180812d 97 SPI Start Quad E 8|-|
IanTheMBEDMaster 2:1c5cc180812d 98 SPI Reset Quad E 9|-|
IanTheMBEDMaster 12:3058f9fb09eb 99 Emergency Stop 10|-|
IanTheMBEDMaster 2:1c5cc180812d 100 Bluetooth tx 13|-|28
IanTheMBEDMaster 2:1c5cc180812d 101 Bluetooth rx 14|-|27
LtBarbershop 4:03bf5bdca9fb 102 15|-|26 Brake, Left Motor, M1
LtBarbershop 4:03bf5bdca9fb 103 16|-|25 Dir, Left Motor, M1
LtBarbershop 4:03bf5bdca9fb 104 17|-|24 PWM, Left Motor, M1
LtBarbershop 4:03bf5bdca9fb 105 18|-|23 Brake, Right Motor, M2
LtBarbershop 9:0eb7b173d6c3 106 Front IR 19|-|22 Dir, Right Motor, M2
LtBarbershop 9:0eb7b173d6c3 107 Rear IR 20|-|21 PWM, Right Motor, M2
IanTheMBEDMaster 2:1c5cc180812d 108 */
IanTheMBEDMaster 2:1c5cc180812d 109
IanTheMBEDMaster 2:1c5cc180812d 110 // --- IO Port Configuration
LtBarbershop 1:3a40c918ff41 111 DigitalOut led1(LED1);
LtBarbershop 1:3a40c918ff41 112 DigitalOut led2(LED2);
LtBarbershop 1:3a40c918ff41 113 DigitalOut led3(LED3);
LtBarbershop 1:3a40c918ff41 114 DigitalOut led4(LED4);
LtBarbershop 8:d65cba3bfc0e 115 DigitalOut dirR(p22);
LtBarbershop 8:d65cba3bfc0e 116 DigitalOut brakeR(p23);
LtBarbershop 8:d65cba3bfc0e 117 PwmOut PwmR(p21);
LtBarbershop 8:d65cba3bfc0e 118 DigitalOut dirL(p25);
LtBarbershop 8:d65cba3bfc0e 119 DigitalOut brakeL(p26);
LtBarbershop 8:d65cba3bfc0e 120 PwmOut PwmL(p24);
LtBarbershop 10:a3ecedc8d9d7 121 Serial BtS(p13, p14); // (tx, rx) for PC serial channel
LtBarbershop 1:3a40c918ff41 122 Serial pc(USBTX, USBRX); // (tx, rx) for Parani/Promi Bluetooth serial channel
IanTheMBEDMaster 2:1c5cc180812d 123 SPI DE0(p5, p6, p7); // (mosi, miso, sclk) DE0 is the SPI channel with the DE0 FPGA
IanTheMBEDMaster 2:1c5cc180812d 124 DigitalOut SpiReset(p9); // Reset for all devices within the slave SPI peripheral in the DE0 FPGA
IanTheMBEDMaster 2:1c5cc180812d 125 DigitalOut SpiStart(p8); // Places SPI interace on the DE0 FPGA into control mode
LtBarbershop 18:4b3ad79d1068 126 //InterruptIn EmerStop(p10); // External interrupt pin
LtBarbershop 9:0eb7b173d6c3 127 AnalogIn IRFront(p19); // Front IR Ranger Input
LtBarbershop 9:0eb7b173d6c3 128 AnalogIn IRRear(p20); // Rear IR Ranger Input
LtBarbershop 1:3a40c918ff41 129 Ticker PeriodicInt;
LtBarbershop 18:4b3ad79d1068 130 DigitalIn EmergencyStop(p10);
LtBarbershop 1:3a40c918ff41 131
LtBarbershop 1:3a40c918ff41 132 // ******** Main Thread ********
IanTheMBEDMaster 2:1c5cc180812d 133 int main()
IanTheMBEDMaster 2:1c5cc180812d 134 {
LtBarbershop 11:521c3e8e6491 135 char c;
LtBarbershop 11:521c3e8e6491 136
LtBarbershop 11:521c3e8e6491 137 InitializeSystem();
LtBarbershop 11:521c3e8e6491 138 BtS.printf("\r\n --- Robot Initialization Complete --- \r\n");
IanTheMBEDMaster 14:669f2f1566b0 139 pc.printf("\r\n --- Robot Initialization Complete --- \r\n");
LtBarbershop 11:521c3e8e6491 140 DisplayMenu();
LtBarbershop 11:521c3e8e6491 141
LtBarbershop 11:521c3e8e6491 142 //BtS.printf("\n\n\rTap w-a-s-d keys for differential speed control: ");
LtBarbershop 11:521c3e8e6491 143 while(1)
LtBarbershop 11:521c3e8e6491 144 {
LtBarbershop 11:521c3e8e6491 145 if(BtS.readable())
LtBarbershop 11:521c3e8e6491 146 {
LtBarbershop 11:521c3e8e6491 147 c = BtS.getc();
LtBarbershop 11:521c3e8e6491 148
LtBarbershop 11:521c3e8e6491 149 // quit
LtBarbershop 11:521c3e8e6491 150 if (c == 'q')
LtBarbershop 11:521c3e8e6491 151 {
LtBarbershop 11:521c3e8e6491 152 action = 0;
LtBarbershop 18:4b3ad79d1068 153 // erase errors
LtBarbershop 18:4b3ad79d1068 154 aeW = 0;
LtBarbershop 18:4b3ad79d1068 155 eW = 0;
LtBarbershop 18:4b3ad79d1068 156 aeL = 0;
LtBarbershop 18:4b3ad79d1068 157 aeR = 0;
LtBarbershop 18:4b3ad79d1068 158 Ramp(0, 800, 0);
LtBarbershop 11:521c3e8e6491 159 DisplayMenu();
LtBarbershop 11:521c3e8e6491 160 continue;
LtBarbershop 11:521c3e8e6491 161 }
LtBarbershop 11:521c3e8e6491 162
LtBarbershop 11:521c3e8e6491 163 if (action == 0)
LtBarbershop 11:521c3e8e6491 164 {
LtBarbershop 11:521c3e8e6491 165 // choose a menu selection
LtBarbershop 11:521c3e8e6491 166 switch(c)
LtBarbershop 11:521c3e8e6491 167 {
LtBarbershop 11:521c3e8e6491 168 case 'd':
LtBarbershop 11:521c3e8e6491 169 action = 1;
IanTheMBEDMaster 12:3058f9fb09eb 170 BtS.printf("\n\rTap w-a-s-d keys for differential speed control\r\nPress 'q' to quit \r\n");
LtBarbershop 11:521c3e8e6491 171 break;
LtBarbershop 11:521c3e8e6491 172 case 'w':
LtBarbershop 13:aaac0105a486 173 BtS.printf("\n\r Welcome to Wall Following, use w-s to control robot speed");
LtBarbershop 13:aaac0105a486 174 BtS.printf("\n\r Use a-d to increase/decrease turning radius");
LtBarbershop 18:4b3ad79d1068 175 BtS.printf("\n\r Use < and > to increase/decrease wall distance");
LtBarbershop 23:806c9b8af77c 176 userSetL = 0.2;
LtBarbershop 23:806c9b8af77c 177 userSetR = 0.2;
LtBarbershop 23:806c9b8af77c 178 TSpeedL = 0.2;
LtBarbershop 23:806c9b8af77c 179 TSpeedR = 0.2;
LtBarbershop 11:521c3e8e6491 180 action = 2;
LtBarbershop 11:521c3e8e6491 181 break;
LtBarbershop 11:521c3e8e6491 182 case '0':
LtBarbershop 11:521c3e8e6491 183 action = 3;
LtBarbershop 11:521c3e8e6491 184 break;
IanTheMBEDMaster 17:bc13550f673b 185 case 'r':
IanTheMBEDMaster 17:bc13550f673b 186 action = 4;
LtBarbershop 21:c5713aafdc9d 187 userSetL = 0.2;
LtBarbershop 21:c5713aafdc9d 188 userSetR = 0.2;
IanTheMBEDMaster 17:bc13550f673b 189 break;
LtBarbershop 11:521c3e8e6491 190 default:
IanTheMBEDMaster 12:3058f9fb09eb 191 BtS.printf("\n\r Command not recognized \n\r");
LtBarbershop 11:521c3e8e6491 192 action = 0;
LtBarbershop 11:521c3e8e6491 193 break;
LtBarbershop 11:521c3e8e6491 194 }
LtBarbershop 11:521c3e8e6491 195 continue;
LtBarbershop 11:521c3e8e6491 196 }
LtBarbershop 11:521c3e8e6491 197
LtBarbershop 11:521c3e8e6491 198 if (action == 1)
LtBarbershop 11:521c3e8e6491 199 {
LtBarbershop 11:521c3e8e6491 200 // keyboard input to drive robot using wasd
LtBarbershop 11:521c3e8e6491 201 switch(c)
LtBarbershop 11:521c3e8e6491 202 {
LtBarbershop 11:521c3e8e6491 203 case('w'):
LtBarbershop 23:806c9b8af77c 204 userSetL = userSetL + 0.1;
LtBarbershop 23:806c9b8af77c 205 userSetR = userSetR + 0.1;
LtBarbershop 11:521c3e8e6491 206 break;
LtBarbershop 11:521c3e8e6491 207 case('s'):
LtBarbershop 23:806c9b8af77c 208 userSetL = userSetL - 0.1;
LtBarbershop 23:806c9b8af77c 209 userSetR = userSetR - 0.1;
LtBarbershop 11:521c3e8e6491 210 break;
LtBarbershop 11:521c3e8e6491 211 case('a'):
IanTheMBEDMaster 22:3cda0d788452 212 userSetL = userSetL - 0.04;
IanTheMBEDMaster 22:3cda0d788452 213 userSetR = userSetR + 0.04;
LtBarbershop 11:521c3e8e6491 214 break;
LtBarbershop 11:521c3e8e6491 215 case('d'):
IanTheMBEDMaster 22:3cda0d788452 216 userSetL = userSetL + 0.04;
IanTheMBEDMaster 22:3cda0d788452 217 userSetR = userSetR - 0.04;
IanTheMBEDMaster 22:3cda0d788452 218 break;
IanTheMBEDMaster 22:3cda0d788452 219 case('e'):
LtBarbershop 23:806c9b8af77c 220 Ramp(0.5, 500, 0);
IanTheMBEDMaster 22:3cda0d788452 221 break;
IanTheMBEDMaster 22:3cda0d788452 222 case('r'):
IanTheMBEDMaster 22:3cda0d788452 223 Ramp(0, 500, 0);
IanTheMBEDMaster 22:3cda0d788452 224 break;
IanTheMBEDMaster 22:3cda0d788452 225 }
IanTheMBEDMaster 22:3cda0d788452 226 if (userSetL > 0.5)
IanTheMBEDMaster 22:3cda0d788452 227 {
IanTheMBEDMaster 22:3cda0d788452 228 userSetL = 0.5;
LtBarbershop 11:521c3e8e6491 229 }
IanTheMBEDMaster 22:3cda0d788452 230 if (userSetL < -0.5)
IanTheMBEDMaster 22:3cda0d788452 231 {
IanTheMBEDMaster 22:3cda0d788452 232 userSetL = -0.5;
IanTheMBEDMaster 22:3cda0d788452 233 }
IanTheMBEDMaster 22:3cda0d788452 234 if (userSetR > 0.5)
IanTheMBEDMaster 22:3cda0d788452 235 {
IanTheMBEDMaster 22:3cda0d788452 236 userSetR = 0.5;
IanTheMBEDMaster 22:3cda0d788452 237 }
IanTheMBEDMaster 22:3cda0d788452 238 if (userSetR < -0.5)
IanTheMBEDMaster 22:3cda0d788452 239 {
IanTheMBEDMaster 22:3cda0d788452 240 userSetR = -0.5;
IanTheMBEDMaster 22:3cda0d788452 241 }
IanTheMBEDMaster 22:3cda0d788452 242
IanTheMBEDMaster 12:3058f9fb09eb 243 continue;
LtBarbershop 11:521c3e8e6491 244 }
LtBarbershop 11:521c3e8e6491 245
LtBarbershop 11:521c3e8e6491 246 if (action == 2)
LtBarbershop 11:521c3e8e6491 247 {
LtBarbershop 11:521c3e8e6491 248 // keyboard input to wall following
LtBarbershop 13:aaac0105a486 249 switch(c)
LtBarbershop 13:aaac0105a486 250 {
LtBarbershop 13:aaac0105a486 251 case('w'):
LtBarbershop 13:aaac0105a486 252 TSpeedL = TSpeedL + 0.05;
LtBarbershop 13:aaac0105a486 253 TSpeedR = TSpeedR + 0.05;
LtBarbershop 13:aaac0105a486 254 break;
LtBarbershop 13:aaac0105a486 255 case('s'):
LtBarbershop 13:aaac0105a486 256 TSpeedL = TSpeedL - 0.05;
LtBarbershop 13:aaac0105a486 257 TSpeedR = TSpeedR - 0.05;
LtBarbershop 13:aaac0105a486 258 break;
LtBarbershop 13:aaac0105a486 259 case('a'):
LtBarbershop 23:806c9b8af77c 260 Turn = Turn + 0.01;
LtBarbershop 13:aaac0105a486 261 break;
LtBarbershop 13:aaac0105a486 262 case('d'):
LtBarbershop 23:806c9b8af77c 263 Turn = Turn - 0.01;
LtBarbershop 18:4b3ad79d1068 264 break;
LtBarbershop 18:4b3ad79d1068 265 case(','):
IanTheMBEDMaster 22:3cda0d788452 266 Nominal = Nominal - 2.5;
LtBarbershop 18:4b3ad79d1068 267 break;
LtBarbershop 18:4b3ad79d1068 268 case('.'):
IanTheMBEDMaster 22:3cda0d788452 269 Nominal = Nominal + 2.5;
IanTheMBEDMaster 19:b9c4952f4acc 270 break;
LtBarbershop 23:806c9b8af77c 271 case('g'):
LtBarbershop 23:806c9b8af77c 272 autoSpeed = autoSpeed * -1;
LtBarbershop 23:806c9b8af77c 273 break;
IanTheMBEDMaster 19:b9c4952f4acc 274 case('n'):
IanTheMBEDMaster 19:b9c4952f4acc 275 BtS.printf("\n\r Current constants: Ki %.3f:, Kp: %.3f, Kor: %.3f, Kpos: %.3f \n\r Select the constant you wish to change:", KiW, KpW, Kor, Kpos);
IanTheMBEDMaster 19:b9c4952f4acc 276 char k;
IanTheMBEDMaster 19:b9c4952f4acc 277 float newConst;
IanTheMBEDMaster 19:b9c4952f4acc 278 while (1)
IanTheMBEDMaster 19:b9c4952f4acc 279 {
IanTheMBEDMaster 19:b9c4952f4acc 280 if (BtS.readable())
IanTheMBEDMaster 19:b9c4952f4acc 281 {
IanTheMBEDMaster 19:b9c4952f4acc 282 k = BtS.getc();
IanTheMBEDMaster 19:b9c4952f4acc 283 if (k == '1')
IanTheMBEDMaster 19:b9c4952f4acc 284 {
IanTheMBEDMaster 19:b9c4952f4acc 285 BtS.scanf("%f", &newConst);
IanTheMBEDMaster 19:b9c4952f4acc 286 KiW = newConst;
IanTheMBEDMaster 19:b9c4952f4acc 287 break;
IanTheMBEDMaster 19:b9c4952f4acc 288 }
IanTheMBEDMaster 19:b9c4952f4acc 289 if (k == '2')
IanTheMBEDMaster 19:b9c4952f4acc 290 {
IanTheMBEDMaster 19:b9c4952f4acc 291 BtS.scanf("%f", &newConst);
IanTheMBEDMaster 19:b9c4952f4acc 292 KpW = newConst;
IanTheMBEDMaster 19:b9c4952f4acc 293 break;
IanTheMBEDMaster 19:b9c4952f4acc 294 }
IanTheMBEDMaster 19:b9c4952f4acc 295 if (k == '3')
IanTheMBEDMaster 19:b9c4952f4acc 296 {
IanTheMBEDMaster 19:b9c4952f4acc 297 BtS.scanf("%f", &newConst);
IanTheMBEDMaster 19:b9c4952f4acc 298 Kor = newConst;
IanTheMBEDMaster 19:b9c4952f4acc 299 break;
IanTheMBEDMaster 19:b9c4952f4acc 300 }
IanTheMBEDMaster 19:b9c4952f4acc 301 if (k == '4')
IanTheMBEDMaster 19:b9c4952f4acc 302 {
IanTheMBEDMaster 19:b9c4952f4acc 303 BtS.scanf("%f", &newConst);
IanTheMBEDMaster 19:b9c4952f4acc 304 Kpos = newConst;
IanTheMBEDMaster 19:b9c4952f4acc 305 break;
IanTheMBEDMaster 19:b9c4952f4acc 306 }
IanTheMBEDMaster 19:b9c4952f4acc 307
IanTheMBEDMaster 19:b9c4952f4acc 308 printf("\n\r Pick a constant ya goof \n\r");
IanTheMBEDMaster 19:b9c4952f4acc 309 }
IanTheMBEDMaster 19:b9c4952f4acc 310 }
LtBarbershop 13:aaac0105a486 311 }
LtBarbershop 11:521c3e8e6491 312 }
LtBarbershop 11:521c3e8e6491 313 if (action == 3)
LtBarbershop 11:521c3e8e6491 314 {
LtBarbershop 11:521c3e8e6491 315 // keyboard input to debug mode
LtBarbershop 11:521c3e8e6491 316 float newSpeed;
LtBarbershop 11:521c3e8e6491 317 BtS.printf("\n\r Enter a motor speed (with sign as direction:\n\r");
LtBarbershop 11:521c3e8e6491 318 BtS.scanf("%f", &newSpeed);
LtBarbershop 11:521c3e8e6491 319
LtBarbershop 11:521c3e8e6491 320 BtS.printf("%f", newSpeed);
IanTheMBEDMaster 17:bc13550f673b 321 Ramp(newSpeed, 20, 0);
LtBarbershop 11:521c3e8e6491 322 //userSetR = userSetL;
IanTheMBEDMaster 12:3058f9fb09eb 323 }
IanTheMBEDMaster 17:bc13550f673b 324
LtBarbershop 23:806c9b8af77c 325 if (action == 2 && c == 'r')
IanTheMBEDMaster 17:bc13550f673b 326 {
LtBarbershop 23:806c9b8af77c 327 if (RecCount == 200)
IanTheMBEDMaster 17:bc13550f673b 328 {
IanTheMBEDMaster 17:bc13550f673b 329 BtS.printf("\n\n\rRecV RecU RecX RecE \n\r");
IanTheMBEDMaster 17:bc13550f673b 330 int i = 0;
LtBarbershop 23:806c9b8af77c 331 for (i = 0; i < 200; i++)
IanTheMBEDMaster 17:bc13550f673b 332 {
IanTheMBEDMaster 17:bc13550f673b 333 BtS.printf("%f, %f, %f, %f \n\r", RecV[i], RecU[i], RecX[i], RecE[i]);
IanTheMBEDMaster 17:bc13550f673b 334 }
IanTheMBEDMaster 17:bc13550f673b 335 }
IanTheMBEDMaster 17:bc13550f673b 336 }
LtBarbershop 11:521c3e8e6491 337 }// close if(BtS.readable())
LtBarbershop 11:521c3e8e6491 338 if (action == 2)
LtBarbershop 11:521c3e8e6491 339 {
IanTheMBEDMaster 17:bc13550f673b 340 // Wall Following
IanTheMBEDMaster 17:bc13550f673b 341 //Var_Lock.lock();
LtBarbershop 18:4b3ad79d1068 342 BtS.printf("IR F: %f cm R: %f cm \n\r", DF, DR);
LtBarbershop 18:4b3ad79d1068 343 BtS.printf("Wall Error: %f \n\r", eW);
LtBarbershop 18:4b3ad79d1068 344 BtS.printf("Acc Error: %f \n\r", aeW);
LtBarbershop 18:4b3ad79d1068 345 BtS.printf("Diff. Setpoint: %f \n\r", uW);
LtBarbershop 18:4b3ad79d1068 346 BtS.printf("Setpoint L: %f R: %f \n\n\r", userSetL, userSetR);
IanTheMBEDMaster 17:bc13550f673b 347 //Var_Lock.unlock();
LtBarbershop 18:4b3ad79d1068 348 Thread::wait(1000);
LtBarbershop 11:521c3e8e6491 349 }
LtBarbershop 13:aaac0105a486 350
LtBarbershop 11:521c3e8e6491 351 if (action == 3)
LtBarbershop 11:521c3e8e6491 352 {
IanTheMBEDMaster 17:bc13550f673b 353 // Debug Mode
LtBarbershop 11:521c3e8e6491 354
IanTheMBEDMaster 12:3058f9fb09eb 355 float IRF, IRR;
IanTheMBEDMaster 12:3058f9fb09eb 356 IRF = IRFront.read();
IanTheMBEDMaster 12:3058f9fb09eb 357 IRR = IRRear.read();
IanTheMBEDMaster 17:bc13550f673b 358
IanTheMBEDMaster 12:3058f9fb09eb 359 Var_Lock.lock();
LtBarbershop 11:521c3e8e6491 360 BtS.printf("Pos. L: %d R: %d \n\r", dPositionLeft, dPositionRight);
LtBarbershop 11:521c3e8e6491 361 BtS.printf("Time L: %d R: %d \n\r", dTimeLeft, dTimeRight);
LtBarbershop 11:521c3e8e6491 362 BtS.printf("fbs L: %f R: %f \n\r", fbSpeedL, fbSpeedR);
LtBarbershop 11:521c3e8e6491 363 BtS.printf("e L: %f R: %f \r\n", eL, eR);
LtBarbershop 11:521c3e8e6491 364 BtS.printf("Ae L: %f R: %f \n\r", aeL, aeR);
IanTheMBEDMaster 12:3058f9fb09eb 365 BtS.printf("cSP L: %f R: %f \n\r", cSetL, cSetR);
LtBarbershop 13:aaac0105a486 366 BtS.printf("IR F: %f R: %f \n\r", IRF, IRR);
IanTheMBEDMaster 12:3058f9fb09eb 367 Var_Lock.unlock();
LtBarbershop 11:521c3e8e6491 368 Thread::wait(2000);
IanTheMBEDMaster 17:bc13550f673b 369 }
LtBarbershop 1:3a40c918ff41 370 }
LtBarbershop 1:3a40c918ff41 371 }
LtBarbershop 1:3a40c918ff41 372
LtBarbershop 1:3a40c918ff41 373 // ******** Control Thread ********
IanTheMBEDMaster 2:1c5cc180812d 374 void PiControlThread(void const *argument)
IanTheMBEDMaster 2:1c5cc180812d 375 {
LtBarbershop 13:aaac0105a486 376 float maxError = 1.0f;
LtBarbershop 13:aaac0105a486 377 float maxAcc = 10.0f;
LtBarbershop 13:aaac0105a486 378
IanTheMBEDMaster 2:1c5cc180812d 379 while (1)
IanTheMBEDMaster 2:1c5cc180812d 380 {
LtBarbershop 18:4b3ad79d1068 381 // check for emergency stop
LtBarbershop 18:4b3ad79d1068 382 if (EmergencyStop == 1)
LtBarbershop 18:4b3ad79d1068 383 {
LtBarbershop 18:4b3ad79d1068 384 userSetL = 0;
LtBarbershop 18:4b3ad79d1068 385 userSetR = 0;
LtBarbershop 18:4b3ad79d1068 386 SetLeftMotorSpeed(userSetL);
LtBarbershop 18:4b3ad79d1068 387 SetRightMotorSpeed(userSetR);
LtBarbershop 18:4b3ad79d1068 388 BtS.printf("\n\rEmergency Stop!!\n\r");
LtBarbershop 23:806c9b8af77c 389 Thread::wait(2000);
LtBarbershop 18:4b3ad79d1068 390 }
LtBarbershop 18:4b3ad79d1068 391
IanTheMBEDMaster 2:1c5cc180812d 392 osSignalWait(SignalPi, osWaitForever);
IanTheMBEDMaster 2:1c5cc180812d 393 led2= !led2; // Alive status
IanTheMBEDMaster 2:1c5cc180812d 394
IanTheMBEDMaster 6:5200ce9fa5a7 395 float prevu1, prevu2;
LtBarbershop 13:aaac0105a486 396
LtBarbershop 8:d65cba3bfc0e 397 // Kp = 0.1, Ki = 0.5
LtBarbershop 21:c5713aafdc9d 398 const float Kp = 0.5f;
IanTheMBEDMaster 17:bc13550f673b 399 const float Ki = 0.8f;
LtBarbershop 5:7108ac9e8182 400
LtBarbershop 21:c5713aafdc9d 401 if (action == 2)
LtBarbershop 13:aaac0105a486 402 {
LtBarbershop 13:aaac0105a486 403 IRChecker();
LtBarbershop 13:aaac0105a486 404 }
LtBarbershop 5:7108ac9e8182 405 prevu1 = u1;
LtBarbershop 5:7108ac9e8182 406 prevu2 = u2;
LtBarbershop 4:03bf5bdca9fb 407
IanTheMBEDMaster 6:5200ce9fa5a7 408 // read encoder and calculate speed of both motors
IanTheMBEDMaster 7:751d5e3e9cab 409 GetSpeeds();
LtBarbershop 4:03bf5bdca9fb 410
LtBarbershop 4:03bf5bdca9fb 411 // calculate error
LtBarbershop 5:7108ac9e8182 412 eL = userSetL - fbSpeedL;
LtBarbershop 5:7108ac9e8182 413 eR = userSetR - fbSpeedR;
IanTheMBEDMaster 6:5200ce9fa5a7 414
LtBarbershop 13:aaac0105a486 415 /*
IanTheMBEDMaster 12:3058f9fb09eb 416 // prevent overflow / bound the error
LtBarbershop 13:aaac0105a486 417 if (eL > 1)
LtBarbershop 5:7108ac9e8182 418 {
LtBarbershop 13:aaac0105a486 419 eL = 1;
LtBarbershop 5:7108ac9e8182 420 }
LtBarbershop 13:aaac0105a486 421 if (eL < -1);
LtBarbershop 5:7108ac9e8182 422 {
LtBarbershop 13:aaac0105a486 423 eL = -1;
LtBarbershop 5:7108ac9e8182 424 }
LtBarbershop 5:7108ac9e8182 425 if (eR > maxError)
LtBarbershop 5:7108ac9e8182 426 {
LtBarbershop 5:7108ac9e8182 427 eR = maxError;
LtBarbershop 5:7108ac9e8182 428 }
LtBarbershop 5:7108ac9e8182 429 if (eR < -maxError);
LtBarbershop 5:7108ac9e8182 430 {
LtBarbershop 5:7108ac9e8182 431 eR = -maxError;
IanTheMBEDMaster 12:3058f9fb09eb 432 }
LtBarbershop 13:aaac0105a486 433 */
LtBarbershop 4:03bf5bdca9fb 434 // accumulated error (integration)
LtBarbershop 5:7108ac9e8182 435 if (prevu1 < 1 && prevu1 > -1)
LtBarbershop 5:7108ac9e8182 436 {
LtBarbershop 5:7108ac9e8182 437 aeL += eL;
LtBarbershop 5:7108ac9e8182 438 }
LtBarbershop 5:7108ac9e8182 439 if (prevu2 < 1 && prevu2 > -1)
LtBarbershop 5:7108ac9e8182 440 {
LtBarbershop 5:7108ac9e8182 441 aeR += eR;
LtBarbershop 5:7108ac9e8182 442 }
LtBarbershop 5:7108ac9e8182 443
LtBarbershop 13:aaac0105a486 444 /*
LtBarbershop 5:7108ac9e8182 445 // bound the accumulatd error
LtBarbershop 5:7108ac9e8182 446 if (aeL > maxAcc)
LtBarbershop 5:7108ac9e8182 447 {
LtBarbershop 5:7108ac9e8182 448 aeL = maxAcc;
LtBarbershop 5:7108ac9e8182 449 }
LtBarbershop 5:7108ac9e8182 450 if (aeL < -maxAcc)
LtBarbershop 5:7108ac9e8182 451 {
LtBarbershop 5:7108ac9e8182 452 aeL = -maxAcc;
LtBarbershop 5:7108ac9e8182 453 }
LtBarbershop 5:7108ac9e8182 454 if (aeR > maxAcc)
LtBarbershop 5:7108ac9e8182 455 {
LtBarbershop 5:7108ac9e8182 456 aeR = maxAcc;
LtBarbershop 5:7108ac9e8182 457 }
LtBarbershop 5:7108ac9e8182 458 if (aeR < -maxAcc)
LtBarbershop 5:7108ac9e8182 459 {
LtBarbershop 5:7108ac9e8182 460 aeR = -maxAcc;
LtBarbershop 5:7108ac9e8182 461 }
LtBarbershop 13:aaac0105a486 462 */
LtBarbershop 4:03bf5bdca9fb 463
LtBarbershop 4:03bf5bdca9fb 464 u1 = Kp*eL + Ki*aeL;
LtBarbershop 4:03bf5bdca9fb 465 u2 = Kp*eR + Ki*aeR;
LtBarbershop 5:7108ac9e8182 466
IanTheMBEDMaster 17:bc13550f673b 467 SetLeftMotorSpeed(u1);
IanTheMBEDMaster 17:bc13550f673b 468 SetRightMotorSpeed(u2);
IanTheMBEDMaster 2:1c5cc180812d 469 }
IanTheMBEDMaster 2:1c5cc180812d 470 }
LtBarbershop 1:3a40c918ff41 471
LtBarbershop 1:3a40c918ff41 472 // ******** Collision Thread ********
IanTheMBEDMaster 2:1c5cc180812d 473 void ExtCollisionThread(void const *argument)
IanTheMBEDMaster 2:1c5cc180812d 474 {
IanTheMBEDMaster 2:1c5cc180812d 475 while (1)
IanTheMBEDMaster 2:1c5cc180812d 476 {
IanTheMBEDMaster 2:1c5cc180812d 477 osSignalWait(SignalExtCollision, osWaitForever);
LtBarbershop 13:aaac0105a486 478 userSetL = 0;
LtBarbershop 13:aaac0105a486 479 userSetR = 0;
LtBarbershop 13:aaac0105a486 480 SetLeftMotorSpeed(userSetL);
LtBarbershop 13:aaac0105a486 481 SetRightMotorSpeed(userSetR);
LtBarbershop 13:aaac0105a486 482 mbed_reset();
LtBarbershop 1:3a40c918ff41 483 }
LtBarbershop 1:3a40c918ff41 484 }
LtBarbershop 1:3a40c918ff41 485
LtBarbershop 1:3a40c918ff41 486 // ******** Watchdog Interrupt Handler ********
IanTheMBEDMaster 2:1c5cc180812d 487 void Watchdog(void const *n)
IanTheMBEDMaster 2:1c5cc180812d 488 {
LtBarbershop 1:3a40c918ff41 489 led3=1;
LtBarbershop 11:521c3e8e6491 490 BtS.printf("\n\r Watchdog Timeout! Oh Shit!\n\r");
LtBarbershop 1:3a40c918ff41 491 }
LtBarbershop 1:3a40c918ff41 492
LtBarbershop 1:3a40c918ff41 493 // ******** Period Timer Interrupt Handler ********
LtBarbershop 5:7108ac9e8182 494 void PiControllerISR(void)
IanTheMBEDMaster 2:1c5cc180812d 495 {
LtBarbershop 1:3a40c918ff41 496 osSignalSet(PiControl,0x1);
IanTheMBEDMaster 2:1c5cc180812d 497 }
LtBarbershop 1:3a40c918ff41 498
LtBarbershop 1:3a40c918ff41 499 // ******** Collision Interrupt Handler ********
LtBarbershop 1:3a40c918ff41 500 void ExtCollisionISR(void)
LtBarbershop 1:3a40c918ff41 501 {
LtBarbershop 1:3a40c918ff41 502 osSignalSet(ExtCollision,0x1);
LtBarbershop 1:3a40c918ff41 503 }
LtBarbershop 1:3a40c918ff41 504
IanTheMBEDMaster 12:3058f9fb09eb 505
IanTheMBEDMaster 2:1c5cc180812d 506 // --- Initialization Functions
IanTheMBEDMaster 2:1c5cc180812d 507 void InitializeSystem()
IanTheMBEDMaster 2:1c5cc180812d 508 {
IanTheMBEDMaster 2:1c5cc180812d 509 led3=0;
IanTheMBEDMaster 2:1c5cc180812d 510 led4=0;
IanTheMBEDMaster 2:1c5cc180812d 511
LtBarbershop 18:4b3ad79d1068 512 //EmerStop.rise(&ExtCollisionISR); // Atach the address of the interrupt handler to the rising edge of Bumper
IanTheMBEDMaster 2:1c5cc180812d 513
IanTheMBEDMaster 2:1c5cc180812d 514 // Start execution of the Threads
IanTheMBEDMaster 2:1c5cc180812d 515 PiControl = osThreadCreate(osThread(PiControlThread), NULL);
IanTheMBEDMaster 2:1c5cc180812d 516 ExtCollision = osThreadCreate(osThread(ExtCollisionThread), NULL);
IanTheMBEDMaster 2:1c5cc180812d 517 osTimerId OneShot = osTimerCreate(osTimer(Wdtimer), osTimerOnce, (void *)0);
LtBarbershop 4:03bf5bdca9fb 518 PeriodicInt.attach(&PiControllerISR, ControlUpdate); // Specify address of the TimerISR (Ticker) function and the interval between interrupts
IanTheMBEDMaster 2:1c5cc180812d 519
IanTheMBEDMaster 6:5200ce9fa5a7 520 InitializePWM();
IanTheMBEDMaster 2:1c5cc180812d 521 InitializeEncoder();
IanTheMBEDMaster 12:3058f9fb09eb 522 BTInit();
IanTheMBEDMaster 2:1c5cc180812d 523 }
IanTheMBEDMaster 2:1c5cc180812d 524
IanTheMBEDMaster 2:1c5cc180812d 525 void InitializePWM()
IanTheMBEDMaster 2:1c5cc180812d 526 {
IanTheMBEDMaster 6:5200ce9fa5a7 527 PwmL.period(PWMPeriod);
IanTheMBEDMaster 6:5200ce9fa5a7 528 PwmR.period(PWMPeriod);
IanTheMBEDMaster 2:1c5cc180812d 529 }
IanTheMBEDMaster 2:1c5cc180812d 530
IanTheMBEDMaster 2:1c5cc180812d 531 void InitializeEncoder()
IanTheMBEDMaster 2:1c5cc180812d 532 {
IanTheMBEDMaster 2:1c5cc180812d 533 // Initialization – to be executed once (normally)
IanTheMBEDMaster 2:1c5cc180812d 534 DE0.format(16,0); // SPI format: 16-bit words, mode 0 protocol.
LtBarbershop 4:03bf5bdca9fb 535 DE0.frequency(1000000);
IanTheMBEDMaster 2:1c5cc180812d 536 SpiStart = 0;
IanTheMBEDMaster 2:1c5cc180812d 537 SpiReset = 1;
IanTheMBEDMaster 2:1c5cc180812d 538 wait_us(10);
IanTheMBEDMaster 2:1c5cc180812d 539 SpiReset = 0;
IanTheMBEDMaster 2:1c5cc180812d 540 DE0.write(0x8004); // SPI slave control word to read (only) 4-word transactions
IanTheMBEDMaster 2:1c5cc180812d 541 // starting at base address 0 within the peripheral.
IanTheMBEDMaster 2:1c5cc180812d 542 }
IanTheMBEDMaster 2:1c5cc180812d 543
IanTheMBEDMaster 12:3058f9fb09eb 544 void BTInit()
IanTheMBEDMaster 12:3058f9fb09eb 545 {
IanTheMBEDMaster 12:3058f9fb09eb 546 BtS.printf("AT+BTCANCEL\r\n");
IanTheMBEDMaster 12:3058f9fb09eb 547 BtS.printf("AT+BTSCAN\r\n");
IanTheMBEDMaster 14:669f2f1566b0 548
IanTheMBEDMaster 14:669f2f1566b0 549 // also send to the pc so we know whats going on
IanTheMBEDMaster 14:669f2f1566b0 550 pc.printf("AT+BTCANCEL\r\n");
IanTheMBEDMaster 14:669f2f1566b0 551 pc.printf("AT+BTSCAN\r\n");
IanTheMBEDMaster 12:3058f9fb09eb 552 }
IanTheMBEDMaster 2:1c5cc180812d 553
IanTheMBEDMaster 2:1c5cc180812d 554 // --- Other Functions
IanTheMBEDMaster 2:1c5cc180812d 555 void SetLeftMotorSpeed(float u)
LtBarbershop 1:3a40c918ff41 556 {
IanTheMBEDMaster 2:1c5cc180812d 557 float T;
IanTheMBEDMaster 2:1c5cc180812d 558 float d;
IanTheMBEDMaster 2:1c5cc180812d 559 float onTime;
IanTheMBEDMaster 20:344c088d3ead 560 float maxMotorSpeed = 0.5;
IanTheMBEDMaster 2:1c5cc180812d 561
LtBarbershop 3:9a39e487b724 562 // bound the input
IanTheMBEDMaster 20:344c088d3ead 563 if (u > maxMotorSpeed)
LtBarbershop 3:9a39e487b724 564 {
IanTheMBEDMaster 20:344c088d3ead 565 u = maxMotorSpeed;
LtBarbershop 3:9a39e487b724 566 }
LtBarbershop 3:9a39e487b724 567
IanTheMBEDMaster 20:344c088d3ead 568 if (u < -maxMotorSpeed)
LtBarbershop 3:9a39e487b724 569 {
IanTheMBEDMaster 20:344c088d3ead 570 u = -maxMotorSpeed;
LtBarbershop 3:9a39e487b724 571 }
LtBarbershop 3:9a39e487b724 572
LtBarbershop 3:9a39e487b724 573 // calculate duty cycle timing
IanTheMBEDMaster 2:1c5cc180812d 574 T = PWMPeriod;
IanTheMBEDMaster 2:1c5cc180812d 575 d = abs(u);
IanTheMBEDMaster 2:1c5cc180812d 576 onTime = d * T;
IanTheMBEDMaster 2:1c5cc180812d 577
IanTheMBEDMaster 2:1c5cc180812d 578 PwmL.pulsewidth(onTime);
IanTheMBEDMaster 2:1c5cc180812d 579
IanTheMBEDMaster 2:1c5cc180812d 580 if (u > 0)
IanTheMBEDMaster 2:1c5cc180812d 581 {
IanTheMBEDMaster 2:1c5cc180812d 582 dirL = 1;
IanTheMBEDMaster 2:1c5cc180812d 583 }
IanTheMBEDMaster 2:1c5cc180812d 584 else
IanTheMBEDMaster 2:1c5cc180812d 585 {
IanTheMBEDMaster 2:1c5cc180812d 586 dirL = 0;
IanTheMBEDMaster 2:1c5cc180812d 587 }
IanTheMBEDMaster 2:1c5cc180812d 588 }
LtBarbershop 1:3a40c918ff41 589
IanTheMBEDMaster 2:1c5cc180812d 590 void SetRightMotorSpeed(float u)
IanTheMBEDMaster 2:1c5cc180812d 591 {
IanTheMBEDMaster 2:1c5cc180812d 592 float T;
IanTheMBEDMaster 2:1c5cc180812d 593 float d;
IanTheMBEDMaster 2:1c5cc180812d 594 float onTime;
IanTheMBEDMaster 20:344c088d3ead 595 float maxMotorSpeed = 0.5;
IanTheMBEDMaster 2:1c5cc180812d 596
LtBarbershop 3:9a39e487b724 597 // bound the input
IanTheMBEDMaster 20:344c088d3ead 598 if (u > maxMotorSpeed)
LtBarbershop 3:9a39e487b724 599 {
IanTheMBEDMaster 20:344c088d3ead 600 u = maxMotorSpeed;
LtBarbershop 3:9a39e487b724 601 }
LtBarbershop 3:9a39e487b724 602
IanTheMBEDMaster 20:344c088d3ead 603 if (u < -maxMotorSpeed)
LtBarbershop 3:9a39e487b724 604 {
IanTheMBEDMaster 20:344c088d3ead 605 u = -maxMotorSpeed;
LtBarbershop 3:9a39e487b724 606 }
LtBarbershop 3:9a39e487b724 607
LtBarbershop 3:9a39e487b724 608 // calculate duty cycle timing
IanTheMBEDMaster 2:1c5cc180812d 609 T = PWMPeriod;
IanTheMBEDMaster 2:1c5cc180812d 610 d = abs(u);
IanTheMBEDMaster 2:1c5cc180812d 611 onTime = d * T;
IanTheMBEDMaster 2:1c5cc180812d 612
IanTheMBEDMaster 2:1c5cc180812d 613 PwmR.pulsewidth(onTime);
IanTheMBEDMaster 2:1c5cc180812d 614
IanTheMBEDMaster 2:1c5cc180812d 615 if (u > 0)
IanTheMBEDMaster 2:1c5cc180812d 616 {
IanTheMBEDMaster 2:1c5cc180812d 617 dirR = 1;
IanTheMBEDMaster 2:1c5cc180812d 618 }
IanTheMBEDMaster 2:1c5cc180812d 619 else
IanTheMBEDMaster 2:1c5cc180812d 620 {
IanTheMBEDMaster 2:1c5cc180812d 621 dirR = 0;
IanTheMBEDMaster 2:1c5cc180812d 622 }
LtBarbershop 1:3a40c918ff41 623 }
LtBarbershop 1:3a40c918ff41 624
IanTheMBEDMaster 7:751d5e3e9cab 625 void GetSpeeds()
LtBarbershop 1:3a40c918ff41 626 {
IanTheMBEDMaster 22:3cda0d788452 627 // when using a interrupt period of 50ms: 1480
IanTheMBEDMaster 22:3cda0d788452 628 float leftMaxPos = 1184.0f;
IanTheMBEDMaster 22:3cda0d788452 629 float rightMaxPos = 1184.0f;
LtBarbershop 1:3a40c918ff41 630
IanTheMBEDMaster 6:5200ce9fa5a7 631 // Restart the SPI module each time
LtBarbershop 4:03bf5bdca9fb 632 SpiStart = 1;
LtBarbershop 4:03bf5bdca9fb 633 wait_us(5);
LtBarbershop 4:03bf5bdca9fb 634 SpiStart = 0;
LtBarbershop 4:03bf5bdca9fb 635 DE0.write(0x8004);
IanTheMBEDMaster 12:3058f9fb09eb 636
IanTheMBEDMaster 6:5200ce9fa5a7 637 // read in 4 16-bit words
LtBarbershop 4:03bf5bdca9fb 638 Var_Lock.lock();
IanTheMBEDMaster 6:5200ce9fa5a7 639 dPositionLeft = DE0.write(Dummy); // Read QEI-0 position register
IanTheMBEDMaster 6:5200ce9fa5a7 640 dTimeLeft = DE0.write(Dummy); // Read QE-0 time interval register
LtBarbershop 4:03bf5bdca9fb 641 dPositionRight = DE0.write(Dummy); // Read QEI-1 position register
LtBarbershop 4:03bf5bdca9fb 642 dTimeRight = DE0.write(Dummy); // Read QEI-1 time interval register
IanTheMBEDMaster 6:5200ce9fa5a7 643 Var_Lock.unlock();
LtBarbershop 4:03bf5bdca9fb 644
IanTheMBEDMaster 7:751d5e3e9cab 645 // calcspeed
IanTheMBEDMaster 7:751d5e3e9cab 646 fbSpeedL = ((float)dPositionLeft)/leftMaxPos;
IanTheMBEDMaster 7:751d5e3e9cab 647 fbSpeedR = ((float)dPositionRight)/rightMaxPos;
IanTheMBEDMaster 7:751d5e3e9cab 648
IanTheMBEDMaster 6:5200ce9fa5a7 649 // bound the feedback speed
IanTheMBEDMaster 7:751d5e3e9cab 650 if (fbSpeedL > 1)
IanTheMBEDMaster 6:5200ce9fa5a7 651 {
IanTheMBEDMaster 7:751d5e3e9cab 652 fbSpeedL = 1;
IanTheMBEDMaster 6:5200ce9fa5a7 653 }
IanTheMBEDMaster 7:751d5e3e9cab 654 if (fbSpeedL < -1)
IanTheMBEDMaster 6:5200ce9fa5a7 655 {
IanTheMBEDMaster 7:751d5e3e9cab 656 fbSpeedL = -1;
IanTheMBEDMaster 6:5200ce9fa5a7 657 }
IanTheMBEDMaster 7:751d5e3e9cab 658 if (fbSpeedR > 1)
IanTheMBEDMaster 6:5200ce9fa5a7 659 {
IanTheMBEDMaster 7:751d5e3e9cab 660 fbSpeedR = 1;
IanTheMBEDMaster 6:5200ce9fa5a7 661 }
IanTheMBEDMaster 7:751d5e3e9cab 662 if (fbSpeedR < -1)
IanTheMBEDMaster 6:5200ce9fa5a7 663 {
IanTheMBEDMaster 7:751d5e3e9cab 664 fbSpeedR = -1;
IanTheMBEDMaster 6:5200ce9fa5a7 665 }
LtBarbershop 9:0eb7b173d6c3 666 }
LtBarbershop 11:521c3e8e6491 667
LtBarbershop 11:521c3e8e6491 668 void IRChecker()
LtBarbershop 9:0eb7b173d6c3 669 {
IanTheMBEDMaster 17:bc13550f673b 670 float IRF, IRR, IRF1, IRR1, IRF2, IRR2, prevDF, prevDR;
LtBarbershop 23:806c9b8af77c 671 float speedSet;
LtBarbershop 13:aaac0105a486 672 float aF = 22.6321; // 34.2911
LtBarbershop 13:aaac0105a486 673 float bF = -0.1721; // -0.2608
LtBarbershop 13:aaac0105a486 674 float aR = 22.6021; // 34.2456
LtBarbershop 13:aaac0105a486 675 float bR = -0.0376; // -0.0569
IanTheMBEDMaster 14:669f2f1566b0 676
IanTheMBEDMaster 14:669f2f1566b0 677 // Read Sensors
IanTheMBEDMaster 17:bc13550f673b 678 IRF1 = 3.3*IRFront.read();
IanTheMBEDMaster 17:bc13550f673b 679 IRR1 = 3.3*IRRear.read();
IanTheMBEDMaster 17:bc13550f673b 680 IRF2 = 3.3*IRFront.read();
IanTheMBEDMaster 17:bc13550f673b 681 IRR2 = 3.3*IRRear.read();
IanTheMBEDMaster 17:bc13550f673b 682
IanTheMBEDMaster 17:bc13550f673b 683 // average
IanTheMBEDMaster 17:bc13550f673b 684 IRF = (IRF1 + IRF2)/2;
IanTheMBEDMaster 17:bc13550f673b 685 IRR = (IRR1 + IRR2)/2;
IanTheMBEDMaster 17:bc13550f673b 686
LtBarbershop 16:cf9519c35510 687 prevDF = DF;
LtBarbershop 16:cf9519c35510 688 prevDR = DR;
LtBarbershop 18:4b3ad79d1068 689
IanTheMBEDMaster 19:b9c4952f4acc 690 // Calculate distance based on voltage
IanTheMBEDMaster 14:669f2f1566b0 691 DF = aF/(IRF+bF);
IanTheMBEDMaster 14:669f2f1566b0 692 DR = aR/(IRR+bR);
IanTheMBEDMaster 14:669f2f1566b0 693
IanTheMBEDMaster 17:bc13550f673b 694 prevuW = uW;
IanTheMBEDMaster 17:bc13550f673b 695
LtBarbershop 16:cf9519c35510 696 // check for invalid data
IanTheMBEDMaster 19:b9c4952f4acc 697 if (DF < 0)
IanTheMBEDMaster 19:b9c4952f4acc 698 {
IanTheMBEDMaster 19:b9c4952f4acc 699 DF = 80;
IanTheMBEDMaster 19:b9c4952f4acc 700 }
IanTheMBEDMaster 19:b9c4952f4acc 701 if (DR < 0)
IanTheMBEDMaster 19:b9c4952f4acc 702 {
IanTheMBEDMaster 19:b9c4952f4acc 703 DR = 80;
IanTheMBEDMaster 19:b9c4952f4acc 704 }
LtBarbershop 21:c5713aafdc9d 705 if (DF > 80)
LtBarbershop 21:c5713aafdc9d 706 {
LtBarbershop 21:c5713aafdc9d 707 DF = 80;
LtBarbershop 21:c5713aafdc9d 708 }
LtBarbershop 21:c5713aafdc9d 709 if (DR > 80)
LtBarbershop 21:c5713aafdc9d 710 {
LtBarbershop 21:c5713aafdc9d 711 DR = 80;
LtBarbershop 21:c5713aafdc9d 712 }
LtBarbershop 21:c5713aafdc9d 713 if (DF < 10)
LtBarbershop 21:c5713aafdc9d 714 {
LtBarbershop 21:c5713aafdc9d 715 DF = 10;
LtBarbershop 21:c5713aafdc9d 716 }
LtBarbershop 21:c5713aafdc9d 717 if (DR < 10)
LtBarbershop 21:c5713aafdc9d 718 {
LtBarbershop 21:c5713aafdc9d 719 DR = 10;
LtBarbershop 21:c5713aafdc9d 720 }
LtBarbershop 21:c5713aafdc9d 721
IanTheMBEDMaster 14:669f2f1566b0 722 // calculate errors
IanTheMBEDMaster 14:669f2f1566b0 723 eW = Kpos*(Nominal - (DF + DR)/2) + Kor*(DR - DF);
IanTheMBEDMaster 14:669f2f1566b0 724
IanTheMBEDMaster 14:669f2f1566b0 725 // accumulate error
LtBarbershop 18:4b3ad79d1068 726 if (prevuW < Turn && prevuW > -Turn)
IanTheMBEDMaster 17:bc13550f673b 727 {
IanTheMBEDMaster 17:bc13550f673b 728 aeW = aeW + eW;
IanTheMBEDMaster 17:bc13550f673b 729 }
IanTheMBEDMaster 14:669f2f1566b0 730
IanTheMBEDMaster 14:669f2f1566b0 731 uW = KpW*eW + KiW*aeW;
IanTheMBEDMaster 14:669f2f1566b0 732
LtBarbershop 18:4b3ad79d1068 733 if (uW > Turn)
IanTheMBEDMaster 15:407e4152cf3a 734 {
LtBarbershop 18:4b3ad79d1068 735 uW = Turn;
IanTheMBEDMaster 15:407e4152cf3a 736 }
LtBarbershop 18:4b3ad79d1068 737 else if (uW < -Turn)
IanTheMBEDMaster 15:407e4152cf3a 738 {
LtBarbershop 18:4b3ad79d1068 739 uW = -Turn;
IanTheMBEDMaster 15:407e4152cf3a 740 }
IanTheMBEDMaster 15:407e4152cf3a 741
LtBarbershop 23:806c9b8af77c 742 // set speed using auto speed control
LtBarbershop 23:806c9b8af77c 743 if (autoSpeed == 1)
LtBarbershop 23:806c9b8af77c 744 {
LtBarbershop 23:806c9b8af77c 745 speedSet = (1 - (abs(eW)*5))*TSpeedL;
LtBarbershop 23:806c9b8af77c 746 if (speedSet < 0.05)
LtBarbershop 23:806c9b8af77c 747 {
LtBarbershop 23:806c9b8af77c 748 speedSet = 0.05;
LtBarbershop 23:806c9b8af77c 749 }
LtBarbershop 23:806c9b8af77c 750 userSetL = speedSet + uW;
LtBarbershop 23:806c9b8af77c 751 userSetR = speedSet - uW;
LtBarbershop 23:806c9b8af77c 752 }
LtBarbershop 23:806c9b8af77c 753 else
LtBarbershop 23:806c9b8af77c 754 {
LtBarbershop 23:806c9b8af77c 755 // set differential speeds
LtBarbershop 23:806c9b8af77c 756 userSetL = TSpeedL + uW;
LtBarbershop 23:806c9b8af77c 757 userSetR = TSpeedR - uW;
LtBarbershop 23:806c9b8af77c 758 }
LtBarbershop 23:806c9b8af77c 759
LtBarbershop 23:806c9b8af77c 760 // data recording code
IanTheMBEDMaster 24:f4f933d9194b 761 if (action == 2)
IanTheMBEDMaster 24:f4f933d9194b 762 {
IanTheMBEDMaster 24:f4f933d9194b 763 if (RecCount < 200)
LtBarbershop 23:806c9b8af77c 764 {
IanTheMBEDMaster 24:f4f933d9194b 765 RecX[RecCount] = eW;
IanTheMBEDMaster 24:f4f933d9194b 766 RecU[RecCount] = uW;
IanTheMBEDMaster 24:f4f933d9194b 767 RecV[RecCount] = DF;
IanTheMBEDMaster 24:f4f933d9194b 768 RecE[RecCount] = DR;
IanTheMBEDMaster 24:f4f933d9194b 769 RecCount++;
LtBarbershop 23:806c9b8af77c 770 }
IanTheMBEDMaster 24:f4f933d9194b 771 }
IanTheMBEDMaster 14:669f2f1566b0 772 }
IanTheMBEDMaster 14:669f2f1566b0 773
LtBarbershop 11:521c3e8e6491 774 void DisplayMenu()
LtBarbershop 11:521c3e8e6491 775 {
IanTheMBEDMaster 12:3058f9fb09eb 776 BtS.printf("\r\n\nPress the corresponding key to do something:\r\n");
LtBarbershop 11:521c3e8e6491 777 BtS.printf("| Key | Action\n\r");
IanTheMBEDMaster 12:3058f9fb09eb 778 BtS.printf("|-----|----------------------------\n\r");
LtBarbershop 11:521c3e8e6491 779 BtS.printf("| d | Drive the robot using wasd keys\n\r");
LtBarbershop 11:521c3e8e6491 780 BtS.printf("| w | Robot performs wall following\n\r");
LtBarbershop 11:521c3e8e6491 781 BtS.printf("| 0 | Debug mode\n\r");
IanTheMBEDMaster 17:bc13550f673b 782 BtS.printf("| r | Record Data \n\r");
IanTheMBEDMaster 12:3058f9fb09eb 783 BtS.printf("| q | Quit current action, stop the robot, and return to this menu\n\r\n");
LtBarbershop 11:521c3e8e6491 784 }
LtBarbershop 11:521c3e8e6491 785
LtBarbershop 11:521c3e8e6491 786 void Ramp(float speed, unsigned int time, unsigned short motor)
LtBarbershop 11:521c3e8e6491 787 {
LtBarbershop 11:521c3e8e6491 788 const unsigned short steps = 20;
LtBarbershop 11:521c3e8e6491 789 float changeL = (speed - userSetL)/steps;
LtBarbershop 11:521c3e8e6491 790 float changeR = (speed - userSetR)/steps;
LtBarbershop 11:521c3e8e6491 791 unsigned short i;
LtBarbershop 11:521c3e8e6491 792 // calculate wait time (we wont worry too much about rounding errors)
LtBarbershop 11:521c3e8e6491 793 unsigned int waitTime = time/steps;
LtBarbershop 11:521c3e8e6491 794
LtBarbershop 11:521c3e8e6491 795 for (i = 0; i < steps; i++)
LtBarbershop 11:521c3e8e6491 796 {
LtBarbershop 11:521c3e8e6491 797 //Thread::wait(200);
LtBarbershop 11:521c3e8e6491 798 Thread::wait(waitTime);
LtBarbershop 11:521c3e8e6491 799
LtBarbershop 11:521c3e8e6491 800 if (motor == 0)
LtBarbershop 11:521c3e8e6491 801 {
LtBarbershop 11:521c3e8e6491 802 // change both speeds
LtBarbershop 11:521c3e8e6491 803 userSetL += changeL;
LtBarbershop 11:521c3e8e6491 804 userSetR += changeR;
LtBarbershop 11:521c3e8e6491 805 continue;
LtBarbershop 11:521c3e8e6491 806 }
LtBarbershop 11:521c3e8e6491 807 if (motor == 1)
LtBarbershop 11:521c3e8e6491 808 {
LtBarbershop 11:521c3e8e6491 809 userSetL += changeL;
LtBarbershop 11:521c3e8e6491 810 continue;
LtBarbershop 11:521c3e8e6491 811 }
LtBarbershop 11:521c3e8e6491 812 if (motor == 2)
LtBarbershop 11:521c3e8e6491 813 {
LtBarbershop 11:521c3e8e6491 814 userSetR += changeR;
IanTheMBEDMaster 12:3058f9fb09eb 815 }
IanTheMBEDMaster 12:3058f9fb09eb 816 }
LtBarbershop 9:0eb7b173d6c3 817 }