Baulteilkunde Teil 1: Aktoren

Die folgende Seite bietet jeweils eine Einführung in neue Bauteile aus der Kategorie Aktoren, für die unterschiedliche Grundlagen aus dem Kapitel “Bausteine von Algorithmen” benötigt werden. Das Kapitel “Elektrische Grundlagen” ist zum tieferen Verständnis sicherlich hilfreich, aber für diese vorkonfigurierten Bauteile nicht unbedingt notwendig. Mit den hier vorgestellten Bauteilen lässt sich bereits eine Vielzahl an größeren Projekten umsetzen. Vielleicht hast du eine tolle Idee?

Aktoren

Im Folgenden werden Bauteile erklärt, die eine Ausgabe machen, also z. B. sich bewegen, etwas anzeigen, Licht aussenden oder Töne erzeugen. In der Roboterkonfiguration handelt es sich um die orangen Blöcke.

RGB-LED

RGB-LED
RGB-LED.

Mit einer RGB-LED können die verschiedensten Farben erzeugt werden, die zum Beispiel in Smartphones als Status-LED genutzt werden. Auch in Tastaturen im Gaming-Bereich werden gerne RGB-Farben zur Beleuchtung verwendet.

RGB steht für Rot, Grün und Blau. In einer RGB-LED sind also drei LEDs gleichzeitig verbaut, die sich in unserem Fall eine gemeinsame Anode (Kontakt mit GND) teilen. Die Anode gehört zum längsten Beinchen. Die anderen Kontakte sollten an einen PWM-Pin (gekennzeichet durch eine Tilde: ~) angeschlossen werden.

Verschaltung einer RGB-LED am Arduino.
Verschaltung einer RGB-LED am Arduino.

Farbenexperimente

Schließe die RGB-LED wie beschrieben an und experimentiere mit den Befehlen für die Farben. Vervollständige mit Hilfe deiner Experimente die unten stehende Tabelle.

Hinweis: Die Werte für die Farbanteile von rot, grün und blau reichen von 0 bis 255.

Farbe Farbanteile
RGB rot RGB rot Code
RGB grün
RGB lila
RGB orange
RGB blau
RGB türkis

Colour-Fading

Wenn man die Farbanteile mit einer Zählschleife durchlaufen lässt, ergeben sich besonders schöne Farbeffekte. Probiere dies in verschiedenen Varianten aus!

Hintergrund: Das RGB-Farbmodell

