Mehrfach-Arduino-Kommunikation (1 Master, n Slaves)


8

Ich möchte ein Master / Slave-Netzwerk entwickeln, das besteht aus:

  • 1 Arduino-Master, der Sensoren liest und Geschwindigkeitsrampenprofile basierend auf den Sensorsignalen generiert und diese Rampen dann an Slaves sendet

  • 3 (oder mehr) Arduino-Slaves, die die Geschwindigkeit von 12-V-Servomotoren nach den vom Master gesendeten Rampen steuern

Was ist ein gutes Kommunikationsprotokoll, um dies zu erreichen? Seriell (SPI)? I2C? Etwas anderes? Wenn es seriell ist, ist der neue Arduino Leonardo eine gute Wahl? Welche Probleme sollte ich bei der Auswahl eines Protokolls berücksichtigen?

Ich stelle mir so etwas vor wie:

Meister:

void loop() {
    update_ramps()
    for(int i=0; i< num_slaves; i++) {
        send_to_all(i, ramps[i]);
    }
}

Sklave 1:

const int id = 1;
int recived_id, recived_value;
void loop() {
    read_data();
    if(recived_id == id) { 
        do_motor_step(recived_value);
    }
}

Und serielle Kommunikation, bei der RX / TX vom Master an alle Slaves gesendet wird.

Scheint dies eine vernünftige Lösung zu sein?


Sie möchten nur genau die gleichen Informationen an alle Slaves senden? Müssen die Sklaven überhaupt antworten?
Oli Glaser

Nein, sie müssen nicht antworten!
nkint

Wie weit werden die Sklaven entfernt sein?
geometrisch

Ich denke nicht mehr als 15 Meter
nkint

Antworten:


12

Soweit ich weiß, möchten Sie jedem der Slaves unterschiedliche Daten senden, aber die Slaves müssen keine Daten zurücksenden.

I2C ist ein adressierter Bus. Wenn Sie also jedem Slave eine andere I2C-Adresse zuweisen, benötigen Sie nur zwei Drähte, um die Daten zu senden. Bei Bedarf können Sie auch Daten zurückfordern. Die AVRs des Arduino verfügen über einen I2C-kompatiblen seriellen Bus. Und Sie können ohne zusätzliche Hardware auf mehr als 3 Slaves bis zu maximal 127 erweitern.

UARTs haben keine Adressierung, daher benötigen Sie entweder 3 UARTs (die der AVR nicht hat) oder fügen eine externe Logik hinzu, um zwischen UART-Leitungen zu wechseln (was Geld kostet). Jeder zusätzliche Slave bedeutet zusätzliche Kosten. Nicht empfohlen.
Bearbeiten
Wie Chris sagt, können Sie mit UART einen Multidrop-Bus erstellen. Und dann müssen Sie die Adressierung hinzufügen, wodurch Ihr UART ein bisschen wie I2C funktioniert, aber dann asynchron und ohne Adressanpassungshardware wie die I2C. Also immer noch kein wirklicher Vorteil. Ende der Bearbeitung

×

Geben Sie hier die Bildbeschreibung ein

Ich denke, der I2C ist die beste Lösung und erfordert die geringste Anzahl von Drähten. Das Protokoll ist etwas komplexer als UART oder SPI, aber da der AVR über die entsprechende Hardware verfügt, sollte es einfach zu bedienen sein.


2
Die Behauptung, dass mehrere UARTs oder externe Logik erforderlich wären, ist nicht korrekt. Die Bus-UART-Kommunikation erfolgt ständig über die Software-Adressierung. Beim gemeinsamen Senden und Empfangen sind nicht mehr Pins als bei I2C erforderlich.
Chris Stratton

@ Chris - Guter Punkt, ich werde meine Antwort aktualisieren.
Stevenvh

1
@capcom - Ich habe ein Blockdiagramm für das SPI hinzugefügt. MOSI wird für den Master und für die Slaves ausgegeben. MISO wird für die Slaves und für den Master ausgegeben. Ja, Sie machen die SS für den Slave, an den Sie Daten senden möchten, niedrig. Die SS dient nicht nur dazu, den Beginn und das Ende der Kommunikation anzuzeigen, sondern auch ein nicht ausgewählter Slave sollte sein MISO für etwaige Buskonflikte hochohmig machen.
Stevenvh

