gpsadafruitarduino-duempu6050

Mpu6050 and Adafruit Ultimate Gps not working together on Arduino Due


I have the codes for mpu6050 and adafruit ultimate gps breakout v3 and they are working fine seperately on arduino due but when i try to combine both the codes the gps does not get a fix. Can anybody help me out? The code for mpu6050 is given below

    // MPU-6050 Short Example Sketch
    // By Arduino User JohnChi
    // August 17, 2014
    // Public Domain
#include<Wire.h>
extern TwoWire Wire1;
const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
int minVal=265;
int maxVal=402;
double x;
double y;
double z;
double pitch,roll,delta_X,delta_Y,delta_Z;
double old_AcX=0;
double old_AcY=0;
double old_AcZ=0;
int led = 13;

void setup(){
  Wire1.begin();
  Wire1.beginTransmission(MPU_addr);
  Wire1.write(0x6B);  // PWR_MGMT_1 register
  Wire1.write(0);     // set to zero (wakes up the MPU-6050)
  Wire1.endTransmission(true);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
 }
 void loop(){
  Wire1.beginTransmission(MPU_addr);
  Wire1.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire1.endTransmission(false);
  Wire1.requestFrom(MPU_addr,14,true);  // request a total of 14        registers
  AcX=Wire1.read()<<8|Wire1.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  AcY=Wire1.read()<<8|Wire1.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire1.read()<<8|Wire1.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire1.read()<<8|Wire1.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire1.read()<<8|Wire1.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire1.read()<<8|Wire1.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire1.read()<<8|Wire1.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);     //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);



  delay(1000);
 }

And the code for the Adafruit ultimate Gps breakout is given below

#include <Adafruit_GPS.h>
#define mySerial Serial1
Adafruit_GPS GPS(&mySerial);
#define GPSECHO  true
   boolean usingInterrupt = false;
    void useInterrupt(boolean); // Func prototype keeps Arduino 0023  happy


    void setup()  
    {


      Serial.begin(9600);
      GPS.begin(9600);
      mySerial.begin(9600);
      GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
      GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);  
      GPS.sendCommand(PGCMD_ANTENNA);
     #ifdef __arm__
  usingInterrupt = false;  
#else
  useInterrupt(true);
  #endif

  delay(1000);

}

#ifdef __AVR__
SIGNAL(TIMER0_COMPA_vect) {
  char c = GPS.read();
#ifdef UDR0
  if (GPSECHO)
    if (c) UDR0 = c;  
    // writing direct to UDR0 is much much faster than Serial.print 
    // but only one character can be written at a time. 
#endif
}

void useInterrupt(boolean v) {
  if (v) {

    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}
#endif //#ifdef__AVR__

uint32_t timer = millis();
void loop()                     
{

  if (! usingInterrupt) {
    char c = GPS.read();
  }

   // if a sentence is received, we can check the checksum, parse it...
   if (GPS.newNMEAreceived()) {
    // a tricky thing here is if we print the NMEA sentence, or data
    // we end up not listening and catching other sentences! 
    // so be very wary if using OUTPUT_ALLDATA and trytng to print out data
    //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false

    if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
      return;  // we can fail to parse a sentence in which case we should just wait for another
  }

  // if millis() or timer wraps around, we'll just reset it
   if (timer > millis())  timer = millis();

  // approximately every 2 seconds or so, print out the current stats
  if (millis() - timer > 2000) { 
     timer = millis(); // reset the timer

    Serial.print("\nTime: ");
    Serial.print(GPS.hour, DEC); Serial.print(':');
    Serial.print(GPS.minute, DEC); Serial.print(':');
    Serial.print(GPS.seconds, DEC); Serial.print('.');
    Serial.println(GPS.milliseconds);
    Serial.print("Date: ");
    Serial.print(GPS.day, DEC); Serial.print('/');
    Serial.print(GPS.month, DEC); Serial.print("/20");
    Serial.println(GPS.year, DEC);
    Serial.print("Fix: "); Serial.print((int)GPS.fix);
    Serial.print(" quality: "); Serial.println((int)GPS.fixquality); 
    if (GPS.fix) {
      //Serial.print("Location: ");
      Serial.print(convertDegMinToDecDeg(GPS.latitude)); 
      Serial.print(", "); 
      Serial.println(convertDegMinToDecDeg(GPS.longitude)); 

      //Serial.print("Speed (knots): "); Serial.println(GPS.speed);
      //Serial.print("Angle: "); Serial.println(GPS.angle);
      //Serial.print("Altitude: "); Serial.println(GPS.altitude);
      //Serial.print("Satellites: ");       Serial.println((int)GPS.satellites);
    }
  }
}

Both the codes are working fine separetely but i am unable to combine them and run in a single code.I tried to combine them and tha adafruit Ultimate gps breakout isn't working and it gives nothing. I want to know how i can combine them to work in a single code.Thanks in advance.


Solution

  • Use NeoGPS instead -- just add it to your IMU sketch:

    #include <NMEAGPS.h>
    NMEAGPS gps;
    #define gpsPort Serial1
    
       ...
    
    void setup(){
      Wire1.begin();
      Wire1.beginTransmission(MPU_addr);
      Wire1.write(0x6B);  // PWR_MGMT_1 register
      Wire1.write(0);     // set to zero (wakes up the MPU-6050)
      Wire1.endTransmission(true);
      Serial.begin(9600);
      pinMode(led, OUTPUT);
    
      gpsPort.begin( 9600 );
    }
    
    void loop(){
      if (gps.available( gpsPort )) {
        gps_fix fix = gps.read();  // A new GPS update is ready, get all the pieces
        // Print some of the pieces?
    
        Serial.print( F("Location: ") );
        if (fix.valid.location) {
          Serial.print( fix.latitude(), 6 );
          Serial.print( ',' );
          Serial.print( fix.longitude(), 6 );
        }
    
        Serial.print( F(", Altitude: ") );
        if (fix.valid.altitude)
          Serial.print( fix.altitude() );
    
        Serial.println();
    
        //  Take an IMU sample too.
        Wire1.beginTransmission(MPU_addr);
           ...
        Serial.print(" | GyZ = "); Serial.println(GyZ);
      }
    }
    

    This will display one GPS update and one IMU sample per second.

    Also, you cannot use delay. The Arduino will not do anything else during the delay, and it will lose GPS characters. Notice that the above loop structure is always running, checking for GPS data. When a GPS update is finally ready, it takes the IMU sample and prints all the results.

    You also have to be careful about printing too much information. Eventually, the Arduino will spend all its time waiting to print characters.

    NeoGPS is available from the Arduino IDE Library Manager, under the menu Sketch -> Include Library -> Manage Libraries. NeoGPS is faster, smaller, more reliable and more accurate than all other GPS libraries, and the examples are properly structured. It is very common for the other libraries' examples to break when they are modified. Even if you don't use it, there is lots of information on the NeoGPS Installation and Troubleshooting pages.