Kommuniktation zwischen Arduinos

Welche Möglichkeiten gibt es, Arduino Uno R3 untereinander kommunizieren zu lassen. Ich habe derzeit 2 Unos hier rumliegen. Würde gerne einen als "Master" machen. Der die anderen Arduinos anfragt, in welchem Modus sie sich befinden und gleichzeitig den Slaves die Uhrzeit mitteilt.

Master -> Zeit übermitteln || Slave -> Zeit empfangen
Slave -> Status übermitteln || Master -> Status empfangen

Der Master Arduino soll dann mit einem LCD Keypad und Ethernet ausgestatet werden.
Ich lese immer wieder etwas bzgl. I2C, finde aber keine nötigen Tutorials bezogen auf den Uno. Leitungslänge kann bei mir vernachlässigt werden. Strecke ~1m.

Wenn es nur 2 Stück sind und du keinen richtigen Bus willst, ist RS232 das einfachste. Einfach jeweils TX mit RX verbinden

Für I2C brauchst du wie gewöhnlich die Wire-Lib. Bei begin() kannst du dann Master/Slave und die Adresse einstellen:

Danach mit onRequest/onReceive arbeiten:

Derzeit sind es nur 2 Arduinos, es soll aber ggf. noch einige mehr dazu kommen. Serielle Verbindung ist dafür dann vermutlich nicht mehr möglich. Gibt es bei der I2C eine Beschränkung der Arduinos? Vermutlich wieder eine ^2 Zahl. Denke nicht, dass ich je mehr als 10 Arduinos gleichzeitig im Gebrauch werden habe ^^

Programm-technisch sind es 7-Bit Adressen. Das sollte reichen :slight_smile:

Elektrisch ist das Problem eher die Länge der Leitungen als die Anzahl der Devices. I2C wurde für kurze Strecken innerhalb eines Geräts konzipiert. Ein paar Meter gehen aber, nach dem was man so liest. Wenn nicht kann man die Geschwindigkeit drosseln (dazu muss man hier aber Wire intern anpassen) oder die Pullups etwas niedriger machen.

SPI gibts auch noch:

Aber das ist komplizierter als I2C und braucht mehr Leitungen. Die höhere Geschwindigkeit und Voll-Duplex Kommunikation braucht man hier nicht.

SPI ist auch nicht viel besser, was die Leitungslänge angeht, und braucht auf dem Master pro Slave einen Select-Pin.

Da Master/Slave = Halbduplex reicht, könnte man auch mit Rx/Tx RS485 - Transceiver ansteuern, für größere Entfernungen.

Wenn die Slaves ihre Sendeleitung nur bei Bedarf auf OUTPUT schalten, sollte man solch ein Netz doch auch ohne Extra-Hardware hinkriegen ???

Er sagt ja Strecke ~1m. Das sollte ohne Probleme gehen :slight_smile:

Serenifly:
Wenn es nur 2 Stück sind und du keinen richtigen Bus willst, ist RS232 das einfachste. Einfach jeweils TX mit RX verbinden

Arduino hat keine RS232 Schnittstelle sondern eine serielle Schnittstelle. Das Protokoll ist dasselbe wie RS232 aber die Logik-Pegel sind unterschiedlich. Bei der Seriellen Schnittstelle sind es 0V und 5V (TTL Pegel) bei RS232 sind es LOW zwischen 3V und 25V, HIGH zwischen -3V und -25V.
Bei nicht allzuvielen Arduinos und kurzer Distanz ist I2C geeignet (wegen parazitärer Kapazität der Leitungen und der Eingänge). Gegebenenfalls ist ein I2C Extender notwendig (zB: P82B715, PCA9507 ..) und/oder ein I2C accelerator (zB: LTC4311, PCA9510) . Bei zu langer Verbindungslänge bzw zuvielen Ardunos ist der einzig gangbare Weg die RS485 Schnittstelle. Man schließt zb einen MAX485 an die seriellen Schnittstelle jeden Arduinos an.
Beim I2C-Bus ist die Flußkontrolle bereits vorhanden, bei RS485 muß sie programmiert werden. Prinzipielle antworten Slaves auf Anfragen des Masters. Der Master kann die Zeit übertragen und der/die Slaves diese annehmen. Um Daten vom Slaves zu erhalten muß der Master diese explizit anfordern und der betreffende Slave antworten.

Grüße Uwe

Darf ich die die rs485 an herz legen damit kannst du Problemlos erweitern in BusTopologie bis zu 1000m und ca 30 Teilnehmern.
Duu brauchst aber für jeden Teilnehmer einen RS485 Wandler z.B. SN75176 oder MAX485.
Hier ne Internetseite von Nick Gammon mit einem Interessanten Libary die ich schon etliche male genutzt habe auch auf Attinys
http://www.gammon.com.au/forum/?id=11428
Handelt von RS485.

Gruß
Der Dani