Wiki: Mathe und Info

Unterrichtsmaterialien für Mathematik und Informatik

Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:sek-ii:q4:embedded:l3-serielle-kommunikation

Serielle Kommunikation (Debuggen von Arduino-Programmen)

Info: Serielle Kommunikation

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.

Definition des Serial-Interfaces

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, mit Serial.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, mit Serial.readString() eine ganze Zeichenfolge vom Serial-Port gelesen.
Beispiel 1: Debuggen
Das Serial-Interface kann man sehr gut zum Debuggen von Arduino-Programmen verwenden. Möchte man z.B. die Werte eines Potentiometers testen, kann man dies mit folgendem Aufbau tun:

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);
}
Beispiel 2: Arduino→Arduino-Kommunikation
Ebenso kann das Serial-Interface zur Kommunikation zwischen zwei Arduinos verwendet werden. Im Aufbau unten wird auf dem Sender ein Knopf gedrückt und entsprechend eine LED angeschaltet. Zusätzlich sendet der Sender 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;
}
Aufgabe 1

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.
Weitere Informationen
Zur Vertiefung des Themas können folgende Artikel hilfreich sein:
info/sek-ii/q4/embedded/l3-serielle-kommunikation.txt · Zuletzt geändert: 2023-01-15 19:57 von christian.weber