Arduino Grundlagen Teil 11: Serielle Schnittstelle

Serielle Schnittstelle - COM-Port

Die serielle Schnittstelle (auch COM-Port oder UART bzw. UART-Schnittstelle genannt) dient einem anfangs zum Debuggen (also zur Fehlerbehebung) des Programms. Über eine serielle Schnittstelle lassen sich aber auch zusätzliche Geräte ansprechen, wie z.B. ein GPS-Modul. Dafür bietet uns ein Arduino ein bis vier solcher Schnittstellen. Die Anzahl ist abhängig vom verbauten Mikro-Controller (µC). Sollten die vorhandenen Schnittstellen nicht ausreichen, kann auch ein SoftSerial eingesetzt werden. Durch diese Software Lösung kann an fast jedem digitalen Pin eine serielle Verbindung aufgebaut werden.

Was haben wir vor?

Wir beginnen mit einer einfachen seriellen Verbindung und lassen uns die ersten Daten übertragen. Das machen wir über den Serial Monitor der Arduino IDE. Wir schreiben jetzt also endlich unser „Hallo Welt“ Programm, welches normalerweise das erste Programm bei einer neu gelernten Programmiersprache ist.

Wenn das funktioniert hat, schauen wir uns einen alternativen Terminal Emulator namens PuTTY an. Hierfür nutzen wir einen zusätzlichen USB-Serial Adapter und sprechen nebenbei ein bisschen über die Theorie einer seriellen Verbindung. Abschließend schreiben wir ein Programm, um Daten bzw. Texte zwischen dem Serial Monitor der Arduino IDE und PuTTY hin und her senden zu können.

In aller Kürze

Die schnellste Variante ist, eine serielle Verbindung über den integrierten USB-Port des Arduinos aufzubauen.

Komponenten-Liste

Für die Umsetzung brauchen wir folgende Komponenten:

Code-Snippets

Um eine serielle Verbindung nutzen zu können, werden folgende Programmteile benötigt.

Die serielle Verbindung initialisieren

Die Initialisierung erfolgt normalerweise in der Setup() Funktion:

Serial.begin(9600);

Der Wert 9600 gibt die Baudrate an.

Daten senden

Das Senden kann in jeder Funktion erfolgen, auch im Setup. Vorher muss allerdings die serielle Verbindung initialisiert werden. Dann stehen zum Senden grundlegend zwei Funktionen zur Verfügung.

Serial.print(„Mein Text.“);

sendet ohne CR (Carriage Return) und LF (Line Feed, auch NL – New Line genannt). Wenn wir also drei Mal etwas per Serial.print() senden, stehen alle Daten/Texte hintereinander in einer Zeile im Serial Monitor.

Durch die Funktion

Serial.println(„Mein Text.“);

wird hinter die gesendeten Daten ein CR und LF gesetzt. Wenn wir also drei Mal etwas per Serial.println() senden, haben wir drei Zeilen im Serial Monitor.

Daten empfangen

Das Empfangen von Daten kann prinzipiell ebenfalls in jeder Funktion erfolgen, wenn die serielle Verbindung vorher initialisiert wurde.

Möchte man eine einfache Zahl einlesen, benötigt man schon drei Zeilen.

while (Serial.available() > 0) {
  byte b_dataIn = Serial.read();
}

Es gibt natürlich noch mehr Datentypen, die man einlesen und verarbeiten kann, dazu kommen wir noch. Erst mal wollen wir ein einfaches Programm schreiben und testen.

Der erste Test – Hallo Welt

Das erste Testprogramm soll uns einfach den Text Hallo Welt ausgeben. Befehlszeilen in der Setup() Funktion werden nur einmalig ausgeführt. Da uns die einmalige Ausgabe reicht, sieht unser Sketch in Listing 1 also recht einfach aus.

void setup() {
  // Wir wollen nur die serielle Verbindung initialisieren 
  // und einen Text senden.
  Serial.begin(9600);
  Serial.println("Hallo Welt");
}

void loop() {
  // Hier soll nichts passieren.
}

Nach dem Upload können wir den Serial Monitor starten (siehe Abbildung 1). Entweder über [Werkzeuge] –> [Serieller Monitor] oder über die Tastenkombination [Strg]+[Shift]+[m].

Abb. 1: Seriellen Monitor öffnen

Abb. 1: Seriellen Monitor öffnen

Direkt nach dem Upload wird das Programm auf dem Arduino gestartet. Das Senden des Textes ist also schon lange abgeschlossen, bevor wir den Serial Monitor öffnen können. Beim Öffnen des Serial Monitor wird der Arduino allerdings automatisch neu gestartet, weswegen der Text angezeigt werden sollte.

Höchst wahrscheinlich ist die Ausgabe aber entweder leer oder zeigt Hieroglyphen an (siehe Abbildung 2).

Abb. 2: Hieroglyphen

