silver kuusik / Mbed 2 deprecated Protocol

Dependencies:   mbed

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?

UserRevisionLine numberNew 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