I2C Konflikt mit MPU-6050 und RTC DS1307

Hallo erstmal

Ich Arbeite mich schon seit einigen Wochen in Arduino ein.

Nun bin ich erstmals auf ein Problem gestossen welches ich nicht selber lösen kann.

Nach reichlicher Recherche habe ich das Problem im Englischem und Spanischem Forum gefunden.
Mein Problem jetzt ist: Spanisch kann ich nicht, und beim Englischen verstehe ich nicht genau was die Lösung ist.

Hier sind die beiden Probleme:
http://forum.arduino.cc/index.php?topic=182037.0
http://forum.arduino.cc//index.php?topic=190284.0

Danke im voraus für eure Hilfe :slight_smile:

Jedes I2C Gerät muss auf einer auf dem I2C Bus einmaligen I2C Adresse laufen.

Die DS1307 Module haben die I2C Adresse 0x68.

Welche I2C Adresse Dein MPU6050 Modul hast, kannst Du mit dem I2C Scanner Sketch herausfinden.
Wenn das Modul ebenfalls die Adresse 0x68 hat, kannst Du beide Module nicht parallel am selben I2C Bus betreiben.
Welche Adresse hat Dein MPU6050, was sagt der I2C Scanner?

Auch er hat die Adresse 0x68.
Kann ich nicht irgendwie einen davon wechseln?

Biomech:
Auch er hat die Adresse 0x68.
Kann ich nicht irgendwie einen davon wechseln?

Normalerweise kann das MPU6050 Board auf die Adressen 0x68 oder 0x69 umgestellt werden.

Was siehst Du auf Deiner MPU6050 Platine:

  • Jumper zum Umstecken?
  • Lötpad zur Herstellung von Lötbrücken?
  • einen ADO Anschluß am Board?

Schaltbild? Foto? Technische Informationen zu Deinem MPU6050 Board?

Lötstellen sind Vorhanden, wie auch ein AD0 Anschluss. Was ein Jumper ist weiss ich leider nicht, aber ein Foto folgt in Kürze.

http://flyduino.net/MPU6050-Break-Out-onboard-33V-reg_1
Dies wäre die Mpu die ich habe.

Hoi jurs,

Die DS1307 Module haben die I2C Adresse 0x68.

meine RTC DS1307 hat irgendwie 2 Adressen...0x50 und 0x68 ?

Habe folgenden ScanSketch auf Nick Gammons HP gefunden und etwas erweitert, damit meine Zuordnungen passen (kann ja leicht angepasst werden).
Dies Proggi lasse ich als Teil meines Sketches am Anfang im Setup durchlaufen um zu sehen (SerialMonitor bzw. PC) ob und welche Komponenten erkannt wurden:

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, October 02, 2013, Using Arduino 1.5.4 user A.R.Ty
//    Added MY descriptions for different adresses to
//    identify each more easier in letters instaed crypted
//    HEX-appearance.
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      
       if ((address) == 0x20)
      {
        Serial.println("............... is I2C LCD_2x16");
        Serial.println();
      }
       if ((address) == 0x27)
      {
        Serial.println("............... is I2C LCD_4x20");
        Serial.println();
      }
       if ((address) == 0x45)
      {
        Serial.println("............... is I2C LED-Bus ");
        Serial.println();
      }
       if ((address) == 0x50)
      {
        Serial.println("............... is I2C RTC_1307");
        Serial.println();
      }
       if ((address) == 0x54)
      {
        Serial.println("............... is I2C EEpRom  ");
        Serial.println();
      }
       if ((address) == 0x68)
      {
        Serial.println("................ is I2C RTC_RAM ");
        Serial.println();
      }
      
      


      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Wenn ich das laufen lasse und NUR die RTC dran habe, erscheinen eben 0x50 und 0x68 als erkannt.

Owohl beide angeschlossen sind RTC Batterie und MPU6050 erkennt es nur einen bei mir.

I2C Scanner
Scanning...
I2C device found at address 0x68 !
................ is I2C RTC_RAM

