Ian Colwell / Mbed 2 deprecated RoboticsProject

Dependencies:   mbed-rtos mbed

Fork of Project by Thomas Elliott

Committer:
LtBarbershop
Date:
Fri Feb 15 21:11:34 2013 +0000
Revision:
3:9a39e487b724
Parent:
2:1c5cc180812d
Child:
4:03bf5bdca9fb
End of Friday 15th

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 2:1c5cc180812d 4
LtBarbershop 1:3a40c918ff41 5 #include "mbed.h"
LtBarbershop 1:3a40c918ff41 6 #include "rtos.h"
LtBarbershop 1:3a40c918ff41 7
IanTheMBEDMaster 2:1c5cc180812d 8 // --- Constants
IanTheMBEDMaster 2:1c5cc180812d 9 #define Dummy 0
IanTheMBEDMaster 2:1c5cc180812d 10 #define PWMPeriod 0.001
LtBarbershop 1:3a40c918ff41 11
IanTheMBEDMaster 2:1c5cc180812d 12 // --- Function prototypes
LtBarbershop 1:3a40c918ff41 13 void PiControllerISR(void);
LtBarbershop 1:3a40c918ff41 14 void WdtFaultISR(void);
LtBarbershop 1:3a40c918ff41 15 void ExtCollisionISR(void);
LtBarbershop 1:3a40c918ff41 16 void PiControlThread(void const *argument);
LtBarbershop 1:3a40c918ff41 17 void ExtCollisionThread(void const *argument);
LtBarbershop 1:3a40c918ff41 18 void Watchdog(void const *n);
IanTheMBEDMaster 2:1c5cc180812d 19 void InitializeSystem();
IanTheMBEDMaster 2:1c5cc180812d 20 void InitializeEncoder();
IanTheMBEDMaster 2:1c5cc180812d 21 void InitializePWM();
IanTheMBEDMaster 2:1c5cc180812d 22 void PwmSetOut(float d, float T);
IanTheMBEDMaster 2:1c5cc180812d 23 void ReadEncoder();
IanTheMBEDMaster 2:1c5cc180812d 24 void SetLeftMotorSpeed(float u);
IanTheMBEDMaster 2:1c5cc180812d 25 void SetRightMotorSpeed(float u);
LtBarbershop 1:3a40c918ff41 26
LtBarbershop 1:3a40c918ff41 27 // Global variables for interrupt handler
LtBarbershop 1:3a40c918ff41 28 float u1;
LtBarbershop 1:3a40c918ff41 29 float u2;
LtBarbershop 3:9a39e487b724 30 int dPositionRight, dTimeRight, dPositionLeft, dTimeLeft;
IanTheMBEDMaster 2:1c5cc180812d 31
IanTheMBEDMaster 2:1c5cc180812d 32 // --- Processes and threads
LtBarbershop 1:3a40c918ff41 33 int32_t SignalPi, SignalWdt, SignalExtCollision;
LtBarbershop 1:3a40c918ff41 34 osThreadId PiControl,WdtFault,ExtCollision;
LtBarbershop 1:3a40c918ff41 35 osThreadDef(PiControlThread, osPriorityNormal, DEFAULT_STACK_SIZE);
LtBarbershop 1:3a40c918ff41 36 osThreadDef(ExtCollisionThread, osPriorityNormal, DEFAULT_STACK_SIZE);
LtBarbershop 1:3a40c918ff41 37 osTimerDef(Wdtimer, Watchdog);
LtBarbershop 1:3a40c918ff41 38
IanTheMBEDMaster 2:1c5cc180812d 39 /* PIN-OUT
IanTheMBEDMaster 2:1c5cc180812d 40
IanTheMBEDMaster 2:1c5cc180812d 41 MOSI Quad Enc 5|-|
IanTheMBEDMaster 2:1c5cc180812d 42 MISO Quad Enc 6|-|
IanTheMBEDMaster 2:1c5cc180812d 43 SCK Quad Enc 7|-|
IanTheMBEDMaster 2:1c5cc180812d 44 SPI Start Quad E 8|-|
IanTheMBEDMaster 2:1c5cc180812d 45 SPI Reset Quad E 9|-|
IanTheMBEDMaster 2:1c5cc180812d 46
IanTheMBEDMaster 2:1c5cc180812d 47 Bluetooth tx 13|-|28
IanTheMBEDMaster 2:1c5cc180812d 48 Bluetooth rx 14|-|27
LtBarbershop 3:9a39e487b724 49 15|-|26 Brake, Right Motor, M1
LtBarbershop 3:9a39e487b724 50 16|-|25 Dir, Right Motor, M1
LtBarbershop 3:9a39e487b724 51 17|-|24 PWM, Right Motor, M1
LtBarbershop 3:9a39e487b724 52 18|-|23 Brake, Left Motor, M2
LtBarbershop 3:9a39e487b724 53 19|-|22 Dir, Left Motor, M2
LtBarbershop 3:9a39e487b724 54 20|-|21 PWM, Left Motor, M2
IanTheMBEDMaster 2:1c5cc180812d 55 */
IanTheMBEDMaster 2:1c5cc180812d 56
IanTheMBEDMaster 2:1c5cc180812d 57 // --- IO Port Configuration
LtBarbershop 1:3a40c918ff41 58 DigitalOut led1(LED1);
LtBarbershop 1:3a40c918ff41 59 DigitalOut led2(LED2);
LtBarbershop 1:3a40c918ff41 60 DigitalOut led3(LED3);
LtBarbershop 1:3a40c918ff41 61 DigitalOut led4(LED4);
LtBarbershop 1:3a40c918ff41 62 DigitalOut dirL(p22);
IanTheMBEDMaster 2:1c5cc180812d 63 DigitalOut brakeL(p23);
IanTheMBEDMaster 2:1c5cc180812d 64 PwmOut PwmL(p21);
IanTheMBEDMaster 2:1c5cc180812d 65 DigitalOut dirR(p25);
IanTheMBEDMaster 2:1c5cc180812d 66 DigitalOut brakeR(p26);
IanTheMBEDMaster 2:1c5cc180812d 67 PwmOut PwmR(p24);
IanTheMBEDMaster 2:1c5cc180812d 68 Serial BluetoothSerial(p13, p14); // (tx, rx) for PC serial channel
LtBarbershop 1:3a40c918ff41 69 Serial pc(USBTX, USBRX); // (tx, rx) for Parani/Promi Bluetooth serial channel
IanTheMBEDMaster 2:1c5cc180812d 70 SPI DE0(p5, p6, p7); // (mosi, miso, sclk) DE0 is the SPI channel with the DE0 FPGA
IanTheMBEDMaster 2:1c5cc180812d 71 DigitalOut SpiReset(p9); // Reset for all devices within the slave SPI peripheral in the DE0 FPGA
IanTheMBEDMaster 2:1c5cc180812d 72 DigitalOut SpiStart(p8); // Places SPI interace on the DE0 FPGA into control mode
IanTheMBEDMaster 2:1c5cc180812d 73 InterruptIn Bumper(p10); // External interrupt pin
LtBarbershop 1:3a40c918ff41 74
LtBarbershop 1:3a40c918ff41 75 Ticker PeriodicInt;
IanTheMBEDMaster 2:1c5cc180812d 76
LtBarbershop 1:3a40c918ff41 77
LtBarbershop 1:3a40c918ff41 78 // ******** Main Thread ********
IanTheMBEDMaster 2:1c5cc180812d 79 int main()
IanTheMBEDMaster 2:1c5cc180812d 80 {
IanTheMBEDMaster 2:1c5cc180812d 81 InitializeSystem();
IanTheMBEDMaster 2:1c5cc180812d 82
IanTheMBEDMaster 2:1c5cc180812d 83 pc.printf("\r\n Robot Initialization Complete \r\n");
IanTheMBEDMaster 2:1c5cc180812d 84
IanTheMBEDMaster 2:1c5cc180812d 85 BluetoothSerial.printf("\n\n\rTap w-a-s-d keys for differential speed control: ");
IanTheMBEDMaster 2:1c5cc180812d 86
IanTheMBEDMaster 2:1c5cc180812d 87 while(1)
IanTheMBEDMaster 2:1c5cc180812d 88 {
LtBarbershop 1:3a40c918ff41 89
IanTheMBEDMaster 2:1c5cc180812d 90 /*if (pc.readable()){
IanTheMBEDMaster 2:1c5cc180812d 91 x=pc.getc();
IanTheMBEDMaster 2:1c5cc180812d 92 pc.putc(x); //Echo keyboard entry
IanTheMBEDMaster 2:1c5cc180812d 93 osTimerStart(OneShot, 2000); // Set the watchdog timer interrupt to 2s.
IanTheMBEDMaster 2:1c5cc180812d 94
IanTheMBEDMaster 2:1c5cc180812d 95 }*/
IanTheMBEDMaster 2:1c5cc180812d 96 if(pc.readable())
LtBarbershop 1:3a40c918ff41 97 {
IanTheMBEDMaster 2:1c5cc180812d 98 pc.printf("\n\r Enter a motor speed (with sign as direction:\n\r");
IanTheMBEDMaster 2:1c5cc180812d 99 pc.scanf("%f", &u1);
IanTheMBEDMaster 2:1c5cc180812d 100 pc.printf("%f", u1);
IanTheMBEDMaster 2:1c5cc180812d 101 /* x=pc.getc();
IanTheMBEDMaster 2:1c5cc180812d 102 if(x=='w')
LtBarbershop 1:3a40c918ff41 103 {
IanTheMBEDMaster 2:1c5cc180812d 104 // increase motor speed
IanTheMBEDMaster 2:1c5cc180812d 105 u1 += 0.02;
IanTheMBEDMaster 2:1c5cc180812d 106 if (u1 > 1)
IanTheMBEDMaster 2:1c5cc180812d 107 {
IanTheMBEDMaster 2:1c5cc180812d 108 u1 = 1;
IanTheMBEDMaster 2:1c5cc180812d 109 }
LtBarbershop 1:3a40c918ff41 110 }
IanTheMBEDMaster 2:1c5cc180812d 111 else if(x=='s')
LtBarbershop 1:3a40c918ff41 112 {
IanTheMBEDMaster 2:1c5cc180812d 113 // u1ecrease motor speed
IanTheMBEDMaster 2:1c5cc180812d 114 u1 -= 0.02;
IanTheMBEDMaster 2:1c5cc180812d 115 if (u1 < 0)
IanTheMBEDMaster 2:1c5cc180812d 116 {
IanTheMBEDMaster 2:1c5cc180812d 117 u1 = 0;
IanTheMBEDMaster 2:1c5cc180812d 118 }
LtBarbershop 1:3a40c918ff41 119 }
IanTheMBEDMaster 2:1c5cc180812d 120 //else if(x=='a') ...
IanTheMBEDMaster 2:1c5cc180812d 121 //else if(x=='d') ...
IanTheMBEDMaster 2:1c5cc180812d 122 */
IanTheMBEDMaster 2:1c5cc180812d 123 }
IanTheMBEDMaster 2:1c5cc180812d 124
IanTheMBEDMaster 2:1c5cc180812d 125 Thread::wait(500); // Wait 500 ms
LtBarbershop 3:9a39e487b724 126
LtBarbershop 3:9a39e487b724 127
LtBarbershop 1:3a40c918ff41 128 }
LtBarbershop 1:3a40c918ff41 129 }
LtBarbershop 1:3a40c918ff41 130
LtBarbershop 1:3a40c918ff41 131 // ******** Control Thread ********
IanTheMBEDMaster 2:1c5cc180812d 132 void PiControlThread(void const *argument)
IanTheMBEDMaster 2:1c5cc180812d 133 {
IanTheMBEDMaster 2:1c5cc180812d 134 while (1)
IanTheMBEDMaster 2:1c5cc180812d 135 {
IanTheMBEDMaster 2:1c5cc180812d 136 osSignalWait(SignalPi, osWaitForever);
IanTheMBEDMaster 2:1c5cc180812d 137 led2= !led2; // Alive status
IanTheMBEDMaster 2:1c5cc180812d 138
IanTheMBEDMaster 2:1c5cc180812d 139 // Read encoder and display results
IanTheMBEDMaster 2:1c5cc180812d 140 ReadEncoder();
IanTheMBEDMaster 2:1c5cc180812d 141
IanTheMBEDMaster 2:1c5cc180812d 142 SetLeftMotorSpeed(u1);
LtBarbershop 3:9a39e487b724 143 SetRightMotorSpeed(u1);
IanTheMBEDMaster 2:1c5cc180812d 144 }
IanTheMBEDMaster 2:1c5cc180812d 145 }
LtBarbershop 1:3a40c918ff41 146
LtBarbershop 1:3a40c918ff41 147 // ******** Collision Thread ********
IanTheMBEDMaster 2:1c5cc180812d 148 void ExtCollisionThread(void const *argument)
IanTheMBEDMaster 2:1c5cc180812d 149 {
IanTheMBEDMaster 2:1c5cc180812d 150 while (1)
IanTheMBEDMaster 2:1c5cc180812d 151 {
IanTheMBEDMaster 2:1c5cc180812d 152 osSignalWait(SignalExtCollision, osWaitForever);
IanTheMBEDMaster 2:1c5cc180812d 153 led4 = !led4;
LtBarbershop 1:3a40c918ff41 154 }
LtBarbershop 1:3a40c918ff41 155 }
LtBarbershop 1:3a40c918ff41 156
LtBarbershop 1:3a40c918ff41 157 // ******** Watchdog Interrupt Handler ********
IanTheMBEDMaster 2:1c5cc180812d 158 void Watchdog(void const *n)
IanTheMBEDMaster 2:1c5cc180812d 159 {
LtBarbershop 1:3a40c918ff41 160 led3=1;
LtBarbershop 3:9a39e487b724 161 pc.printf("\n\r Watchdog Timeout! Oh Shit!\n\r");
LtBarbershop 1:3a40c918ff41 162 }
LtBarbershop 1:3a40c918ff41 163
LtBarbershop 1:3a40c918ff41 164 // ******** Period Timer Interrupt Handler ********
IanTheMBEDMaster 2:1c5cc180812d 165 void PiControllerISR(void)
IanTheMBEDMaster 2:1c5cc180812d 166 {
LtBarbershop 1:3a40c918ff41 167 osSignalSet(PiControl,0x1);
IanTheMBEDMaster 2:1c5cc180812d 168 }
LtBarbershop 1:3a40c918ff41 169
LtBarbershop 1:3a40c918ff41 170 // ******** Collision Interrupt Handler ********
LtBarbershop 1:3a40c918ff41 171 void ExtCollisionISR(void)
LtBarbershop 1:3a40c918ff41 172 {
LtBarbershop 1:3a40c918ff41 173 osSignalSet(ExtCollision,0x1);
LtBarbershop 1:3a40c918ff41 174 }
LtBarbershop 1:3a40c918ff41 175
IanTheMBEDMaster 2:1c5cc180812d 176 // --- Initialization Functions
IanTheMBEDMaster 2:1c5cc180812d 177 void InitializeSystem()
IanTheMBEDMaster 2:1c5cc180812d 178 {
IanTheMBEDMaster 2:1c5cc180812d 179 led3=0;
IanTheMBEDMaster 2:1c5cc180812d 180 led4=0;
IanTheMBEDMaster 2:1c5cc180812d 181
IanTheMBEDMaster 2:1c5cc180812d 182 Bumper.rise(&ExtCollisionISR); // Atach the address of the interrupt handler to the rising edge of Bumper
IanTheMBEDMaster 2:1c5cc180812d 183
IanTheMBEDMaster 2:1c5cc180812d 184 // Start execution of the Threads
IanTheMBEDMaster 2:1c5cc180812d 185 PiControl = osThreadCreate(osThread(PiControlThread), NULL);
IanTheMBEDMaster 2:1c5cc180812d 186 ExtCollision = osThreadCreate(osThread(ExtCollisionThread), NULL);
IanTheMBEDMaster 2:1c5cc180812d 187 osTimerId OneShot = osTimerCreate(osTimer(Wdtimer), osTimerOnce, (void *)0);
LtBarbershop 3:9a39e487b724 188 PeriodicInt.attach(&PiControllerISR, 1); // Specify address of the TimerISR (Ticker) function and the interval between interrupts
IanTheMBEDMaster 2:1c5cc180812d 189
IanTheMBEDMaster 2:1c5cc180812d 190 InitializeEncoder();
IanTheMBEDMaster 2:1c5cc180812d 191 }
IanTheMBEDMaster 2:1c5cc180812d 192
IanTheMBEDMaster 2:1c5cc180812d 193 void InitializePWM()
IanTheMBEDMaster 2:1c5cc180812d 194 {
IanTheMBEDMaster 2:1c5cc180812d 195
IanTheMBEDMaster 2:1c5cc180812d 196 }
IanTheMBEDMaster 2:1c5cc180812d 197
IanTheMBEDMaster 2:1c5cc180812d 198 void InitializeEncoder()
IanTheMBEDMaster 2:1c5cc180812d 199 {
IanTheMBEDMaster 2:1c5cc180812d 200 // Initialization – to be executed once (normally)
IanTheMBEDMaster 2:1c5cc180812d 201 DE0.format(16,0); // SPI format: 16-bit words, mode 0 protocol.
IanTheMBEDMaster 2:1c5cc180812d 202 SpiStart = 0;
IanTheMBEDMaster 2:1c5cc180812d 203 SpiReset = 1;
IanTheMBEDMaster 2:1c5cc180812d 204 wait_us(10);
IanTheMBEDMaster 2:1c5cc180812d 205 SpiReset = 0;
IanTheMBEDMaster 2:1c5cc180812d 206 DE0.write(0x8004); // SPI slave control word to read (only) 4-word transactions
IanTheMBEDMaster 2:1c5cc180812d 207 // starting at base address 0 within the peripheral.
IanTheMBEDMaster 2:1c5cc180812d 208 }
IanTheMBEDMaster 2:1c5cc180812d 209
IanTheMBEDMaster 2:1c5cc180812d 210
IanTheMBEDMaster 2:1c5cc180812d 211 // --- Other Functions
IanTheMBEDMaster 2:1c5cc180812d 212 void SetLeftMotorSpeed(float u)
LtBarbershop 1:3a40c918ff41 213 {
IanTheMBEDMaster 2:1c5cc180812d 214 float T;
IanTheMBEDMaster 2:1c5cc180812d 215 float d;
IanTheMBEDMaster 2:1c5cc180812d 216 float onTime;
IanTheMBEDMaster 2:1c5cc180812d 217
LtBarbershop 3:9a39e487b724 218 // bound the input
LtBarbershop 3:9a39e487b724 219 if (u > 1)
LtBarbershop 3:9a39e487b724 220 {
LtBarbershop 3:9a39e487b724 221 u = 1;
LtBarbershop 3:9a39e487b724 222 }
LtBarbershop 3:9a39e487b724 223
LtBarbershop 3:9a39e487b724 224 if (u < -1)
LtBarbershop 3:9a39e487b724 225 {
LtBarbershop 3:9a39e487b724 226 u = -1;
LtBarbershop 3:9a39e487b724 227 }
LtBarbershop 3:9a39e487b724 228
LtBarbershop 3:9a39e487b724 229 // calculate duty cycle timing
IanTheMBEDMaster 2:1c5cc180812d 230 T = PWMPeriod;
IanTheMBEDMaster 2:1c5cc180812d 231 d = abs(u);
IanTheMBEDMaster 2:1c5cc180812d 232 onTime = d * T;
IanTheMBEDMaster 2:1c5cc180812d 233
IanTheMBEDMaster 2:1c5cc180812d 234 PwmL.period(T);
IanTheMBEDMaster 2:1c5cc180812d 235 PwmL.pulsewidth(onTime);
IanTheMBEDMaster 2:1c5cc180812d 236
IanTheMBEDMaster 2:1c5cc180812d 237 if (u > 0)
IanTheMBEDMaster 2:1c5cc180812d 238 {
IanTheMBEDMaster 2:1c5cc180812d 239 dirL = 1;
IanTheMBEDMaster 2:1c5cc180812d 240 }
IanTheMBEDMaster 2:1c5cc180812d 241 else
IanTheMBEDMaster 2:1c5cc180812d 242 {
IanTheMBEDMaster 2:1c5cc180812d 243 dirL = 0;
IanTheMBEDMaster 2:1c5cc180812d 244 }
IanTheMBEDMaster 2:1c5cc180812d 245 }
LtBarbershop 1:3a40c918ff41 246
IanTheMBEDMaster 2:1c5cc180812d 247 void SetRightMotorSpeed(float u)
IanTheMBEDMaster 2:1c5cc180812d 248 {
IanTheMBEDMaster 2:1c5cc180812d 249 float T;
IanTheMBEDMaster 2:1c5cc180812d 250 float d;
IanTheMBEDMaster 2:1c5cc180812d 251 float onTime;
IanTheMBEDMaster 2:1c5cc180812d 252
LtBarbershop 3:9a39e487b724 253 // bound the input
LtBarbershop 3:9a39e487b724 254 if (u > 1)
LtBarbershop 3:9a39e487b724 255 {
LtBarbershop 3:9a39e487b724 256 u = 1;
LtBarbershop 3:9a39e487b724 257 }
LtBarbershop 3:9a39e487b724 258
LtBarbershop 3:9a39e487b724 259 if (u < -1)
LtBarbershop 3:9a39e487b724 260 {
LtBarbershop 3:9a39e487b724 261 u = -1;
LtBarbershop 3:9a39e487b724 262 }
LtBarbershop 3:9a39e487b724 263
LtBarbershop 3:9a39e487b724 264 // calculate duty cycle timing
IanTheMBEDMaster 2:1c5cc180812d 265 T = PWMPeriod;
IanTheMBEDMaster 2:1c5cc180812d 266 d = abs(u);
IanTheMBEDMaster 2:1c5cc180812d 267 onTime = d * T;
IanTheMBEDMaster 2:1c5cc180812d 268
IanTheMBEDMaster 2:1c5cc180812d 269 PwmR.period(T);
IanTheMBEDMaster 2:1c5cc180812d 270 PwmR.pulsewidth(onTime);
IanTheMBEDMaster 2:1c5cc180812d 271
IanTheMBEDMaster 2:1c5cc180812d 272 if (u > 0)
IanTheMBEDMaster 2:1c5cc180812d 273 {
IanTheMBEDMaster 2:1c5cc180812d 274 dirR = 1;
IanTheMBEDMaster 2:1c5cc180812d 275 }
IanTheMBEDMaster 2:1c5cc180812d 276 else
IanTheMBEDMaster 2:1c5cc180812d 277 {
IanTheMBEDMaster 2:1c5cc180812d 278 dirR = 0;
IanTheMBEDMaster 2:1c5cc180812d 279 }
LtBarbershop 1:3a40c918ff41 280 }
LtBarbershop 1:3a40c918ff41 281
LtBarbershop 1:3a40c918ff41 282 void ReadEncoder()
LtBarbershop 1:3a40c918ff41 283 {
LtBarbershop 3:9a39e487b724 284 //int dPositionRight, dTimeRight, dPositionLeft, dTimeLeft;
LtBarbershop 1:3a40c918ff41 285
LtBarbershop 1:3a40c918ff41 286 // May be executed in a loop
LtBarbershop 1:3a40c918ff41 287 dPositionRight = DE0.write(Dummy); // Read QEI-0 position register
LtBarbershop 1:3a40c918ff41 288 dTimeRight = DE0.write(Dummy); // Read QE-0 time interval register
LtBarbershop 1:3a40c918ff41 289 dPositionLeft = DE0.write(Dummy); // Read QEI-1 position register
LtBarbershop 1:3a40c918ff41 290 dTimeLeft = DE0.write(Dummy); // Read QEI-1 time interval register
IanTheMBEDMaster 2:1c5cc180812d 291
IanTheMBEDMaster 2:1c5cc180812d 292 // simply write out the results for now
LtBarbershop 3:9a39e487b724 293
IanTheMBEDMaster 2:1c5cc180812d 294 pc.printf("Left Position: %d \n\r", dPositionLeft);
IanTheMBEDMaster 2:1c5cc180812d 295 pc.printf("Left Time: %d \n\r", dTimeLeft);
IanTheMBEDMaster 2:1c5cc180812d 296 pc.printf("Right Position: %d \n\r", dPositionRight);
IanTheMBEDMaster 2:1c5cc180812d 297 pc.printf("Right Time: %d \n\n\r", dTimeRight);
LtBarbershop 3:9a39e487b724 298
IanTheMBEDMaster 2:1c5cc180812d 299 }