Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

techniken:datenaustausch:serialchars

Dies ist eine alte Version des Dokuments!




Kommandos in Form von einzelnen Zeichen an den Arduino senden

Die einfachste Art und Weise, einen Befehl vom PC an den Arduino zu übermitteln, ist, ihm einzelne Zeichen über die Serielle Schnittstelle zu schicken, die ein Programm auf dem Arduino auswertet.

Dabei kann z.B. der Buchstabe f für „fahre los“ und der Buchstabe s für „stop“ stehen.

Das Arduino Programm muss zum Empfang der Befehle nur:

  • Überprüfen, ob neue Daten angekommen sind (mit Serial.available())
  • Das erste Zeichen aus den angekommenen Daten lesen (mit Serial.read())
  • Das erhaltene Zeichen untersuchen, um zu erkennen, ob es ein bekannter Befehl ist. (im Bedingungsteil (Runde Klammern) von if oder switch case)
  • Eine Funktion aufrufen, die das erledigt, was dem Befehl entspricht (im Befehlsblock (geschweifte Klammern) von if oder switch case)

Das Beispiel libraries/Serial/SimpleWrite in Processing enthält sowohl den Processing, als auch den Arduino Code, um mit der Maus eine LED auf dem Arduino ein- und ausschalten zu können. Hier ein kleiner Ausschnitt mit den wichtigsten Teilen auf Arduinoseite:

...
if (Serial.available()) { // Wenn Daten empfangen wurden und zum Lesen bereitstehen
  int val = Serial.read(); // lese das erste Zeichen in der Warteschlange und speichere es in der Variable 'val' zwischen
  if (val == 'H') { // Wenn das Zeichen den Wert 'H' hat...
    digitalWrite(ledPin, HIGH); // schalte eine LED an
  } 
  else {
    digitalWrite(ledPin, LOW); // wenn es irgendein anderes Zeichen ist, schalte die LED aus.
  }
}
...

Erweiterung auf mehrere Befehle mit switch/case

Sollen mehr als zwei unterschiedliche Befehle erkann werden können, so geht das am einfachsten mit dem switch/case. Auch hier gibt es ein gutes Beispielprogramm ''control/switchCase2'' aus dem Arduino IDE, aus dem ich hier (mit deutschen Kommentaren) zitiere:

  if (Serial.available() > 0) { // Wenn Daten angekommen sind...
    int inByte = Serial.read(); // ...dann lies das erste Byte und speichere es in der Variable inByte
    switch (inByte) {           // und nimm den Wert, der übertragen wurde, genauer unter die Lupe.
    case 'a':                   // wenn dieser wert dem wert des zeichens 'a' entspricht...
      digitalWrite(2, HIGH);    // ... dann schalte den pin 2 auf 5V  
      break;                    // Ohne 'break' würde das Programm auch den nächsten Teil ausführen, obwohl kein 'b' kam. (beliebter Fehler)
    case 'b':                   // alle anderen Buchstaben funktionieren genauso wie 'a', nur passiert eben als Reaktion etwas anderes.
      digitalWrite(3, HIGH);
      break;
    case 'c':    
      digitalWrite(4, HIGH);
      break;
    case 'd':    
      digitalWrite(5, HIGH);
      break;
    case 'e':    
      digitalWrite(6, HIGH);
      break;
    default:               //wenn das Zeichen keinem der oben überprüften entspricht, passiert das Folgende:
      // Schalte die Spannung an allen Pins aus.
      for (int thisPin = 2; thisPin < 7; thisPin++) {
        digitalWrite(thisPin, LOW);
      }
    } 

Erweiterung auf Kommandos mit dazugehörigen Werten

Die Variante mit switch/case lässt sich sehr schön mit dem hier Beschriebenen Empfang von Zahlen erweitern.

Beispielprogramm

techniken/datenaustausch/serialchars.1421238953.txt.gz · Zuletzt geändert: 2016/01/21 12:45 (Externe Bearbeitung)