Ich bekomm nur diese Adresse.

Als nächstes versuche ich den PMU Chip wieder zu entfehrnen.

Biomech:
Lötstellen sind Vorhanden, wie auch ein AD0 Anschluss. Was ein Jumper ist weiss ich leider nicht, aber ein Foto folgt in Kürze.

http://flyduino.net/MPU6050-Break-Out-onboard-33V-reg_1
Dies wäre die Mpu die ich habe.

Das sieht nach einem herausgeführten ADO-Anschluß aus. Dann würde ich mal ausprobieren, was im Playground beschrieben steht: Arduino Playground - HomePage

Zitat:
The I2C-address depends on the AD0 pin of the sensor. If it is connected to ground, the address is 0x68. If it is connected to VLOGIC (+3.3V) it is 0x69.

Welche Adresse zeigt dann der I2C-Scanner an, wenn Du ADO mit 3.3V versorgst?

@A.R.Ty: An Adresse 0x50 sitzt noch ein zusätzliches EEPROM vom Typ AT24C32 auf Deiner Uhrenplatine, das Du per I2C programmieren und in dem Du Daten speichern kannst, schau Dir die Bauteilebestückung an!

Thx, wieder was gelernt - nicht dass es I2C Ram war (das dachte ich mir schon) aber dass die Adresse genau "anders herum" ist.
Da wurde mir sofort einiges unerklärliche Uhrenverhalten erklärlich, gerade im Umgang mit Kurzzeittimern :wink:

Naja, wenn man alles könnte und wüsste....wäre es dann nicht schon wieder langweilig ? XD

Also jetzt habe ich(du xD) es geschafft :slight_smile:

der i2c Manager zeigt jetzt endlich 2 verschiedene Daten an.

Scanning...
I2C device found at address 0x68 !
................ is I2C RTC_RAM

I2C device found at address 0x69 !
done

Beide (RTC und MPU6050) laufen jetzt.
Das nächste was ich ausprobieren werde ist sie gleichzeitig Arbeiten zu lassen, was mein ursprüngliches Ziel war, aber ich denke nicht, dass das ein Problem sein sollte. Vielen dank Jurs :slight_smile:

Kann das MPU6050-Board zum Ändern der Adresse mit AD0 auch auf 5V+ gelegt werden oder müssen das zwingend 3,3V+ sein ?
3,3V ist wegen einem SensorShield 5 - Board nicht (mehr) verfügbar - oder gibts die noch woanders ?
Pinout gibt nichts Anderes her :frowning:

Ansonsten kann ich ja noch 2 Dioden dazwischen schweissen, jede zieht so ca. 0,8V AFAIK....

Hallo Arduino Community,

ich versuche die RTC 1307 und das Gyroskop MPU6050 zusammen zu betreiben. Dazu habe ich wie beschrieben die i2c adresse des Gyros auf 0x69 geändert (i2c scanner bestätigt dies)

Wenn ich nun das set_time sketch hochlade und im Anschluss mein Hauptprogramm für das Gyroskop hochlade, funktioniert alles perfekt.

ABER, wenn ich jetzt den Arduino vom Strom trenne und wieder anschliesse, läuft lediglich die Zeit und der Gyro antwortet nicht.

Kann mir bitte irgendjemand helfen :frowning: danke schonmal

Fraser-Island:
Wenn ich nun das set_time sketch hochlade und im Anschluss mein Hauptprogramm für das Gyroskop hochlade, funktioniert alles perfekt.

ABER, wenn ich jetzt den Arduino vom Strom trenne und wieder anschliesse, läuft lediglich die Zeit und der Gyro antwortet nicht.

Wie machst du das?
Lädst du 2 Sketche hintereinander auf den Arduino?
Das wird nicht funktionieren. Du kannst nur einen Sketch draufladen.

Du musst die beiden Programme zusammenfügen, so dass es zu einem Sketch wird.

Ich lade erst set_time hoch (um die Zeit erstmalig zu definieren) und anschließend mein normales Programm, welches die RTC und den Gyro ausliest.

