Der Arduino und die serielle Schnittstelle
Die serielle Schnittstelle deines Arduino-Boards ist ein leistungsfähiges Werkzeug, das es dir ermöglicht, effizient mit einem Computer oder anderen Geräten zu kommunizieren. Besonders faszinierend an dieser Schnittstelle ist die Fähigkeit zur bidirektionalen Datenübertragung. Das heißt, du kannst Daten nicht nur senden, sondern auch empfangen.
Im Zentrum deines Arduino-Boards befindet sich eine Hardware-Schnittstelle, die als UART (Universal Asynchronous Receiver/Transmitter) bezeichnet wird. Mit ihr hast du die Möglichkeit, serielle Daten in Byte-Form zu senden und zu empfangen. Dies ermöglicht es dem Arduino, beispielsweise Sensorwerte oder Statusmeldungen an einen Computer zu übermitteln, oder Befehle und Steuerinformationen vom Computer zu empfangen und darauf basierend Aktionen auszuführen.
Für die Kommunikation über die serielle Schnittstelle benötigst du in der Regel ein USB-Kabel. Dabei erkennt der Computer den Arduino als virtuellen seriellen Port. Ein entscheidender Aspekt bei der Datenübertragung ist die Baudrate, die bestimmt, wie schnell die Daten übertragen werden. Gängige Werte liegen bei 9600 oder 115200 Bits pro Sekunde, es sind aber auch andere Übertragungsraten möglich.
Es ist zu beachten, dass die serielle Schnittstelle nicht Teil einer separaten Arduino-Bibliothek ist, sondern fest in die Hardware des Arduino-Boards integriert ist. Die Arduino "Serial" Bibliothek bietet jedoch Funktionen, die es dir ermöglichen, Daten über die serielle Schnittstelle zu senden und zu empfangen.
Bibliotheken sind in der Arduino-Welt sehr geschätzt. Sie wurden von anderen Entwicklern erstellt und bieten grundlegende Funktionen, beispielsweise zur Abfrage von Sensoren oder zur Implementierung von Kommunikationsprotokollen. Sie unterstützen dich dabei, deinen eigenen Code übersichtlich und sauber zu halten. Mit dem seriellen Monitor, einem Fenster, das Textausgaben anzeigt, kannst du die serielle Schnittstelle visualisieren.
Zur effizienten Datenübertragung zwischen Arduino und Computer stehen verschiedene Protokolle zur Verfügung, die den Datenfluss regeln. Einige dieser Bibliotheken sind bereits in die Arduino IDE integriert, andere kannst du nach Bedarf hinzufügen. Mit ihrer Hilfe kannst du produktiver arbeiten und Zeit sparen, da du auf vordefinierte Funktionen zurückgreifen kannst.
Betrachten wir nun die technischen Details der seriellen Schnittstelle. Die Datenübertragung erfolgt seriell, d.h., die Informationseinheiten werden nacheinander übertragen. Die Übertragung kann in verschiedenen Modi erfolgen, z.B. im Simplex-Modus (nur in eine Richtung), im Halb-Duplex-Modus (abwechselnd in beide Richtungen) oder im Voll-Duplex-Modus (gleichzeitig in beide Richtungen).
Ein Byte setzt sich aus 8 Bits zusammen, wobei ein Bit den Zustand 0 oder 1 annehmen kann und die kleinste Speichereinheit darstellt. Alle Arten von Zeichen, von Zahlen bis zu Wörtern, werden in Byte-Form ausgedrückt.
8 Bits = 1 Byte
Als Beispiel könnte die Zahl 7 als Byte so aussehen: 00000111.
Die Übertragung von Bytes erfolgt durch das Setzen der Datenleitung auf HIGH oder LOW, vergleichbar mit dem Ein- und Ausschalten einer LED. Eine Seite legt das zu übertragende Byte fest, die andere liest es aus. Dieser Mechanismus erinnert an die alte Telegrafie, bei der Morsezeichen zur Informationsübermittlung verwendet wurden.
Mit deinem Arduino-Board kannst du die Übertragungen in Echtzeit nachvollziehen: Die LEDs für Tx und Rx signalisieren dir den Datentransfer.
Zur Übertragung eines Bytes werden die einzelnen Bits des Bytes nacheinander gesendet, beginnend mit dem niedrigstwertigen Bit (LSB) und endend mit dem höchstwertigen Bit (MSB). Für jedes Bit wird die Datenleitung entsprechend auf HIGH oder LOW gesetzt. Auf der Empfängerseite wird die Datenleitung kontinuierlich überwacht, um die Bits zu lesen. Sobald ein HIGH- oder LOW-Signal erkannt wird, wird das entsprechende Bit des empfangenen Bytes gesetzt. Sind alle Bits empfangen, ist das Byte vollständig und kann verarbeitet werden.
Für eine erfolgreiche Kommunikation ist es entscheidend, dass Sender und Empfänger das gleiche Übertragungsprotokoll und die gleiche Geschwindigkeit (Baudrate) verwenden. Zusätzlich werden Start- und Stop-Bits verwendet, um den Beginn und das Ende jedes Bytes zu kennzeichnen und die Synchronisation zwischen Sender und Empfänger zu erleichtern.
Eine serielle Verbindung zum Arduino herstellen
Bei diesem Beispiel ist die Verkabelung sehr einfach, da der Sketch auf die serielle Kommunikation zwischen dem Arduino und dem Computer abzielt. Daher benötigst du lediglich ein USB-Kabel, um dein Arduino-Board mit dem Computer zu verbinden. Es sind keine weiteren elektronischen Komponenten oder eine spezielle Verkabelung notwendig.
Dieser Arduino-Sketch führt zwei Hauptaufgaben aus: Erstens initialisiert er die serielle Kommunikation und zweitens sendet er kontinuierlich die Nachricht "Hello world!" an den Computer.
// Definiere die serielle Kommunikation
void setup()
{
// Öffne die serielle Verbindung mit einer Baudrate von 9600
Serial.begin(9600);
}
void loop()
{
// Sende den Text "Hello world!" an den Computer
Serial.println("Hello world!");
// Füge eine kurze Verzögerung ein, um die Stabilität der Ausgabe zu gewährleisten
delay(1000); // Warte für 1000 Millisekunden (1 Sekunde)
}
Sketch-Details und Erläuterungen
Das Einrichten einer seriellen Verbindung zwischen deinem Arduino und deinem Computer ist unkompliziert und direkt. In der nachfolgenden Anleitung stelle ich dir einen Sketch vor, der eine einfache Textnachricht vom Arduino an den Computer sendet und sie in der integrierten Entwicklungsumgebung (IDE) anzeigt. Stelle zunächst sicher, dass dein Arduino-Board über ein USB-Kabel korrekt mit dem Computer verbunden ist.
In diesem Sketch senden wir die berühmte Nachricht "Hello world!" über die serielle Schnittstelle an den Computer. Mit der Zeile Serial.begin(9600); setzen wir die Grundlage für die Kommunikation, sie weist den Arduino an, die serielle Schnittstelle für Ein- und Ausgaben zu nutzen und verbindet ihn mit dem Computer.
Serial.begin(9600);
Die Funktion Serial.begin() verwendet die integrierte serielle Bibliothek, die uns verschiedene Funktionen zur Verfügung stellt. Mit Serial.begin(9600); definieren wir die Geschwindigkeit unserer Kommunikation: 9600 Baud, was bedeutet, dass pro Sekunde 9600 Bits übertragen werden. Stelle sicher, dass diese Geschwindigkeit mit der Einstellung im seriellen Monitor der Arduino-IDE übereinstimmt, um unleserliche Zeichen zu vermeiden.
Sobald du den Sketch auf deinen Arduino geladen hast, kannst du den seriellen Monitor in der Arduino-IDE öffnen. Klicke dafür entweder auf das Lupen-Symbol in der oberen rechten Ecke oder nutze das Menü: Werkzeuge > Serieller Monitor. Eine weitere Möglichkeit ist die Verwendung der Tastenkombination Shift+CMD+M.
Ein neues Fenster öffnet sich und zeigt kontinuierlich die Nachricht "Hello World!" an, sobald die Verbindung hergestellt ist.
Um unleserlichen Text zu vermeiden, prüfe, ob die Baudrate im seriellen Monitor mit der in deinem Sketch definierten Baudrate übereinstimmt. Falls du dennoch Schwierigkeiten mit der Lesbarkeit hast, vergewissere dich, dass das korrekte Board im Menü "Werkzeuge > Board" ausgewählt wurde, da verschiedene Boards unterschiedliche Taktraten haben können. In der unteren rechten Ecke des seriellen Monitors findest du eine Dropdown-Box, die die Baudrate anzeigt, welche dein Computer zur Synchronisation mit dem Arduino verwendet. Falls diese nicht mit der im Sketch festgelegten Baudrate übereinstimmt, erscheinen unleserliche Zeichen, was auf eine fehlgeschlagene Kommunikation hindeutet. Der Befehl Serial.println wird genutzt, um Daten oder Zeichen zu senden.
Serial.println("…");
Wenn wir den seriellen Monitor der Arduino-IDE verwenden, präfixieren wir unsere Befehle stets mit "Serial.", gefolgt von der entsprechenden Funktion wie println. Die Verwendung von Serial hilft uns, Befehle der seriellen Bibliothek von anderen Funktionen zu unterscheiden, insbesondere wenn wir mehrere Bibliotheken gleichzeitig verwenden, die eventuell identische Funktionsnamen aufweisen. Beispielsweise gibt es die Befehle Serial.write() und EEPROM.write(). Ohne die Präfixe wäre eine eindeutige Zuordnung der Befehle nicht möglich.
In unserem Sketch senden wir den String "Hello world!" vom Arduino an den Computer mit dem Befehl Serial.println("Hello world!");.
Serial.println("Hello world!");
Jeder Text oder jede Zahlenkombination, die wir zwischen Anführungszeichen setzen, wird als String, also als Textvariante, interpretiert.