Verbinden Sie mehrere Slave-Arduino-Geräte mit einem Master-Arduino-Gerät

Ich möchte die serielle Kommunikation zwischen einem Master und mehreren Slaves verwenden.

Ich habe bereits den RX des Masters mit den TX-Pins beider Slaves verbunden und umgekehrt (also den TX-Pin des Masters mit den RX-Pins beider Slaves verbunden). Ich habe auch die GND-Pins verbunden.

Aber jetzt bekomme ich komische Zeichen, wenn ich das Fenster des seriellen Monitors öffne.

Wie verbinde ich nun ein Master-Arduino-Gerät mit mindestens zwei Slave-Arduino-Geräten über die RX- und TX-Pins? Muss ich 5V-Pins anschließen?

PS: Ich sehe viele Wörter wie „SPI“ und „I2C“, und die Leute fangen an, Terminologie zu verwenden. Aber ich bin nicht so erfahren, also bitte, wenn Sie die Begriffe verwenden, erklären Sie sie.
Ein weiteres PS: Ich möchte, dass die Arduino-Geräte Strom vom Master-Arduino-Gerät verwenden.

Sie können einen TX-Pin mit mehreren RX-Pins verbinden. Wenn Sie mehrere TX-Pins an einen RX-Pin anschließen, treten Probleme auf, da das Signal von einem TX das andere stört. Sie müssen mehrere UARTS (serielle Ports) auf dem Master verwenden, um separate mit jedem Slave zu verbinden.

Antworten (3)

Wie verbinde ich nun ein Master-Arduino-Gerät mit mindestens zwei Slave-Arduino-Geräten über die RX- und TX-Pins? Muss ich 5V-Pins anschließen?

Netzwerke des armen Mannes:

Die folgende Schaltung ist extrem "frech", kann aber "gut genug" zum Laufen gebracht werden.
Sie können dasselbe mit formellen Gates tun.

Obere Schaltung:

Master + N Secondaries.
Master wird immer von allen Secondaries gehört.
Der Meister kann jeden sekundären hören.
Secondaries können andere Secondaries nicht hören.
Mehrere gleichzeitig sendende Secondaries verfälschen beide Signale.

Master RX wird durch einen Widerstand hochgezogen.
Jeder Slave kann Master RX auf Low ziehen, indem er seinen TX auf Low setzt.
Es kann immer nur ein Slave „sprechen“, wenn korrupte Übertragungen vermieden werden sollen. Max. begrenzt durch die Zeitkonstante von R plus Schaltungskapazität.
Ein zu niedriges R kann von TX nicht richtig heruntergezogen werden.

Unterste Schaltung: Alle Peers.

Jeder kann (einzeln) senden.
Alle erhalten alles gesendet.
Der Sender erhält seine eigene Übertragung und kann beurteilen, ob die Übertragung beschädigt wurde.

Nützlich für zB Pure-ALOHAnet oder Slotted-ALOHAnet Betrieb .
Oder Token Ring, Round Robin oder die meisten anderen Netzwerksysteme. Sogar CSMA/CD

Geben Sie hier die Bildbeschreibung ein

Der Wert des Pullup-Widerstands bleibt als Übung für den Schüler übrig.

Die gezeigte Polarität setzt voraus, dass der TX-Leerlaufpegel hoch ist.
Diodenpolaritäten umkehren und Pulldown für TX-Leerlauf verwenden ist niedrig.

Ich wollte gerade etwas Ähnliches vorschlagen, aber Sie sind mir zuvorgekommen! Ich habe gerade ein Design fertiggestellt, das etwas sehr Ähnliches tut, außer dass an jedem Knoten Opto-Isolatoren vorhanden sind. Nichtsdestotrotz ist es ein Eindraht-Halbduplex-Schema, das dem, was Sie oben gezeigt haben, sehr ähnlich ist.
FWIW - Das oben erwähnte optoisolierte Schema funktioniert gut bei 2400 Baud mit 200 Metern eines abgeschirmten Twisted-Pair-Kabels (+5 V, Signal, Abschirmung ist Masse).

Verbinden Sie die TX-Pins nicht miteinander. Wenn ein Slave-Arduino seinen TX auf logisch hoch und der andere Arduino seinen TX auf logisch niedrig treibt, ist die resultierende Spannung kein gültiger Logikpegel - deshalb erhalten Sie ungültige Zeichen.

Kaufen Sie stattdessen eine vorgefertigte Version RS-485 arduino shieldfür jedes Ihrer Geräte. Details unten...

