Veröffentlicht am Schreib einen Kommentar

PIN Eingabesystem mit Explorer HAT Pro

In diesem kleinen Tutorial werden Sie lernen, wie man ein paar Geräte mit den kapazitiven Touchflächen des Explorer HAT Pro verbindet und somit ein kleines PIN-Eingabesystem schafft. Dieses System wird die verbunden LEDs je nachdem, ob eine PIN-Nummer korrekt oder falsch eingegeben wurde, zum Leuchten und den Summer zum Erklingen bringen.

Das folgende Tutorial ist die deutsche Wiedergabe des Originals von Pimoroni.

Im Tutorial wird gezeigt, wie man die LEDs an dem Explorer HAT Pro richtig anschließt und steuert sowie wie man den Summer mittels PWM (Pulse Width Modulation) steuert.

Das wird benötigt:

  • Raspberry Pi 3/2/B+/Zero/Zero W
  • Explorer HAT Pro
  • Ein paar 470 Ohm Widerstände (mindestens drei)
  • Ein Paar Farb-LEDs 5 mm (Idealerweise grün und rot)
  • Ein Piezo-Wandler (Summer) 
  • Ein paar Steckbrücken

All diese Teile sind im Set Explorer HAT Pro Teile-Set enthalten.

Installation der Software

Wenn Ihr Explorer HAT Pro noch nicht eingerichtet ist, führen Sie folgende Befehle aus, um die Einrichtung vorzunehmen:

curl https://get.pimoroni.com/i2c | bash
sudo apt-get install python-smbus
sudo apt-get install python-pip
sudo pip install explorerhat

Mit diesen Befehlen wird I2C eingerichtet und die Python-Bibliothek für Explorer HAT Pro installiert.

Anschließend setzen Sie den Explorer HAT Pro auf die GPIO-Pins Ihres Raspberry Pi. Um zu überprüfen, ob der Explorer HAT Pro richtig eingerichtet wurde, führen Sie den folgenden Befehl aus:

python -c ‘import time, explorerhat; explorerhat.light.on(); time.sleep(1); explorerhat.light.off()’

 

Der obere Befehl soll die am Explorer HAT Pro verbauten LEDs zum Leuchten bringen. Alle vier LEDs leuchten für eine Sekunde auf. Wenn es geschehen ist, so wurde der Explorer HAT Pro richtig eingerichtet und Sie können fortfahren.

Die Komponenten verbinden

Setzen Sie die einzelnen Komponenten wie im unteren Schaltplan dargestellt ein. 

Achten Sie darauf, die LEDs richtig zu verbinden: Mit dem langen Draht – die Anode – an den 5V-Anschluss via Widerstand und mit dem kurzen Draht an den Ausgangskanal. Die Widerstände, die mit den LEDs verbunden sind, begrenzen die ankommenden 5V auf die für die LEDs verträgliche Spannung. Der Piezo-Wandler sowie der entsprechende Widerstand können dann von Ihnen beliebig verbunden werden.

PIN Eingabesystem Schaltplan

Der Code

Das sind die Aufgaben, die mit dem Code realisiert werden sollen:

  • Einen PIN-Code aus vier Zahlen setzen
  • Die Reihenfolge der eingegebenen Zahlen verfolgen 
  • Ein visuelles Feedback bei der Eingabe der Zahlen bekommen
  • Nach Eingabe von vier Zahlen, prüfen, ob die Eingabe korrekt war 
  • Wenn die PIN korrekt ist, die grüne LED soll blinken und der Summer soll einen hohen Ton abgeben
  • Wenn die PIN falsch ist, die rote LED soll blinken und der Summer soll einen tiefen Ton abgeben
  • Nach Eingabe der vier Zahlen werden die eingegeben Zahlen gelöscht 
  • Eine Meldung im Terminal ausgeben

Der unten abgebildete Code kann vom Github geklont werden. Im weiteren Verlauf wird jedoch auf einzelne Bestandteile des Codes eingegangen. 

 

Den Code klonen und ausführen 

git clone https://github.com/sandyjmacdonald/explorer-hat.git
cd explorer-hat/examples
python pin_entry.py

So sieht der Code aus:

 ## Imports, for time delays, controlling Explorer HAT Pro and GPIO pin 18
