This program is designed to run on a set of Xadow M0 modules to create a Hotshoe IMU which outputs GPS and Orientation data to Nikon cameras, as well as triggering the camera at set intervals.

Dependencies:   MBed_Adafruit-GPS-Library SC16IS750 SDFileSystem SSD1308_128x64_I2C USBDevice mbed BMP085

Fork of MPU9150AHRS by Kris Winer

/media/uploads/whatnick/20151022_004759.jpg

Revision:
7:37bd00805530
Parent:
5:81bba9f0f92b
Child:
9:b7062c55d36c
--- a/main.cpp	Mon May 25 02:54:44 2015 +0000
+++ b/main.cpp	Thu Jul 16 07:38:13 2015 +0000
@@ -41,12 +41,15 @@
 SSD1308 oled = SSD1308(i2c, SSD1308_SA0);
 
 //Use Serial expander for extra UART
-SC16IS750_I2C serial_i2c(&i2c, SC16IS750_SA5);
+SPI spi(P0_9,P0_8,P0_10); //MOSI, MISO, SCK
+DigitalOut CS(P0_15); //CS
+SC16IS752_SPI serial_spi_nikon(&spi,P0_15,NC,SC16IS750::Channel_B);
+SC16IS752_SPI serial_spi_ble(&spi,P0_15,NC,SC16IS750::Channel_A);
 
 //Use BMP085 Temperature,Pressure
 BMP085 bmp(i2c);
 
-SDFileSystem sd(P0_21, P0_22, P1_15, P1_19, "sd", P0_20,  SDFileSystem::SWITCH_POS_NC); // the pinout on the mbed Cool Components workshop board
+SDFileSystem sd(P0_21, P0_22, P1_15, P1_19, "sd", P0_20,  SDFileSystem::SWITCH_POS_NC); // Pin-out on Xadow SD board attached to 1st SPI
 
 float sum = 0;
 uint32_t sumCount = 0, mcount = 0;
@@ -84,6 +87,12 @@
 
     //Set up I2C
     i2c.frequency(400000);  // use fast (400 kHz) I2C
+    
+    //Set up SPI
+    spi.format(8, 0);;          
+//    spi.frequency(100000);    
+//    spi.frequency(500000);    
+    spi.frequency(1000000);
 
     //Set up GPS
     Adafruit_GPS myGPS(&gps);
@@ -106,15 +115,25 @@
     myGPS.sendCommand(UBX_DISABLE_GSA);
     
     wait(1);
-    //Set Serial I2C Baudrate
-    serial_i2c.baud(4800);
+    //Set Serial I2C Baudrate for Nikon
+    serial_spi_nikon.baud(4800);
+    wait(1);
+    
+    //Set Serial SPI Baudrate for BLE
+    serial_spi_ble.baud(2400);
     wait(1);
     
+    //Set BLE Baud rate
+    //serial_spi_ble.printf("AT+BAUD2");
+    //wait(1);
+    //serial_spi_ble.baud(19200);
+    //wait(1);
+    
     //Set output pins for trigggering camera
-    serial_i2c.ioSetDirection(0x3);
+    serial_spi_nikon.ioSetDirection(0xFF); // All outputs
+    serial_spi_nikon.ioSetState(0xFF);     // All On
     
-    //Set BLE Baud rate
-    //serial_i2c.printf("AT+BAUD6");
+    
     
     oled.fillDisplay(0xAA);
     oled.setDisplayOff();
@@ -225,28 +244,28 @@
             sprintf(buffer,"PRS:%5.2f",pres);
             oled.writeString(6,0,buffer);
             
-            serial_i2c.printf("$GPRMC,000002.000,A,3456.9076,S,13831.2800,E,0.00,65.44,240215,,,D*49\r\n");
-            serial_i2c.printf("$PTNTHPR,105.0,N,-21.4,N,0.9,N,A*79\r\n");
+            serial_spi_nikon.printf("$GPRMC,000002.000,A,3456.9076,S,13831.2800,E,0.00,65.44,240215,,,D*49\r\n");
+            serial_spi_nikon.printf("$PTNTHPR,105.0,N,-21.4,N,0.9,N,A*79\r\n");
             wait(0.1);
-            //serial_i2c.printf("$GPVTG,65.44,T,,M,0.00,N,0.00,K,D*0B");
+            //serial_spi_nikon.printf("$GPVTG,65.44,T,,M,0.00,N,0.00,K,D*0B");
             sprintf(buffer+1,"GPGGA,000002.000,3456.9076,S,13831.2800,E,2,07,0.94,%5.2f,M,-0.5,M,,",baroAlt);
             int checkS = checkSum(buffer+1,strlen(buffer+1));
             buffer[0] = '$';
