Hier ein Auszug aus dem Artikel Raspberry Pi: Grundlagen serieller Kommunikation von Elektronik Praxis.
Bei serieller Kommunikation nutzen wir eine Datenleitung, um seriell Daten zu übermitteln. Die einzelnen Bits werden nacheinander, also in Serie, übermittelt. Die Alternative dazu wäre die parallele Kommunikation, bei der Bits gleichzeitig übertragen werden, beispielsweise bei älteren Druckern mit Parallelport. Die meisten modernen Schnittstellen sind seriell. Dazu zählen etwa der Universal Serial Bus (USB) […], Inter-Integrated Circuit (gesprochen als I-Quadrat-C; I2C) und Serial AT Attachment (SATA) […].
Die serielle Kommunikation hat inbesondere bei höheren Geschwindigkeiten Vorteile gegenüber der parallelen, da es sehr schwierig wäre, parallele Pins zu synchronisieren. Die serielle Kommunikation benötigt für die Datenübertragung zudem weniger Leitungen als die parallele, was die Kabel dünner und günstiger macht.
Von Bits, Bytes und ASCII
Ein Bit ist die kleinste Informationseinheit in einem Computer und entspricht den Zuständen "0" und "1". Ein Byte ist die kleinste adressierbare Datenmenge. […] Mit einem Byte (8 Bits) lassen sich 256 Zeichen darstellen. […] Auf der Seite ASCII-Code findet sich die Belegung dieser Zeichen […]. Einige dieser ASCII-Zeichen sind nicht-druckbare Zeichen (bspw. für neue Zeile, etc.); andere sind Sonderzeichen, etwa Umlaute. […]
[…]
Dabei kommt typischerweise eine Sendeleitung je Richtung zum Einsatz – [..] ein Sendeteil (TX für Transmit), und ein Empfangsteil (RX für Receive).
Der Arduino übernimmt das Umwandeln eines Bytes in einzelne Bits für uns. Über Serial.print('A');
wird beispielsweise das Byte 01000001
bitweise gesendet.
Beim Empfangen übernimmt der Arduino ebenso das Zusammensetzen von einzelnen Bits zu einem Byte. Empfängt er z.B. die Bitfolge 01001001
und man ruft char c = Serial.read();
auf, empfängt man ein großes I.
Für weitere Infos (z.B. wie genau das UART-Protokoll, das hinter Arduino's Serial
steckt, sicherstellt, ob die empfangenen Daten auch korrekt sind), bitte im Artikel weiter lesen.
Der Arduino hat ein vordefiniertes Serial-Interface, das zwei "Zugänge" hat. Einerseits ist das Serial-Interface mit dem USB-Anschluss verbunden, sodass man es vom Computer aus auslesen kann. Außerdem sind die Pins 0 (RX) und 1 (TX) mit dem Serial-Interface verbunden, um einfache Steckverbindungen zu anderen Serial-Interfaces herstellen zu können. Verbindet man mehrere Arduinos miteinander, muss man zusätzlich die GND-Pins verbinden, ansonsten können die AD-DA-Wandler nicht vernünftig messen.
Das Serial-Interface des Arduino stellt euch vier grundlegende Methoden zur Verfügung:
- Mit
Serial.begin(9600)
wird festgelegt, dass der serielle Port des Arduinos verwendet wird, und zwar mit einer Geschwindigkeit von 9600 bits/s. - Mit
Serial.print('A')
wird ein einzelnes ASCII-Zeichen, mitSerial.println('Hallo, Welt')
eine ganze Zeichenfolge auf den Serial-Port geschrieben. - Mit
Serial.available()
kann man abfragen, ob Daten empfangen wurden und zum "Abholen" bereit sind - Mit
Serial.read()
wird ein einzelnes ASCII-Zeichen, mitSerial.readString()
eine ganze Zeichenfolge vom Serial-Port gelesen.
In der Ardunino-IDE und in TinkerCad ist ein so genannter Serial-Monitor eingebaut, mit dem die vom Arduino gesendeten Daten via USB leicht ausgelesen werden können. Der Serial-Monitor kann sogar einzelne gesendete Zahlen in einem Graphen darstellen.
void setup() { Serial.begin(9600); } void loop() { int val = analogRead(0); Serial.println(val); delay(100); }
H
an den Empfänger, wenn der Knopf gedrückt ist, und L
, wenn nicht. Der Empfänger liest das aus und schaltet seine eigene On-Board-LED entsprechend.- Receiver.cpp
void setup() { pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available() > 0) { char chr = Serial.read(); if (chr == 'H') { digitalWrite(13, HIGH); } else if (chr == 'L') { digitalWrite(13, LOW); } } }
- Sender.cpp
int buttonPushCounter = 0; int buttonState = 0; int lastButtonState = 0; void setup() { pinMode(5, INPUT); pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { buttonState = digitalRead(5); if (buttonState != lastButtonState) { if (buttonState == HIGH) { digitalWrite(13, HIGH); Serial.println("H"); } else { digitalWrite(13, LOW); Serial.println("L"); } delay(50); } lastButtonState = buttonState; }
a) Setze beide Beispiele von oben in TinkerCad um.
b) Überlege dir zwei eigene Schaltungen, die Daten von einem Arduino zum anderen übertragen.
- z.B. mit einem Temperatursensor an einem Arduino, der eine Ampel am anderen ansteuert (rot = heiß, blau = kalt, grün = gute Temperatur)
- z.B. ein Arduino mit mehrern Buttons, der einen Arduino mit einem Motor steuert (Button 1 = vorwärts, Button 2 = rückwärts, Button 3 = Stopp)
- etc.