Use hexiwear as a GPSIMU-AHRS for Nikon DSLR cameras
Dependencies: FXOS8700CQ FXAS21000 MBed_Adafruit-GPS-Library Hexi_OLED_SSD1351 Hexi_KW40Z Madgwick
Fork of Hexi_Blinky_Example by
Diff: main.cpp
- Revision:
- 21:b165e847c5ba
- Parent:
- 20:5a4e47822d79
- Child:
- 22:e69bc54ca4c0
--- a/main.cpp Fri Aug 19 02:22:15 2016 +0000 +++ b/main.cpp Mon Sep 19 04:34:11 2016 +0000 @@ -2,17 +2,15 @@ #include "FXOS8700Q.h" #include "FXAS21000.h" #include "MBed_Adafruit_GPS.h" -#include "Adafruit_SSD1351.h" -//#include "NeatGUI.h" +#include "Hexi_OLED_SSD1351.h" DigitalOut myled(LED1); -DigitalOut BOOSTEN(PTC13); //oled power enable Serial gps(PTD3,PTD2); Serial pc(USBTX, USBRX); -//SSD1351_SPI OLED96(PTB22,PTB23,PTB21,PTB20,PTD15); //Hexiwear pins for SPI bus OLED (MOSI, MISO, SCK, CS, DC) -Adafruit_SSD1351 OLED96(PTB20,PTE6,PTD15,PTB21,PTB22); //Hexiwear pins for SPI bus OLED (CS, RS, DC, SCK, MOSI, MISO); +/* Instantiate the SSD1351 OLED Driver */ +SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */ //#define BLACK 0x000000 //#define WHITE 0xFFFFFF @@ -30,114 +28,167 @@ FXAS21000 gyro( PTC11, PTC10); // Proper Ports for Hexiwear -int main() { -float faX, faY, faZ; -float fmX, fmY, fmZ; -int16_t raX, raY, raZ; -int16_t rmX, rmY, rmZ; -float gyro_data[3]; +Timer t; +int lastUpdate; -Adafruit_GPS myGPS(&gps); -char c; //when read via Adafruit_GPS::read(), the class returns single character stored here -myGPS.begin(115200); +int main() +{ + float faX, faY, faZ; + float fmX, fmY, fmZ; + int16_t raX, raY, raZ; + int16_t rmX, rmY, rmZ; + float gyro_data[3]; + + Adafruit_GPS myGPS(&gps); + char c; //when read via Adafruit_GPS::read(), the class returns single character stored here + char text[30]; /* Text Buffer */ + +//Start timer + t.start(); + + myGPS.begin(9600); //Turn off all sentences except GGA and RMC //For MTK GPS -myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //FOR UBLOX GPS -myGPS.sendCommand(UBX_DISABLE_ZDA); -myGPS.sendCommand(UBX_DISABLE_GLL); -myGPS.sendCommand(UBX_DISABLE_VTG); -myGPS.sendCommand(UBX_DISABLE_GSV); -myGPS.sendCommand(UBX_DISABLE_GSA); + myGPS.sendCommand(UBX_DISABLE_ZDA); + myGPS.sendCommand(UBX_DISABLE_GLL); + myGPS.sendCommand(UBX_DISABLE_VTG); + myGPS.sendCommand(UBX_DISABLE_GSV); + myGPS.sendCommand(UBX_DISABLE_GSA); -pc.baud(115200); + pc.baud(115200); + + acc.enable(); + pc.printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", acc.whoAmI()); + pc.printf("\r\n\nFXAS21000 Who Am I= %X\r\n", gyro.getWhoAmI()); + + /* Get OLED Class Default Text Properties */ + oled_text_properties_t textProperties = {0}; + oled.GetTextProperties(&textProperties); -acc.enable(); -pc.printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", acc.whoAmI()); -pc.printf("\r\n\nFXAS21000 Who Am I= %X\r\n", gyro.getWhoAmI()); + /* Turn on the backlight of the OLED Display */ + oled.DimScreenON(); -BOOSTEN = 1; + /* Fills the screen with solid black */ + oled.FillScreen(COLOR_BLACK); + + /* Display Text at (x=7,y=0) */ + strcpy((char *) text,"AERO GPS-AHRS"); + oled.Label((uint8_t *)text,7,0); -OLED96.begin(); -//OLED96.invert(true); -OLED96.setRotation(0); -OLED96.setTextColor(OLED96.Color565(0,255,0)); -OLED96.setTextWrap(false); -OLED96.on(); -OLED96.fillScreen(BLACK); -/* -for(int i=0;i<128;i++) -{ - for(int j=0;j<128;j++) - { - OLED96.drawPixel(i,j,OLED96.Color565(0,255,0)); - wait(0.1); - } -} -*/ -//OLED96.fillScreen(BLACK); -OLED96.printf("Hello from Hexi\n"); -OLED96.printf("I am alive now\n"); -OLED96.printf("I am going to be\n"); -OLED96.printf("a GPS-AHRS \n"); -OLED96.printf("for Nikon D800"); + /* Change font color to blue */ + textProperties.fontColor = COLOR_BLUE; + oled.SetTextProperties(&textProperties); + + + /* Display text at (x=1,y=10) MAG label*/ + strcpy(text,"M:"); + oled.Label((uint8_t *)text,1,10); + + /* Display text at (x=1,y=25) ACC label*/ + strcpy(text,"A:"); + oled.Label((uint8_t *)text,1,25); + + /* Display text at (x=1,y=40) GYRO label*/ + strcpy(text,"G:"); + oled.Label((uint8_t *)text,1,40); + + /* Display text at (x=1,y=55) Time label*/ + strcpy(text,"Timer(s):"); + oled.Label((uint8_t *)text,1,55); + + /* Display text at (x=1,y=70) Position label*/ + strcpy(text,"P:"); + oled.Label((uint8_t *)text,1,70); + + /* Set text properties to white and right aligned for the dynamic text */ + textProperties.fontColor = COLOR_WHITE; + textProperties.alignParam = OLED_TEXT_ALIGN_RIGHT; + oled.SetTextProperties(&textProperties); -/* -OLED96.open(); -OLED96.state(Display::DISPLAY_ON); -OLED96.drawCircle(10,10,5,0xFFFFFFFF); -OLED96.flush(); -wait(2.0); -*/ -//OLED128.state(Display::DISPLAY_OFF); - -//BOOSTEN = 0; + while (true) { - while (true) { - /* - acc.getAxis(acc_data); - mag.getAxis(mag_data); - gyro.ReadXYZ(gyro_data); - pc.printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f ", acc_data.x, acc_data.y, acc_data.z); - pc.printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", mag_data.x, mag_data.y, mag_data.z); - pc.printf("FXAS21000 X=%4.2f Y=%4.2f Z=%4.1f\r\n", gyro_data[0], gyro_data[1], gyro_data[2]); - acc.getX(&faX); - acc.getY(&faY); - acc.getZ(&faZ); - mag.getX(&fmX); - mag.getY(&fmY); - mag.getZ(&fmZ); - pc.printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f ", faX, faY, faZ); - pc.printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", fmX, fmY, fmZ); - acc.getAxis(acc_raw); - mag.getAxis(mag_raw); - pc.printf("FXOS8700Q ACC: X=%d Y=%d Z=%d ", acc_raw.x, acc_raw.y, acc_raw.z); - pc.printf(" MAG: X=%d Y=%d Z=%d\r\n", mag_raw.x, mag_raw.y, mag_raw.z); - acc.getX(&raX); - acc.getY(&raY); - acc.getZ(&raZ); - mag.getX(&rmX); - mag.getY(&rmY); - mag.getZ(&rmZ); - pc.printf("FXOS8700Q ACC: X=%d Y=%d Z=%d ", raX, raY, raZ); - pc.printf(" MAG: X=%d Y=%d Z=%d\r\n\n", rmX, rmY, rmZ); - - */ - c = myGPS.read(); //queries the GPS - if (c) { - pc.printf("%c", c); //this line will echo the GPS data if not paused - } - //check if we recieved a new message from GPS, if so, attempt to parse it, if ( myGPS.newNMEAreceived() ) { if ( !myGPS.parse(myGPS.lastNMEA()) ) { continue; } } + + int Now = t.read_ms(); + + if(Now - lastUpdate > 500) { + + acc.getAxis(acc_data); + mag.getAxis(mag_data); + gyro.ReadXYZ(gyro_data); + pc.printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f ", acc_data.x, acc_data.y, acc_data.z); + pc.printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", mag_data.x, mag_data.y, mag_data.z); + pc.printf("FXAS21000 X=%4.2f Y=%4.2f Z=%4.1f\r\n", gyro_data[0], gyro_data[1], gyro_data[2]); + acc.getX(&faX); + acc.getY(&faY); + acc.getZ(&faZ); + mag.getX(&fmX); + mag.getY(&fmY); + mag.getZ(&fmZ); + pc.printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f ", faX, faY, faZ); + pc.printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", fmX, fmY, fmZ); + acc.getAxis(acc_raw); + mag.getAxis(mag_raw); + pc.printf("FXOS8700Q ACC: X=%d Y=%d Z=%d ", acc_raw.x, acc_raw.y, acc_raw.z); + pc.printf(" MAG: X=%d Y=%d Z=%d\r\n", mag_raw.x, mag_raw.y, mag_raw.z); + acc.getX(&raX); + acc.getY(&raY); + acc.getZ(&raZ); + mag.getX(&rmX); + mag.getY(&rmY); + mag.getZ(&rmZ); + pc.printf("FXOS8700Q ACC: X=%d Y=%d Z=%d ", raX, raY, raZ); + pc.printf(" MAG: X=%d Y=%d Z=%d\r\n\n", rmX, rmY, rmZ); + + /* Format the MAG reading */ + sprintf(text,"%.1f %.1f %.1f",fmX,fmY,fmZ); + /* Display Mag readings to 1 decimal */ + oled.TextBox((uint8_t *)text,15,10,80,15); /*Expand textbox for more digits*/ + + /* Format the ACC reading */ + sprintf(text,"%.2f %.2f %.2f",faX,faY,faZ); + /* Display acceleration to 2 decimal */ + oled.TextBox((uint8_t *)text,15,25,80,15); /*Expand textbox for more digits*/ + + /* Format the GYRO reading */ + sprintf(text,"%.2f %.2f %.2f",gyro_data[0],gyro_data[1],gyro_data[2]); + /* Display gyro to 2 decimal */ + oled.TextBox((uint8_t *)text,15,40,80,15); /*Expand textbox for more digits*/ + + + /* Format the time reading */ + sprintf(text,"%.2f",t.read()); + + /* Display time reading in 35px by 15px textbox at(x=55, y=55) */ + oled.TextBox((uint8_t *)text,55,55,35,15); /*Expand textbox for more digits*/ + + if(myGPS.fix) { + pc.printf(myGPS.lastNMEA()); + sprintf(text,"%.2f %.2f %.2f",myGPS.longitude,myGPS.longitude,myGPS.altitude); + /* Display GPS location to 2 decimal */ + oled.TextBox((uint8_t *)text,15,70,80,15); /*Expand textbox for more digits*/ + } + else + { + sprintf(text,"No GPS"); + /* Display lock status */ + oled.TextBox((uint8_t *)text,15,70,80,15); /*Expand textbox for more digits*/ + } + + + lastUpdate = t.read_ms(); + } } }