Arduino I2C-Kommunikation zwischen 2 Master-Netzwerken

Ich habe 2 Arduino-Mikrocontroller, an die jeweils ein Netzwerk von I2C-Geräten angeschlossen ist (einer hat 2 ADCs und der andere ein LCD-Display und eine RTC). Wie kann ich die I2C-Verbindung verwenden, um die vom ersten uC erhaltenen Werte von den ADCs auf den zweiten zu übertragen? Beide uC sind Master auf ihren I2C-Bussen. Ich dachte daran, einen Software-I2C auf dem zweiten uC zu erstellen und ihn als Slave mit dem ersten zu verbinden (der zweite Controller hätte also 2 I2C-Ports: einen Hardware- und einen Software-Port). Das Problem ist, dass ich keine Software-I2C-Bibliothek finden kann, die als Slave arbeitet. Alle sind Meister.

Warten auf Ihre Ideen.


Die Frage ist, kann ich mit einem Arduino Mega2560 2 I2c-Netzwerke erstellen? Einer als Master am Hardware-Port zur Kommunikation mit dem LCD und der RTC und einer als Slave an einem Software-Port an 2 anderen Pin-Paaren (für SCL und SDA) zum Empfangen von Daten von einem anderen Master-Arduino ...


Nach Analyse aller Daten komme ich zu dem Schluss, dass die 2 I2C-Busse nicht miteinander verbunden werden können. An dem externen I2C-Port, den ich am Datenerfassungs-uC zur Verfügung habe, werde ich einen anderen Arduino als Slave anschließen, der die Informationen empfängt und sie mithilfe eines drahtlosen Adapters (wahrscheinlich ein NRF24N01) weiterleitet. Auf diese Weise brauche ich keine Kabel von meinem Solarregler zum Arduino, das die Produktion an die pvoutput-Website meldet.

Welcher Arduino (eigentlich welcher Mikroprozessor)?
Arduino Pro mini ist mit den ADCs verbunden. Arduino Mega2560 ist derjenige mit etc und LCD.

Antworten (4)

Aus den Kommentaren geht hervor, dass Sie in jedem Ihrer separaten Projekte nur eine Verbindung zum I2C-Bus herstellen und Daten übertragen können.

Mit Wirning können Sie einen Arduino entweder als I2C-Master oder als Slave ausführen. Sie können nicht sowohl die Master- als auch die Slave-Wiring-Software auf einem einzigen Mikro ausführen, da beide die USI-Hardware verwenden möchten, aber da Sie nur eine USI haben, können Sie sowieso nur eine Verbindung zu einem Bus herstellen.

Ich würde vorschlagen, einen ATTiny85 als I2C-Slave-Schnittstelle auf jedem Bus zu verwenden und sie dann über einen Software-UART miteinander zu verbinden. Es gibt eine sehr schöne TinyWire- Bibliothek für ATTiny85 von Adafruit .... sie haben auch ein sehr kleines Board namens Trinket , das Sie verwenden könnten.

Es gibt eine Reihe von ATTiny85-Boards (wie Digispark), die an die Arduino-Programmierumgebung angeschlossen werden können, sodass dies eine einfache und kostengünstige Möglichkeit sein sollte, einen I2C-Slave zu erstellen.

Während einige sagen mögen, dass dies übertrieben ist, wäre es extrem einfach zu implementieren und würde keine Hardware-Mods für Ihr Projekt erfordern.

IIC ist keine gute Wahl für Peer-to-Peer-Kommunikation.

Der einfachste Weg, sich mit Mikrocontrollern zu verbinden, ist wahrscheinlich mit UARTs. Beachten Sie, dass in jeder Richtung ein separater und asynchroner Kanal bereitgestellt wird. Sie sind auch nicht an Standard-Baudraten gebunden. Verwenden Sie etwas Schnelles, das direkt von beiden Uhren abgeleitet werden kann. Sie können problemlos ein MBaud oder mehr zwischen UARTs auf derselben Platine ausführen.

Besonders wenn Sie die Baudrate erhöhen, kann es eine gute Idee sein, eine Flusskontrolle zu implementieren. Einige Microncontroller-UARTS haben RTS/CTS eingebaut, aber selbst wenn nicht, lässt sich diese Art von Fähigkeit einfach in Firmware hinzufügen. Stellen Sie sicher, dass der Empfänger mindestens so viele Zeichen zwischenspeichern kann, wie sich im Hardware-FIFO des Senders befinden. Auf diese Weise kann die Flusssteuerungsleitung im Sender verwendet werden, um einfach keine weiteren Daten auf die Hardware zu schreiben. Mikrocontroller haben in der Regel kleine UART-Ausgangs-FIFOs (normalerweise nur ein oder zwei, selten mehr als 4), daher ist dies kein großes Problem.