-            serial_i2c.printf(buffer);
-            serial_i2c.printf("*%02X\r\n",checkS);
+            serial_spi_nikon.printf(buffer);
+            serial_spi_nikon.printf("*%02X\r\n",checkS);
             wait(0.1);
-            serial_i2c.printf("$GPGSA,A,3,13,15,24,06,12,02,28,,,,,,1.32,0.94,0.92*09\r\n");
-            serial_i2c.printf("$GPGLL,3456.9076,S,13831.2800,E,000002.000,A,D*4D\r\n");
-            serial_i2c.printf("$NKGCS,WGS 84*11\r\n");
+            serial_spi_nikon.printf("$GPGSA,A,3,13,15,24,06,12,02,28,,,,,,1.32,0.94,0.92*09\r\n");
+            serial_spi_nikon.printf("$GPGLL,3456.9076,S,13831.2800,E,000002.000,A,D*4D\r\n");
+            serial_spi_nikon.printf("$NKGCS,WGS 84*11\r\n");
             
             if(up)
             {
-                serial_i2c.ioSetState(0x0);
+                serial_spi_nikon.ioSetState(0x0);
                 up = false;
             }
             else
             {
-                serial_i2c.ioSetState(0x3);
+                serial_spi_nikon.ioSetState(0x3);
                 up = true;
             }
             lastUpdate = Now;
@@ -269,10 +288,10 @@
         c = myGPS.read();   //queries the GPS
         if (c) {
             LOG("%c", c);    //this line will echo the GPS data if not paused
-            //serial_i2c.putc(c);
-            //serial_i2c.printf("$GPGGA,154850.00,3452.12190,S,13836.65170,E,1,04,1.64,123.5,M,0.0,M,,*7F\r\n");
+            //serial_spi_nikon.putc(c);
+            //serial_spi_nikon.printf("$GPGGA,154850.00,3452.12190,S,13836.65170,E,1,04,1.64,123.5,M,0.0,M,,*7F\r\n");
             //$GPGGA,160202.00,3452.14414,S,13836.63059,E,1,04,2.60,45.4,M,-3.4,M,,*6B
-            //serial_i2c.printf("$GPRMC,154850.00,A,3452.12190,S,13836.65170,E,0.510,,110215,,,A*63\r\n");
+            //serial_spi_nikon.printf("$GPRMC,154850.00,A,3452.12190,S,13836.65170,E,0.510,,110215,,,A*63\r\n");
             //$GPRMC,160203.00,A,3452.14414,S,13836.63079,E,0.332,,110215,,,A*6F
         }
         
@@ -308,7 +327,7 @@
             c = myGPS.read();   //queries the GPS
             if (c) {
                 LOG("%c", c);    //this line will echo the GPS data if not paused
-                //serial_i2c.putc(c);
+                //serial_spi_nikon.putc(c);
             }
 
             //check if we recieved a new message from GPS, if so, attempt to parse it,
@@ -319,8 +338,12 @@
                 
                 else
                 {
-                    serial_i2c.printf(myGPS.lastNMEA());
-                    serial_i2c.printf("\n\r");
+                    serial_spi_nikon.printf(myGPS.lastNMEA());
+                    serial_spi_nikon.printf("\n\r");
+                    
+                    serial_spi_ble.printf(myGPS.lastNMEA());
+                    serial_spi_ble.printf("\n\r");
+                    
                     if(myGPS.fix && fp!=NULL) {
                         fprintf(fp,myGPS.lastNMEA());
                         fprintf(fp,"\r\n");
@@ -397,8 +420,12 @@
             sprintf(buffer+1,"PTNTHPR,%3.1f,N,%3.1f,N,%3.1f,N,A",yaw,pitch,roll);
             int checkS = checkSum(buffer+1,strlen(buffer+1));
             buffer[0] = '$';
-            serial_i2c.printf(buffer);
-            serial_i2c.printf("*%02X\r\n",checkS);
+            serial_spi_nikon.printf(buffer);
+            serial_spi_nikon.printf("*%02X\r\n",checkS);
+            
+            serial_spi_ble.printf(buffer);
+            serial_spi_ble.printf("*%02X\r\n",checkS);
+            
             if(fp != NULL) {
                 fprintf(fp,"%s%02X\r\n",buffer,checkS);
                 if(fflush(fp)==EOF) {