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
Diff: main.cpp
- 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) {