Aktor, Ausgang, digital, Signalgeber
Leuchtdioden leuchten in den Farben rot, gelb, grün, blau. Ausserdem gibt es 'unsichtbare' Infrarot-Lichtdioden IR-LED, weisse Leuchtdioden und mehrfarbige Leuchtdioden.
Für mehrfarbige Leuchtdioden siehe Abschnitt 6.2.1.3, „RGB-LED Mehrfarbige Leuchtdioden“ .
Leuchtdioden kann man an- oder ausschalten. Oder Blinken lassen.
Wenn man die Helligkeit verändern möchte, dann muss man entweder den Strom verändern, was relativ aufwendig ist.
Oder man benutzt Pulsweitenmodulation PWM. Das ist eine schnelles Blinken, so schnell dass das Auge nicht mitkommt, und mit veränderlichem An-Ausverhältnis. Das können Computer meist relativ gut.
Das Bild zeigt das Prinzip: regelmässig wird die LED an- und ausgeschaltet. Wird nur kurz eingeschaltet, so leuchtet die LED dunkel. Wird lange eingeschaltet, so leuchtet die LED hell.
PWM-Steuerung
Das folgende Beispiel zeigt den Anschluss einer LED an Anschluss IO.4.
Für den Aufbau wird benötigt
Die LED hat 2 Anschlüsse, einer davon ist länger als die anderen. Dieser ist in der Zeichnung besonders markiert und muss an der Stelle sitzen, wo der blaue Draht wegführt zur Platine.
Aufbauhinweise:
Kontrolle
Schaltskizze
Der Aufbau wurde oben bereits beschrieben. Das An- und Ausschalten erfolgt mit Sende-Events von Scratch aus.
Start scratchClient-Software für Scratch 3.0:
scratchClient -c ikg_led
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Die Leuchtdiode wird mit den Sende-Events 'led4_ON' bzw
'led4_OFF' angesteuert. Diese Events müssen in scratch angelegt werden.
Der Aufbau wurde oben bereits beschrieben. Die Helligkeitssteuerung erfolgt mit Variablenwerten von Scratch aus.
Start scratchClient-Software für Scratch 3.0:
scratchClient -c ikg_led_pwm_pigpiod
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Die Leuchtdiode wird mit einer Variablen 'led4' angesteuert, Wert =
0 (== dunkel) bis 100 (==hell). Die Variable muss als globale Variable in scratch
angelegt werden.
Die Aufgaben können mit beiden Ansteuerungen für die LED ausgeführt werden (Konfiguration ikg_led oder ikg_led_pwm). Zu beachten ist, dass die Art der Ansteuerung dann unterschiedlich ist.
Aufgaben
![]() |
Reaktionszeitmesser Schreibe ein Programm in Scratch für einen Reaktionszeit-Messer. Zuerst ist die LED ausgeschaltet. Benutze eine zufällige Wartezeit von 1 bis 5 Sekunden, um die LED aufleuchten zu lassen. Starte die Stoppuhr. Dann muss der Button s0 auf der Platine gedrückt werden. Lies die Zeit aus der Stoppuhr in eine Variable ein und zeige diese an. Benutze für den Scratch-Client die An-Ausschalten-Konfiguration für dieses Beispielprogramm. |
![]() | Überlegt euch, wie ihr den anderen Schülern das Programm erklärt. Was sind die ganz wichtigen Punkte ? Was weniger wichtig ist soll an den Schluss. |
![]() | Zusatzaufgabe: einen highscore einbauen. Name abfragen und mit der Zeit anzeigen. |
Für die Anzeige von Zahlen werden häufig 7-Segmentanzeigen verwendet.
|
![]() |
Das sind 7 Leuchtdioden, die in einem Gehäuse gemeinsam angeordnet sind. Meist ist auch noch eine achte Diode eingebaut für den Dezimalpunkt.
Als Beispiel für eine solche Diode hier ein Datenblatt SA08-11GWA .
Die hier benutzte Leuchtdiode soll sehr hell leuchten und braucht deswegen höhere Spannungen als die 3.3V der Adapterplatine. Deshalb die externe Versorgung mit 12V und Vorwiderständen. Der Strom durch jedes Segment ist dann ca 20mA.
Für den Aufbau wird benötigt
Das Anzeigemodul hat viele Anschlüsse, hier muss genau gezählt werden.
Aufbauhinweise:
Kontrolle
Schaltskizze
Start scratchClient-Software für Scratch 3.0:
scratchClient -c ikg_7segment
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Die Anzeige wird mit globalen Variablen in Scratch angesteuert:
seg_A, seg_B, … seg_G. .
Werte sind '0' für aus, und '1' für ein.
Aufgaben
![]() |
Die globalen Variablen seg_A, seg_B, etc anlegen. Die Variablen der Reihe nach mit '0' oder '1' belegen und überprüfen, ob die richtigen Segmente leuchten. |
![]() |
Zeichnet eine Tabelle, in der für die Zahlen 0 bis 9 die Werte
'1' bzw '0 für die Segmente eingetragen sind.
|
![]() | Schreibe ein Programm in Scratch, das die Zahlen 0-9 in einer Schleife ausgibt. Baue Wartezeiten ein. |
![]() | Überlegt euch, wie ihr den anderen Schülern das Programm erklärt. Was sind die ganz wichtigen Punkte ? Was weniger wichtig ist soll an den Schluss. |
![]() | Zusatzaufgabe: Simuliert die Siebensegmentanzeige in Scratch. Baut 7 Segmente auf mit den Namen 'a' bis 'g'. Die Anordnung ist oben im Kapitel enthalten. Steuert je nach anzuzeigender Zahl die Segmente auf 'sichtbar' oder 'versteckt'. Eine solche Logik ist auch in der scratchClient-Software enthalten. Hier werden die ankommenden Zeichen gelesen, dann alle Segmente auf 'aus' geschaltet und z.B. bei '1' das Segment 'b' und 'c' eingeschaltet. |
![]() | Zusatzaufgabe 2: wie könnte – in scratch – eine mehrstellige Anzeige aufgebaut werden ? Für die Zahlen 0 bis 999 zum Beispiel. |
Mehrfarbige Leuchtdioden bestehen aus drei einzelnen Dioden für die Farben rot, grün, blau, die sehr eng zusammen in einem Gehäuse eingebaut sind. Deswegen haben diese Dioden nicht zwei, sondern 4 oder 6 Anschlüsse.
Als Beispiel für eine solche Diode mit gemeinsamer Anode hier ein Datenblatt YSL-R596AR3G4B5C-C10 .
Die hier benutzte RGB-Leuchtdiode soll sehr hell leuchten und braucht deswegen höhere Spannungen als die 3.3V der Adapterplatine.
Die Ansteuerung erfolgt für jede R-, G- oder B-LED mit PWM-Signalen.
Für den Aufbau wird benötigt
Die LED hat 4 Anschlüsse, einer davon ist länger als die anderen. Dieser ist in der Zeichnung besonders markiert.
Aufbauhinweise:
Für die erste Generation der Adapterplatine. Diese haben noch keine Buchse für den Hohlstecker:
Kontrolle
Schaltskizze
Start scratchClient-Software für Scratch 3.0:
scratchClient -c ikg_rgb_pwm_pigpiod
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Die RGB-Diode wird mit globalen Variablen in Scratch angesteuert:
'rgb_A_R' (rot), 'rgb_A_G'
(grün), 'rgb_A_B' (blau), Werte sind
0..100.
Beispiele:
rgb_A_R | rgb_A_G | rgb_A_B | |
---|---|---|---|
rot hell | 100 | 0 | 0 |
grün hell | 0 | 100 | 0 |
blau hell | 0 | 0 | 100 |
blau mittel | 0 | 0 | 50 |
gelb | 100 | 100 | 0 |
weiss | 100 | 100 | 100 |
![]() | |
Scratch3 kann sehr viele Werte zu scratchClient schicken. In einer Schleife mit einer Aktualisierung von 3 Werten wurden 4350 Updates je Sekunde von scratch3 zu scratchClient gemessen (mit einem Raspberry Pi 4). Diese hohe Datenrate führt zu einer Überlastung von scratchClient und damit einer großen Verzögerung bei der Aktualisierung der Werte. Abhilfe erfolgt durch das Einfügen einer kleinen Verzögerung in die Aktualisierungsschleife. ![]() Die Verzögerung von 0.05 sec bedeutet 20 Aktualisierungen je Sekunde bzw. 60 Datenpakete je Sekunde, was für eine zügige Darstellung ausreicht und noch nicht zu einer Überlastung führt. |
Aufgaben
![]() |
Die (globalen) Variablen 'rgb_A_R', 'rgb_A_G', 'rgb_A_B' anlegen. Sensorverbindung aktivieren. Aktiviere die Regler an der Anzeige der Variablen. So sieht das aus: ![]()
Mit den Reglern die verschiedenen Farbwerte ausprobieren. 'rgb_A_R' sollte die rote Farbe steuern, 'rgb_A_G', 'rgb_A_B' sind für die grüne und blaue Farbe. |
![]() |
Schreibe ein Programm in Scratch, das die RGB-Leuchtdiode ansteuert. „Farben wie Mondrian.“ Piet Mondrian war ein holländischer Maler, der abstrakte Bilder mit farbigen Rechtecken gemalt hat, hier ein Beispiel. Auf der Bühne sollen mehrere, bunte Rechtecke angeordnet werden. Wenn die Maus ein Rechteck berührt, soll die Farbe auf die LED ausgegeben werden. Benutzt mindestens die drei Farben rot, grün, blau und einige Mischfarben. ![]() Jedes der Rechtecke ist ein eigenes Sprite, das auf Mausklicks reagiert und die entsprechenden RGB-Werte setzt. Erst mal ein oder zwei Sprites anlegen, wenn diese dann funktionieren die anderen kopieren und anpassen. |
![]() | Zusatzaufgabe: Einfach mit der Maus auf Felder zu klicken ist auf Dauer etwas langweilig. Baut ein, dass sich Felder drehen, wenn sie berührt werden. Oder einen Klang ausgeben. |
Aktor, Ausgang, Pulsweitenmodulation, Bewegung, Motor
Servomotoren werden häufig im Modellbau eingesetzt. Sie enthalten einen Motor, Getriebe und eine Elektronik, welche die Ansteuersignale in eine Position übersetzt.
Die Ansteuerung erfolgt mit elektrischen Impulsen, die je nach gewünschter Position mehr oder weniger lang sind (Pulsweitenmodulation).
Da die Servomotoren relativ hohe Ströme brauchen, je nach Bauart 100mA bis mehrere Ampere, muss für diese Schaltung ein externes Netzteil benutzt werden. Die Stromversorgung aus dem RaspberryPi kann das nicht bereitstellen und Störsignale des Motors würden u.U. auch den Prozessor stören.
Für den Aufbau wird benötigt:
Aufbauhinweise:
Kontrolle
Schaltskizze
Start scratchClient-Software für Scratch 3.0:
scratchClient -c ikg_servo_pigpiod
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Der Servo erhält Werte von Scratch: globale Variable
'servo_A', werte sind 0..100.
Bei Tastendrücken s0,s1,s8 auf der Adapterplatine werden die Signale 's0_pressed', 's0_released', 's1_pressed', 's1_released', 's8_pressed', 's8_released' an scratch geschickt.
Aufgabe, Schritt für Schritt eine Zahlenskala aufbauen.
![]() | Erste Funktionskontrolle: Globale Variable 'servo_A' anlegen. Den Regler an der Variablenanzeige aktivieren und verschiedenen Werte einstellen. Das Servo soll sich bewegen. |
![]() |
Befestige ein Stück Papier am Servo als
Zeiger und eine zeichne eine Skala mit Zahlenwerten 0,1,2,3,4,5. Das muss nicht regelmässig sein. Aber überprüfe
(mit dem Regler), dass der Servo alle Zahlen erreichen kann.
![]() |
![]() |
Zeichne eine Tabelle auf ein Blatt Papier und notiere für jeden Zahlenwert der Skala den Wert des Reglers 'servo_A'
|
![]() | In scratch soll ein Schritt-Variable mit diesen Werten 0,1,2,3,4,5 angelegt werden. Benutze die Taste s8 auf der Adapterplatine, um den Zahlenwert zu erhöhen. Wenn er auf '6' geht, soll er wieder auf '0' zurückgesetzt werden. |
![]() | Je nach Zahlenwert soll der Zeiger des Servo auf die Zahl auf der Skala zeigen. |
![]() | Wie könnte man so ein Servo in einem Spiel verwenden ? |
Aktor, Ausgang, Bewegung, Motor, Schrittmotor
Schrittmotoren werden verwendet, wenn man präzise Antriebe benötigt. Die Motore müssen sich nicht kontinuierlich drehen, sondern können eine Position halten und beliebig vorwärts, rückwärts drehen.
Schrittmotore sind nicht sehr schnell. Allerdings können mit geeigneter Ansteuerung um die 10 Umdrehungen je Sekunde erzielt werden. Der Vorteil ist die präzise Bewegung, auch sehr langsam bis zum Stillstand.
Die Verwendung ist in Druckern, Werkzeugmaschinen, Scannern. Immer dann, wenn man genau steuerbare Bewegungen benötigt.
Die meisten Motoren haben 200 Schritte je Umdrehung.
Schrittmotor mit NEMA-Gehäuse (Industriestandard) und der im Kurs verwendete 'kleine' Schrittmotor.
Im Kurs verwenden wir einen Motor mit 64 Schritten und einem
Getriebe mit 64-facher Untersetzung, also 64x64=4096 Schritte je
Umdrehung.
Ganz genau genommen ist die
Untersetzung 63,684:1. Das ist dann wichtig, wenn man den Motor kontinuierlich im Kreis drehen lässt.
Für die Ansteuerung muss ein Impulsmuster eingehalten werden.
Hier das Impulsmuster für den verwendetenen Motor. Es gibt zwei Muster, eines mit 8 Schritten und eines mit 4 Schritten. Das Muster mit 8 Schritten läuft ruckelfreier, ruhiger als das mit 4 Schritten. Dafür ist das 4-Schritt Muster schneller.
Schritt | br0.0 | br0.1 | br1.0 | br1.1 | pattern |
---|---|---|---|---|---|
Schritt 0 | 0 | 0 | 0 | 1 | b0001 |
Schritt 1 | 0 | 0 | 1 | 1 | b0011 |
Schritt 2 | 0 | 0 | 1 | 0 | b0010 |
Schritt 3 | 0 | 1 | 1 | 0 | b0110 |
Schritt 4 | 0 | 1 | 0 | 0 | b0100 |
Schritt 5 | 1 | 1 | 0 | 0 | b1100 |
Schritt 6 | 1 | 0 | 0 | 0 | b1000 |
Schritt 7 | 1 | 0 | 0 | 1 | b1001 |
Schritt | br0.0 | br0.1 | br1.0 | br1.1 | pattern |
---|---|---|---|---|---|
Schritt 0 | 0 | 0 | 1 | 1 | b0011 |
Schritt 1 | 0 | 1 | 1 | 0 | b0110 |
Schritt 2 | 1 | 1 | 0 | 0 | b1100 |
Schritt 3 | 1 | 0 | 0 | 1 | b1001 |
Im Vorwärtsbetrieb wird Schritt 0, 1, 2, 3 ... durchlaufen. Soll der
Motor rückwärts laufen, wird die Sequenz rückwärts durchlaufen.
Die Geschwindigkeit für den Motor ist minimal 10ms je Schritt. Wenn der Motor nur wenig belastet wird, dann gehen auch 1ms je Schritt.
Für den Aufbau wird benötigt:
Aufbauhinweise:
Kontrolle
Schaltskizze
Die Ansteuerung der Einzelsignale von scratch aus ist möglich, allerdings sehr langsam. Für eine Umdrehung konnten etwa 44 sec Dauer ermittelt werden (2014-08-02; scratch1.4, nuscratch5, eine verbesserte Scratch-Version; 4 Schritt-Sequenz).
Start scratchClient-Software für Scratch 3.0:
scratchClient -c stepper_28BYJ-48_step
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Die Signale können als Einzelwerte an den scratchClient geschickt werden oder als Binärmuster.
Einzelwerte: globale Variable 'br0.0',
'br0.1', 'br1.0', 'br1.1', Werte sind 0, 1.
Statt der Einzelwerte können auch Binärmuster geschickt werden. Dazu benutzt man die in der Tabelle angegebenen 'pattern'.
Globale Variable 'pattern', Werte z.B. 'b0011'. Das 'b' am Anfang ist deswegen notwendig,
da scratch den Wert '0011' als '11' senden würde.
Einzelsignale und Pattern sollten nicht gemischt verwendet werden.
Aufgaben
![]() | Steuere den Motor so an, dass er langsam in eine Richtung läuft. Verwende das 8-Schritt-Muster. Zwischen den Schritten soll 1ms Wartezeit sein. Die Zeit für eine Umdrehung soll bestimmt werden. |
![]() | Ändere das Programm so, dass die 4-Schritt-Sequenz verwendet wird. Die Zeit für eine Umdrehung soll bestimmt werden. |
![]() | Ändere das Programm so, dass das Bitmuster verwendet wird. Die Zeit für eine Umdrehung soll bestimmt werden. |
![]() | Vergleiche die Zeiten, die mit den verschiedenen Programmen für eine Umdrehung verwendet werden. Was ist die Ursache, warum die Zeiten unterschiedlich sind ? |
Die scratchClient-Software hat eine Funktion eingebaut, die das Ansteuern des Motors einfacher und schneller erlaubt. Schneller ist das deswegen, da die vielen Verarbeitungsschritte nicht in scratch erledigt werden, sondern im scratchClient.
Mit 1ms Wartezeit konnte eine Umdrehung in 10sec erreicht werden.
Dies ist ein Beispiel, wie scratch nicht mehr jeden einzelnen Schritt selber ansteuert, sondern eine komplexe Softwarefunktion in einem anderen Softwaremodul angesteuert wird.
Schnittstellenbeschreibung:
Event 'reset_4' setzt die interne Logik zurück und stellt die 4-Schritt-Sequenz ein.
Event 'reset_8' setzt die interne Logik zurück und stellt die 8-Schritt-Sequenz ein (default).
Es werden zwei Variablen 'speed' und 'target' benutzt.
'speed' ist die Zeit je Schritt, minimal 0.001[sec], default ist 1[sec]. Je kleiner, umso schneller.
'target' ist die anzusteuernde Position in Schritten.
Wird 'target' gesetzt, so führt die scratchClient-Funktion die notwendige Anzahl von Schritten aus, um dieses Ziel zu erreichen. Wird das Ziel erreicht, so stoppt die Bewegung; die Ausgänge werden dann deaktiviert um ein Aufheizen des Motors zu vermeiden..
Scratch muss so lange warten, bis das Ziel erreicht ist. Die Wartezeit ist abs(neue_position-alte_position)*speed*1.2; der Faktor 1.2 ist wegen der Ungenauigkeiten in den Verarbeitungszeiten notwendig.
Start scratchClient-Software für Scratch 3.0:
scratchClient -c stepper_28BYJ-48_module
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Der Motor erhält Werte von Scratch: globale Variable 'speed',
'target'.
Aufgaben
![]() | Setze speed=0.001 und target auf 1000. Wenn der Motor die Endposition erreicht hat, dann setze target auf -1000. |
![]() | Setze speed=0.001 und lasse den Motor eine Umdrehung machen. Welcher Wert für 'target' ist dafür notwendig ? Miss die Zeit für diese Umdrehung. Beobachte die Leuchtdioden auf der Adapterplatine. |
![]() | Steuere den Motor so an, dass er als 'Sekundenzeiger' funktioniert. |
Schrittmotoren haben keinen definierten Nullpunkt. Das bedeutet, dass die einfach nach dem Einschalten dort weitermachen, wo sie gerade stehen. Für viele Anwendungen ist das nicht akzeptabel. Dann verwendet man z.B. Schalter in Kombination mit einer Nockenscheibe, um nach dem Einschalten einen bestimmten Anfangspunkt zu bestimmen.
Motor-Platte, Microschalter und Nockenscheibe.
Für den Aufbau wird benötigt:
Aufbauhinweise:
Kontrolle
Schaltskizze
Start scratchClient-Software für Scratch 3.0:
scratchClient -c stepper_28BYJ-48_module
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Der Motor erhält Werte von Scratch: globale Variable 'speed',
'target'.
Scratch erhält Sensorwerte vom Microschalter 'microschalter' '0' (aus) oder '1' (ein, gedrückt).
Aufgabe
![]() |
Erweitere das Sekundenzeiger-Beispiel aus dem vorherigen Kapitel. |
Anmerkungen zum Beispielprogramm.
Das Suchen der Anfangsposition wird zuerst in grossen Schritten durchgeführt. Das ist schnell, aber auch ungenau. Wenn der Mikroschalter betätigt wird, dann wird noch einmal zurück gedreht und dann in kleinen Schritten die Position nochmals angefahren.
Die verschiedenen Zustände des Programmes werden schnell durchlaufen. Um nachvollziehen zu können, was das Programm macht, werden die Zustände in eine Liste geschrieben. Diese wird am Beginn gelöscht. Die Liste kann man wie alle anderen Variablen auch auf die Bühne einblenden und so die Funktion des Programmes verfolgen.
Die Ansteuerung der Positionen wird als Unterprogramm mit 'sende NNN an alle und warte' durchgeführt. Bei der Uhranzeige wird allerdings nicht gewartet, da nur so einigermassen genaue Wartezeiten erzielt werden können. Die Ausführungszeit eines 'Sekundenschrittes' ist mit ca 0,2sec auch immer dieselbe. Würde man warten, so wird die Wartezeit auf die Bewegungszeit des Schrittmotors addiert und damit sehr ungenau.
Mit den Pfeiltasten hoch, runter kann der Motor vorwärts, rückwärts bewegt werden. Das ist für den Test vorgesehen. Maschinensteuerungen haben oft eine solche manuelle Verstellfunktion.
Aktor, Ausgang, Benutzerinterface
Piepser sind kleine elektronische Einheiten, die einen Ton, z.B. für eine Warnung, ausgeben und sind meist recht laut.
Die Ansteuerung erfolgt durch An- und Ausschalten.
Die Stromrichtung ist wichtig, da die Piepser eine eigene Elektronikschaltung enthalten.
Für den Aufbau wird benötigt:
Aufbauhinweise:
Kontrolle
Schaltskizze
Start scratchClient-Software für Scratch 3.0:
scratchClient -c ikg_power
Scratch3 im Browser neu laden!
Scratch Sende/ Empfangssignale
Der Piepser wird mit Sendesignalen 'power7_ON' bzw. 'power7_OFF' an-
und ausgeschaltet.
Aktor, Ausgang, Bewegung
Elektromagnete sind ein einfaches Betätigungselement. Sie bestehen aus einer Spule und einem Anker. Der Anker wird durch die Spule angezogen, sobald Strom fliesst. Die Kraft ist nicht linear über den Weg. Die Ansteuerung erfolgt durch An- und Ausschalten, kann jedoch auch mit Pulsweitenmodulation erfolgen.
Die Stromrichtung bei Magneten ist in der Regel nicht wichtig.
Da Magnete relativ hohe Ströme brauchen, je nach Bauart 100mA bis mehrere Ampere, muss für diese Schaltung ein externes Netzteil benutzt werden. Die Stromversorgung aus dem RaspberryPi kann das nicht bereitstellen. Wichtig ist, dass Magnete immer eine Freilaufdiode benötigen, da die hohen Spannungen beim Abschalten sonst die Elektronik zerstören können. Der Leistungstreiber ULN2803 der Adapterplatine hat bereits eine solche Diode eingebaut.
Für den Aufbau wird benötigt:
Aufbauhinweise:
Kontrolle
Schaltskizze
Start scratchClient-Software für Scratch 3.0:
scratchClient -c ikg_power
Scratch3 im Browser neu laden!
Verfügbare Signale/ Daten Der Magnet wird mit Sendesignalen 'power7_ON' bzw. 'power7_OFF' an- und ausgeschaltet.