Ich möchte zwei gleiche Magnetometer (HMC5883L) mit meinem Arduino verwenden, aber ich kann den Code nicht herausfinden, um jeden von ihnen separat aufzurufen.
Ich habe online gelesen, dass das Verbinden mehrerer Geräte durchaus machbar ist, solange Sie ihre jeweiligen Adressen anrufen. Das Problem, das ich habe, ist, dass sie, weil ich zwei gleiche Geräte verwende, jeweils dieselbe Adresse haben.
Meine Fragen sind also, kann ich die I2C-Adresse eines meiner Magnetometer ändern, ohne dass es kaputt geht, wie mache ich das, ist es eine dauerhafte Änderung, und wenn ja, kann ich den HMC5883L bei Bedarf auf die Standardeinstellung zurücksetzen?
Ich habe gerade das Datenblatt gelesen, ohne externe Hardware (wie eine Art Multiplex-Puffer mit Kanalauswahl und Chipaktivierung) können Sie nicht zwei dieser Geräte auf demselben I2C-Bus haben.
Das von Ihnen verwendete Gerät hat eine feste, werkseitig eingestellte Adresse. Es gibt keine Möglichkeit, die Adresse per Software oder sogar durch externe Pins zu ändern, um die 7-Bit-I2C-Busadresse anzupassen.
Komplexere ATMEL 8-Bit AVR wie die XMEGAs haben mehrere I2C-Schnittstellen, sodass Sie mit diesen zwei Geräte haben könnten, eines pro Kanal. Dasselbe gilt beispielsweise für den einfachen und kleineren ARM Cortex M0 -> M3, alle haben mehrere Busschnittstellen, die dieses Problem lösen können.
Etwas, das mit ein wenig Hardware und Software zu tun hat, besteht darin, einen IC zu haben, der die I2C Serial Clock (SCL) entweder zum einen oder zum anderen blockiert und abwechselt, welcher die Taktsignale empfängt und daher in der Lage ist, Befehle zu empfangen und darauf zu reagieren. Ich denke, ein einfacher Dual-MOSFET mit XOR-Steuerung an den Gates könnte dies mit einer einfachen Schaltung tun. Andernfalls können Sie mit einer Art Leitungstreiber / Pufferchip mit einem Aktivierungspin und einem Zweikanal- / Multiplexausgang umschalten, welcher Ausgang das SCL-Signal erhält.
So oder so ist es nicht schön. Sie können immer ein zweites, aber ähnliches IC/Modul-Magnetometer finden, das eine andere hartcodierte I2C-Adresse hat oder zumindest die Möglichkeit hat, sie zu ändern (normalerweise externe Pin-Konfigurationen/Widerstände), um mehrere auf demselben Bus zuzulassen.
BEARBEITEN: Texas Instruments hat ein I2C-Fehlerbehebungsdokument , das auf Seite 8 eine Möglichkeit zeigt, das Multiplexen einfacher als von mir beschrieben durchzuführen, um den I2C-Bus in Unterabschnitte aufzuteilen, um mit widersprüchlichen Slave-Adressproblemen wie dem, was Sie haben, umzugehen.
viel Glück!
Gemeinsame Wege:
Verwenden Sie zwei i2c-Kanäle. Entweder Hardware oder Bitbanged/Software i2c. Es ist kein kompliziertes Protokoll und es gibt viele Bibliotheken dafür.
Verwenden Sie einen Hardware-i2c-Puffer/Busschalter/Multiplexer usw. Es gibt viele Namen für dasselbe. Einige werden von einem externen GPIO gesteuert, andere können über ihre eigene i2c-Adresse gesteuert werden.
Wie @Jjones erwähnte, würde eine Brücke auch funktionieren. Dedizierte oder Ersatz-Mikrocontroller könnten in eine Protokollbrücke umgewandelt werden, wie i2c-spi oder serial-i2c oder was auch immer.
Schließlich haben viele Hersteller alternative Adressversionen derselben Chips.
Komischerweise hat dieser Sensor viele unbenutzte Pins, die zum Einstellen einer Adresse hätten verwendet werden können, aber sie haben sich aus irgendeinem Grund dagegen entschieden.
Der LT4316 ist Ihre Antwort. http://cds.linear.com/docs/en/datasheet/4316fa.pdf
Dieser erstaunliche kleine Chip ist eine nahezu passive Lösung. Ich habe es gerade auf einem Board verwendet (habe meine Verschiebung tatsächlich auf Null gesetzt und sie als Puffer verwendet). Was ich mit fast passiv meine, ist, dass Sie Ihre i2c-Adressverschiebung einfach mit Widerständen einstellen können und die Änderung für Ihren Code unsichtbar ist.
Die Verschiebung gilt nur für die Adresse selbst und durchläuft die Daten dann unverändert.
Sie könnten 2 Arduino verwenden und über SPI mit jedem Host-I2C-Slave-Gerät kommunizieren.
Andreja Ko
hallowelt922
KyranF
Kadin
Venny
Nick Alexejew