Working firmware for simultaneous LiDAR and Magnetometer data retrieval over ethernet.

Dependencies:   EthernetInterface FXOS8700Q LidarLite mbed-rtos mbed

Committer:
jakelarsen17
Date:
Thu Dec 10 17:45:30 2015 +0000
Revision:
0:ade62dde274b
Working firmware for simultaneous LiDAR and Magnetometer data retrieval over ethernet.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jakelarsen17 0:ade62dde274b 1 /*
jakelarsen17 0:ade62dde274b 2 #include "mbed.h"
jakelarsen17 0:ade62dde274b 3
jakelarsen17 0:ade62dde274b 4 DigitalOut gpo(D0);
jakelarsen17 0:ade62dde274b 5 DigitalOut led(LED_RED);
jakelarsen17 0:ade62dde274b 6
jakelarsen17 0:ade62dde274b 7 int main()
jakelarsen17 0:ade62dde274b 8 {
jakelarsen17 0:ade62dde274b 9 while (true) {
jakelarsen17 0:ade62dde274b 10 gpo = !gpo; // toggle pin
jakelarsen17 0:ade62dde274b 11 led = !led; // toggle led
jakelarsen17 0:ade62dde274b 12 wait(0.2f);
jakelarsen17 0:ade62dde274b 13 }
jakelarsen17 0:ade62dde274b 14 }
jakelarsen17 0:ade62dde274b 15 */
jakelarsen17 0:ade62dde274b 16
jakelarsen17 0:ade62dde274b 17 // MalletFirmware, this is the real deal version
jakelarsen17 0:ade62dde274b 18 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
jakelarsen17 0:ade62dde274b 19 *
jakelarsen17 0:ade62dde274b 20 * Pinout for FRDM-k64f
jakelarsen17 0:ade62dde274b 21 * J2
jakelarsen17 0:ade62dde274b 22 * X X
jakelarsen17 0:ade62dde274b 23 * X X
jakelarsen17 0:ade62dde274b 24 * X X
jakelarsen17 0:ade62dde274b 25 * J3 X X GND
jakelarsen17 0:ade62dde274b 26 * X X X X SCLK
jakelarsen17 0:ade62dde274b 27 * X X X X MISO
jakelarsen17 0:ade62dde274b 28 * X X X X MOSI
jakelarsen17 0:ade62dde274b 29 * X X X X CS
jakelarsen17 0:ade62dde274b 30 * X X GND X X
jakelarsen17 0:ade62dde274b 31 * GND X X X X
jakelarsen17 0:ade62dde274b 32 * GND X X
jakelarsen17 0:ade62dde274b 33 * 5Vin X X J1
jakelarsen17 0:ade62dde274b 34 * X X
jakelarsen17 0:ade62dde274b 35 * J4 X X motorA
jakelarsen17 0:ade62dde274b 36 * X X X X motorB
jakelarsen17 0:ade62dde274b 37 * mic1 X X X X
jakelarsen17 0:ade62dde274b 38 * mic2 X X X X
jakelarsen17 0:ade62dde274b 39 * X X X X
jakelarsen17 0:ade62dde274b 40 * X X quadA X X
jakelarsen17 0:ade62dde274b 41 * X X quadB X X Painter 1
jakelarsen17 0:ade62dde274b 42 *
jakelarsen17 0:ade62dde274b 43 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
jakelarsen17 0:ade62dde274b 44
jakelarsen17 0:ade62dde274b 45 #include "mbed.h"
jakelarsen17 0:ade62dde274b 46 #include <string>
jakelarsen17 0:ade62dde274b 47
jakelarsen17 0:ade62dde274b 48 //LiDAR
jakelarsen17 0:ade62dde274b 49 #include "LidarLite.h"
jakelarsen17 0:ade62dde274b 50 #define LIDARLite1_SDA PTC11 //SDA pin
jakelarsen17 0:ade62dde274b 51 #define LIDARLite1_SCL PTC10 //SCL pin
jakelarsen17 0:ade62dde274b 52
jakelarsen17 0:ade62dde274b 53 //Magnetometer
jakelarsen17 0:ade62dde274b 54 #include "FXOS8700Q.h"
jakelarsen17 0:ade62dde274b 55 FXOS8700Q_mag mag( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board
jakelarsen17 0:ade62dde274b 56 MotionSensorDataUnits mag_data;
jakelarsen17 0:ade62dde274b 57 MotionSensorDataCounts mag_raw;
jakelarsen17 0:ade62dde274b 58
jakelarsen17 0:ade62dde274b 59 // Hardware delays
jakelarsen17 0:ade62dde274b 60 #include "pause.cpp"
jakelarsen17 0:ade62dde274b 61
jakelarsen17 0:ade62dde274b 62 // Ethernet
jakelarsen17 0:ade62dde274b 63 #include "EthernetInterface.h"
jakelarsen17 0:ade62dde274b 64
jakelarsen17 0:ade62dde274b 65 #include <stdio.h>
jakelarsen17 0:ade62dde274b 66 #include "PeripheralNames.h"
jakelarsen17 0:ade62dde274b 67 #include "PeripheralPins.h"
jakelarsen17 0:ade62dde274b 68
jakelarsen17 0:ade62dde274b 69 // Settings for each mallet
jakelarsen17 0:ade62dde274b 70 #define NUM 9 // this number identifies the mallet and is a value between 1-7, (8 or 9 for the painters)
jakelarsen17 0:ade62dde274b 71 #define PORT (55000+NUM) // set to a random port number. All the mallets can use the same port number.
jakelarsen17 0:ade62dde274b 72 #define MAX_CLIENTS 2 // set the max number of clients to at least 2 (first client is MATLAB, second is the distance unit)
jakelarsen17 0:ade62dde274b 73 #define DEBUG 0 // '1' enables debug statements printed through serial port at baud 230400, '0' disables
jakelarsen17 0:ade62dde274b 74
jakelarsen17 0:ade62dde274b 75 // Ethernet
jakelarsen17 0:ade62dde274b 76 #define LEN_PACKET 1460
jakelarsen17 0:ade62dde274b 77 //#define N_PACKET (TOTAL_SAMPLES/LEN_PACKET)
jakelarsen17 0:ade62dde274b 78 #define GATEWAY "169.254.99.1" // set to match your computer
jakelarsen17 0:ade62dde274b 79 #define MASK "255.255.0.0" // set to match your computer (probably does already)
jakelarsen17 0:ade62dde274b 80 #define IP_LAPTOP "169.254.99.103"
jakelarsen17 0:ade62dde274b 81
jakelarsen17 0:ade62dde274b 82 #define IP "169.254.99.139"
jakelarsen17 0:ade62dde274b 83
jakelarsen17 0:ade62dde274b 84 // Status reporting
jakelarsen17 0:ade62dde274b 85
jakelarsen17 0:ade62dde274b 86 // data good flags?
jakelarsen17 0:ade62dde274b 87
jakelarsen17 0:ade62dde274b 88 // DMA status flag?
jakelarsen17 0:ade62dde274b 89
jakelarsen17 0:ade62dde274b 90 // for debug purposes
jakelarsen17 0:ade62dde274b 91 Serial pc(USBTX, USBRX);
jakelarsen17 0:ade62dde274b 92 #if DEBUG
jakelarsen17 0:ade62dde274b 93 #define DEBUG_PRINT(x) pc.printf(x)
jakelarsen17 0:ade62dde274b 94 #else
jakelarsen17 0:ade62dde274b 95 #define DEBUG_PRINT(x) do {} while(0)
jakelarsen17 0:ade62dde274b 96 #endif
jakelarsen17 0:ade62dde274b 97 DigitalOut led_red(LED_RED);
jakelarsen17 0:ade62dde274b 98 DigitalOut led_green(LED_GREEN);
jakelarsen17 0:ade62dde274b 99 DigitalOut led_blue(LED_BLUE);
jakelarsen17 0:ade62dde274b 100 DigitalOut paint(D0);
jakelarsen17 0:ade62dde274b 101
jakelarsen17 0:ade62dde274b 102 LidarLite sensor1(LIDARLite1_SDA, LIDARLite1_SCL); //Define LIDAR Lite sensor 1
jakelarsen17 0:ade62dde274b 103 Timer dt;
jakelarsen17 0:ade62dde274b 104 float distance;
jakelarsen17 0:ade62dde274b 105
jakelarsen17 0:ade62dde274b 106 float fmX, fmY, fmZ;
jakelarsen17 0:ade62dde274b 107 int16_t rmX, rmY, rmZ;
jakelarsen17 0:ade62dde274b 108
jakelarsen17 0:ade62dde274b 109 char buffer[LEN_PACKET]; // general purpose tx/rx buffer
jakelarsen17 0:ade62dde274b 110
jakelarsen17 0:ade62dde274b 111 // Declaration of functions
jakelarsen17 0:ade62dde274b 112 void clearBuffer();
jakelarsen17 0:ade62dde274b 113
jakelarsen17 0:ade62dde274b 114 using namespace std;
jakelarsen17 0:ade62dde274b 115
jakelarsen17 0:ade62dde274b 116 int main() {
jakelarsen17 0:ade62dde274b 117 led_blue = 1;
jakelarsen17 0:ade62dde274b 118 led_green = 1;
jakelarsen17 0:ade62dde274b 119 led_red = 0;
jakelarsen17 0:ade62dde274b 120
jakelarsen17 0:ade62dde274b 121 pc.baud(230400);
jakelarsen17 0:ade62dde274b 122 mag.enable();
jakelarsen17 0:ade62dde274b 123 dt.start();
jakelarsen17 0:ade62dde274b 124
jakelarsen17 0:ade62dde274b 125 pc.printf("Starting M%i\r\n",NUM);
jakelarsen17 0:ade62dde274b 126 DEBUG_PRINT("HELLO\r\n");
jakelarsen17 0:ade62dde274b 127 // Give everything lower priority
jakelarsen17 0:ade62dde274b 128 for(int i = 0; i < 86; i++)
jakelarsen17 0:ade62dde274b 129 {
jakelarsen17 0:ade62dde274b 130 if(NVIC_GetPriority((IRQn_Type) i) == 0) NVIC_SetPriority((IRQn_Type) i, 2);
jakelarsen17 0:ade62dde274b 131 }
jakelarsen17 0:ade62dde274b 132
jakelarsen17 0:ade62dde274b 133 // Give hardware associated with
jakelarsen17 0:ade62dde274b 134 // sampling the highest priority
jakelarsen17 0:ade62dde274b 135 NVIC_SetPriority(ADC1_IRQn,0);
jakelarsen17 0:ade62dde274b 136 NVIC_SetPriority(ADC0_IRQn,0);
jakelarsen17 0:ade62dde274b 137 NVIC_SetPriority(PDB0_IRQn,0);
jakelarsen17 0:ade62dde274b 138 NVIC_SetPriority(DMA0_IRQn,0);
jakelarsen17 0:ade62dde274b 139 NVIC_SetPriority(DMA1_IRQn,0);
jakelarsen17 0:ade62dde274b 140 NVIC_SetPriority(DMA2_IRQn,0);
jakelarsen17 0:ade62dde274b 141
jakelarsen17 0:ade62dde274b 142 NVIC_SetPriority(ENET_1588_Timer_IRQn,1);
jakelarsen17 0:ade62dde274b 143 NVIC_SetPriority(ENET_Transmit_IRQn,1);
jakelarsen17 0:ade62dde274b 144 NVIC_SetPriority(ENET_Receive_IRQn,1);
jakelarsen17 0:ade62dde274b 145 NVIC_SetPriority(ENET_Error_IRQn,1);
jakelarsen17 0:ade62dde274b 146
jakelarsen17 0:ade62dde274b 147
jakelarsen17 0:ade62dde274b 148 // The ethernet setup must be within the first few lines of code, otherwise the program hangs
jakelarsen17 0:ade62dde274b 149 EthernetInterface interface;
jakelarsen17 0:ade62dde274b 150 interface.init(IP, MASK, GATEWAY);
jakelarsen17 0:ade62dde274b 151 interface.connect();
jakelarsen17 0:ade62dde274b 152
jakelarsen17 0:ade62dde274b 153 led_green = 0;
jakelarsen17 0:ade62dde274b 154
jakelarsen17 0:ade62dde274b 155 pc.printf("IP Address is: %s\n\r", interface.getIPAddress());
jakelarsen17 0:ade62dde274b 156 pc.printf("Port is: %i\n\r", PORT);
jakelarsen17 0:ade62dde274b 157 ENET_TIPG = 0x08; // minimum time between TCP packets
jakelarsen17 0:ade62dde274b 158
jakelarsen17 0:ade62dde274b 159 // ethernet setup failed for some reason. Flash yellow light then uC resets itself
jakelarsen17 0:ade62dde274b 160 if(interface.getIPAddress() == 0)
jakelarsen17 0:ade62dde274b 161 {
jakelarsen17 0:ade62dde274b 162 for(int i = 0; i < 5; i++)
jakelarsen17 0:ade62dde274b 163 {
jakelarsen17 0:ade62dde274b 164 // flash yellow LED
jakelarsen17 0:ade62dde274b 165 led_red = 0;
jakelarsen17 0:ade62dde274b 166 led_green = 0;
jakelarsen17 0:ade62dde274b 167 pause_ms(500);
jakelarsen17 0:ade62dde274b 168 led_red = 1;
jakelarsen17 0:ade62dde274b 169 led_green = 1;
jakelarsen17 0:ade62dde274b 170 pause_ms(1000);
jakelarsen17 0:ade62dde274b 171 }
jakelarsen17 0:ade62dde274b 172 NVIC_SystemReset();
jakelarsen17 0:ade62dde274b 173 }
jakelarsen17 0:ade62dde274b 174
jakelarsen17 0:ade62dde274b 175
jakelarsen17 0:ade62dde274b 176 TCPSocketServer server;
jakelarsen17 0:ade62dde274b 177 server.bind(PORT);
jakelarsen17 0:ade62dde274b 178 server.listen(MAX_CLIENTS);
jakelarsen17 0:ade62dde274b 179
jakelarsen17 0:ade62dde274b 180 led_green = 1;
jakelarsen17 0:ade62dde274b 181 led_red = 1;
jakelarsen17 0:ade62dde274b 182 led_blue = 1;
jakelarsen17 0:ade62dde274b 183 pc.printf("Server started\r\n");
jakelarsen17 0:ade62dde274b 184
jakelarsen17 0:ade62dde274b 185 while(true) { // tcp connect/disconnect loop
jakelarsen17 0:ade62dde274b 186
jakelarsen17 0:ade62dde274b 187 TCPSocketConnection laptop;
jakelarsen17 0:ade62dde274b 188 server.accept(laptop);
jakelarsen17 0:ade62dde274b 189 laptop.set_blocking(false, 9000); // timeout after 9s
jakelarsen17 0:ade62dde274b 190
jakelarsen17 0:ade62dde274b 191 bool ipVerified = true;
jakelarsen17 0:ade62dde274b 192 string ipAddress = laptop.get_address();
jakelarsen17 0:ade62dde274b 193 if(ipAddress != IP_LAPTOP) ipVerified = false;
jakelarsen17 0:ade62dde274b 194 int n;
jakelarsen17 0:ade62dde274b 195 while(true) { // rx/tx loop
jakelarsen17 0:ade62dde274b 196 n = laptop.receive(buffer,LEN_PACKET); // this operation times out after 1.5s
jakelarsen17 0:ade62dde274b 197 if(n <= 0) break; // exit rx/tx loop
jakelarsen17 0:ade62dde274b 198
jakelarsen17 0:ade62dde274b 199 if(!ipVerified){
jakelarsen17 0:ade62dde274b 200 clearBuffer();
jakelarsen17 0:ade62dde274b 201 sprintf(buffer,"Incorrect IP address");
jakelarsen17 0:ade62dde274b 202 n = laptop.send(buffer,LEN_PACKET);
jakelarsen17 0:ade62dde274b 203 pc.printf("%s\r\n");
jakelarsen17 0:ade62dde274b 204 break; // exit rx/tx loop
jakelarsen17 0:ade62dde274b 205 }
jakelarsen17 0:ade62dde274b 206
jakelarsen17 0:ade62dde274b 207 if(buffer[0] == ':' && ipVerified) {
jakelarsen17 0:ade62dde274b 208 /*
jakelarsen17 0:ade62dde274b 209 if(n == 2){
jakelarsen17 0:ade62dde274b 210 if(buffer[1] == '.'){
jakelarsen17 0:ade62dde274b 211 paint = 1;
jakelarsen17 0:ade62dde274b 212 pause_ms(100);
jakelarsen17 0:ade62dde274b 213 paint = 0;
jakelarsen17 0:ade62dde274b 214 }
jakelarsen17 0:ade62dde274b 215 else if(buffer[1] == '-'){
jakelarsen17 0:ade62dde274b 216 paint = 1;
jakelarsen17 0:ade62dde274b 217 pause_ms(300);
jakelarsen17 0:ade62dde274b 218 paint = 0;
jakelarsen17 0:ade62dde274b 219 }
jakelarsen17 0:ade62dde274b 220 }
jakelarsen17 0:ade62dde274b 221 */
jakelarsen17 0:ade62dde274b 222
jakelarsen17 0:ade62dde274b 223 //dt.start();
jakelarsen17 0:ade62dde274b 224
jakelarsen17 0:ade62dde274b 225 /*
jakelarsen17 0:ade62dde274b 226 pc.printf("range: %d cm, velocity: %d cm/s, rate: %.2f Hz\n", sensor1.getRange_cm(), sensor1.getVelocity_cms(), 1/dt.read());
jakelarsen17 0:ade62dde274b 227 dt.reset();
jakelarsen17 0:ade62dde274b 228 */
jakelarsen17 0:ade62dde274b 229
jakelarsen17 0:ade62dde274b 230 if(n == 2){
jakelarsen17 0:ade62dde274b 231 if(buffer[1] == 'l'){
jakelarsen17 0:ade62dde274b 232 sensor1.refreshRangeVelocity();
jakelarsen17 0:ade62dde274b 233 //distance = double(sensor1.getRange_cm())*.393701;
jakelarsen17 0:ade62dde274b 234 //pc.printf("Distance: %f in\r\n", float(sensor1.getRange_cm())*.393701);
jakelarsen17 0:ade62dde274b 235 clearBuffer();
jakelarsen17 0:ade62dde274b 236 sprintf(buffer, "Distance: %f inches", float(sensor1.getRange_cm())*.393701);
jakelarsen17 0:ade62dde274b 237 n = laptop.send(buffer,LEN_PACKET);
jakelarsen17 0:ade62dde274b 238 }
jakelarsen17 0:ade62dde274b 239 else if(buffer[1] == 'm'){
jakelarsen17 0:ade62dde274b 240 clearBuffer();
jakelarsen17 0:ade62dde274b 241
jakelarsen17 0:ade62dde274b 242 mag.getAxis(mag_data);
jakelarsen17 0:ade62dde274b 243 //sprintf(buffer, "MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", mag_data.x, mag_data.y, mag_data.z);
jakelarsen17 0:ade62dde274b 244
jakelarsen17 0:ade62dde274b 245 mag.getX(&fmX);
jakelarsen17 0:ade62dde274b 246 mag.getY(&fmY);
jakelarsen17 0:ade62dde274b 247 mag.getZ(&fmZ);
jakelarsen17 0:ade62dde274b 248 //sprintf(buffer, "MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", fmX, fmY, fmZ);
jakelarsen17 0:ade62dde274b 249
jakelarsen17 0:ade62dde274b 250 mag.getAxis(mag_raw);
jakelarsen17 0:ade62dde274b 251 //sprintf(buffer, "MAG: X=%d Y=%d Z=%d\r\n", mag_raw.x, mag_raw.y, mag_raw.z);
jakelarsen17 0:ade62dde274b 252
jakelarsen17 0:ade62dde274b 253 mag.getX(&rmX);
jakelarsen17 0:ade62dde274b 254 mag.getY(&rmY);
jakelarsen17 0:ade62dde274b 255 mag.getZ(&rmZ);
jakelarsen17 0:ade62dde274b 256 //sprintf(buffer, "MAG: X=%d Y=%d Z=%d\r\n", rmX, rmY, rmZ);
jakelarsen17 0:ade62dde274b 257
jakelarsen17 0:ade62dde274b 258 sprintf(buffer, "MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\nMAG: X=%4.1f Y=%4.1f Z=%4.1f\r\nMAG: X=%d Y=%d Z=%d\r\nMAG: X=%d Y=%d Z=%d\r\n\n", mag_data.x, mag_data.y, mag_data.z, fmX, fmY, fmZ, mag_raw.x, mag_raw.y, mag_raw.z, rmX, rmY, rmZ);
jakelarsen17 0:ade62dde274b 259 n = laptop.send(buffer,LEN_PACKET);
jakelarsen17 0:ade62dde274b 260 }
jakelarsen17 0:ade62dde274b 261 else{
jakelarsen17 0:ade62dde274b 262 clearBuffer();
jakelarsen17 0:ade62dde274b 263 sprintf(buffer, "Invalid Input");
jakelarsen17 0:ade62dde274b 264 n = laptop.send(buffer,LEN_PACKET);
jakelarsen17 0:ade62dde274b 265 }
jakelarsen17 0:ade62dde274b 266 }
jakelarsen17 0:ade62dde274b 267 else{
jakelarsen17 0:ade62dde274b 268 clearBuffer();
jakelarsen17 0:ade62dde274b 269 sprintf(buffer, "Invalid Input");
jakelarsen17 0:ade62dde274b 270 n = laptop.send(buffer,LEN_PACKET);
jakelarsen17 0:ade62dde274b 271 }
jakelarsen17 0:ade62dde274b 272 //pc.printf("%s\r\n",buffer);
jakelarsen17 0:ade62dde274b 273
jakelarsen17 0:ade62dde274b 274 } // end if(buffer[0] == ':')
jakelarsen17 0:ade62dde274b 275 if(n <= 0) break;
jakelarsen17 0:ade62dde274b 276 } // end while(true) rx/tx loop
jakelarsen17 0:ade62dde274b 277 } // end while(true) tcp connect/disconnect loop
jakelarsen17 0:ade62dde274b 278 } // end main
jakelarsen17 0:ade62dde274b 279
jakelarsen17 0:ade62dde274b 280 void clearBuffer() {
jakelarsen17 0:ade62dde274b 281 for(int i = 0; i < 100; i++) buffer[i] = 0;
jakelarsen17 0:ade62dde274b 282 }
jakelarsen17 0:ade62dde274b 283