RFID – Türöffner mit dem Raspberry Pi Teil 2

Tja, nun habe ich es tatsächlich hinbekommen. Die Schaltung inkl. Programmierung läuft. Nachdem ich lange nach Lösungen gesucht hatte, musste ich mir aus drei Lösungsansätzen aus dem www etwas eigenes zusammenschrauben. Die Nacht wurde immer länger und ich wollte schon fast aufgeben, irgendwie gelang es mir dann noch noch mich zu konzentrieren. Das Ergebniss ist unter dem Beitrag als Video zu sehen. Die Steuerung ist mit Python und einer MySQL-Datenbank erstellt. Als nächster Schritt folgt die Weboberfläche zum Verwalten für Zutrittsberechtigte. Danach Finetuning, falls das System mal abschmiert. Ich schaue bereits nach passenden Türöffnern, die ich dann in den Haustürrahmen einsetzen kann.

Zur groben Erklärung des Programmablaufs auf dem PI:

Als erstes ein sauberes Wheezy aufsetzen. Ich habe mich dafür entschieden, da im Jessy sehr viele Änderungen vorgenommen wurden. U.a wurde die Inittab „entsorgt“. Wenn man aber mal im Netz nach einer Lösung sucht, so ist alles auf Wheezy-Basis. Ach so, mit Wheezy meinte ich das Image auf dem Raspberry Pi.

Nachdem ich also nun das Image aufgespielt hatte, musste ich diverse Einstellungen machen. Dabei war u.a. die Installation folgender Dinge:

Apache Server, MySQL und phpmyadmin. Dann hier und da noch ein wenig am System geschraubt und schon konnte es losgehen mit den Softwarespielereien;-).

Es gibt derzeit für mein System nun drei wesentliche Programmteile. Die functions.py übernimmt dabei die Hauptfunktion.

Als erstes ist da die „add.py“. Das kleine Script hat den Sinn die Chips in die Datenbank als Nutzer zu hinterlegen.

#!/usr/bin/python
# coding=utf-8
# Datei add.py
import RPi.GPIO as GPIO
from functions import *
db = DB()
print "Neuer Zugangsberechtigter\n"
print "Transponder einlesen...\n"
id = read_rfid()
name = raw_input("Name eingeben: ")
try:
db.add_user(id,name)
print "Neuer Datensatz angelegt"
except:
print "Fehler beim Schreiben"
db.close_db() 

 

Es folgte dann das Python-Script welches auch gestartet werden muss. Die „main.py“. Sicherlich sind die Scripte nichtganz fehlerfrei, aber ich lerne noch :-).

<div>#!/usr/bin/python
# coding=utf-8
# Datei main.py
import RPi.GPIO as GPIO
from functions import *
import time,sys
db = DB()
time_open = 5
try:
while True:
lcd ("Klingeln oder","Chip einscannen")
id = read_rfid()
check =  db.mysql_read(id)
if check[1] != 0:
lcd ("Guten Tag",check[1])
sleep(1)
lcd ("Tuer offen", "fuer "+str(time_open)+" Sek")
db.update_timestamp(id)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.OUT)
GPIO.output(27, True)
time.sleep(time_open)
GPIO.output(27, False)
lcd ("Tuer wieder", "verriegelt")
sleep(1)</div>
<div></div>
<div>        else:
lcd("Chip nicht","erlaubt!")
continue

except KeyboardInterrupt:
db.close_db()
GPIO.cleanup()
sys.exit()</div>
Als letztes fehlt nun noch die „functions.py“. Dort habe ich nun alle funktionen eingesetzt. Dazu zählen u.a die LCD-Anzeige und die Datenbankabfrage.
<div>#!/usr/bin/python
# coding=utf-8
# Datei functions.py
import sys
import time
import serial
import MySQLdb
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)</div>
<div></div>
<div># Auslesen der RFID-Transponder
def read_rfid():
ser = serial.Serial("/dev/ttyAMA0")
ser.baudrate = 9600
daten = ser.read(14)
ser.close()
daten = daten.replace("\x02", "" )
daten = daten.replace("\x03", "" )
return daten
class DB():
def __init__(self):
db = MySQLdb.connect(host="127.0.0.1", user="xxxxx", passwd="xxxxxxx", db="rfid")
db.autocommit(True)
self.cur = db.cursor()
def close_db( self ):
self.cur.close()
def add_user(self,rfid_id, name):
add=self.cur.execute("INSERT INTO user (rfid, name) " + "VALUES (%s,%s)", (rfid_id, name))
def mysql_read(self, rfid_id):
a= self.cur.execute("SELECT id, name, timestamp, rfid " + "FROM user WHERE rfid = %s" ,rfid_id)
id = 0
name = 0
timestamp = 0
rfid = 0
for row in self.cur.fetchall():
id = int(row[0])
name = str(row[1])
timestamp = str(row[2])
rfid = str(row[3])
return id, name, timestamp,rfid
def update_timestamp(self, rfid_id):
a= self.cur.execute("UPDATE user SET timestamp = NOW() " +  "WHERE rfid = %s" ,rfid_id)</div>
<div></div>
<div># startlcd</div>
<div></div>
<div>LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18</div>
<div></div>
<div>
LCD_WIDTH = 16
LCD_CHR = True
LCD_CMD = False</div>
<div></div>
<div>LCD_LINE_1 = 0x80 # address for the 1st line
LCD_LINE_2 = 0xC0 # address for the 2nd line</div>
<div></div>
<div>textl1= ""
textl2= ""</div>
<div></div>
<div>
E_PULSE = 0.00005
E_DELAY = 0.00005</div>
<div></div>
<div>def lcd(textl1, textl2):</div>
<div></div>
<div>
GPIO.setmode(GPIO.BCM)
GPIO.setup(LCD_E, GPIO.OUT)
GPIO.setup(LCD_RS, GPIO.OUT)
GPIO.setup(LCD_D4, GPIO.OUT)
GPIO.setup(LCD_D5, GPIO.OUT)
GPIO.setup(LCD_D6, GPIO.OUT)
GPIO.setup(LCD_D7, GPIO.OUT)</div>
<div></div>
<div>
lcd_init()</div>
<div></div>
<div>
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string(str(textl1))
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(str(textl2))</div>
<div></div>
<div>  time.sleep(0.5)
GPIO.cleanup()</div>
<div></div>
<div>def lcd_init():
# Initialise display
lcd_byte(0x33,LCD_CMD)
lcd_byte(0x32,LCD_CMD)
lcd_byte(0x28,LCD_CMD)
lcd_byte(0x0C,LCD_CMD)
lcd_byte(0x06,LCD_CMD)
lcd_byte(0x01,LCD_CMD)</div>
<div></div>
<div>def lcd_string(message):</div>
<div></div>
<div>
message = message.ljust(LCD_WIDTH," ")</div>
<div></div>
<div>  for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)</div>
<div></div>
<div>def lcd_byte(bits, mode):</div>
<div></div>
<div>
GPIO.output(LCD_RS, mode)</div>
<div></div>
<div>
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&amp;0x10==0x10:
GPIO.output(LCD_D4, True)
if bits&amp;0x20==0x20:
GPIO.output(LCD_D5, True)
if bits&amp;0x40==0x40:
GPIO.output(LCD_D6, True)
if bits&amp;0x80==0x80:
GPIO.output(LCD_D7, True)</div>
<div></div>
<div>
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)</div>
<div></div>
<div>
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&amp;0x01==0x01:
GPIO.output(LCD_D4, True)
if bits&amp;0x02==0x02:
GPIO.output(LCD_D5, True)
if bits&amp;0x04==0x04:
GPIO.output(LCD_D6, True)
if bits&amp;0x08==0x08:
GPIO.output(LCD_D7, True)</div>
<div></div>
<div>
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)</div>
<div></div>
<div>if __name__ == '__main__':</div>
<div></div>
<div> lcd()</div>
Auf die einzelnen Programmteile und die genaue Verdrahtung werde ich aber noch eingehen. Dazu möchte ich das ganze aber noch etwas verfeinern.
Jetzt erst mal das Ergebniss im Video:

 

 

2 Kommentare

  1. Hallo,

    bist du mit deinem Projekt schon weiter gekommen. Habe mir gerade die einzelnen Komponenten bestellt um deine Anleitung nach zu bauen.

    Gruß
    Michael

    1. Hallo Michael,
      ich konnte bisher leider nicht viel weiter machen. Allerdings möchte ich so langsam fertig werden, jetzt wo hoffentlich bald der Frost weg ist.
      Ich werde den Fortschritt dann hier im Blog schreiben. Das ganze dann auch mit Video.
      Viele Grüße
      Rainer

Kommentar hinterlassen

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

Time limit is exhausted. Please reload the CAPTCHA.