Mehrer Sensoren mithilfe einer dynamischen Adresse auslesen.

Hallo,
ich habe die Tage schon mal einen Post gemacht da ich mehrer MPU6050 Sensoren mit einem Arduino UNO auslesen wollte. (https://forum.arduino.cc/index.php?topic=719079.0)
Ich habe bezüglich Adressen ändern und auslesen noch etwas weitergeforscht und bin auf eine ganz interessante möglichkeit gestoßen, mehrere MPU6050 Sensoren ohne I2C Multiplexer auszulesen.
(Arduino Playground - MPU-6050)

Kurz erklärt: Mit dem AD0 Pin am Sensor kann die Adresse von 0x68 auf 0x69 geändert werden, in dem man den Pin mit 5V versorgt (oder 3.3V da gibt es iergentwie verschiedene Meinungen).
Wenn also nur die Daten von der ersten Adresse ausgelesen werden und immer nur ein Sensor diese Adresse verwendet, dann kann man die einzelnen Sensoren nacheinander auf die erste Adresse setzten und die Werte von jedem Sensor auslesen.

Es ist auch ein Beispielcode im Post, aber der gibt nur die raw Werte aus.
Ich habe das ganze auch mit der Library (http://www.i2cdevlib.com/devices/mpu6050) versucht, aber diese kann wie es scheint nur ein Geräte auslesen (außer es weiß jemand mehr).

Ich wollte jetzt also mal nachfragen ob schon jemand dieses Problem hatte, oder eine Library weiß die auch mehrer Sensoren auslesen kann.

Ich verwende:
Arudino Uno
MPU6050 Sensor (https://www.amazon.de/gp/product/B07NP2WF7J/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)

PS: Ich habe jetzt nochmal neu gefragt, da ich dachte der andere Post ist jetzt schon wieder etwas weiter nach hinten geschoben. Ich hoffe das passt, ansonsten bessert mich bitte aus.

Schau dir den Header an. Da siehst du dass man die Adresse beim Erstellen des Objekts angeben kann

Du kannst zwei Objekte mit unterschiedlichen Adressen haben

#define MPU6050_ADDRESS_AD0_LOW 0x68 // address pin low (GND), default for InvenSense evaluation board
#define MPU6050_ADDRESS_AD0_HIGH 0x69 // address pin high (VCC)
#define MPU6050_DEFAULT_ADDRESS MPU6050_ADDRESS_AD0_LOW

Meintest du das?
Ich kann die Adresse ändern von der der Sensor die Daten auslesen soll, aber nicht bei auf einmal nutzen
Geschweige denn mehrere auf einem hintereinander.

Wäre es möglich dass ich die beiden Dateien also h und cpp einfach zu einer Klasse umfunktioniere und dann in der Arduino IDE mehre Instanzen erstelle, die ich dann eben immer für einen Sensor verwende?

Ich denke das ist sicher nicht die eleganteste Möglichkeit und ist auch sicher extrem Leistungshungrig.

Mehrere Instanzen sind sicher möglich, doch muß man damit rechnen, daß die entsprechend viel Speicherplatz belegen (Kalibrierdaten, Matrix...).

Hallo,

das Du jetzt da einen neuen Post aufgemacht hast ist sicher nicht Sinn der Sache.

in einem Link den Du oben angegeben hast wird ja geschrieben das es wohl funktioniert hat mehr als zwei Sensore auf diese Art auszulesen. Ich bezweifele allerdings das das zuverlässig läuft. Auf der anderen Seite muss es ja einen Grund geben warum die Adressleitung rausgeführt wird und nicht nur aus einer festen Lötbrücke besteht wie sonst bei I2c üblich.

Probier es doch einfach aus.

Du schliest zwei Sensoren an, benutzt zwei zusätzliche Ausgänge je einen auf die A0 Eingang des Sensors. Im Sketch erzeugst Du ein Objekt mit der standard Adresse. Jetzt musst Du sicher erst mal beide Sensoren nacheinander unter gleicher Adresse initialisieren.. ??? Dann schaltest Du einen Ausgang ein und ließt ein. Dann den anderen Ausgang für den anderen Sensor auf 1 legen und einlesen. Jetzt müssten das die Werte vom zweiten Senosr sein. Einen legts Du anders hin damit Du sie unterscheiden kannst.

Wenn es den klappt machst Du einen Zähler 1-7 und mit jeden Zählerzand einen Ausgang auf H und die Werte einlesen. Eventuelle brauchst Du eine kleine Verzögerung vor dem Einlesen. Zählerstand ist dann letztlich der Index für die Messwert-Array´s. Das könnte ein Ansatzt sein.

Aber wie gesagt ich glaube das läuft nicht zuverlässig, Du klaust dem I2c "Bus-Master" das Gerät unterm Hintern weg und schiebst Ihm ein anderes unter. ZUdem gibt es mehrere ungenutzte mit gleicher Adresse ??

Heinz

Danke für die Antworten.
Ich war mir eben nicht ganz sicher ob wenn ich in einem Post, der schon etwas weiter nach hintengerutscht ist, noch jemand antwortet.

Also es ist mir schon bewust wie das ganze gundsätzlich funktionieren sollte, doch ich habe es jetzt noch nicht hinbekommen mit der library die ich verwende mehr als einen Sensor auszulesen, also auch wenn ich zwei mit unterschiedlicher Adresse habe, bin ich bis jetzt noch nicht dahinter gekommen, wie ich das umsetzten sollte, oder wie das gedacht ist.

Rentner:
Aber wie gesagt ich glaube das läuft nicht zuverlässig, Du klaust dem I2c "Bus-Master" das Gerät unterm Hintern weg und schiebst Ihm ein anderes unter. ZUdem gibt es mehrere ungenutzte mit gleicher Adresse ??

Hallo Heinz,
auch hier gilt: Versuch macht kluch !

Wenn man alle üblichen I2C-Konventionen beachtet werden, könnte es funktionieren.
Ist zwar Bastelkram, ich würde es nicht so machen, aber wenn der Bus zuvor ordnungsgemäß gestoppt wird und nach dem Adresswechsel wieder gestartet wird, dann könnte es so funktionieren.

Wie du schon schreibst, einfach mal testen.

Hallo

na ja mit 2 Objekten

auszug aus einem Beispiel der Lib

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for InvenSense evaluation board)
// AD0 high = 0x69

MPU6050 accelgyro1;
MPU6050 accelgyro2(0x69); // <-- use for AD0 high

Damit hast Du 2 Objekte die Du unter dem beiden unterschiedlichen Namen “accelgyro1” und “accelgyro2” auslesen kannst.

Heinz

Ja blöd kann man sein. :roll_eyes:
Danke schon mal für alle Antworten, ich werde das mal ausprobieren

Habe es jetzt endlich zum laufen gebracht, jedoch nur 2 Sensoren, also einen pro Adresse.
Bin mir nicht ganz sicher wieso dass es nicht funktioniert hat, aber ich werde vermutlich einfach einen Multiplexer verwenden.
Danke für alle Antworten.

Wenn also nur die Daten von der ersten Adresse ausgelesen werden und immer nur ein Sensor diese Adresse verwendet, dann kann man die einzelnen Sensoren nacheinander auf die erste Adresse setzten und die Werte von jedem Sensor auslesen.

Dazu brauchst Du aber keine 2 Instanzen der Klasse sondern nur eine. zB die den Sensor mit der Adresse 0x68 ausliest. Alle anderen Sensoren haben die Adresse 0x69 und da es mehrere sind kannst Du die sowieso nicht ansprechen.
Du brauchst pro Sensor einen Arduino Pin der am AD0 Pin des Sensors die Adresse umschaltet.

Es ist noch zu schauen ob der Sensor es Böse nimmt die Adresse dauernt umgeschaltet zu bekommen.
Da macht aber Probieren schlau.
Grüße Uwe

Bei diesen Sensoren dürften einige zusätzliche sensorspezifische Daten in jeder Instanz liegen. Deshalb braucht man mehrere Instanzen, und auch eine Methode zum aktivieren des zugeordneten Sensors.

Ja genau also ich hätte es auch schon mit einer Instanz versucht, jedoch wird anscheinend bei diesem Sensor nicht der Wert einfach von Sensor ausgelesen, sondern der ausgelesene Wert wird zum Wert der von der Funktion zurückgegeben wird (also in desem Fall ein Quaternion) hinzugerechnet.

Also auf Deutsch, die Raw Werte des Sensors geben keine Grad oder so zurück, sondern nur um wie viel der Sensor gedreht wurde.

Also brauch ich natürlich auch eigene Variablen, die die Daten für jeden einzelnen Sensor speichern, da sonst immer nur zu einem Wert die Werte der verschiedenen Sensoren addiert werden.