...oder wie ich eine Gegensprechanlage baute (Teil 1)
Irgendwie kam mir der Gedanke, eine Gegensprechanlage zu bauen – einfach so zum Spaß. Also wie fange ich an? Als Grundlage verwende ich einen Raspberry Pi 3 B+ und habe ihn zunächst in Betrieb genommen.
In diesem Post soll es darum gehen, was man dabei beachten muss und wie man eine LED und einen Button ansteuern kann. Am Anfang erläutere ich kurz, weshalb ich mich für einen Raspberry Pi entschieden habe. Der Blog–Artikel spiegelt natürlich nur meine persönliche Meinung wider. Bestimmt gibt es noch andere und ganz gegensätzliche Meinungen – und das ist auch gut so.
Wichtig: Trotz aller Sorgfalt könnte dieser Artikel Fehler enthalten. Bitte kopiere nicht blind Schaltungen und Quellcode. Im schlimmsten Fall können Bauteile und der Raspberry Pi beschädigt werden. Wir geben keine Garantien und übernehmen keinerlei Haftung.
Was spricht für einen Raspberry Pi?
Ein Raspberry Pi ist ein fertiger kleiner Computer. Man kann eine Tastatur und einen Monitor anschließen, sich ins WiFi verbinden und auf sandstorm.de interessante Blog–Artikel lesen. Entsprechend einfach ist es, auf den Rechner im Heimnetz per Handy oder Laptop zuzugreifen. Trotzdem kann man eigene Schaltungen ansteuern.
Die Hardware des Raspberry Pi reicht aus für komplexere Aufgaben. Eine Web-UI und eine Gesichtserkennung mit angeschlossener Kamera sollten machbar sein.
Was gibt es für Alternativen?
Zwei populäre Alternativen will ich zumindest erwähnen: einen Arduino oder ein STM32 Bluepill. Beide sind günstiger als ein Raspberry Pi und beide sind langsamer und können weniger. Die Ersteinrichtung und die Verbindung ins Heimnetz per Kabel oder WiFi sind bei beiden Platinen schon kleine Projekte. Trotzdem habe ich gute Erfahrung mit dem STM32 Bluepill gemacht. Die wichtige Frage ist immer: Was willst du selber bauen und was soll schon fertig sein?
Einrichtung eines Raspberry Pi
Mit diesem Getting–Started–Tutorial habe ich auf dem Raspberry Pi NOOBS installiert. Dazu muss man Monitor, Tastatur und Maus anschließen. Später will ich an meinem Laptop entwickeln und den Raspberry Pi ohne Monitor betreiben.
Seit ich SSH aktiviert habe unter Einstellungen -> Raspberry-Pi-Konfiguration -> Schnittstellen -> SSH aktivieren, kann ich mich per ssh pi@192.168.… verbinden. Meinen SSH-Key habe ich in die authorized_keys gelegt, damit ich nicht ständig das Passwort eingeben muss.
Per SSH lade ich meine Dateien auf den Raspberry Pi mit: rsync -r * pi@192.168.…:mein-ordner
Achtung: Auch wenn kein Monitor angeschlossen ist, solltest du den Raspberry Pi runterfahren, bevor du den Strom trennst! Einloggen und sudo halt eingeben und ein paar Minuten warten.
Achtung: Eine falsche Schaltung kann den Raspberry Pi beschädigen. Im einfachsten Fall ein Kurzschluss. Deshalb schließen wir weder LED noch Button ohne Schutzwiderstand an!
Achtung: Ich würde nicht an Schaltungen am eingeschalteten Raspberry Pi basteln. Der Raspberry Pi könnte beschädigt werden.
Der Push–Button
Die Schaltung findest du in diesem Button–Tutorial: 3v3 --- Button --- 10kΩ --- GPIO pin.
Wenn man den Button drückt, erzeugt man ohne Widerstand einen Kurzschluss. Das kann den Raspberry Pi beschädigen! Wieso hat der Widerstand aber 10kΩ? Damit nur wenig Strom fließt, den wir mit Hilfe des Ohmschen Gesetzes schnell ausrechnen können.
Damit ich den Button–Code in späteren Projekten einfach wiederverwenden kann, habe ich ihn in eine eigene Klasse ausgelagert. Hier benutze ich Python3. Andere Sprachen kannst du auch verwenden.
Starten lässt sich das Skript mit python3 Button.test.main.py – und nicht vergessen den Button zu drücken ;-)
# content of Button.py
import RPi.GPIO as GPIO
class Button:
"""
driver for a push button on a GPIO pin connected as follows
3v3 --- button --- 10kΩ --- GPIO pin
"""
def __init__(self, pin: int):
self._hasBeenPressed = False
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(
pin, GPIO.RISING,
callback=self._handleFalling, bouncetime=200)
def _handleFalling(self, channel):
self._hasBeenPressed = True
def read(self):
"""
determines if the button has been pressed since the last call to read()
returns True if has been pressed, False otherwise
"""
hasBeenPressed = self._hasBeenPressed
self._hasBeenPressed = False
return hasBeenPressed
def destroy(self):
pass
# content of Button.test.main.py
import RPi.GPIO as GPIO
from Button import Button
import time
import sys
BtnPin = 10
if __name__ == '__main__':
GPIO.setmode(GPIO.BOARD)
button = Button(BtnPin)
try:
while True:
if(button.read()):
print("\nButton has been pressed")
time.sleep(1)
print(".", end = "")
sys.stdout.flush()
except KeyboardInterrupt:
button.destroy()
GPIO.cleanup()
Die LED
Bei der LED hat mir dieses Tutorial geholfen. Die Schaltung habe ich übernommen: GPIO Pin --- LED --- 330Ω --- GND.
Die Frage ist wieder: Wieso ausgerechnet 330Ω? In diesem Artikel findest du die passende Gleichung.
R = (Vges - Vled) / I I = (Vges - Vled) / R
An dieser Stelle müssen wir die Spannung kennen, die über der LED abfällt. Das hängt von der LED ab. Bei meiner sind es etwa 1,7V.
I = (3,3V - 1,7V) / 330Ω = 4,8mA
Die Anode (das lange Beinchen) der LED muss an den GPIO Pin.
Der Quellcode besteht aus zwei Teilen: einer wiederverwendbaren Klasse und einem Mini–Programm zum Testen. Wenn alles klappt, sollte die LED anfangen zu blinken, wenn man python3 BinaryOutput.test.main.py eingibt.
# content of BinaryOutput.py
import RPi.GPIO as GPIO
class BinaryOutput:
"""
some GPIO pin which is either HIGH or LOW
LED example
GPIO Pin --- LED --- 330Ω --- GND
"""
def __init__(self, pin: int, isHigh: bool = False):
self._pin = pin
self._isHigh = isHigh
GPIO.setup(pin, GPIO.OUT)
self._flush()
def toggle(self):
self._isHigh = not self._isHigh
self._flush()
def enable(self):
self._isHigh = True
self._flush()
def isEnabled(self):
return self._isHigh
def disable(self):
self._isHigh = False
self._flush()
def _flush(self):
GPIO.output(self._pin, GPIO.HIGH if self._isHigh else GPIO.LOW)
def destroy(self):
self.disable()
# content of BinaryOutput.test.main.py
import RPi.GPIO as GPIO
from BinaryOutput import BinaryOutput
import time
import sys
LedPin = 18
if __name__ == '__main__':
GPIO.setmode(GPIO.BOARD)
led = BinaryOutput(LedPin)
try:
while True:
led.toggle()
print(".", end = "")
sys.stdout.flush()
time.sleep(1)
except KeyboardInterrupt:
led.destroy()
GPIO.cleanup()
Im nächsten Blog–Artikel verbinden wir LED und Button zu einer Schaltung — natürlich gleich mit einer Web–UI.
Viel Spaß beim Basteln und Ausprobieren. Feedback ist natürlich immer willkommen, also kontaktiert uns gerne.