Das klappt ja auch so weit, aber nach trennen der Stromversorgung liest er nur noch die Zeit und das Gyroskop nichmehr...

Fraser-Island:
Ich lade erst set_time hoch (um die Zeit erstmalig zu definieren) und anschließend mein normales Programm, welches die RTC und den Gyro ausliest.

Das klappt ja auch so weit, aber nach trennen der Stromversorgung liest er nur noch die Zeit und das Gyroskop nichmehr...

Wie schon geschrieben,
das geht so nicht. Du musst ein Programm daraus machen.
Wenn du die Zeit stellst, wird diese in der RTC gespeichert und kann natürlich immer abgerufen werden.

Ok, sorry, habe eben nochmal gelesen.
Dein "Hauptprogramm" beinhaltet schon beide Routinen. Das habe ich in deinem ersten Post so nicht gelesen.

Ja mein Programm kann die RTC lesen, aber nach Verlust der Spannungsversorgung nur noch die RTC und das Gyroskop nichtmehr.

Wenn ich die RTC dann entferne kann er den Gyro wieder lesen (Uhr ausgesteckt)

  • erneutes einstecken der Uhr : nur noch Gyro, ohne Uhr

Fraser-Island:
Ja mein Programm kann die RTC lesen, aber nach Verlust der Spannungsversorgung nur noch die RTC und das Gyroskop nichtmehr.

Wenn ich die RTC dann entferne kann er den Gyro wieder lesen (Uhr ausgesteckt)

  • erneutes einstecken der Uhr : nur noch Gyro, ohne Uhr

Dann solltest du uns deinen Sketch zeigen.
Füge diesen hier in Code-Tags (diese Schaltfläche </>) ein.
Da wird mit I2C etwas nicht stimmen.
Vermutlich hast du die Adressen im Sketch nicht angepasst.

#include<Wire.h>

#include <LiquidCrystal_I2C.h>
 

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
#include <RTClib.h>
RTC_DS1307 RTC;

const int MPU=0x69;  

int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup()
{
  Serial.begin(9600);
  lcd.begin(20, 4);
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x63F); 
   
  //initialisieren MPU-6050
  Wire.write(0); 
  Wire.endTransmission(true);
     
  //Informat. display
  lcd.setCursor(0,0);
  lcd.print("Acc");
  lcd.setCursor(0,2);
  lcd.print("Gyro");

   pinMode(8,OUTPUT);
  if (! RTC.isrunning()) {
   Serial.println("RTC is NOT running!");
   
}
}
void loop(){
Wire.beginTransmission(MPU);
  Wire.write(0x3B);  
  Wire.endTransmission(false);
 
  Wire.requestFrom(MPU,14,true);  
{
  AcX=Wire.read()<<8|Wire.read();  //0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  //0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  //0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  //0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  //0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  //0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
   
  
  Serial.print("AcX = "); Serial.print(AcX);
  lcd.setCursor(0,1);
  lcd.print("X=");
  lcd.print(AcX);
   
  
 
  Serial.print(" | GyX = "); Serial.print(GyX);
  lcd.setCursor(0,3);
  lcd.print("X=");
  lcd.print(GyX);
   
 

  delay(1000);

   DateTime now = RTC.now();
    lcd.setCursor(9, 0);
     if (now.hour()<10)
    lcd.print('0');
    lcd.print(now.hour(), DEC);
    lcd.print(':');
     if (now.minute()<10)
    lcd.print('0');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    if (now.second()<10)
    lcd.print('0');
    lcd.print(now.second(), DEC);
    lcd.setCursor(9,0);
    
   
  
 
    
   
}}

Du must deine Konfiguration der I2C-Adressen überprüfen. Du steuerst den MPU, mit unterschiedlichen
I2C-Adressen an.

Ich kenne den MPU nicht, vermute aber, das liegt an den falschen bzw. unterschiedlichen Adressen die du verwendest.

Danke HotSystems für deine Hilfe.
Leider besteht das Problem weiterhin :frowning: