2017-10-23 15 views
0

私はmpu6050とadafruitの究極のgpsブレークアウトv3のコードを持っていて、arduinoで別々に動作しています。しかし、両方のコードを組み合わせようとすると、修正する。誰か助けてくれますか? コードがseparetely正常に動作しているが、私は彼らと実行を結合することができません両方mpu6050ためのコードはMpu6050とAdafruit Ultimate GpsがArduino Dueで一緒に働いていない

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

の下に与えられ、Adafruit究極のGPSブレイクアウトのためのコードは

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

以下に示します。私はそれらを組み合わせようとしましたが、その味方の究極のGPSブレイクアウトは機能しておらず、何もしません。私はそれらを組み合わせて単一のコードで作業する方法を知りたいと思います。事前に感謝します。

答えて

0

利用代わりNeoGPS - ちょうどあなたのIMUのスケッチに追加します。

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

これは、1回のGPSの更新と毎秒1個のIMUのサンプルが表示されます。

また、delayは使用できません。遅延中にArduinoは何もしませんし、GPS文字を失います。上記のループ構造は常に実行されており、GPSデータをチェックしていることに注意してください。最終的にGPSの更新が完了すると、IMUサンプルが取り込まれ、すべての結果が出力されます。

また、printing too muchの情報に注意する必要があります。最終的に、Arduinoは文字を印刷するのを待っています。

NeoGPSはArduino IDEライブラリマネージャのスケッチ - >ライブラリを含める - >ライブラリの管理のメニューから入手できます。 NeoGPSは、他のすべてのGPSライブラリよりも高速、小型、信頼性、正確性が高く、例は適切に構成されています。 他のライブラリの例が変更されたときに壊れることは非常に一般的です。あなたがそれを使用しなくても、NeoGPSのインストールとトラブルシューティングのページにはたくさんの情報があります。

関連する問題