Raspberry Pi

Einstieg

Mehr Kurz-Infos

RPi-Setup

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:

  1. RPi
  2. Stromkabel (Micro-USB)
  3. HDMI-Kabel (für die Installation ganz praktisch)
  4. Mini-SD-Karte
  5. SD-Karten-Adapter (evtl. für die Installation)
  6. 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?

Lösung

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

  1. Lasse eine LED fünf Mal für je eine Sekunde blinken. (Code-Länge = 10 Zeilen.)
  2. Lasse zwei LEDs fünf Mal für je eine Sekunde blinken.
  3. Lasse zwei LEDs abwechselnd blinken.
  4. Verwende vier LEDs und lasse abwechselnd jeweils zwei gleichzeitig blinken.
  5. 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

  1. Simple Alarmanlage: Beim Schließen des Schalters soll eine LED ganz wild blinken.
  2. 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 (0i100 0 \leq i \leq 100 ).

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:

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

Weitere Projekt-Ideen

results matching ""

    No results matching ""