Der TX/RX ist nicht darauf ausgelegt, mehrere Slave-Geräte zu unterstützen; es ist nur eine Verbindung zwischen zwei Punkten. Der TX-Ausgang wird immer angesteuert, und es kann nur einen Treiber geben.

Um mehrere Slave-Geräte richtig anzuschließen, benötigen Sie eine Schnittstelle, die tatsächlich für die Unterstützung mehrerer Treiber ausgelegt ist.

Die Arduino TX/RX-Pins, die Sie verwenden, werden allgemein als bezeichnet RS-232, obwohl das nicht ganz genau ist. RS-232 ist eine sehr einfache Art von Netzwerk, das zwei Geräte verbindet. Ein Gerät heißt the DCEund das andere Gerät heißt DTE. Machen Sie sich keine Gedanken darüber, was diese Namen bedeuten; Sie bedeuteten früher etwas in den dunklen Zeiten, als Menschen kabelgebundene Telefonhörer mit akustischen Telefonmodems verbanden ( http://en.wikipedia.org/wiki/Acoustic_coupler ) . Draht, während das andere Gerät weitersendet und weiterhört . Dies wird verwirrend, da wir gerne Drähte mit ähnlichen Namen verbinden, also verwenden wir oft einen Verbindungstyp namens aTXDRXDRXDTXDNull Modem-- der TX-Ausgang eines Geräts treibt den RX-Eingang des anderen Geräts und umgekehrt.

(Ich überspringe einige Details darüber, wie RS-232-Signale höhere Spannungen als die CMOS-Logikpegel verwenden – es ist nicht nur eine direkte logische Verbindung.)

Die Einschränkung eines Nullmodems besteht jedoch darin, dass es nur zwei Geräte verbindet. Es kann kein Netzwerk aus drei Geräten unterstützen, da die Kabelverbindung nicht wissen kann, welches Gerät gültige Daten signalisiert und welches Gerät im Leerlauf ist. Das erfordert eine neuere Art von seriellem Netzwerk namens „RS-485“.

Der RS-485Standard erfordert die Verwendung einer speziellen Art von Pegelumsetzer, Sie verbinden nicht nur die TX/RX-Signale mit Logikpegel. Dieser RS-485-Pegelumsetzer sorgt dafür, dass die Verbindung so gesteuert wird, dass er die gemeinsame Nutzung der Verbindung zwischen mehreren Geräten ermöglicht. Sie müssen immer noch darauf achten, dass Geräte nicht gleichzeitig senden (genannt a Collision), aber da Sie ein Gerät als Master und die anderen Geräte als Slaves festgelegt haben, sollte das kein Problem sein. Das Master-Gerät entscheidet, welches Gerät auf dem Bus sprechen darf.

Da Sie ein Arduino-Benutzer und nicht sehr erfahren in der Elektronik sind, ist der einfachste Weg für Sie der Kauf eines vorgefertigten RS-485 arduino shield.

Sie erwähnten I2C(auch seltener abgekürzt als IIC), einen 2-Draht-Open-Drain-Schnittstellenstandard, der ursprünglich von der Philips Corporation definiert wurde. Google i2c bus specificationfür Details. Sie könnten wahrscheinlich das erreichen, was Sie mit RS-485 oder I2C versuchen, aber RS-485 ist näher an dem, was Sie jetzt verwenden.

Sie haben erwähnt, dass Sie die Slave-Geräte über dieselbe Stromversorgung mit Strom versorgen möchten, die das Master-Gerät mit Strom versorgt. (Sie sollten auf jeden Fall bereits dieselbe Erdungsrückleitung verwenden.) Wenn das Master-Arduino über USB mit Strom versorgt wird, sollte dies in Ordnung sein, solange der von allen drei Platinen aufgenommene Gesamtversorgungsstrom den Nennlaststrom nicht überschreitet. Wenn das passiert, werden Sie es wissen, weil Ihr Windows-PC den USB-Anschluss abschaltet.

Was Sie nicht erwähnt haben, wenn Sie über RS-485 sprechen, ist die Richtungssteuerung, die an jedem Knoten erforderlich ist. Sie können dies bei Bedarf in Hardware tun (Jan Axelson hat eine nette Schaltung veröffentlicht, die gut funktioniert), aber die Richtungssteuerung wird normalerweise vom Mikrocontroller übernommen.
@DwayneReid Die Richtungssteuerung wird nur für Halbduplex- RS485 benötigt. Wenn Sie separate Vollduplex- TX- und -RX-Paare haben, ist dies nicht erforderlich.

https://www.arduino.cc/en/Tutorial/TwoPortReceive

Es geht über das Setzen anderer digitaler Pins in andere TX- und RX-Pins.

Frosty0_0