Broadcast mit RS232: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
K (Mirekgoebel verschob Seite Boradcast mit RS232 nach Broadcast mit RS232) |
Version vom 8. Februar 2014, 15:39 Uhr
Für die Kommunikation zwischen mehreren Teilnehmer (mehr als 2) existieren bereits verschiedene Bussysteme. Dieses Artikel behandelt das "Misbrauchen" der RS232-Kommunikationsschnittstelle beim Arduino für eine Single-Master-Multiple-Slave-Kommunikation. Die Kommunikationsart ist "Broadcast" d.h. ein Master sendet und alle Slaves empfangen.
Diese Art der Kommunikation wurde aufgebaut, um ein Steuersequenz von einer zentralen Steuereinheit an verschiedene dezentrale Steuergeräte zu senden. Die Zielgeräte benötigen einen Teil des Sequenzes und müssen keine Rückmeldung (zumindest nicht auf die RS232-Schnittstelle) senden.
Versuchsaufbau
Der Versuch besteht aus einem Master, der "Ein"- und "Aus"-Zeichen an die Slaves sendet. Der Master sendet wechselnd die Zeichen mit einem 2 Sekundentakt. Die Slaves lesen laufend (Pollbetrieb) die Zeichen an der RS232-Schnittstelle und reagieren nach Zeichen. Dabei wird zur Anzeige die LED auf dem Slave umgeschaltet.
Vom Master aus geht die Tx (Transmitt) Leitung und wird mit der Rx (Receive) Leitung der Slaves verbunden. Somit erreicht man, dass der Zeichenstream vom Master an allen Slaves geleitet werden.
Programme
Die Testsoftware besteht aus 2 Programmen. Das Masterprogramm sendet mit 2 Sekundentakt abwechselnd die Zeichen 'a' (LED einschalten) und 'x' (LED ausschalten). Die Slaves fragen die RS232-Schnittstelle ab und schalten die LED entsprechend des empfangenen Zeichens. Ein Hardware-Test gezeigt, dass die LEDs auf dem Master und Slaves alle zum "gleichen" Zeit umschalten.
Master
#define LED 13 //LED fuer Anzeige
#define SET_CHAR 'a' //Bei diesem Zeichen LED einschalten
#define UNSET_CHAR 'x' //Bei diesem Zeichen LED ausschalten
#define DELAY_TIME 2000 //Wartezeit zwischen Senden
void setup(){
Serial.begin(9600); //Seriele Kommunikation starten
pinMode(LED, OUTPUT);//LED als Ausgang konfigurieren
}
void loop(){
//Zeichen zum LED einschalten am Slave senden
Serial.print(SET_CHAR);
//LED zur Kontrolle einschalten
digitalWrite(LED,HIGH);
//Wartezeit
delay(DELAY_TIME);
//Zeichen zum LED ausschalten am Slave senden
Serial.print(UNSET_CHAR);
//LED zur Kontrolle ausschalten
digitalWrite(LED,LOW);
//Wartezeit
delay(DELAY_TIME);
}
Slave
#define LED 13 //LED fuer Anzeige
#define SET_CHAR 'a' //Bei diesem Zeichen LED einschalten
#define UNSET_CHAR 'x' //Bei diesem Zeichen LED ausschalten
char in_byte; //Eingelesenes Zeichen
void setup(){
Serial.begin(9600); //Seriele Kommunikation starten
pinMode(LED, OUTPUT);//LED als Ausgang konfigurieren
}
void loop(){
//Abfragen ob neues Zeichen angekommen ist
if(Serial.available()>0){
//Zeichen lesen
in_byte = Serial.read();
//Zeichen interpretieren
if(in_byte == SET_CHAR){
digitalWrite(LED, HIGH); //LED einschalten
}else if(in_byte == UNSET_CHAR){
digitalWrite(LED, LOW); //LED ausschalten
}
}
}