Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@1:6e34363efa95, 2011-09-17 (annotated)
- Committer:
- silbo
- Date:
- Sat Sep 17 09:11:16 2011 +0000
- Revision:
- 1:6e34363efa95
- Parent:
- 0:3cbe4eec57ae
new revision
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| silbo | 0:3cbe4eec57ae | 1 | #include "mbed.h" |
| silbo | 0:3cbe4eec57ae | 2 | |
| silbo | 1:6e34363efa95 | 3 | #define VERSION "0.0.2" |
| silbo | 1:6e34363efa95 | 4 | |
| silbo | 0:3cbe4eec57ae | 5 | DigitalOut motor1A(p9); |
| silbo | 0:3cbe4eec57ae | 6 | DigitalOut motor1B(p10); |
| silbo | 0:3cbe4eec57ae | 7 | DigitalOut motor2A(p11); |
| silbo | 0:3cbe4eec57ae | 8 | DigitalOut motor2B(p12); |
| silbo | 0:3cbe4eec57ae | 9 | DigitalOut motor3A(p13); |
| silbo | 0:3cbe4eec57ae | 10 | DigitalOut motor3B(p14); |
| silbo | 0:3cbe4eec57ae | 11 | DigitalOut motor4A(p15); |
| silbo | 0:3cbe4eec57ae | 12 | DigitalOut motor4B(p16); |
| silbo | 0:3cbe4eec57ae | 13 | |
| silbo | 0:3cbe4eec57ae | 14 | PwmOut motor1(p21); |
| silbo | 0:3cbe4eec57ae | 15 | PwmOut motor2(p22); |
| silbo | 0:3cbe4eec57ae | 16 | PwmOut motor3(p23); |
| silbo | 0:3cbe4eec57ae | 17 | PwmOut motor4(p24); |
| silbo | 0:3cbe4eec57ae | 18 | |
| silbo | 1:6e34363efa95 | 19 | DigitalOut digital1(p17); |
| silbo | 1:6e34363efa95 | 20 | DigitalOut digital2(p18); |
| silbo | 1:6e34363efa95 | 21 | DigitalOut digital3(p19); |
| silbo | 1:6e34363efa95 | 22 | DigitalOut digital4(p20); |
| silbo | 1:6e34363efa95 | 23 | DigitalOut led(LED1); |
| silbo | 1:6e34363efa95 | 24 | |
| silbo | 1:6e34363efa95 | 25 | SPI spi(p5, p6, p7); // mosi(out), miso(in), sclk(clock) |
| silbo | 1:6e34363efa95 | 26 | DigitalOut cs(p8); // cs(select) |
| silbo | 0:3cbe4eec57ae | 27 | |
| silbo | 0:3cbe4eec57ae | 28 | Serial pc(USBTX, USBRX); |
| silbo | 1:6e34363efa95 | 29 | // for latency calculation and transmission count |
| silbo | 1:6e34363efa95 | 30 | Timer timer; |
| silbo | 1:6e34363efa95 | 31 | unsigned long a, temp, count; |
| silbo | 1:6e34363efa95 | 32 | // for enableing disableing autosending sensor values |
| silbo | 1:6e34363efa95 | 33 | bool autosend; |
| silbo | 1:6e34363efa95 | 34 | // the analog sensor values for ADC |
| silbo | 1:6e34363efa95 | 35 | volatile uint8_t* values; |
| silbo | 1:6e34363efa95 | 36 | volatile uint8_t* location; |
| silbo | 1:6e34363efa95 | 37 | // the serial message buffer |
| silbo | 1:6e34363efa95 | 38 | volatile char command[3]; |
| silbo | 1:6e34363efa95 | 39 | volatile int index; |
| silbo | 0:3cbe4eec57ae | 40 | |
| silbo | 0:3cbe4eec57ae | 41 | // maps the value x to a new given range |
| silbo | 1:6e34363efa95 | 42 | double map(double x, double in_min, double in_max, double out_min, double out_max) |
| silbo | 1:6e34363efa95 | 43 | { |
| silbo | 1:6e34363efa95 | 44 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
| silbo | 0:3cbe4eec57ae | 45 | } |
| silbo | 0:3cbe4eec57ae | 46 | |
| silbo | 1:6e34363efa95 | 47 | // shifts 2 8 bit bytes into one integer |
| silbo | 1:6e34363efa95 | 48 | int getIntValue( uint8_t high, uint8_t low ) |
| silbo | 1:6e34363efa95 | 49 | { |
| silbo | 1:6e34363efa95 | 50 | return (high << 8) | low; |
| silbo | 0:3cbe4eec57ae | 51 | } |
| silbo | 0:3cbe4eec57ae | 52 | |
| silbo | 0:3cbe4eec57ae | 53 | // sets the given pwm value |
| silbo | 1:6e34363efa95 | 54 | void setPWM(int value, PwmOut pwm, DigitalOut a, DigitalOut b) |
| silbo | 1:6e34363efa95 | 55 | { |
| silbo | 0:3cbe4eec57ae | 56 | // block the motors |
| silbo | 1:6e34363efa95 | 57 | if (value > 511) { |
| silbo | 0:3cbe4eec57ae | 58 | a = 0; |
| silbo | 0:3cbe4eec57ae | 59 | b = 0; |
| silbo | 0:3cbe4eec57ae | 60 | pwm = 1; |
| silbo | 0:3cbe4eec57ae | 61 | } else { |
| silbo | 0:3cbe4eec57ae | 62 | // clockwise run |
| silbo | 1:6e34363efa95 | 63 | if (value > 255) { |
| silbo | 0:3cbe4eec57ae | 64 | value = value - 256; |
| silbo | 0:3cbe4eec57ae | 65 | a = 0; |
| silbo | 0:3cbe4eec57ae | 66 | b = 1; |
| silbo | 0:3cbe4eec57ae | 67 | } else { |
| silbo | 0:3cbe4eec57ae | 68 | a = 1; |
| silbo | 0:3cbe4eec57ae | 69 | b = 0; |
| silbo | 0:3cbe4eec57ae | 70 | } |
| silbo | 0:3cbe4eec57ae | 71 | // map the 0-255 value to 0-1 |
| silbo | 1:6e34363efa95 | 72 | pwm = map(value, 0, 255, 0, 1); |
| silbo | 0:3cbe4eec57ae | 73 | } |
| silbo | 0:3cbe4eec57ae | 74 | } |
| silbo | 0:3cbe4eec57ae | 75 | |
| silbo | 0:3cbe4eec57ae | 76 | // specifies the action for the user input |
| silbo | 1:6e34363efa95 | 77 | void specifyAction(char action, int value) |
| silbo | 1:6e34363efa95 | 78 | { |
| silbo | 0:3cbe4eec57ae | 79 | // specify the action |
| silbo | 1:6e34363efa95 | 80 | switch (action) { |
| silbo | 1:6e34363efa95 | 81 | case 40: |
| silbo | 1:6e34363efa95 | 82 | // print the version of this software |
| silbo | 1:6e34363efa95 | 83 | pc.printf("%s",VERSION); |
| silbo | 1:6e34363efa95 | 84 | pc.putc(255); |
| silbo | 1:6e34363efa95 | 85 | break; |
| silbo | 1:6e34363efa95 | 86 | case 41: |
| silbo | 1:6e34363efa95 | 87 | // enable or disable autosending sensor values |
| silbo | 1:6e34363efa95 | 88 | autosend = value; |
| silbo | 1:6e34363efa95 | 89 | break; |
| silbo | 1:6e34363efa95 | 90 | case 42: |
| silbo | 1:6e34363efa95 | 91 | // send last command latency |
| silbo | 1:6e34363efa95 | 92 | pc.putc(temp >> 8); |
| silbo | 1:6e34363efa95 | 93 | pc.putc(temp); |
| silbo | 1:6e34363efa95 | 94 | // the end of the message |
| silbo | 1:6e34363efa95 | 95 | pc.putc(255); |
| silbo | 0:3cbe4eec57ae | 96 | case 44: |
| silbo | 0:3cbe4eec57ae | 97 | // print the analogs and digitals |
| silbo | 1:6e34363efa95 | 98 | // the sensor reading checksum |
| silbo | 1:6e34363efa95 | 99 | char checksum = 0; |
| silbo | 1:6e34363efa95 | 100 | // restart pointer |
| silbo | 0:3cbe4eec57ae | 101 | values = location; |
| silbo | 1:6e34363efa95 | 102 | // print analog sensor values |
| silbo | 1:6e34363efa95 | 103 | for(int i = 0; i < 16; i++) { |
| silbo | 1:6e34363efa95 | 104 | pc.putc(*(values)); |
| silbo | 1:6e34363efa95 | 105 | // add analog sensor to the checksum |
| silbo | 1:6e34363efa95 | 106 | checksum ^= *(values++); |
| silbo | 0:3cbe4eec57ae | 107 | } |
| silbo | 1:6e34363efa95 | 108 | // add digital sensors to the checksum |
| silbo | 1:6e34363efa95 | 109 | checksum ^= '\0'; |
| silbo | 1:6e34363efa95 | 110 | // print digital sensor values |
| silbo | 1:6e34363efa95 | 111 | pc.putc('\0'); |
| silbo | 1:6e34363efa95 | 112 | // print checksum |
| silbo | 1:6e34363efa95 | 113 | pc.putc(checksum); |
| silbo | 1:6e34363efa95 | 114 | // print last latency value |
| silbo | 1:6e34363efa95 | 115 | pc.putc(temp >> 8); |
| silbo | 1:6e34363efa95 | 116 | pc.putc(temp); |
| silbo | 1:6e34363efa95 | 117 | // send packet count |
| silbo | 1:6e34363efa95 | 118 | count++; |
| silbo | 1:6e34363efa95 | 119 | pc.putc(count >> 16); |
| silbo | 1:6e34363efa95 | 120 | pc.putc(count >> 8); |
| silbo | 1:6e34363efa95 | 121 | pc.putc(count); |
| silbo | 1:6e34363efa95 | 122 | // the end of the message |
| silbo | 1:6e34363efa95 | 123 | pc.putc(255); |
| silbo | 0:3cbe4eec57ae | 124 | break; |
| silbo | 0:3cbe4eec57ae | 125 | case 162: |
| silbo | 0:3cbe4eec57ae | 126 | // set the first PWMs value |
| silbo | 1:6e34363efa95 | 127 | setPWM(value, motor1, motor1A, motor1B); |
| silbo | 0:3cbe4eec57ae | 128 | break; |
| silbo | 0:3cbe4eec57ae | 129 | case 163: |
| silbo | 0:3cbe4eec57ae | 130 | // set the second PWMs value |
| silbo | 1:6e34363efa95 | 131 | setPWM(value, motor2, motor2A, motor2B); |
| silbo | 0:3cbe4eec57ae | 132 | break; |
| silbo | 0:3cbe4eec57ae | 133 | case 164: |
| silbo | 0:3cbe4eec57ae | 134 | // set the third PWMs value |
| silbo | 1:6e34363efa95 | 135 | setPWM(value, motor3, motor3A, motor3B); |
| silbo | 0:3cbe4eec57ae | 136 | break; |
| silbo | 0:3cbe4eec57ae | 137 | case 165: |
| silbo | 0:3cbe4eec57ae | 138 | // set the fourth PWMs value |
| silbo | 1:6e34363efa95 | 139 | setPWM(value, motor4, motor4A, motor4B); |
| silbo | 0:3cbe4eec57ae | 140 | break; |
| silbo | 0:3cbe4eec57ae | 141 | case 230: |
| silbo | 0:3cbe4eec57ae | 142 | // Goto _reset ? |
| silbo | 0:3cbe4eec57ae | 143 | break; |
| silbo | 0:3cbe4eec57ae | 144 | case 231: |
| silbo | 0:3cbe4eec57ae | 145 | // enable or disable servos |
| silbo | 1:6e34363efa95 | 146 | if (value == 1) { |
| silbo | 0:3cbe4eec57ae | 147 | // enable servo ? |
| silbo | 1:6e34363efa95 | 148 | } else if (value == 2) { |
| silbo | 0:3cbe4eec57ae | 149 | // disable servo ? |
| silbo | 0:3cbe4eec57ae | 150 | } |
| silbo | 0:3cbe4eec57ae | 151 | break; |
| silbo | 0:3cbe4eec57ae | 152 | case 233: |
| silbo | 0:3cbe4eec57ae | 153 | // set digitals values |
| silbo | 1:6e34363efa95 | 154 | digital1 = (value & 1); |
| silbo | 1:6e34363efa95 | 155 | digital2 = ((value >> 1) & 1); |
| silbo | 1:6e34363efa95 | 156 | digital3 = ((value >> 2) & 1); |
| silbo | 1:6e34363efa95 | 157 | digital4 = ((value >> 3) & 1); |
| silbo | 0:3cbe4eec57ae | 158 | break; |
| silbo | 0:3cbe4eec57ae | 159 | default: |
| silbo | 1:6e34363efa95 | 160 | pc.printf("unspecified command\n"); |
| silbo | 0:3cbe4eec57ae | 161 | } |
| silbo | 0:3cbe4eec57ae | 162 | } |
| silbo | 0:3cbe4eec57ae | 163 | |
| silbo | 1:6e34363efa95 | 164 | // for reading external ADC values |
| silbo | 1:6e34363efa95 | 165 | int readSensor(int channel, DigitalOut select) |
| silbo | 1:6e34363efa95 | 166 | { |
| silbo | 0:3cbe4eec57ae | 167 | // sending the 5 bits + 2 bits to ignore the null bits |
| silbo | 0:3cbe4eec57ae | 168 | // coming from the device, so the data that is sent is 11000101 |
| silbo | 0:3cbe4eec57ae | 169 | uint8_t commandbits = 0xC0; |
| silbo | 1:6e34363efa95 | 170 | commandbits |= (channel << 2); |
| silbo | 1:6e34363efa95 | 171 | |
| silbo | 1:6e34363efa95 | 172 | // select the device |
| silbo | 1:6e34363efa95 | 173 | select = 0; |
| silbo | 1:6e34363efa95 | 174 | // send command bits |
| silbo | 1:6e34363efa95 | 175 | spi.write(commandbits); |
| silbo | 0:3cbe4eec57ae | 176 | // now the device sends back the readings 12 bits, 7 bits at a time |
| silbo | 0:3cbe4eec57ae | 177 | uint8_t high = spi.write(0x0); |
| silbo | 0:3cbe4eec57ae | 178 | uint8_t low = spi.write(0x0); |
| silbo | 0:3cbe4eec57ae | 179 | low = low >> 2; |
| silbo | 0:3cbe4eec57ae | 180 | |
| silbo | 0:3cbe4eec57ae | 181 | // shift to get the high and low byte |
| silbo | 1:6e34363efa95 | 182 | high = (high >> 3); |
| silbo | 1:6e34363efa95 | 183 | low = ( high << 5) | low; |
| silbo | 0:3cbe4eec57ae | 184 | |
| silbo | 0:3cbe4eec57ae | 185 | // deselect the device |
| silbo | 0:3cbe4eec57ae | 186 | select = 1; |
| silbo | 0:3cbe4eec57ae | 187 | |
| silbo | 0:3cbe4eec57ae | 188 | // save the values |
| silbo | 0:3cbe4eec57ae | 189 | *(values++) = high; |
| silbo | 0:3cbe4eec57ae | 190 | *(values++) = low; |
| silbo | 0:3cbe4eec57ae | 191 | |
| silbo | 0:3cbe4eec57ae | 192 | return 0; |
| silbo | 0:3cbe4eec57ae | 193 | } |
| silbo | 0:3cbe4eec57ae | 194 | |
| silbo | 1:6e34363efa95 | 195 | // serial interrupt method |
| silbo | 1:6e34363efa95 | 196 | void serialEvent() |
| silbo | 1:6e34363efa95 | 197 | { |
| silbo | 1:6e34363efa95 | 198 | // if we are getting a new message |
| silbo | 1:6e34363efa95 | 199 | if(!index) { |
| silbo | 1:6e34363efa95 | 200 | // mark the time |
| silbo | 1:6e34363efa95 | 201 | a = timer.read_us(); |
| silbo | 1:6e34363efa95 | 202 | } |
| silbo | 0:3cbe4eec57ae | 203 | char c = pc.getc(); |
| silbo | 0:3cbe4eec57ae | 204 | // if we received enter |
| silbo | 1:6e34363efa95 | 205 | if( c == 255 ) { |
| silbo | 1:6e34363efa95 | 206 | specifyAction(command[ 0 ], getIntValue(command[ 1 ], command[ 2 ])); |
| silbo | 1:6e34363efa95 | 207 | index = 0; |
| silbo | 1:6e34363efa95 | 208 | // calculate the latency |
| silbo | 1:6e34363efa95 | 209 | temp = timer.read_us() - a; |
| silbo | 0:3cbe4eec57ae | 210 | } |
| silbo | 1:6e34363efa95 | 211 | // otherwise add byte to buffer |
| silbo | 0:3cbe4eec57ae | 212 | else { |
| silbo | 1:6e34363efa95 | 213 | command[index++] = c; |
| silbo | 0:3cbe4eec57ae | 214 | } |
| silbo | 0:3cbe4eec57ae | 215 | } |
| silbo | 0:3cbe4eec57ae | 216 | |
| silbo | 0:3cbe4eec57ae | 217 | // the main method |
| silbo | 1:6e34363efa95 | 218 | int main() |
| silbo | 1:6e34363efa95 | 219 | { |
| silbo | 0:3cbe4eec57ae | 220 | // Setup the spi for 7 bit data, high steady state clock, |
| silbo | 0:3cbe4eec57ae | 221 | // second edge capture, with a 1MHz clock rate |
| silbo | 0:3cbe4eec57ae | 222 | spi.format(7,0); |
| silbo | 0:3cbe4eec57ae | 223 | spi.frequency(1000000); |
| silbo | 0:3cbe4eec57ae | 224 | |
| silbo | 1:6e34363efa95 | 225 | // specify the usb baud rate |
| silbo | 1:6e34363efa95 | 226 | pc.baud(115200); |
| silbo | 0:3cbe4eec57ae | 227 | |
| silbo | 0:3cbe4eec57ae | 228 | // allocate 16 bytes of space for the adc values |
| silbo | 0:3cbe4eec57ae | 229 | values = (uint8_t*) malloc(16); |
| silbo | 0:3cbe4eec57ae | 230 | // remember the first values aadress |
| silbo | 0:3cbe4eec57ae | 231 | location = values; |
| silbo | 0:3cbe4eec57ae | 232 | |
| silbo | 0:3cbe4eec57ae | 233 | // attach a serial interrupt |
| silbo | 1:6e34363efa95 | 234 | pc.attach(&serialEvent); |
| silbo | 0:3cbe4eec57ae | 235 | |
| silbo | 0:3cbe4eec57ae | 236 | // to indicate programm is running |
| silbo | 0:3cbe4eec57ae | 237 | led = 1; |
| silbo | 0:3cbe4eec57ae | 238 | |
| silbo | 1:6e34363efa95 | 239 | timer.start(); |
| silbo | 0:3cbe4eec57ae | 240 | // endless loop |
| silbo | 1:6e34363efa95 | 241 | while (true) { |
| silbo | 0:3cbe4eec57ae | 242 | values = location; |
| silbo | 1:6e34363efa95 | 243 | for (int i=0; i<8; i++) { |
| silbo | 1:6e34363efa95 | 244 | readSensor(i, cs); |
| silbo | 0:3cbe4eec57ae | 245 | } |
| silbo | 1:6e34363efa95 | 246 | if(autosend) |
| silbo | 1:6e34363efa95 | 247 | specifyAction(44,0); |
| silbo | 0:3cbe4eec57ae | 248 | } |
| silbo | 0:3cbe4eec57ae | 249 | } |
| silbo | 0:3cbe4eec57ae | 250 |