Im RGB-Farbmodell werden alle Farben mit Hilfe von verschiedenen Anteilen von Rot, Grün und Blau zusammengesetzt. Dabei handelt es sich um ein additives Farbmodell, bei dem die Farbe umso heller wird, je größer der Anteil jeder Farbe ist. Werden rot, grün und blau in voller Stärke vermischt, ergibt sich weiß. Wenn ihr Anteil jeweils null beträgt, ergibt sich schwarz.
Die Anteile werden durch eine Zahl zwischen 0 und 255 angegeben, welches sich jeweils durch acht Bit bzw. ein Byte speichern lassen. Statt der Dezimalzahlen von 0 bis 255 wird der Anteil auch häufig mit Hexadezimalzahlen von \(00_{hex}\) bis \(ff_{hex}\) angegeben. Der Code sieht dann zum Beispiel so aus: \(\#72b9fa\), wobei \(72\) der Rotanteil, \(b9\) der Grünanteil und \(fa\) der Blauanteil ist.

Konfiguration mit analogen bzw. PWM-Pins

Wie oben beschrieben handelt es sich bei der RGB-LED eigentlich um drei einzelne LEDs, die jeweils mit einem PWM-Pin verbunden werden müssen, damit die Farbanteile eingestellt werden können.

Überprüfe dies, indem du jede LED einzeln als analogen Aktor konfigurierst und die Farben aus der ersten Aufgabe mit dem Befehl schalte analogen Wert Aktor <led name> <zahl> mit einer Zahl von 0 bis 255 erzeugst.

Rücklink: Pulsweitenmodulation

Servo

Servo-Motor
Servo.

Ein Servo ist in der Regel ein kleiner Elektromotor zusammen mit einer elektronischen Steuereinheit, die dazu dient, den Motor auf einen bestimmten Winkel einzustellen. Häufig wird beides zusammen als Servomotor bezeichnet. Angewendet werden Servos in vielen Bereichen - zum Beispiel im Modellbau.

Verschaltung eines Servo am Arduino.
Verschaltung eines Servo am Arduino.

Der Servo wird mit drei Anschlüssen an den Arduino angeschlossen:

  • VCC (rot): Die Stromversorgung des Servo wird mit dem 5 V-Pin des Arduino verbunden. Dabei ist zu beachten, dass ein Servomotor relativ große Stromstärken “ziehen” kann. Der 5 V-Pin des Arduino kann bis zu \(200 \, mA\) ausgeben, bevor er durchbrennt. Das ist für den Servo genug. Ein normaler Digitalpin verträgt dagegen nur \(40 \, mA\), was deutlich zu wenig für den Servo ist. Die Stromversorgung des Servo kann also nicht über einen normalen Digitalpin sichergestellt werden.
  • GND (schwarz/braun): Die Stromversorgung ist nur komplett, wenn auch das GND-Niveau auf das GND-Niveau des Arduino festgelegt wird.
  • Signalleitung (gelb): Die Einstellung des Winkels erfolgt über ein Pulsweitenmodulation, allerdings wird diese von einer zusätzlichen Bibliothek bereitgestellt, sodass das gelbe Kabel mit jedem Digitalpin am Arduino verbunden werden kann.

Schranke

Baue mit einem Servo eine Schranke, die auf Knopfdruck geöffnet und wieder geschlossen werden kann.

Die Servo-Steuerung erfolgt über Angabe eines Winkels zwischen 0° und 180°.
Die Servo-Steuerung erfolgt über Angabe eines Winkels zwischen 0° und 180°.

Recherche: Wie funktioniert die Steuerung eines Servos?
Der Winkel, auf den sich die Ausgangswelle des Servo drehen soll, wird über ein PWM-Signal geregelt. Recherchiere im Internet, wie dies realisiert wird und fasse es zusammen.

Schrittmotor

Schrittmotor mit Motortreiber ULN2003.
Schrittmotor mit Motortreiber ULN2003.

Während ein Servo darauf ausgelegt ist, einen Winkel möglichst präzise anzusteuern, dient ein Schrittmotor dazu, möglichst präzise Drehungen zu realisieren. Damit können zum Beispiel 3D-Drucker oder Roboterarme, aber auch DVD-Laufwerke sehr genau gesteuert werden.

Herzstück des Motors sind zwei Spulen, die jeweils in der Mitte durch eine 5 V-Spannungsversorgung in zwei Teile geteilt werden. Weil der Pol mit dem positiven 5 V-Potential dadurch festgelegt ist und nicht flexibel an beiden Enden angelegt werden kann, nennt man den Motor auch unipolaren Schrittmotor.

In der Mitte der Spulen befindet sich ein Permanentmagnet, an dessen Ende ein Zahnrad angebracht ist, das wiederum weitere Zahnräder in Bewegung versetzt. Die Spulen werden nun abwechselnd an und aus geschaltet und wirken dabei als Elektromagnet. Durch die wechselnde Anziehung und Abstoßung des Permanentmagneten in der Mitte beginnt dieser, sich zu drehen. Für das Ein- und Ausschalten der Spulen wird ein Motortreiber genutzt, der den Arduino vor zu hohen und rückläufigen Strömen schützt (vgl. den Abschnitt Elektromotoren mit dem Motortreiber-IC L293D steuern). Aufgrund der Stromaufnahme von ca. \(240 \, mA\) ist es empfehlenswert, eine externe Spannungsversorgung am Motortreiber anzuschließen (zum Beispiel mit Hilfe des Power Supply Module - denke an die gemeinsame Erdung mit dem Arduino!). Da die Spulen auch beim Halten der Position dauerhaft unter Strom stehen müssen, ist der Stromverbrauch konstant hoch.

Anschluss des Schrittmotors an den Motortreiber ULN2003 und den Arduino mit externer Spannungsquelle.
Anschluss des Schrittmotors an den Motortreiber ULN2003 und den Arduino mit externer Spannungsquelle.

Die korrekte Reihenfolge des Ein- und Ausschaltens der Spulen ist bereits in Nepo implementiert, sodass die Steuerung sich einfach bewerkstelligen lässt. Es ist aber wichtig zu verstehen, dass jede Spuleneinstellung den Permanentmagneten in der Mitte dazu bringt, sich um einen kleinen Winkel zu drehen. Dieser Winkel wird auch Schritt genannt und dies gibt dem Schrittmotor seinen Namen. Dieser Schritt oder Winkel ist auch die kleinste Schrittweite, die der Motor ansteuern kann und gibt somit die Präzision des Motors an. Beim hier verwendeten Modell 28BYJ-48 beträgt der Schrittwinkel \(5,625°\) (vgl. Datenblatt), woraus sich ergibt, dass der Motor 64 Schritte für eine Umdrehung benötigt. Durch die eingebauten Zahnräder wird die Drehung des Schafts aber weiter verlangsamt, sodass ein Motorschritt nur einer Schaftdrehung von etwa \(0,176°\) (1/32 der Motorschrittweite) entspricht. Dies bedeutet, dass der Motor 2048 Schritte für eine Umdrehung braucht. Wenn du in den textbasierten Quellcode von Nepo schaust, nachdem du einen Schrittmotor konfiguriert hast, wirst du diese Zahl wiederfinden!

Steuerung eines Schrittmotors im Open Roberta Lab.
Steuerung eines Schrittmotors im Open Roberta Lab.

In Nepo lässt sich einfach angeben, mit welcher Geschwindigkeit (in Umdrehungen pro Minute, engl. revolutions per minute, rpm) und um wie viele Umdrehungen sich der Schaft drehen soll. Alternativ kann angegeben werden, um wie viel Grad sich der Schaft drehen soll.

Sekundenzeiger

Programmiere einen möglichst präzisen Sekundenzeiger. Überprüfe ihn mit der Stoppuhr deines Smartphones.

Tipp: Nutze Klebeband, um eine kleine Fahne als Zeiger zu basteln.

Für Interessierte: Die Funktionsweise eines Schrittmotors

An dieser Stelle ist ein Video von Youtube eingebettet. Mit deiner Erlaubnis willigst du ein, dass deine Daten an YouTube in den USA übermittelt werden. Weitere Informationen zur Datenverarbeitung von YouTube findest du in der Datenschutzerklärung von YouTube.

Liquid Crystal Display (LCD)

LC-Display an einem Parkhaus-Automaten.
LC-Display an einem Parkhaus-Automaten.

In vielen Projekten genügt es nicht, Messwerte, Statusanzeigen oder Menüs über den seriellen Monitor am Computer anzeigen zu lassen - man benötigt stattdessen ein Display, das sich direkt an den Arduino anschließen und mit ihm verbauen lässt. Ein günstige Möglichkeit dafür bieten sogenannte Liquid Crystal Displays (LCD), die man zum Beispiel in Kaffeemaschinen oder Parkautomaten finden kann. Modernere LCD werden in Laptops, Fernsehern und Tablets verbaut.

Um ein LC-Display anzusteuern, werden ziemlich viele Kabel benötigt. Daher gibt es neben den normalen LC-Displays häufig auch eine Variante, bei der ein I2C-Modul am LC-Display angebracht ist, was die benötigten Kabel deutlich reduziert. Im Folgenden werden beide Varianten beschrieben.

LC-Display ohne I2C-Modul

Im Schaltplan sind die Kabel so mit dem Arduino verbunden, wie es die Standardkonfiguration für das LCD 1602 in Nepo angibt. Es empfiehlt sich, die zahlreichen 5V- und GND-Anschlüsse auf den Längsseiten des Steckbretts zu sammeln.

LCD Arduino
VSS GND
VDD 5V
V0 Drehregler (Mitte)
RS 12
RW GND
E 11
D0 - D3
D4 5
D5 4
D6 3
D7 2
A 5V
K GND

Die Anschlüsse A und K stehen für die Anode und Kathode der LEDs, die die Hintergrundbeleuchtung ausmachen. Mit dem Drehregler wird der Kontrast des Bildschirms eingestellt.

LCD mit I2C-Modul

Die I2C-Schnittstelle erlaubt es, ein LC-Display mit nur vier Kabel anzusteuern. Der Anschluss an den Arduino erfolgt wie in der Abbildung dargestellt.

Verschaltung des LC-Displays mit I2C-Modul.
Verschaltung des LC-Displays mit I2C-Modul.

I2C oder IIC: Inter-Integrated Circuit

I2C steht für Inter-Intergrated-Circuit. Dies ist ein sogenannter Datenbus, also ein System zur Übertragung von Daten zwischen mehreren Teilnehmern. Die Datenübertragung funktioniert über ein getaktetes An- und Ausstellen der Datenleitung, um die Daten in Binärform (1 und 0) zu übertragen. Neben der Spannungsversorgung (GND und VCC) wird dazu ein Kabel für die serielle Datenübertragung (SDA - Serial Data) und ein Kabel für die Abstimmung des Taktes (SCL - Serial Clock) benötigt.
Da auch mehrere I2C-kompatible Geräte an denselben Datenbus angeschlossen werden können, bekommt jedes Gerät eine Adresse, damit klar ist, welches Gerät die Daten bekommen soll. Die Adresse wird bei der Konfiguration als Hexadezimalzahl angegeben und kann prinzipiell zwischen 0 und 127 liegen. Typischerweise ist die voreingestellte Adresse 0x27. Dabei bedeutet 0x, dass die folgenden beiden Ziffern als Hexadezimalzahl zu interpretieren sind. Falls bereits ein anderes Gerät auf dem gleichen Datenbus dieselbe Adresse hat, kann die Adresse über die Lötbrücken verändert werden (siehe bastelgarage.ch).

I2C-Bus mit einem Master- und drei Slave-Geräten
I2C-Bus mit einem Master- und drei Slave-Geräten (Quelle: Wikpedia), CC-BY-SA 3.0, Urheber: Colin Burnett.

Funktionstest des LCD

Schließe das LC-Display wie beschrieben an den Arduino an und erstelle ein Programm, das “Hello World!” auf dem LC-Display anzeigt.

Hinweis: Falls alle Pixel weiß oder blau bleiben, kann es sein, dass der Drehregler falsch eingestellt ist. Drehe in diesem Fall an dem Drehregler, um den Kontrast zu verbessern. Für den Drehregler auf dem I2C-Modul (blauer Kasten) brauchst du einen Schraubendreher o. ä.

Messwertanzeige auf dem LCD

In vielen Anwendungen soll auf dem LC-Display ein Messwert o. ä. angezeigt werden, der sich mit der Zeit ändern kann. Diese Anzeige soll aber schön formatiert sein.

Erstelle ein Programm, das alle drei Sekunden eine Zufallszahl z zwischen 0 und 200 erzeugt und auf dem Display folgende Anzeige ausgibt:

Messwert: z E

Hinweise:

  • E soll für eine beliebige Einheit stehen.
  • Achte darauf, dass der vorherige Wert von z gelöscht wird (Lösche LCD1602 (I2C)).
  • Die Ausgabe der Zahl z soll immer rechtsbündig erfolgen, sodass zwischen den Einern von z und der Einheit genau ein Leerzeichen steht.
  • Du benötigst den Befehl LCD 1602 (I2C) zeige Text "..." in Spalte <_> in Zeile <_>. Die Zeile ist entweder \(0\) (oben) oder \(1\) (unten). Die Spalte kann sich von \(0\) bis \(15\) erstrecken. (In der Informatik beginnt das Zählen stets mit der Null!)

Codierung von Zeichen auf dem LCD

Für die Darstellung von Zeichen auf dem LCD muss im Hintergrund geklärt werden, welche Pixel an- und ausgestellt werden müssen. Dazu lohnt ein genauer Blick auf die Zellen des LCD.
Jede Zelle besteht aus \(5 \times 8\) Pixeln, von denen manche weiß und manche blau sind. Wenn man für jedes Pixel eine 1 (weiß) oder eine 0 (blau) notiert, dann erhält man Bitfolgen (gekennzeichnet durch das vorstehende 0b), die sich in einer Reihung notieren lassen.

Codierung des Buchstabens A auf einem LC-Display.
Codierung des Buchstabens A auf einem LC-Display.

Man könnte die Reihung von Bitfolgen auch als Reihung von Dezimalzahlen notieren und käme auf das gleiche Ergebnis. Das macht den Code zwar kürzer, jedoch leidet die Lesbarkeit des Codes deutlich.
Entwerfe einen Smiley und ein eigenes Symbol auf \(5 \times 8\) Pixeln und notiere die zugehörige Reihung von Bitfolgen, die dieses Zeichen codiert.
Hinweis: Mit der textbasierten Arduino-IDE lassen sich nach dem oben beschriebenen Prinzip auch eigene Zeichen für das LC-Display codieren. Ein Beispiel findet sich unter Datei \(\rightarrow\) Beispiele \(\rightarrow\) LiquidCrystal \(\rightarrow\) CustomCharacter.

OLED-Display SSD1306

Das OLED-Display SSD1306.
Das OLED-Display SSD1306 (Büroklammer zum Vergleich).

OLED-Displays basieren auf LEDs, die im Gegensatz zu herkömmlichen LEDs aus organischen Materialien hergestellt werden (OLED steht für organische Leuchtdiode, engl. organic light-emitting diode). Bekannt sind OLED-Displays vor allem von Samsung Smartphones mit AMOLED-Display (active matrix organic light-emitting diode), aber OLEDs werden auch in Tablets, Fernsehern oder bei der Raumbeleuchtung eingesetzt.

Das SSD1306 ist ein kostengünstiges, kleines Display in zwei Versionen: Eine mit 128 x 64 OLEDs und somit 128 x 64 Pixeln und eine mit 128 x 32 OLEDs / Pixeln. Achtung: In Onlineshops werden häufig 64 Pixel Höhe angegeben, obwohl nur 32 Pixel Höhe vorhanden sind! Die Bildschirmdiagonale beträgt 0,96", also ca. 2,44cm. Die OLEDs haben in der Regel eine weiße Farbe, es gibt aber auch Versionen mit einer integrierten Farbfolie, sodass blaue und gelbe Farbtöne möglich sind (aber immer nur ein Farbton pro LED). Es verfügt über vier Pins, von denen VCC und GND wie üblich die Stromversorgung sicherstellen, während die Datenübertragung über den I2C-Datenbus realisiert wird. Dazu wird der SCL-Pin mit A5 und der SDA-Pin mit A4 verbunden (siehe Schaltplan / Roboterkonfiguration).

SSD1306 in der Roboterkonfiguration
Das SSD1306 in der Roboterkonfiguration.

Die Adresse, unter der das Display über den I2C-Datenbus erreichbar ist, ist in der Regel 0x3D (Standard bei 128 x 64 Pixeln) oder 0x3C (Standard bei 128 x 32 Pixeln). Bei manchen Displays kann man die Adresse auch auf der Rückseite ablesen und ggf. abändern, indem man eine Lötstelle überbrückt.

Funktionstest des OLED-Displays

  1. Schließe das Display wie beschrieben an und gib darauf ein blinkendes "Hello World!" aus. Falls auf dem Display keine Ausgabe erscheint, probiere eine andere Adresse in der Roboterkonfiguration des Displays aus.
  2. Die Spaltenangabe bezieht sich auf die 128 Pixel bzw. OLEDs in horizontaler Richtung, während die Zeilenangabe sich auf die 64 Pixel bzw. 32 Pixel in vertikaler Richtung bezieht.
    Entnimm der Abbildung des Displays die Pixelhöhe und Pixelbreite der Buchstaben auf dem Display. Begründe damit die Maximalwerte für die Spalte und die Zeile des Text-Befehls für das Display.

Befehl zur Ausgabe von Text auf dem SSD1306

min. max.
Spalte 0 122
Zeile 0 56 bzw. 24



Hinweis zur maximalen Zeile:

56px bei 64 px Höhe und 24px bei 32px Höhe.

Messwertanzeige auf dem SSD1306

In vielen Anwendungen soll auf dem Display ein Messwert o. ä. angezeigt werden, der sich mit der Zeit ändern kann. Diese Anzeige soll aber schön formatiert sein.

Erstelle ein Programm, das alle drei Sekunden eine Zufallszahl z zwischen 0 und 200 erzeugt und auf dem Display folgende Anzeige ausgibt:

Messwert: z E

Hinweise:

  • E soll für eine beliebige Einheit stehen.
  • Achte darauf, dass der vorherige Wert von z gelöscht wird (Lösche OLED SSD1306 I²C).
  • Die Ausgabe der Zahl z soll immer rechtsbündig erfolgen, sodass zwischen den Einern von z und der Einheit genau ein Leerzeichen steht.

Recherche: Vor- und Nachteile der OLED-Technologie

Auf dem Markt für Displays gibt es immer noch eine harte Konkurrenz und längst nicht alle Hersteller setzen auf OLEDs. Recherchiere, welche Vor- und Nachteile diese Technologie für die Verwendung in Bildschirmen hat.