Wir bauen ein elektronisches Schloss 2331

In vielen „Smart-Homes“ können die Türen automatisch über ein Keypad, mittels App oder sogar per Sprache geöffnet und geschlossen werden. Wir wollen mit einem Raspberry Pi Pico ein elektrisches Schloss selber bauen und dann auch programmieren, damit wir es öffnen und wieder schließen können.

Inhalt

Im folgenden Video siehst du das Schloss in Aktion:

Folgende Bauteile benötigst du, um das Schloss nachbauen zu können:

Des Weiteren brauchst du ein Breadboard und Kabel zum Verbinden.

1) Keypad – Tastatur anschließen

Verkabelung Keypad und Raspberry Pi Pico

Im ersten Schritt schließen wir das Keypad an den Raspberry Pi Pico an und testen die Funktionalität. Den Rasbperry Pi Pico musst du mit Circuit Python bespielen, um das Programm weiter unten ausführen zu können. Wie das funktioniert, kannst du im Artikel Python und der Raspberry Pi Pico nachlesen.

An das Keypad habe ich 8 Kabel angelötet und diese der Reihe nach von links nach rechts an die Pins GP10 bis GP17 angeschlossen:

Pinbelegung vom Keypad

Folgendes Programm nutzt das bereits in Circuit Python enthaltene Modul keypad, um das Keypad auszulesen:

import board
import keypad

#Tupel mit genutzten Pins
rowPins = (board.GP10, board.GP11, board.GP12, board.GP13)
columnPins = (board.GP14, board.GP15, board.GP16, board.GP17)

#keypad Matrix wird erstellt
keypadMatrix = keypad.KeyMatrix(rowPins, columnPins)

#Tastenzuweisung
tastenMap = { 0: "1", 1: "4", 2: "7", 3: "*", 4: "2", 5: "5", 6: "8", 7: "0",
              8: "3", 9: "6", 10: "9", 11: "#", 12: "A", 13: "B", 14: "C", 15: "D"}



while True:
  event = keypadMatrix.events.get()
  if event:
      if event.pressed:
        #gibt die Keynummer zurück. Bei einem 4x4 Keypad sind das Zahlen von 0-15
        print(event.key_number)
        #hier wird anhand der Keynummer in der Map nachgeschlagen, welche Taste
        #gedrückt wurde z.B.: key_number 12 wird zu "A"
        print(tastenMap[event.key_number])

Im Video erkläre ich das Programm und zeige die Funktion auf:

2) Schloss mit Relais öffnen

Das Keypad funktioniert nun und wir wollen mit dem Raspberry Pi Pico das elektrische Schloss öffnen und schließen. Dafür legen wir das Keypad zuerst beiseite und schauen, wie wir mit dem Pico ein Schloss öffnen können, welches 12 V benötigt und wir mit dem Pico nur 3,3 V ausgeben können.

Um mit einem kleinen Stromkreis (3,3 V vom Raspberry Pi Pico) einen großen Stromkreis (12 V vom elektrischen Schloss) zu schalten, benötigt man ein Relais.

Ein Relais ist ein durch elektrischen Strom betriebener Schalter mit zwei Schaltstellungen. Das Relais wird über einen Steuerstromkreis aktiviert und schaltet dadurch den zweiten Stromkreis.

Wir nutzen für unser Beispiel das Relais SRD-05VDC-SL-C. Im folgenden Bild sieht man links die Anschlüsse für den größeren zu schaltenden Stromkreis und rechts die Anschlüsse für den Raspberry Pi Pico.

Relais mit Anschlüssen
  • NO = Normally Open, der zu schaltende Stromkreis wäre hier immer offen, also es fließt kein Strom. Erst wenn das Relais ein Signal bekommt, wird dieser Stromkreis geschlossen.
  • C = Common Terminal, hier kann zum Beispiel der Pluspol des Stromkreises angeschlossen werden.
  • NC = Normally Closed, der zu schaltende Stromkreis wäre hier immer geschlossen, also es fließt Strom. Erst wenn das Relais ein Signal bekommt, wird dieser Stromkries geöffnet und es fließt kein Strom mehr.

