So fügen Sie ein zusätzliches I2C-Sensormodul auf Arduino hinzu

Ich habe den GY-521-Sensor auf Arduino ausprobiert, indem ich die Anleitung von ( http://playground.arduino.cc/Main/MPU-6050 ) verwendet habe. Es hat gut funktioniert. Kann mir bitte jemand erklären, wie ich ein weiteres GY-521-Modul hinzufügen kann? Ich plane, insgesamt vier davon mit meinem Arduino Uno zu verbinden. Wie definiere ich die zusätzlichen Sensormodule im Programm?

Antworten (3)

Der Sensor-Breakout GY-521 ist ein I2C-Slave-Gerät. Solange Sie die zusätzlichen Sensoren als I2C-Slaves mit unterschiedlichen Slave-Adressen erhalten (oder konfigurieren) können, werden sie auf die gleiche Weise wie der erste gesteuert, außer dass für jeden der Sensoren eine separate Kommunikationsinitiierung erfolgt und dann die Daten gelesen werden von jedem Sensor über seine I2C-Adresse zurück.

Leider unterstützt der MPU-6050 , der Motion Processing Unit IC im GY-521, nur zwei I2C-Slave-Adressen, so dass Sie bestenfalls Breakout-Boards finden (oder modifizieren) können, um diese beiden Adressen zu unterstützen (durch die Logikpegel an Pin AD0 / Pin 9 des IC angelegt). Wenn Sie tatsächlich mehr als 2 Geräte gleichzeitig benötigen, schauen Sie sich andere ähnliche Geräte und die entsprechenden Breakout-Boards an.

Bei der physischen Verkabelung werden alle Module parallel an denselben Pins angeschlossen, die Sie bereits zur Steuerung des ersten Moduls verwendet haben, auch als I2C- Bus bekannt . Dies würde nur funktionieren, wenn nur eines der Module seine Pull-up-Widerstände aktiviert hat. Auf dem Schaltplan des Moduls sind diese Pull-up-Widerstände mit R4 und R5 mit jeweils 4,7 Kiloohm gekennzeichnet.

Auf der GY-521-Platine, die in dem in der Frage angegebenen Link gezeigt wird, scheinen die Pull-up-Widerstände jeweils 2,2 k zu betragen, wie unten zu sehen ist:

Planke

Die tatsächliche Platine, die Sie haben, müsste untersucht werden, um zu überprüfen, welche spezifischen kleinen SMD-Teile die Pull-up-Widerstände darauf sind: Nicht allzu schwierig, da sie mit den SDA- und SCL-Header-Pin-Pads verbunden sind.

Auf allen außer einer der Sensorplatinen müssten Sie diese beiden Widerstände vorsichtig entlöten, ohne mit anderen Teilen oder anderen Lötstellen auf der Platine herumzuspielen. Wenn Sie nicht daran gewöhnt sind, mit SMD-Bauteilen zu arbeiten, ist es möglicherweise besser, zuerst mit einigen Schrottplatinen zu üben, die von zum Tode verurteilten Druckern oder anderer Hardware geborgen wurden.


Es ist ein bisschen viel, jemanden zu bitten, den Code für Sie zu schreiben, aber es gibt mehrere Arduino-Tutorials zur Kommunikation mit mehreren I2C-Geräten, die sich einen Bus teilen. Suchen Sie auf derselben Website, auf der Sie den Leitfaden für dieses Modul gefunden haben.

Hallo Anindo, danke für die Antwort. Ich habe meine Platinen untersucht und sie sind 2,2k Widerstände. Soll ich die Widerstände auf meiner zweiten Platine entfernen und die zweite Platine mit der ersten Platine verbinden? Oder gibt es eine andere Möglichkeit, ohne physische Änderungen an der Platine vorzunehmen, möglicherweise eine Codeänderung? Es tut mir leid, ich habe die I2C-Kommunikation noch nie gemacht und bin verwirrt. Außerdem hatte ich Schwierigkeiten, Ihre Kommentare zu verstehen. Bitte verwenden Sie einfach und Englisch. Kurze Sätze würden helfen. PS Ich habe nie jemanden gebeten, das Programm für mich zu schreiben. Ich hoffe nur, dass mich jemand dabei anleitet.
@Robert Wenn Sie nur 2 der Module verwenden, können Sie versuchen, die Pullups nicht zu entfernen: Dies führt zu einem Pullup-Wert von 1,1 k auf den SDA- und SCL-Leitungen, was möglicherweise funktioniert. Sie müssen auch herausfinden, wie Sie die Pin 9-Verbindung auf einer der Platinen ändern, um die Geräteadresse zu ändern: Siehe Datenblatt für die MPU-6050. In Bezug auf die Vereinfachung meiner Worte: Ich werde versuchen, die Antwort später zu bearbeiten, wenn Sie auf bestimmte Teile hinweisen, die schwierig sind. Danke für die Rückmeldung.
Hallo Anindo, aus dem Datenblatt habe ich herausgefunden, dass die Slave-Adresse des Sensors 7 Bit lang ist. Der Logikpegel an Pin AD0 des 1. und 2. Sensors kann als logisch niedrig bzw. logisch hoch eingestellt werden. Beim Codieren kann ich wie folgt definieren: #define MPU6050_I2C_ADDRESS 0x68 // 1. Sensor #define MPU6050_I2C_ADDRESS_2 0x69 // 2. Sensor Bin ich hier auf dem richtigen Weg? Ich bin mir immer noch unsicher über die physikalische Verkabelung des I2C-Busses. Kann ich sie parallel zum Arduino anschließen? Im Datenblatt konnte ich dazu keine Informationen finden. PS Lange Sätze können abgekürzt werden. Danke schön.
@Robert Richtig: Sie müssten den AD0-Zeilenwert für jedes der Module aus dem Code festlegen, und dann reagieren sie auf die beiden möglichen Adressen. Für diese beiden Pins benötigen Sie zwei GPIO-Pins vom Mikrocontroller - oder Sie können Widerstände verwenden, um den AD0 auf einem hochzuziehen und auf dem anderen herunterzuziehen. Zum Verdrahten der I2C-Pins verbinden Sie einfach jedes Modul parallel.
Danke Anindo. Kann ich einfach einen der ADO an den Vcc anschließen und einen anderen mit Masse kurzschließen? Oder muss ich die Widerstände verwenden? Welche Bedeutung haben die Widerstände?
Sehr geehrter Herr Anindo Ghosh, Millionen von Dank an Sie. Ich habe es geschafft, die beiden Sensormodule zum Laufen zu bringen.
Sehr geehrter Herr Anindo, ich habe Ihre Antwort akzeptiert, konnte Ihre Antwort jedoch nicht positiv bewerten, da mir der „Ruf“ fehlt.
Betreff: SMD-Entlöten, wäre es für diesen speziellen Fall nicht einfacher, die Widerstände einfach abzuschneiden? oder glauben Sie, dass Sie ein noch größeres Risiko eingehen, Dinge zu beschädigen als mit einem Bügeleisen?
@RobStarling Das würde von der Finesse mit einem Schneidwerkzeug sowie von der Qualität der Leiterplatte abhängen - abgehobene Spuren können manchmal lästig sein.

Da Sie vier dieser i2c-Module benötigen, die nur zwei Adressen unterstützen (basierend auf dem AD0-Pin), haben Sie vier Möglichkeiten.

Die erste besteht darin, mehrere i2c-Busse auf Ihrem Arduino zu verwenden. Es gibt verschiedene Software-i2c-Implementierungen für Arduinos. Dies sind Software- (oder Bitbang-) i2c-Code. Sie erhöhen den Overhead, sollten aber für die meisten Projekte in Ordnung sein. Diese nehmen weitere zwei Stifte ein.

Die zweite verwendet einen i2c-Switch/Multiplexer/Bus/Puffer-Chip. Diese Chips schalten entweder physisch zwischen zwei (oder mehr) Bussen um oder verwenden Puffer oder andere Methoden, um mehreren Bussen auf einer Seite zu ermöglichen, auf einem einzigen Bus auf der anderen Seite zu kommunizieren. Einige verwenden einen zusätzlichen Eingang zum Umschalten, andere sind selbst i2c-Geräte (Sie senden eine i2c-Nachricht, um das Umschalten durchzuführen).

Der dritte und der vierte sind etwas anders und erfordern ein paar freie Pins und hängen vom verwendeten i2c-Chip ab. Nicht alle i2c-Chips verhalten sich gleich. Die dritte hängt von der Geschwindigkeit ab, die zum Neustart nach einem Stromausfall erforderlich ist, oder davon, ob die Kalibrierung eine Weile dauert. Dies würde das Abschalten der Stromversorgung zu einem der Module bedeuten. Jeder kleine Signaltransistor oder Mosfet würde dafür funktionieren. Da der mpu-6050 ein empfohlenes Einschaltverfahren hat (VDD dann VLogic), ist dies möglicherweise nicht das beste.

Die letzte Option, die ad0-Pins auf den vier Modulen können mit vier freien gpio auf dem Arduino verbunden werden, und dann können Sie die ad0 so umschalten, dass jeweils nur eines der i2c-Geräte die eindeutige Adresse hat. Drei hätten die gleiche 0x68-Adresse (AD0 Low), der vierte hätte 0x69 (AD0 High), den Sensor lesen, dann umschalten, so dass der dritte die 0x69-Adresse hat, lesen, Spülschaum wiederholen. Dadurch wird Ihrem Projekt nur ein wenig Code hinzugefügt, ohne dass zusätzliche Teile erforderlich sind. Dies funktioniert möglicherweise nicht, wenn Sie es zu schnell tun oder wenn das IC es nicht mag, dass der AD0-Pin nach dem Einschalten umgeschaltet wird, aber es ist der billigste und einfachste Weg.

Option 3b) Verwenden Sie 2 Transistoren anstelle von jedem, um die i2c-Leitungen anstelle der Stromversorgung zu schalten. Funktioniert das? Was ist nur mit SDA, wenn Sie fast alle Pullups auf SCLs entfernen?

Ich glaube nicht, dass Sie 4 identische I2C-Geräte hinzufügen können, da ihre Busgeräte-IDs gleich sein werden. Warum brauchen Sie 4 Beschleunigungsmesser - einer gibt Ihnen alle Bewegungsachsen?

Danke für Ihre Antwort. Ich baue ein Exoskelett für die unteren Gliedmaßen. Ich platziere 2 des Sensormoduls an einem Bein, Oberschenkel und Schienbein. Die anderen Zwei werden auf dem anderen Bein platziert, um Feedback zu erhalten, während ich die Motoren steuere.
Tatsächlich können Sie für die meisten Geräte mehr als eines davon auf demselben I2C-Bus platzieren. Nur ein Teil der Adresse ist im Gerät fest codiert. Einige Bits sind über externe Pins einstellbar.