MPU6050 - I2C Bus Fehler 4 Wire.write / stoppt den Arduino

Hey Leute,

ich arbeite mich gerade mit dem MPU6050 ein und glaube mittlerweile, dass die Wahl keine gute war.
Ich habe den ganzen Tag damit verbracht einigermaßen brauchbare Werte aus dem Ding zu bekommen.

Jetzt habe ich leider noch das Problem, dass sporadisch, mal nach 15 Minuten mal beim I2C Initialisieren, mal zwischen durch sich der Arduino aufhängt.

Ich habe Bibliotheken von Lauszus mit der Kalman Bibliothek, die Jeff Rowberg Bibliothek und von einem User hier aus dem Forum Krodal ausprobiert. Überall war es das gleiche, Absturz.

Beim Sketch von Kodal konnte ich den Fehler soweit eingrenzen, dass dieser beim Wire.write ein Returncode 4 bekommt. Bei Rowberg hängt er sich teilweise schon beim I2C Init auf.

int MPU6050_read(int start, uint8_t *buffer, int size)
{
  int i, n, error;
  //int tempBuffer = buffer;
  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  Serial.println(start);
  n = Wire.write(start);
  if (n == 4) {
    Serial.println("begin");
    Serial.println(start);
    Serial.println(size);
  }
  if (n != 1)
    return (-10);

  n = Wire.endTransmission(false);    // hold the I2C-bus
  if (n == 4) {
    Serial.println("end");
    Serial.println(start);
    Serial.println(size);
  }
  if (n != 0)
    return (n);

  // Third parameter is true: relase I2C-bus after data is read.
  Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true);
  i = 0;
  while(Wire.available() && i<size)
  {
    buffer[i++]=Wire.read();
  }
  if ( i != size)
    return (-11);

  return (0);  // return : no error
}

Im Prinzip ist mir das egal, ob er mal für eine Sekunde keine Daten vom MPU6050 bekommt, er darf nur nicht aufhören zu arbeiten.

Meine Frage ist

  1. Kann ich den Fehler abfangen und selber entscheiden was er macht? Ich dachte da an sowas, wie noch einmal ein Init versuchen, wenn ich den Arduino neustarte geht es ja auch wieder…

  2. Kann man den Fehler weiter eingrenzen?

Ich habe hier eine Alternative zur I2C Initialisierung gefunden, welche ich noch testen will, ich befürchte aber, dass das nicht mein Problem löst. Sowie ich den Autor verstehe, geht es hier bei um mehrere Geräte am I2C Bus.

http://www.forward.com.au/pfod/ArduinoProgramming/I2C_ClearBus/index.html

gy_521_send_serial_mod.ino (39 KB)

ich arbeite mich gerade mit dem MPU6050 ein und glaube mittlerweile, dass die Wahl keine gute war.

Der Bursche ist sicherlich nicht dein Problem.

I2C Pullup ?

Ich kann Probleme mit mindestens einer Bibliothek bestätigen, weiß aber noch nicht, woran es genau liegt. Da hängt sich das Beispielprogramm schon nach ca. 15 Abfragen dauerhaft auf.

Was Du unbedingt ändern solltest, das sind Ausgaben auf Serial innerhalb einer I2C Übertragung, das kann nur schiefgehen.

Wie genau hast Du den MPU angeschlossen? Der arbeitet nur mit 3,3V, da empfiehlt sich ein Level-Shifter für zuverlässigen Betrieb.

Also ich habe den MPU6050 von eBay wo die Spannungsdefinition 3,3-5V beschreibt, daher habe ich hier keinen Level Shifter eingesetzt, ich versuche auch die Anzahl der Komponenten klein zu halten.
Auch ein Pullup Widerstand hab ich nicht eingesetzt.

@DrDiettrich, wenn Du das aufhängen bestätigen kannst, was für eine Konfiguration hast Du probiert? Also mit MPU6060 inkl. Pullup etc.?

Wenn Du mit einem anderen Setup auch das Problem hast klingt es danach, dass es nicht am Hardware Setup liegt, sondern ein Softwareproblem ist, also auch nichts mit meinem MPU6050 zu tun hat.

Ich habe auch ein zweites Setup ohne MPU6050 wo der selbe Sketch lief, der wohl auch mal hängen geblieben ist. Also ohne Geräte am I2C Bus... Das muss ich aber noch einmal verifizieren.

Mit welchen Bibliotheken arbeitet ihr denn für den MPU6050? Der Sketch von Krodal ist ja relativ übersichtlich, mir ist da jetzt nicht groß was aufgefallen wo ich sagen würde, dass sieht komisch aus. Aktuell nehme ich den von Jeff, da ich dachte, das Lesen aus dem FiFo könnte Stabilität bringen. Dem ist aber nicht so.

der ClearBus Sketch habe ich auch getestet, der hatte aber keinen Effekt.

von eBay wo die Spannungsdefinition

Wenn du dem Händler mehr vertraust, als dem Datenblatt…???

combie:
Wenn du dem Händler mehr vertraust, als dem Datenblatt...?!?!?

Naja mit Vertrauen hat das erstmal nix zu tun, ich habe aber mal das Datenblatt angefragt, auch um mal zu schauen ob ein PullUp Wiederstand auf dem Board drauf ist.

Der interne PullUp wird über das Wire.begin() aktiviert, nach meinen Recherchen sind mit den Kabellängen von 10cm und den internen PullUps ok. Aber ich behalte das mal als Punkt präsent.

Die Frage die sich mir noch stellt ist wie DrDiettrich den Fehler reproduzieren konnte.

Naja mit Vertrauen hat das erstmal nix zu tun, ich habe aber mal das Datenblatt angefragt, auch um mal zu schauen ob ein PullUp Wiederstand auf dem Board drauf ist.

Möchtest du mich nicht verstehen?
Oder warum ignorierst du die 3,3V Angabe im Datenblatt?

nach meinen Recherchen sind mit den Kabellängen von 10cm und den internen PullUps ok.

Das sind genau die richtigen Annahmen, um einen stabilen Betrieb zu vermeiden.

Sind alle MPU6050 Bauarten identisch?

ArduinoGuy255:
Sind alle MPU6050 Bauarten identisch?

Hast du schon unterschiedliche Datenblätter gefunden?

Der MPU arbeitet immer mit 3,3V, bei den 5V Boards ist nur ein entsprechender Spannungsregler drauf. Der hebt aber die Signalpegel nicht auf 5V an, deshalb der Levelshifter.

Der Fehler tritt bei der Bibliothek von Jeff Roberg auf, vermutlich in I2Cdevlib. Das Beispiel MPU6050_DMP6 lief, MPU6050_raw hängt sich auf. Mit einer höheren Baudrate läßt sich das Aufhängen vermeiden, deshalb tippe ich darauf, daß die Serial Interrupts die I2C Übertragung torpedieren.

Alles klar!

ich teste mal die unterschiedlichen Varianten mit Levelshifter und PullUps und dann schau ich mal weiter :slight_smile:

Das mit den seriellen Ausgaben klingt auch logisch, ich schau mal was er ohne Ausgaben sagt.

Vielen Dank für die Analysen :slight_smile: