Raspberry Pi
- Einstieg
- PINs und GPIOs/BCMs
- LED-Test
- LED an/aus
- Try
- Inputs
- LED dimmen
- 7-Segmentanzeige
- Kamera
- Langzeit-Projekte
Einstieg
Ich habe für die Vorbereitung der folgenden Unterrichtsstunden übrigens das Skript von Volker verwendet.
Mit dem RPi kann man zum Beispiel ein altes Radio zum Internetradio aufpeppeln.
Material-Bedarf:
- RPi
- Stromkabel (Micro-USB)
- HDMI-Kabel (für die Installation ganz praktisch)
- Mini-SD-Karte
- SD-Karten-Adapter (evtl. für die Installation)
- Lautsprecher mit Line-In-Kabel
PINs und GPIOs/BCMs
Was welcher PIN kann: 1, 2, 3, 4
Informationen zum Steckbrett.
Die Stromversorgung über den USB-Anschluss des Computers reicht für die ersten Stunden.
LED-Test
Wie viel Ampere sind 1200 mA?
Wenn eine LED die Beschriftung 2 V, 10 mA trägt, welchen Widerstand muss man dann (mindestens) verwenden?
Bei der LED geht der kürzere Fuß zur Erde (zum niedrigeren Potential, zur Kathode, zum Minus). Ob der Widerstand rechts oder links ist, ist egal.
LED an/aus
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep
# Die Nummerierungen der PINs auf die physikalische Nummerierungen (1-40) festlegen.
GPIO.setmode(GPIO.BOARD)
# PIN als Ausgänge definieren
GPIO.setup(12, GPIO.OUT)
# Einschalten des PINs und 5 Sekunden warten. Statt 'GPIO.HIGH' kann man auch '1' oder 'True' schreiben. Statt 'GPIO.LOW' geht auch '0' oder 'False'.
GPIO.output(12, GPIO.HIGH)
sleep(5)
# Den Ausgangszustand wiederherstellen. Bitte immer hinzufügen, um das RPi nicht zu beschädigen.
GPIO.cleanup()
Arbeitsaufträge mit LEDs
- Lasse eine LED fünf Mal für je eine Sekunde blinken. (Code-Länge = 10 Zeilen.)
- Lasse zwei LEDs fünf Mal für je eine Sekunde blinken.
- Lasse zwei LEDs abwechselnd blinken.
- Verwende vier LEDs und lasse abwechselnd jeweils zwei gleichzeitig blinken.
- Verwende vier LEDs um Knight-Rider zu programmieren.
Tipp zur Code-Optimierung: Die GPIO-Befehle verstehen auch Listen:
led_pins = [11,12]
GPIO.setup(led_pins, GPIO.OUT)
GPIO.output(led_pins, 0)
Try
Wenn man ein Programm abbricht, weil es nicht so funktioniert wie man sich das gedacht hat, hat man ein Problem: Das cleanup
wird nicht aufgerufen. Verwendet daher bitte den try-except
-Befehl im folgenden Beispiel:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
print('Diese Programm kann man mit Strg+C abbrechen, ohne das RPi kaputt zu machen.')
try:
while True:
GPIO.output(12, GPIO.HIGH)
sleep(1)
GPIO.output(12, GPIO.LOW)
sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
Druck-Taster
Jetzt wollen wir einen GPIO als Input verwenden, d.h. wir wollen am angeschlossenen Pin (Nr. 11) messen, ob der Stromkreis zwischen 3,3 V, Schalter, Widerstand und Erde gerade offen oder geschlossen ist. Bei geschlossenem Stromkreis, also wenn die Taste gedrückt ist, soll die LED leuchten.
Den Schalter, auch Taster oder Pushbutton genannt, schließen wir bitte so an. Auf den kleinen Widerstand (200-400 Ohm) kann man zwar verzichten, wenn man richtig programmiert, aber wer weiß, ob man nicht einmal unkonzentriert ist und dann das RaspberryPi einen Kurzschluss bekommt.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
# Um vom Pin 11 ein Signal empfangen zu können, wird er hier als GPIO.IN definiert. Das `pull_up_down` definiert einen Vorwiderstand, der einen Kurzschluss verhindert.
GPIO.setup(11, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
print('Diese Programm kann man mit Strg+C abbrechen, ohne das RPi kaputt zu machen.')
try:
while True:
# In der Variable taster_int wird der Wert gespeichert, den der Pin 11 liefert, also ob der Stromkreis geschlossen ist oder nicht, also entweder 0 oder 1.
taster_int = GPIO.input(11)
if taster_int == 1:
GPIO.output(12, GPIO.HIGH)
else:
GPIO.output(12, GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup()
Verwendet man die ausgelesene 1
bzw. 0
direkt, braucht man die vier Zeilen der if-Anweisung nicht zu schreiben. Man kann allerdings darüber streiten, ob der Code dann noch besonders gut zu lesen ist.
GPIO.output(12, taster_int)
Arbeitsaufträge mit Schalter
- Simple Alarmanlage: Beim Schließen des Schalters soll eine LED ganz wild blinken.
- Auf Tastendruck soll eine Ampel für 5 Sekunden auf rot schalten und dann wieder auf grün.
LED dimmen
Für das Dimmen kann man die Pulweitenmodulation (PWM) benutzen. Ein Puls besteht aus Breite (Zeit, 50 Hz entspricht 20 ms) und Höhe (Intensität).
Es wird empfohlen, den GPIO18 zu verwenden, weil er Hardware-PWM unterstützt.
Im Wesentlichen wird ein Objekt mit einer bestimmten (PWM-)Frequenz definiert, gestartet und mit ChangeDutyCycle(i)
auf die Helligkeit i
gesetzt ().
import RPi.GPIO as GPIO
from import time import sleep
GPIO. setmode(GPIO.BOARD)
GPIO.setup(18,GPIO.OUT)
# Ein Objekt p wird mit PWM definiert. 18 ist der Pin, 50 ist Frequenz 50 Hz. 0,5 Hz sind 2 Sekunden.
p = GPIO.PWM(18,50)
# Das Objekt p wird gestartet, wobei 0 bedeutet, dass die Höhe 0 ist. 50 würde bedeuten, dass der Puls zu 50 % auf hight gesetzt wäre.
p.start(0)
try:
# Im Folgenden wird die LED abwechselnd heller und dunkler.
while True:
# Die letzte Ziffer in range gibt die Schritte an, mit der die Zahlen i von 0 bis 100 in jedem Schritt wachsen.
for i in range(0,101,5):
# Jetzt ändern wir die Helligkeit. ChangeDutyCycle erwartet eine Zahl (int oder float).
p.ChangeDutyCycle(i)
# Verzögerung:
sleep(0.1)
for i in range(100,-1,-5):
p.ChangeDutyCycle(i)
sleep(0.1)
except KeyboardInterrupt:
# Beendet die PWM:
p.stop()
GPIO.cleanup()
Arbeitsauftrag
- Lasse zwei LEDs sich gegenläufig dimmen.
7-Segmentanzeige
7-Segmentanzeigen werden bei ihren mittleren Pins an der Erde angeschlossen. Den Rest der Pinbelegung unserer 7-Segmentanzeigen kannst du nachlesen oder selbst herausfinden. Verwende bitte 470-Ohm-Widerstände und wie immer try
.
Wenn du z.B. von 0 bis 9 hochzählen lassen willst oder eine Tastatureingabe eine bestimmte Anzeige bewirken soll, solltest du Listen und Dictionaries bei deiner Programmierung verwenden.
...
zeige = ["a","b","ab"]
pin = {"a":3, "b":5}
# Auf die Werte greift man mit .values zu
for i in pin.values():
GPIO.output(i,0)
# Auf die Schlüssel greift man mit eckiger Klammer zu
for k in range(len(zeige)):
for i in zeige[k]:
GPIO.output(pin[i],1)
sleep(1)
for i in zeige[]:
GPIO.output(pin[i],1)
...
Diese Codierung könnte dir helfen, keinen Knoten im Hirn zu bekommen.
Kamera
Um die Kamera benutzen zu können, muss man bei
sudo raspi-config
unter camera dieselbe durch Auswahl von Enable aktivieren. Speichern und ein Neustart sind nicht verkehrt.
Bilder kann man aufnehmen mit:
raspistill -o bild.jpg
Eine Video der Länge 10 Sekunden kann man z.B. aufnehmen mit:
raspivid -o video1.h264 -t 10000
Anschauen kann man ein Video mittels:
omxplayer video.h264
Weitere Informationen:
- Offizielle Rpi-Seite
- Video aus Bilder erstellen
- Kamera als Bewegungsmelder
- Weitere Anleitungen zur Kamera
Arbeitsaufträge mit der Kamera
- Programmiere einen Fotoapparat, d.h. durch einen Taster soll ein Bild aufgenommen werden.
Langzeit-Projekte
Tipp: Die Stationen sehen cooler aus, wenn du keine herkömmlichen Mechaniken verwendest, z.B. statt einem Plastikschalter eine Wäscheklammer.
Morse-Code
Schreibe ein Programm, das Text zu Morse-Code übersetzt und die LED in entsprechendem Rhythmus blinken lässt.
Wäscheklammer-Klavier
Lärmanzeige
Alarmanlage für die Schublade
Verstellbare LED-Uhr
7-Segmentanzeigen, die die Uhrzeit anzeigen. Die Uhr kann man per Handy steuern, um z.B. morgens im Kinderzimmer eine falsche Uhrzeit anzuzeigen. Tipp: Steuerung per XMPP-Nachricht.
Licht-Harfe
Mittels Abstandssensor wird Abstands-Intervallen verschiedene Töne zugeordnet.
Digitales Gästebuch
Gäste können eine E-Mail schreiben, und deren Nachricht erscheint direkt auf dem Bildschirm/Beamer.
LED-Kette
Anleitung zum Steuern einer LED-Kette