## for the piezo buzzer.

import time
import explorerhat as eh
import RPi.GPIO as GPIO

## Sets up GPIO pin 18 as a PWM output with freq. of 400 Hz.

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
buzzer = GPIO.PWM(18, 400)

## Lists for the correct PIN and an empty one to add digits to.

correct_pin = [1,2,3,4]
pin = []

## Function to add a digit pressed on EHP cap. touch to our pin list.

def add_to_pin(channel, event):
if channel > 4: ## Only use channels 1-4
return
if event == ‘press’:
global pin
pin.append(channel)
eh.light[channel-1].on() ## Blink the corresponding LED
time.sleep(0.05)
eh.light[channel-1].off()

## We use a try, except, finally to run our code and catch exceptions.

try:

## The while True loop keeps the program running until control-c breaks out.

while True:
while len(pin) < 4: ## Keeping adding until 4 digits added
eh.touch.pressed(add_to_pin)
time.sleep(0.05)
if pin == correct_pin: ## Runs with correct PIN
print(‘PIN correct!’)
for i in range(5): ## Blinks LEDs and buzzes 5 times
buzzer.ChangeFrequency(400) ## High frequency
buzzer.start(50)
eh.output.one.on() ## Turns green LED on
time.sleep(0.1)
buzzer.stop()
eh.output.one.off() ## Turns green LED off
time.sleep(0.1)
else: ## Runs with incorrect PIN
print(‘PIN incorrect! Try again.’)
for i in range(5): ## Similar to previous block
buzzer.ChangeFrequency(50) ## Low frequency
buzzer.start(50)
eh.output.two.on() ## Turns red LED on
time.sleep(0.1)
buzzer.stop()
eh.output.two.off() ## Turns red LED off
time.sleep(0.1)
pin = [] ## Resets the list after 4 digits have been entered

## Catches control-c.

except KeyboardInterrupt:
pass

## Catches any other exceptions.

except Exception:
pass

## Clean up GPIO before exit.

finally:
GPIO.cleanup()

 

Die Erläuterungen zum Code 

Imports:

import time
import explorerhat as eh
import RPi.GPIO as GPIO

 

Das Modul time wird verwendet, um etwas Verzögerung in den Code zu bringen. Die kleinen Verzögerungen sind gut für die geordnete Ausführung des Codes. Empfohlen ist beispielsweise der Wert von 0.05 Sekunden.

Das import explorerhat as eh ist aus Effizienz-Gründen wichtig, um nicht jedesmal explorerhat im weiteren Verlauf des Codes tippen zu müssen.

Das RPi.GPIO wird für die Steuerung des Piezo-Wandlers via PWM benötigt.

Die Einrichtung von RPi.GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
buzzer = GPIO.PWM(18, 400)

 

Die erste Zeile definiert die GPIO Pin-Nummer als Broadcom-Nummerierung. Die zweite Zeile setzt den GPIO-Pin 18 als den Ausgangspin. Der PWM-Kanal des Explorer HAT Pro ist mit dem GPIO-Pin von Raspberry Pi verbunden, an diesen wird der Piezo-Wandler angeschlossen.

Die letzte Zeile generiert ein PWM-Objekt mit dem Namen buzzer und verwendet den Pin 18 sowie setzt die Frequenz auf 400 Hz. Dieses buzzer-Objekt kann später für die Steuerung des Summers verwendet werden.

PIN setzen

correct_pin = [1,2,3,4]
pin = []

 

In der ersten Zeile wird die korrekte PIN definiert und in der zweiten Zeile kann die PIN eingetragen werden. Diese Liste wird dann nach der vollständigen Eingabe immer geleert.

Zahlen eingeben 

def add_to_pin(channel, event):
if channel > 4:
return
if event == ‘press’:
global pin
pin.append(channel)
eh.light[channel-1].on()
time.sleep(0.05)
eh.light[channel-1].off()

 

Hier wird eine kleine Funktion geschaffen, mit der drei Sachen erledigt werden: Erkennung der betätigten Taste, Eintragung der entsprechenden Nummer in die pin-Liste und Blinken der entsprechenden LED als visuelles Feedback für die Eingabe. Diese Funktion wird später an die eh.touch.pressed() weitergegeben.

