2017-10-23 2 views
0

Ich habe die Codes für mpu6050 und Adafruit ultimative gps Breakout v3 und sie arbeiten gut separat auf arduino fällig, aber wenn ich versuche, beide Codes zu kombinieren die GPS bekommt nicht ein Fix. Kann mir jemand helfen? Der Code für MPU6050 wird unterMpu6050 und Adafruit Ultimate Gps arbeiten nicht zusammen auf Arduino Due

gegeben
// 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); 
} 

Und der Code für die Adafruit ultimative GPS-Ausbruch unter

#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); 
    } 
    } 
} 

Sowohl die Codes arbeiten gut separetely gegeben ist, aber ich bin nicht in der Lage, sie und führen zu kombinieren in einem einzigen Code.Ich habe versucht, sie zu kombinieren und Tha Adafruit Ultimate GPS Breakout funktioniert nicht und es gibt nichts. Ich möchte wissen, wie ich sie kombinieren kann, um in einem einzigen Code zu arbeiten. Danke im Voraus.

Antwort

0

Verwenden NeoGPS statt - nur fügen Sie es Ihrer IMU Skizze:

#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); 
    } 
} 

wird ein GPS-Update und eine IMU Probe pro Sekunde Diese Anzeige.

Sie können auch delay nicht verwenden. Der Arduino wird während der Verzögerung nichts anderes tun und GPS-Zeichen verlieren. Beachten Sie, dass die obige Schleifenstruktur immer ausgeführt wird, um nach GPS-Daten zu suchen. Wenn ein GPS-Update endlich fertig ist, nimmt es das IMU-Beispiel und druckt alle Ergebnisse.

Sie müssen auch vorsichtig sein über printing too much Informationen. Schließlich wird der Arduino seine ganze Zeit darauf warten, Charaktere zu drucken.

NeoGPS ist im Arduino IDE Library Manager unter dem Menü Skizze -> Bibliothek einbeziehen -> Bibliotheken verwalten verfügbar. NeoGPS ist schneller, kleiner, zuverlässiger und genauer als alle anderen GPS-Bibliotheken und die Beispiele sind richtig strukturiert. Es ist sehr häufig, dass die anderen Bibliotheken Beispiele brechen, wenn sie geändert werden. Auch wenn Sie es nicht verwenden, finden Sie auf den Seiten zu NeoGPS Installation und Fehlerbehebung viele Informationen.

Verwandte Themen