Beachte das Datenblatt des Relais, welches du nutzt. Dieses kann einen anderen Aufbau als den hier beschriebenen haben.

Da bei unserem Projekt das Schloss immer geschlossen sein soll, bis der Raspberry Pi Pico das Signal gibt, schließen wir den 12 V Stromkreis an C und NO an.

Dies ist ein Beispielcode, der das Relais öffnet, wenn man den angeschlossenen Knopf drückt:

import time
import board
import digitalio

#Signalpin der mit dem Relais verbunden ist
relais = digitalio.DigitalInOut(board.GP0)
relais.direction = digitalio.Direction.OUTPUT

#Button zum Testen der Relaisschaltung
button = digitalio.DigitalInOut(board.GP15)
button.switch_to_input(pull=digitalio.Pull.DOWN)

while True:
    if(button.value):
        print("Button gedrückt")
        relais.value = True
        time.sleep(2)
        relais.value = False
    time.sleep(0.5)

Folgendes Video zeigt dir den Aufbau und erklärt die Funktionsweise:

3) Alles zusammenfügen

Wir haben gesehen, wie man ein Keypad nutzt, um Informationen zum Raspberry Pi Pico zu senden und wie man mithilfe eines kleinen Stromkreises einen größeren Stromkreis schalten kann.

Jetzt fügen wir alles zusammen und passen den Code an, damit dieser nur das Schloss öffnet, wenn man den richtigen Code eingegeben hat.

Neu hinzugekommen ist der Spannungswandler, der die 12 V vom Netzteil auf 5 V reduziert und damit den Raspberry Pi Pico über Pin 39 (VSYS) versorgt. Damit kann das Schloss und der Raspberry Pi Pico mit nur einer Spannungsquelle (12 V) betrieben werden. Wie der Spannungswandler MP1584EN eingestellt wird, kannst du in diesem Video anschauen: Mini MP1584EN adjustable step down DC to DC voltage buck converter electronics module

Wenn der Raspberry Pi Pico über Pin 39 mit 5V versorgt wird, darf nicht gleichzeitig der Raspberry Pi Pico mit dem USB Kabel am Computer angeschlossen sein.

Will man den Code ändern, muss vorher die Spannung an Pin 39 entfernt werden, da sonst der Pico zu viel Spannung bekommt und kaputt gehen kann!

Schaltplan
import board
import keypad
import time
import digitalio

#Tupel mit genutzten Pins
rowPins = (board.GP10, board.GP11, board.GP12, board.GP13)
columnPins = (board.GP14, board.GP15, board.GP16, board.GP17)

#keypad Matrix wird erstellt
keypadMatrix = keypad.KeyMatrix(rowPins, columnPins)

#Tastenzuweisung
tastenMap = { 0: "1", 1: "4", 2: "7", 3: "*", 4: "2", 5: "5", 6: "8", 7: "0",
              8: "3", 9: "6", 10: "9", 11: "#", 12: "A", 13: "B", 14: "C", 15: "D"}

#Signalpin der mit dem Relais verbunden ist
relais = digitalio.DigitalInOut(board.GP0)
relais.direction = digitalio.Direction.OUTPUT

#LED auf dem Pico, wird aktiviert um zu sehen, dass das Programm läuft
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT

#Variable speichert die Eingabe des Nutzers
tempCode = ""

#Methode testet den eingegebenen Code, wenn die #-Taste gedrückt wird
def testeCode():
    global tempCode
    if(tempCode == "1011"):
        print("open")
        relais.value = True
        time.sleep(2)
        relais.value = False
        tempCode = ""
    else:
        print("not open")
        tempCode = ""



#Dauerschleife
while True:
    led.value = True
    event = keypadMatrix.events.get()
    if event:
        if event.pressed:
            #hier wird anhand der Keynummer in der Map nachgeschlagen, welche Taste
            #gedrückt wurde z.B.: key_number 12 wird zu "A"
            print(tastenMap[event.key_number])
            
            if(tastenMap[event.key_number] == "#"):
                testeCode()
            else:
                #gedrückte Taste wird Variable hinzugefügt
                tempCode += tastenMap[event.key_number]
                print(tempCode)