2
@nkint - 8 m haben eine Kapazität von ungefähr 800 pF, und I2C erlaubt nur 400 pF, die erforderliche Kantengeschwindigkeit zu erhalten. Sie müssen einen Bus-Extender wie den P82B715 verwenden , der den Bus mit bis zu 50 m Kabel ansteuert .
Stevenvh

1
@stevenvh das P82B715 funktioniert super und es ist wirklich einfach zu stecken!
nkint

5

Ich nehme an, mit seriell meinst du UART? Beachten Sie, dass UART, SPI und I2C alle serielle Protokolle sind.

SPI oder I2C wären dafür in Ordnung, da beide die Master / Slave-Architektur verwenden.
Ohne Masse würde SPI für 3 Slaves 6 Pins (MOSI, MISO, CLK + 3 SS-Pins) und I2C nur zwei (SDA und SCK) erfordern.
Ich würde wahrscheinlich I2C auswählen, vorausgesetzt, Sie benötigen keine sehr hohe Datenübertragung Raten (<400 kHz)

Je mehr Slaves Sie hinzufügen, desto weniger praktisch ist SPI, da Sie für jeden neuen Slave eine weitere SS (Slave-Auswahl) benötigen. Bei I2C ist dies kein Problem, da die Adressierung Teil des Protokolls ist und Sie immer noch nur die 2 Leitungen (plus Masse) benötigen.

Für Arduino sollte es eine ganze Reihe von Tutorials mit I2C / SPI-Bibliotheken und Beispielcode für beide oben genannten Funktionen geben, was die Inbetriebnahme ziemlich schmerzlos machen sollte.


Sie haben Recht, die Daten sind für jeden Slave unterschiedlich. Ich wurde durch den Namen der Funktion "send_to_all" in die Irre geführt, aber es scheint, dass für jede Funktion eine andere Rampe verwendet wird (sie sind indiziert). Ich habe meine erste Antwort gelöscht.
Stevenvh

1

Gemeinsame asynchrone Signalisierungsschemata ähnlich RS485 sollten ebenfalls möglich sein.

Wenn Sie keine Leitungstreiber / -empfänger verwenden (nur die bloßen ATMEGA-Pins), müssen Sie den UART TX zu einem Eingang machen, wenn Sie nicht an der Reihe sind, zu sprechen. Wenn Sie Leitungstreiber verwenden, müssen Sie einen zusätzlichen Pin verwenden, um die Tristate-Aktivierung des Leitungstreibers zu steuern, wenn Sie nicht an der Reihe sind, zu sprechen.

Beachten Sie auch, dass Sie den Sender nicht einfach tristieren können, wenn das letzte Byte in das Senderegister aufgenommen wurde (der Punkt, an dem Sie ein anderes Zeichen senden könnten). Stattdessen müssen Sie sicherstellen, dass der Sender oder Leitungstreiber aktiviert bleibt, bis das Wort gefunden wurde voll herausgeschoben.

Berücksichtigen Sie bei den Schemata, bei denen Sie auf demselben Kabel (oder Differentialpaar) senden und empfangen, dass Sie Ihre eigenen Übertragungen hören.


1

In dem speziellen Fall, in dem Sie eine Verbindung über UART herstellen möchten , können Sie den UART RS485 MODBUS verwenden . Dies ist ein Kommunikationsprotokoll mit Softwareadressen, Funktion und Prüfsumme.

Ich denke : Es ist aufgrund von RS-485 zuverlässiger als I²C oder SPI und benötigt weniger Drähte als SPI.

HINWEIS: Es kann standardmäßig mit einigen Bibliotheken implementiert werden , es kann jedoch teuer sein, da Sie für jeden Slave ein RS485-Modul und für den Master eines benötigen, ABER es ist mit einem vorhandenen Netzwerk kompatibel. Sie können dies jedoch kostengünstiger tun, indem Sie ältere Komponenten verwenden und Ihr eigenes Gerät herstellen. Der MAX 485 kann die Basiskomponente für die Herstellung eines Hardware 485-Busses oder die Verwendung einer Software RS485 sein


0

Die einfachste Lösung für die spezifischen Anforderungen wäre ein RS-422-Sender auf einer TX-Leitung am Master (Bus-Controller). Dies würde auf die mehreren Empfänger (Remote Terminals) auffächern.

Alle RTs würden die Broadcast-Nachrichten hören, aber nur die Befehle authentifizieren und ausführen, die über die RT-Adresse an sie gerichtet sind.

Wenn ein Busprotokoll ähnlich 1553 verwendet würde, wäre es einfach zu implementieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.