Keine Sorge, das ist korrekt. Der Grund dafür ist die falsch gewählte Baudrate. In der Setup() Funktion haben wir den seriellen Port mit einer Baudrate von 9.600Bd initialisiert, im Serial Monitor steht die Baudrate aber noch auf 57.600Bd. Sobald wir die Baudrate auf 9.600Bd stellen, sollte unser Text richtig angezeigt werden (siehe Abbildung 3). Auch beim Ändern der Baudrate wird der Arduino neu gestartet. Der Text sollte also nach einem kurzen Moment übertragen sein.

Abb. 3: Baudrate korrekt eingestellt und Nachricht wird angezeigt.

Das ging doch recht einfach. Was hat es aber mit diesen Baudraten auf sich?

Baudrate

In der Einheit Baud (Abkürzung: Bd) wird die Symbolrate angegeben. Also wie viele Symbole pro Sekunde übertragen werden. Je nach Kodierung eines Symbols kann die Anzahl der Bits natürlich abweichen. Das soll uns an dieser Stelle aber nicht weiter interessieren.

Achtung! Baudrate beim Sender (TX – Transmit) und Empfänger (RX – Receive)
Die Baudrate muss natürlich auf der Sender- und Empfänger-Seite identisch sein, sonst „spricht“ der Arduino schneller, als der PC „zuhört“ und umgekehrt.

Bei einer seriellen Verbindung gibt es verschiedene Baudraten. Interessant sind für uns momentan nur die Baudraten, die von unserem Arduino unterstützt werden. Diese finden wir in der Auswahl des Serial Monitor (wo wir gerade 9.600Bd eingestellt haben). Bevor wir uns eine Liste mit den Baudraten anschauen, sollten wir noch über die möglichen Fehler sprechen.

Welche Baudrate soll ich nutzen?

Meistens nutzen wir 9.600Bd oder 57.600Bd. Die Werte würden wir Dir ebenfalls empfehlen. 9.600Bd für wenige Daten, 57.600Bd für viele Daten. 115.200Bd versuchen wir zu vermeiden.

Warum ist nicht immer die höchst mögliche Baudrate die beste?

Zum einen, weil nicht jedes Gerät mit hohen Baudraten umgehen kann. Zum anderen, weil je nach Baudrate Fehler entstehen (können). Mit Fehler ist hier eigentlich die Abweichung zwischen der Frequenz bei der Übertragung und der Frequenz des µC (vielleicht besser gesagt des Controllers im Allgemeinen) gemeint. Der Fehler gibt also den Unterschied dieser beiden Frequenzen an und kann daher auch negative Werte annehmen. Wenn der Empfänger (RX-Seite) eine geringe Fehlertoleranz hat, können diese Abweichungen also auch in wirklichen Übertragungsfehlern und somit in Datenverlust enden.

Die Tabelle 1 stellt exemplarisch einen Auszug der Fehler bzw. Abweichungen bei einem ATmega 328p µC (bei 16MHz) dar, der auf einem Arduino Nano verbaut ist. Genauere Tabellen und Informationen befinden sich in den entsprechenden Datenblättern der µC.

Baudrate Fehler
2.400 0,0%
4.800 -0,1%
9.600 0,2%
14.400 -0,1%
19.200 0,2%
38.400 0,2%
57.600 -0,8%
115.200 2,1%
230.400 -3,5%
250.000 0,0%

Tab 1: Auszug der Fehler/Abweichung bei einem Arduino Nano

Mit den -0,8% Fehler/Abweichung bei 57.600Bd kam bisher jede Hardware gut klar, die wir im Einsatz hatten. Bei GPS-Modulen eines Copters beispielsweise, kam es bei 115.200Bd schon öfter mal zu Problemen.

PuTTY

Der Serial Monitor der Arduino IDE ist ein schönes Werkzeug. Man muss aber die komplette IDE „mit sich rumschleppen“. Wir reden hier von weit über 100MB. Es gibt aber auch kleine Tools, wie z.B. PuTTY mit unter 1MB.

PuTTY ist ein so genannter Terminal Emulator. Ein Terminal war früher (als ein Computer noch eine grün/schwarze Röhre als Monitor besaß) ein Endgerät, um auf Großrechner (Server) zugreifen zu können. Aus dieser Zeit stammt auch die Abkürzung TTY für solch ein Terminal. TTY kommt vom englischen Wort teletype (Fernschreiber). Ein Terminal Emulator ist also ein Programm, welches solch ein Terminal emuliert. Es gibt natürlich auch viele andere Terminal Emulatoren, aber irgendwie sind wir bei PuTTY für Windows-Systeme hängen geblieben.

PuTTY kann nicht nur auf serielle Schnittstellen zugreifen, sondern auch auf verschiedene Netzwerk-Verbindungen. Wir interessieren uns an dieser Stelle aber nur für die seriellen Schnittstellen, weswegen wir als erstes [Serial] markieren (siehe Abbildung 4).

Abb. 4: PuTTY Startseite

Abb. 4: PuTTY Startseite

In der Zeile [Serial line] geben wir nun den korrekten COM-Port an (diesen findest Du im Geräte-Manager Deines Systems, bei uns ist es COM4) und bei [Speed] die Baudrate des Arduinos (9.600Bd).

Serial line   COM4
Speed         9600

Wenn Du PuTTY öfter für Deinen Arduino nutzen möchtest, kannst Du die Einstellungen auch speichern. Gib dafür, wie in Abbildung 5 gezeigt, bei [Saved Sessions] einen sinnvollen Namen ein und klicke auf [Save]. Danach kann die Verbindung über [Open] geöffnet werden.

Abb. 5: PuTTY Voreinstellungen ändern und speichern.

Abb. 5: PuTTY Voreinstellungen ändern und speichern.

Wenn alles geklappt hat, wird nun eine Session wie in Abbildung 6 gestartet und der Text „Hallo Welt“ von unserem Programm angezeigt.

Abb. 6: Eine geöffnete PuTTY Session.

Abb. 6: Eine geöffnete PuTTY Session.

PuTTY kann natürlich noch konfiguriert werden und bietet noch weit mehr Möglichkeiten / Funktionen als diese einfache serielle Verbindung. Für den Moment haben wir aber alles, was wir benötigen.

USB-Serial Adapter

Was mache ich, wenn mein Arduino keinen USB-Anschluss hat?
Wie kann ich direkt auf ein Gerät (z.B. GPS-Modul) über eine serielle Schnittstelle zugreifen?

Genau dafür gibt es USB-Serial Adapter (siehe Abbildung 7). Sie werden auch unter anderen Namen genannt, z.B. USB-To-Serial Adapter, USB-RS232 Adapter, USB-UART Adapter, USB TTY Adapter, USB TTL Adapter, USB COM Adapter, FTDI-Adapter (FTDI steht für die Firma Future Tech Device International Ltd., die unter anderem solche Chips/Controller herstellt) und noch einige mehr. Es geht aber immer darum, dass solch ein Adapter einen Controller besitzt, der die Signale (Befehle, Daten,…) von USB auf eine serielle Schnittstelle übersetzt. Solche Adapter gibt es natürlich von verschiedenen Herstellern. Momentan haben wir beispielsweise sehr häufig den „FTDI Breakout v2 (FT231X) – USB-Seriell-Wandler“ von Watterott.com im Einsatz.

Was uns an diesem Adapter gut gefällt, ist der Schalter zum Einstellen der Spannung von 3,3V und 5V. Es wird damit gleichzeitig die Versorgungs-Spannung des Geräts (Arduino, GPS-Modul,…) und der Logic-Level (also welche Spannungen die Signale bei der Übertragung haben) verändert.

Nicht jedes Gerät hat dieselbe Anschluss-Reihenfolge. Lötet man sich aber solch ein kleines Adapter-Kabel, kann man die Reihenfolge schnell ändern.

Abb. 7: USB-Serial Adapter und Kabel

Abb. 7: USB-Serial Adapter und Kabel

Du hast es Dir sicher schon gedacht, auf vielen Arduinos ist solch ein USB-Serial Controller verbaut. Drehst Du Deinen Arduino Nano um, findest Du den Chip auf der Unterseite (siehe Abbildung 8).

Abb. 8: Arduino Nano FTDI-Chip

Abb. 8: Arduino Nano FTDI-Chip

Tipp: Integrierter USB-Controller
Bei anderen µC (z.B. ATmega 32U4 des Arduino Leonardo oder Arduino Micro) ist ein USB Controller bereits integriert. Es wird also kein zusätzlicher Chip auf dem Board benötigt.

Eigentlich wäre es doch ein cooler Test Daten zwischen der Arduino IDE (mit dem integrierten USB-Anschluss) und PuTTY (über den USB-Serial Adapter) hin und her zu schreiben, oder? Ganz so einfach macht es uns der Arduino Nano aber nicht, da er nur eine serielle Schnittstelle hat, die schon für den USB-Anschluss verwendet wird. Aber auch dafür gibt es eine Lösung, namens SoftwareSerial Library.


Arduino Grundlagen Kurs im Überblick:

>> Teil 1: Der Arduino im Detail
>> Teil 2: Die Bauteile des Arduino
>>Teil 3: Ein Programm auf einen Arduino laden
>> Teil 4: Eine LED blinken lassen!
>> Teil 5: Eine externe LED blinken lassen
>> Teil 6: Die LED Schaltung im Detail
>> Teil 7: Mehrere LEDs ansteuern & blinken lassen
>> Teil 8: Eine LED dimmen
>> Teil 9: Mehrere LEDs dimmen
>> Teil 10: Taster an Arduino anschließen
>> Teil 11: Serielle Schnittstelle
>> Teil 12: Softwareserial Library

 

Kommentar hinterlassen zu "Arduino Grundlagen Teil 11: Serielle Schnittstelle"

Hinterlasse einen Kommentar

E-Mail Adresse wird nicht veröffentlicht.


*


*