Mehrere MPU6050 an einem Multiplxer

Hallo,

Ich habe hier einen Multiplexer.Ich möchte an diesen 2 MPUs deselben Types anschließen. Ich möchte hierbei nicht die 2 I2C Adressen verwenden, sondern die 2 MPUs mittels den Multiplxer ansteuern.

Ich nutze hierbei die Adafruits Libary GitHub - adafruit/Adafruit_MPU6050 und gehe nach dem Beispiel vor Adafruit_MPU6050/basic_readings.ino at master · adafruit/Adafruit_MPU6050 · GitHub

Ich habe 2 Multiplexer, die an Kanal4 und an Kanal 5 anliegen

//Multiplexer
#define Multiplexer 0x70

extern "C" { 
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}

// define Multiplexer switch function
void tcaselect(uint8_t i) {
  if (i > 7) return;
  Wire.beginTransmission(Multiplexer);
  Wire.write(1 << i);
  Wire.endTransmission();  
} 

//MPU 6050
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;

void setup() {
  //Serial setup
  Serial.begin(250000);

  tcaselect(4);if (mpu.begin())           {Serial.println("MPU6050_1 found!");}
  tcaselect(5);if (mpu.begin())           {Serial.println("MPU6050_2 found!");}
}

mpu.begin() macht er, sobald das zweite ausgeführt wird, hängt er sich auf

Habe auch schon versucht, mir 2 Multiplxer zu definieren

#define Multiplexer 0x70
//Multiplexer
extern "C" { 
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}

// define Multiplexer switch function
void tcaselect(uint8_t i) {
  if (i > 7) return;
  Wire.beginTransmission(Multiplexer);
  Wire.write(1 << i);
  Wire.endTransmission();  
} 

//MPU 6050
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu1;
Adafruit_MPU6050 mpu2;

void setup() {
  //Serial setup
  Serial.begin(250000);

  tcaselect(4);if (mpu1.begin())           {Serial.println("MPU6050_1 found!");}
  tcaselect(5);if (mpu2.begin())           {Serial.println("MPU6050_2 found!");}
}

Das gleiche Ergebnis. Hat jemand eine Idee, wie man das lösen könnte ohne die 2 I2C Adressen zu verwenden?

Hat wirklich niemand eine Idee?

Habe es mal mit der Joy-It Methode probiert

Ich versuche hier den Rückgabewert der Transmission abzufangen und schau, ob das Senden erfolgreich war

//Multiplexer
extern "C" { 
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}
#define Multiplexer 0x70

//MPU 6050
#include <Wire.h>
const int I2C_adress_MPU = 0x68; // I2C Adresse der MPU6050s
tcaselect(4); 
Wire.beginTransmission(I2C_adress_MPU);Wire.write(0x6B); Wire.write(0); 
 if(!Wire.endTransmission(true))  {Serial.println("MPU_1 found!");}
tcaselect(5); 
Wire.beginTransmission(I2C_adress_MPU); Wire.write(0x6B); Wire.write(0); 
if(!Wire.endTransmission(true))  {Serial.println("MPU_2 found!");}

Auch hier hängt er sich bei der zweiten Abfrage auf. Aber wieso? Versteh das nicht so ganz

Ich kenne weder den Sensor, noch die Lib.

Könnte es aber sein, dass Du für 2 Sensoren auch 2 Instanzen von Adafruit_MPU6050 brauchst?

Also:

Adafruit_MPU6050 mpu1, mpu2;

Gruß Tommy

Tommy56:
Ich kenne weder den Sensor, noch die Lib.

Könnte es aber sein, dass Du für 2 Sensoren auch 2 Instanzen von Adafruit_MPU6050 brauchst?

Also:

Adafruit_MPU6050 mpu1, mpu2;

Gruß Tommy

Hallo Tommy,

Schau mal im ersten Post den zweiten Code an, da habe ich genau das versucht

Grüße

Ok, Du hast zu viele Codes.

Es gibt zum I2C-Multiplexer einen I2C-Scanner. Hast Du den schon mal eingesetzt?

Gruß Tommy

Tommy56:
Ok, Du hast zu viele Codes.

Es gibt zum I2C-Multiplexer einen I2C-Scanner. Hast Du den schon mal eingesetzt?

Gruß Tommy

Sollte eigentlich nicht nötig sein, da der Code nur der Überprfüng dient, ob ein MPU überhaupt angeschlossen ist.

Aber ja, der MPU wird erkannt und funktioniert auch (wenn man keine 2 Instanzen davon erzeugt). Habe das schon getestet

Grüße

DerPeter:
Sollte eigentlich nicht nötig sein, da der Code nur der Überprfüng dient, ob ein MPU überhaupt angeschlossen ist.

Aber ja, der MPU wird erkannt und funktioniert auch (wenn man keine 2 Instanzen davon erzeugt). Habe das schon getestet

Und wo ist dann das Problem, wenn er funktioniert?

Gruß Tommy

Tommy56:
Und wo ist dann das Problem, wenn er funktioniert?

Gruß Tommy

DerPeter:
(wenn man keine 2 Instanzen davon erzeugt)

Grüße

Okay, habe jetzt die Rätsels Lösung gefunden. Der zweite MPU hatte einen wackligen Kontakt. Anscheind bleibt das ganze Programm hängen, wenn mpu.begin() nicht ausgeführt werden kann.

Das ist relativ doof, da das Programm in der Lage sein sollte, zu erkennen, ob ein Sensor angeschlossen ist oder nicht und selbst wenn ein Sensor nicht angeschlossen ist, sollte es den restlichen Programmcode ausführen und sich nciht aufhängen

Gibt es dafür irgendeine Lösung?

Da musst Du mal in die Lib schauen und diese evtl. umbauen.

Gruß Tommy

Tommy56:
Da musst Du mal in die Lib schauen und diese evtl. umbauen.

Gruß Tommy

Siehst du wo das Problem liegt?

Grüße

Da habe ich derzeit kein Interesse daran, mich da einzuarbeiten, da ich für den Schaltkreis auf längere Zeit betrachtet, keine Verwendung habe.

Gruß Tommy

Tommy56:
Da habe ich derzeit kein Interesse daran, mich da einzuarbeiten, da ich für den Schaltkreis auf längere Zeit betrachtet, keine Verwendung habe.

Gruß Tommy

Beruht auf Gegenseitigkeit. Gibt es eine Alternativlösung für die Überprüfung?
Grüße

DerPeter:
Beruht auf Gegenseitigkeit.

Wenn es Dich auch nicht interessiert, warum suchst Du dann eine Lösung?

Gruß Tommy

Tommy56:
Wenn es Dich auch nicht interessiert, warum suchst Du dann eine Lösung?

Gruß Tommy

Puh, deine Antworten sind heute auch ganz schön schwierig.

Weil ich mich ebenfalls einarbeiten müsste und dann -bis auf dieses Problem -auch keine weitere Verwendung hätte

Würde mich aber freuen, wenn wir jetzt wieder zum Thema zurück kämen :wink:

Hätte einer eine Idee wie man das eventuell mit dem Joy-It Code machen kann? Der steuert den Sensor ja direkt an