Broadcast mit RS232

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

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

Verdrahtung: Master und 2 Slaves

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
     }
     
   }
 }