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.
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.
Alles in allem finden Sie hier , wie Sie zwei Arduino Uno-Boards (einen Master und einen Slave) über einen I2C-Bus verbinden.
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:
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.
st2000
Mihai