Serielle Kommunikation am Arduino

Veröffentlicht von

Inhalte

  • Serielle Kommunikation am Arduino in der Praxis

Einführung

Das Arduino verfügt über eine Kommunikationsschnittstelle, die als serieller Port oder UART (Unviversal Asynchronous Reciever Transmitter) bezeichnet wird. Dieser erlaubt es dem Mikrocontroller mit anderen Geräten über ein simples, digitales Protokoll zu kommunizieren.
Dieser Artikel befasst sich mit der praktischen Anwendung dieser Schnittstelle. Die Theorie zur Funktionsweise von seriellen Protokollen wird in [ARTIKEL] behandelt.

Asynchrone Serielle Protokolle sind in der Welt der Mikrocontroller sehr weit verbreitet und werden gerne verwendet um Daten auszutauschen oder Steuerbefehle zu versenden.

Anwendung der seriellen Kommunikation

Bei der seriellen Kommunikation am Arduino werden Daten in Byte-Größe übertragen. Um eine funktionierende Kommunikation zwischen zwei Geräten herzustellen müssen beide manuell mit denselben Parametern konfiguriert werden. Der wichtigste Parameter ist die Geschwindigkeit der Datenübertragung, die in Bits pro Sekunde (bps) angegeben wird.

Zeichen vom Arduino senden

Beispiel 1.1: Senden vom Arduino an einen PC

Eine Verbindung zwischem den Arduino und dem PC kann über die USB-Schnittstelle des Arduinos hergestellt werden. Hierbei gibt sich das Arduino am PC als virtuelle serielle Schnittstelle zu erkennen.

Laden Sie zunächst folgenden Code auf das Arduino.

Öffnen Sie anschließend den Serial Monitor in der Arduino IDE und stellen Sie sicher, dass dieser ebenfalls auf 9600 bps konfiguriert ist.

serial_monitor
Durch Klick auf „Serial Monitor“ öffnet sich dieses als Fenster
serial_monitor_window
Der „Serial Monitor“. Unten rechts befindet sich das Drop-Down Menu, mit dem die Kommunikationsgeschwindigkeit des PCs angepasst werden kann.

Code-Analyse:

Um den seriellen Port verwenden zu können muss er zunächst initialisiert werden. In der Setup-Funktion geschieht dies mit dem Befehl Serial.begin(9600), wobei 9600 die Übertragungsgeschwindigkeit in bps ist, die für die folgende Kommunikation des Arduinos definiert wird.

In der Funktion loop wird anschließend regelmäßig durch den Aufruf der Funktion Serial.println()  ein Datenwert von der seriellen Schnittstelle versandt. Dieser Wert wird in der Arduino IDE im seriellen Monitor ausgegeben.

Serial.println()  und Serial.print()

Zum Senden von Zeichen können zwei Kommandos verwendet werden:

  • Serial.print()  versendet die angegebenen Zeichen oder Werte
  • Serial.println()  (lies: print line) versendet die Zeichen und schließt die Zeichen mit einem Zeilenumbruch ab. D.h. alle folgenden Zeichen beginnen erst in der nächsten Zeile.

Beispiel 1.2: print und println

Im folgenden Beispiel wird der Befehl Serial.print()  mehrmals hintereinander mehrfach aufgerufen, um Zeichen nebeneinander in einer Zeile auszugeben. Mit dem aufruf von Serial.println()  wird die Zeile abgeschlossen und eine neue Zeile beginnt.

Code-Analyse

Im der Funktion loop  wird zunächst mit Serial.print("ANFANG: ");  Die Zeichenkette Anfang:  an den seriellen Port geschickt. Die Anführungszeichen "  am Anfang und Ende der Zeichenkette sind notwendig, damit das System ANFANG: nicht für einen Variablennamen hält sondern als Zeichenkette interpretiert.

In der folgenden for -Schleife wird der Serial.print()  Befehl mehrmals hintereinander ausgeführt. Beachten Sie, dass bei der Ausgabe alle Befehle in der selben Zeile erscheinen.

Die Zeile Serial.println("ENDE");  schließt den loop ab. Da println  automatisch einen Zeilenumbruch einfügt, werden die folgenden Zeichen in der nächsten Zeile begonnen.

Zeichen und Zahlen

Beide Funktionen können als Argument verschiedene Typen von Variablen annehmen. Je nach Variablentyp ist die Ausgabe eventuell unterschiedlich. Während die Ausgabe von byte , int , float , … den Zahlenwert ausgibt, wird bei char das ASCII-Zeichen des Werts ausgegeben.

Befehle am Arduino empfangen

[VIDEO Zeichen empfangen]

Das Arduino kann auch Befehle von einem anderen Gerät, beispielsweise von einem PC oder einem anderem Arduino empfangen. Der Mikrocontroller besitzt hierfür einen kleinen Pufferspeicher, in dem die empfangenen Zeichen zwischengespeichert werden, bis sie von aus dem Speicher geholt werden (d.h. als ProgrammiererIn muss man sich selber darum kümmern).

Die wichtigsten Befehle hierfür lauten

Serial.available()  : Überprüft, ob ein oder mehrere neue Zeichen angekommen sind. Rückgabewert ist die Anzahl der Zeichen bzw. -1, wenn kein Zeichen verfügbar ist.

Serial.read()  : Liest das erste Byte (Zeichen) im Pufferspeicher aus. Dabei wird es aus dem Puffer entfernt.

Serial.peek()  : Liest das erste Byte im Puffer aus, belässt es aber im Speicher. (Wird daher peek mehrmals hintereinander aufgerufen, dann kann bekommt man immer dasselbe Zeichen zu sehen).

Beispiel 2.1: Senden von einem PC an das Arduino

Im folgenden Beispiel kann man über den Serial Monitor eine Ziffer an das Arduino schicken. Die LED blinkt dann so oft, wie der Wert des Zeichens ist. Zu beachten ist, dass die Übertragung als ASCII Zeichen geschieht. Der Buchstabe „1“ hat in der ASCII-Tabelle den Wert 49. Diese Differenz muss durch eine Subtraktion ausgeglichen werden.

Code-Analyse

Die Variable receivedValue  vom Typ Byte wird verwendet um die Zahlenwerte des empfangenen Zeichens zu speichern.

Die erste if -Abfrage prüft, ob im Pufferspeicher ein Zeichen empfangen wurde. Wenn Serial.available() > 0  ergibt, dann geht es im if -Block weiter. Zunächst wird das erste vorhandene Zeichen ausgelesen, in der Byte-Variable receivedValue  gespeichert und gleich wieder mittels println()  ausgegeben (in der Ausgabe erkennt man gleich, dass das ASCII-Zeichen einer Ziffer nicht gleich dem Wert der Ziffer ist, z.B. 2 -> 50).

Da nur Ziffern als gültig erachtet werden, prüft eine weitere if-Abfrage, ob das Zeichen tatsächlich eine Ziffer ist, also im Bereich 48 (0) bis 58 (9) ist. Ist dies der Fall, wird mittels Subtraktion der Wert der Variable dem tatsächlichen Ziffernwert angepasst. Anschließend wird die LED dementsprechend oft geblinkt.

Zusammenfassung

Die serielle Schnittstelle wird zum Senden von Binärdaten vom und zum Arduino verwendet. Sender und Empfänger müssen auf dieselben Parameter (z.B. Übertragungsgeschwindigkeit) konfiguriert werden. Die gesendeten Zeichen verwenden die Werte des ASCII-Codes.

Weiterführende Links

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.