Ein Arduino Pro mini ist mit den ADCs verbunden und bildet die Anzeigeeinheit eines Solarladereglers (er hat ein spezielles LCD seriell angeschlossen). Die einzige Verbindung, die ich verwenden kann, ist der I2C (oder ich muss ein Chaos aus der eingeschalteten Platine machen). Ein Arduino Mega2560 ist derjenige mit RTC und LCD und hat auch ein Ethernet-Schild. Diese Datenübertragung muss nicht schnell sein, ich muss nur etwa jede Sekunde 2 Werte (Volt und Ampere) senden.
  • Sie können nur einen I2C-Master auf dem I2C-Bus haben. (Es gibt vielleicht einige erweiterte Protokolle, bei denen Sie wechseln können, wer der Master ist.)
  • Viele eingebettete Prozessoren können entweder als I2C-Master oder -Slave konfiguriert werden. (Ich glaube nicht, dass die Standard-Arduino-I2C-Bibliothek einen einfachen Wechsel zwischen Master und Slave ermöglicht. Es kann Arduinos geben, die Prozessoren ohne Unterstützung für den Slave-Modus verwenden.)
  • Diese Arten von Protokollen (SPI oder I2C) sollten von Teilen verwendet werden, die dieselbe Platine und Stromversorgung teilen. Sie sind im Allgemeinen nicht robust genug, um die Komplikationen von (z. B.) teilweisen Stromausfällen, Hot-Plugging oder übermäßig langen Kabeln zu ertragen.

Alles in allem finden Sie hier , wie Sie zwei Arduino Uno-Boards (einen Master und einen Slave) über einen I2C-Bus verbinden.

Ich habe dieses ganze System als 2 separate I2C-Netzwerke betrachtet: das erste mit Arduino Promini als Master + ADC und Arduino Mega2560 als Slaves. Das zweite Netzwerk besteht aus Arduino Mega2560 als Master + LCD und usw. als Slaves. Wie Sie sehen können, möchte ich, dass Mega2560 2 I2C-Verbindungen hat, eine als Slave (Software) und eine als Master am Hardware-Port.
Es ist möglich, einen Software-Slave-I2C-Port zu implementieren. Entweder müssen Sie Ihr Programm während einer Übertragung ausschließlich der Überwachung der CS-, Takt- und Datenleitungen widmen. Oder verlangsamen Sie die SPI, bis der Slave die Übertragung und alles andere, was Sie auf dem Slave-Prozessor tun müssen, bewältigen kann.
Hoppla, ich muss in meiner Antwort von SPI zu I2C wechseln. Außerdem gibt es kein CS (Chip Select) für I2C. I2C verwendet in seinem Protokoll die Slave-Adressierung.
Ich sehe, dass es einige Bibliotheken für einen Software-I2C gibt, aber alle sind Master ... Kein Slave ... Ich könnte den Software-I2C für die Kommunikation mit LCD und RTC verwenden, aber ich bezweifle, dass die für diese Module erstellten Bibliotheken mit einer Software funktionieren würden Hafen...
Stellen Sie sich eine Situation vor, in der Sie genau wissen, was Sie zwischen Ihren 2 Arduino-Boards senden möchten und wie schnell Sie es senden möchten. Bedenken Sie, dass es einfacher sein kann, eine benutzerdefinierte Handshaking-Schnittstelle zu implementieren, die in Software auf beiden Prozessoren implementiert ist. Sehen Sie, ich glaube nicht, dass Sie (zum Beispiel) den Adressierungsaufwand des I2C-Protokolls benötigen. Schließlich haben Sie nur 1 Master und 1 Slave. Und Sie müssen möglicherweise nur Daten in eine Richtung senden. Sie müssen sich also nicht die Mühe machen, Leitungen mit Tristate zu versehen und sie mit Widerständen hochzuziehen.

Was @olin vorgeschlagen hat, sollten Sie berücksichtigen.

Falls Sie zwei I2C-Modi (sowohl Master als auch Slave) benötigen, lesen Sie weiter.

Das Arduino kann zu jedem beliebigen Zeitpunkt entweder als Master oder als Slave konfiguriert werden. Also, ich würde das versuchen. Das Arduino, das beide Rollen übernehmen muss (nennen Sie es Arduino A), kann standardmäßig als Slave konfiguriert werden. Auf diese Weise verpasst der Arduino keine Befehle vom Arduino B (der Arduino, der immer meistern wird).

Der Arduino A kann selbst entscheiden, wann er seine Rolle zum Master ändert . Dies hängt von den periodischen Intervallen ab, aus denen Daten gelesen werden müssen. Sobald Daten von den Sensoren gelesen oder Daten auf LCD geschrieben werden, kann das Arduino A wieder die Rolle des Slaves übernehmen.

Ein Haken ist, dass, während Arduino A die Rolle des Masters übernommen hat, Arduino B nicht mit Arduino A kommunizieren kann. Dies kann auf viele Arten gelöst werden:

  1. Mit einem Ersatz-GPIO informiert Arduino A B, dass es beschäftigt ist
  2. Der Arduino B kann es nach einer kurzen Zeit erneut versuchen
  3. Arduino A kann Arduino B informieren, wenn es zur Kommunikation bereit ist (Beispiel: B wissen lassen, wann die zu kommunizierenden Daten über GPIO verfügbar sind).
  4. Programmieren Sie den Arduino B, um regelmäßig die Daten zu schreiben, die Arduino A erwartet.

Betrachten Sie http://www.gammon.com.au/i2c , falls hilfreich. Es gibt gute Informationen über Konfigurationen. Alles auf einer Seite. Bitte verirren Sie sich nicht während der Navigation.

Schließlich sind die Faktoren, die die Entscheidung der Logik beeinflussen, Ihre eigenen Anwendungsanforderungen. Die Häufigkeit der Kommunikation – die gelegentlich oder zusammenhängend sein kann, die Kritikalität der Reaktionszeit, nicht die geringste Menge an Ressourcen, die man sparen möchte, falls man sich entscheidet, auch einen I2C-Software-Slave zu implementieren.