Die Zeilen if channel > 4: return bedeuten, dass nur die Tasten 1 bis 4 am unteren Rand des Explorer HAT Pro verwendet werden können. Anschließend wird die pin als global definiert, um diese von überall erreichen zu können. Danach wird die eingegebene Nummer in die Liste eingetragen. Mit eh.light[channel-1].on() wird die der betätigten Taste entsprechende LED aktiviert. Das time.sleep(0.05) hält die LED aktiviert und eh.light[channel-1].off() deaktiviert diese abschließend. Vom Kanal muss stets 1 subtrahiert werden, da die Kanäle ab 1 und die LEDs ab 0 indexiert sind.

Try, except, finally:

Die Sektionen try, except, finally werden für mehr Ordnung genutzt. Try erlaubt die Ausführung des Hauptcodes. Die möglichen Abweichungen werden mit except gehandhabt. Und im finally wird der Befehl GPIO.cleanup() ausgeführt, der wichtig ist, um jegliche Probleme bei der Verwendung von RPi.GPIO-Bibliothek zu vermeiden.

Berührung erfassen und Nummern in die pin-Liste eintragen

while True:
while len(pin) < 4:
eh.touch.pressed(add_to_pin)
time.sleep(0.05)

 

while True hält den Code am Laufen, bis dieser durch control-c unterbrochen wird. Dann werden die Eingaben solange angenommen, bis die pin-Liste alle vier Zahlen enthält. Der Befehl eh.touch.pressed(add_to_pin) führt die oben erstellte Funktion add_to_pin aus jederzeit, wenn eine Berührung erfasst wurde und trägt die eingegebenen Zahlen in die pin-Liste sowie gibt das visuelle Feedback dazu. Die Zeile time.sleep(0.05) sorgt für die ordentliche Ausführung.

Ihre PIN ist richtig!

Die Zeile while len(pin) < 4 wird abgeschlossen, nachdem die 4 Zahlen erfasst wurden. Nun muss geprüft werden, ob die eingegebene PIN richtig oder falsch war.

if pin == correct_pin:
print(‘PIN correct!’)
for i in range(5):
buzzer.ChangeFrequency(400)
buzzer.start(50)
eh.output.one.on()
time.sleep(0.1)
buzzer.stop()
eh.output.one.off()
time.sleep(0.1)

 

Zuerst wird festgestellt, ob die eingegebene pin der correct_pin entspricht. Wenn ja, dann wird im Terminal die entsprechende Meldung ausgegeben. 

Dann wird ein for Loop fünf Mal nacheinander ausgeführt. Jedes Mal wird der Summer mit buzzer.ChangeFrequency(400) auf eine hohe Frequenz gesetzt und mit buzzer.start(50) ausgeführt. Gleichzeitig wird die grüne LED, die am Ausgang 1 angeschlossen ist, mit eh.output.one.on() aktiviert. Die Zeile time.sleep(0.1) bedeutet, dass der Summer und die LED für 0,1 Sekunde erklingt bzw. erleuchtet.

Abschließend wird der Summer mit buzzer.stop() und die LED mit eh.output.one.off() deaktiviert. Nun wird noch die Zeitverzögerung mit time.sleep(0.1) eingeführt – in dieser Zeit geschieht nichts.

Dieser Loop wird fünf Mal wiederholt, währenddessen wird für insgesamt eine Sekunde die LED fünf Mal aufleuchten und der Summer fünf Mal erklingen.

Ihre PIN ist falsch!

Der else Block tut im Grunde dasselbe wie der vorherige, mit einer Ausnahme – es leuchtet die rote LED und der Summer erklingt im tieferen Ton. Auch wird die entsprechende Meldung im Terminal ausgegeben.

else:
print(‘PIN incorrect! Try again.’)
for i in range(5):
buzzer.ChangeFrequency(50)
buzzer.start(50)
eh.output.two.on()
time.sleep(0.1)
buzzer.stop()
eh.output.two.off()
time.sleep(0.1)

 

Abschließend wird die pin-Liste mit pin = [] geleert und für eine weitere Eingabe vorbereitet. Nun kann die PIN-Eingabe wiederholt werden.

Das war es schon. Viel Spaß beim Ausprobieren!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert