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?
Antworten:
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
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.
quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle