KOFFER-
SICHERUNG
MIT
RASPBERRY PI
Markus Schwer (13)
DOS Lauchheim
Schüler experimentieren 2015
Regionalwettbewerb Heilbronn-Franken
Markus Schwer [1]
Inhaltsverzeichnis
1. Kurzfassung.......................................................................................................................................... 2
2. Einleitung ............................................................................................................................................. 2
3. Materialien .......................................................................................................................................... 2
4. Durchführung ...................................................................................................................................... 3
5. Aufgetretene Probleme und Problemlösung .................................................................................... 11
6. Fazit ................................................................................................................................................... 13
7. Danksagung ....................................................................................................................................... 13
Markus Schwer [2]
1. Kurzfassung
Nachdem ich im letzten Jahr mein Türschloss mit einem Mikrocontroller
(Arduino) gesichert habe, habe ich mich in diesem Jahr entschlossen, einen
Koffer vor unerlaubtem Zugriff zu sichern. Schon im letzten Jahr wollte ich zur
Steuerung ein Webinterface benutzen, habe aber festgestellt, dass dies mit
Arduino nicht so einfach geht. Deshalb habe ich für mein neues Projekt den
Raspberry Pi ausgewählt. Der Raspberry Pi ist ein Mini-Computer ohne internen
Speicher. Ich habe einen Koffer mit einem Entriegelungsmagnet gesichert, der
über den Raspberry Pi gesteuert wird. Der Raspberry Pi erlaubt nur
authorisierten Personen mit RFID-Karte den Zugriff. Über ein Webinterface
kann ich auswählen, welche Personen meinen Koffer öffnen können. Das
Programm dafür habe ich mit Python geschrieben.
2. Einleitung
Ich habe im Herbst 2014 die Empfehlung bekommen, mir einen Raspberry Pi
zuzulegen. Der Raspberry Pi ist ein Mini-Computer ohne internen Speicher.
Dazu habe ich noch das Buch „Raspberry Pi, Das umfassende Handbuch“ von
dem Verlag Galileo Computing bekommen. In diesem Buch ist ein Projekt
beschrieben, das genau meinem geplanten Projekt entspricht. Ich musste „nur
noch“ einiges anpassen.
3. Materialien
Raspberry Pi B+
RFID-Reader RDM6300 von Itead Studio
125 kHz RFID-Transponderkarten
Zugmagnet REGDON L5081
Motortreiber TLE 4202B
Micro SD-Karte
WLAN-Stick
Handy Akku
Markus Schwer [3]
4. Durchführung
Zu Beginn des Projekts habe ich das Betriebssystem Raspbian von
www.raspberrypi.org/downloads auf eine SD Karte geladen. Raspbian ist eine
Linux Distribution.
Dafür habe ich die Zip-Datei auf meinem PC gespeichert, die Zip geöffnet und
den Inhalt auf eine SD Karte kopiert.
Nun wurde die SD Karte in den Raspberry Pi gesteckt und der Raspberry Pi mit
Strom versorgt. Nachdem der Raspberry Pi gebootet hat, habe ich Raspbian
installiert. Bei der Konfiguration von Raspbian habe ich SSH aktiviert. SSH dient
der Kommunikation innerhalb eines Netzwerkes. Nach dem Reboot habe ich
mich mit username: pi und password: raspberry eingeloggt. Als Nächstes habe
ich startx in die Konsole eingegeben. Daraufhin öffnet sich die Oberfläche von
Raspbian. In der Konsole habe ich das Passwort mit passwd geändert. Nachdem
sichergestellt war, dass Raspberry Pi mit dem Internet verbunden ist, habe ich
Apache 2 installiert, und zwar mit sudo apt-get install apache2. Danach habe
ich MySQL mit sudo apt-get install mysql-server php5-mysql installiert. Nun
musste ich noch phpMyAdmin installieren, und zwar mit sudo apt-get install
phpmyadmin. Nun musste noch die UART Schnittstelle aktiviert und gesäubert
werden. Dazu muss in der cmdline.txt der text console=ttyAMA0, 115200,
kgdboc=ttyAMA0, 115200 gelöscht werden. In cmdline.txt kommt man mit
sudo leafpad /boot/cmdline.txt. Als Nächstes musste ich die etc/inittab in
einem Editor öffnen und die letzte Zeile mit # auskommentieren.
Dann musste ich noch pySerial installieren. Das geht mit:
sudo apt-get install python-setuptools
sudo easy_install pip
pip install pyserial
Danach musste ich den Webbrowser öffnen und die IP-Adresse vom Raspberry
Pi eingeben. Die IP-Adresse des Raspberry Pi findet man unter
Menü->Einstellungen->Wifi Konfiguration.
Nach der IP-Adresse des Raspberry Pi musste man /phpmyadmin eingeben. Als
Nächstes habe ich eine neue Datenbank mit dem Namen rfid erstellt. Danach
muss man folgenden SQL-Befehl eingeben:
Markus Schwer [4]
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
`rfid` text CHARACTER SET utf8,
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)
Dann habe ich die Programme main.py, functions.py und add.py aus dem Buch
„Raspberry Pi“ (Kapitel 27) abgetippt und in /home/pi gespeichert. Nun war die
Programmierung fertig.
main.py:
#!/usr/bin/python
# coding=utf-8
# Datei main.py
import RPi.GPIO as GPIO
from functions import *
import time,sys
GPIO.setmode(GPIO.BOARD)
GPIO.setup(13,GPIO.OUT)
db = DB()
time_open = 5
try:
while True:
print "Warte auf Transponder...\n"
id = read_rfid()
check = db.mysql_read(id)
if check[1] != 0:
print "Hallo",check[1],"\n"
print "Tuer",time_open,"Sekunden geoeffnet "
db.update_timestamp(id)
Markus Schwer [5]
GPIO.output(13, True)
time.sleep(time_open)
GPIO.output(13, False)
else:
print "Transpondernummer",id, "nicht gefunden!"
print "Kein Zutritt!"
continue
except KeyboardInterrupt:
db.close_db()
GPIO.cleanup()
sys.exit()
functions.py:
#!/usr/bin/python
# coding=utf-8
# Datei functions.py
import serial
import MySQLdb
# 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="localhost", user="root", passwd="*******", db="rfid")
db.autocommit(True)
self.cur = db.cursor()
def close_db( self ):
self.cur.close()
def add_user(self,rfid_id, name):
Markus Schwer [6]
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)
add.py:
#!/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()
Nun kam die Hardware. Zuerst habe ich mir die Pinbelegung vom Raspberry Pi
B+
Markus Schwer [7]
(http://data.designspark.info/uploads/images/53bc258dc6c0425cb44870b50a
b30621)
und vom RFID-Reader (http://wiki.iteadstudio.com/RDM6300) angeschaut.
Dann habe ich den RFID-Reader mit Hilfe von zwei 1 kOhm Widerständen nach
folgendem Schaltplan an den Raspberry Pi angeschlossen.
Als Nächstes habe ich mit sudo python add.py das Programm add.py ausgeführt
und mit dem RFID Reader die Daten der Transponderkarten eingelesen.
Nun habe ich das Programm main.py ausgeführt, und es hat funktioniert.
Markus Schwer [8]
Nun musste ich „nur noch“ den Zugmagnet ansteuern. Nach einem Tipp von
Herrn Barth habe ich dafür einen Motortreiber verwendet, und zwar den
TLE4202B. Da über den Raspberry Pi maximal 5V verfügbar sind und mein
Magnet mind. 6V benötigt, musste ich eine externe Spannungsquelle (9V-Block)
verwenden. Den Motortreiber habe ich folgendermaßen angeschlossen:
Markus Schwer [9]
Die komplette Platine habe ich mit Fritzing erstellt und bestellt:
Dies ist die Pinbelegung vom Raspberry Pi B+.
Quelle:
http://www.rs-online.com/designspark/electronics/eng/blog/introducing-the-
raspberry-pi-b-plus
Markus Schwer [10]
Zum Testen habe ich die Schaltungen auf einem Steckbrett ausprobiert.
Damit das Ganze auch transportabel ist, habe ich den Raspberry Pi zur
Stromversorgung an einen Handy Akku angeschlossen.
Als letztes habe ich alles in den Deckel des Koffers eingebaut.
Markus Schwer [11]
5. Aufgetretene Probleme und Problemlösung
Bei der Durchführung dieses Projekts traten folgende Probleme auf:
1. Ich hatte /etc/inittab in einem Editor geöffnet und geschaut, ob die Zeile
auskommentiert ist, so wie in dem Buch „Raspberry Pi“ beschrieben
(T0:23:respawn:/sbin/getty –L ttyAMA0 115200 vt100. Leider ist diese
Zeile zweimal in der inittab vorhanden, und ich hatte nur die erste Zeile
gesehen. Die letzte Zeile habe ich übersehen.
Ich bekam dann beim Ausführen der main.py ständig folgenden Fehler: Traceback (most recent call last):
File "main.py", line 18, in <module>
id = read_rfid()
File "/home/pi/functions.py", line 13, in read_rfid
daten = ser.read(14)
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 449, in read
buf = os.read(self.fd, size-len(read))
OSError: [Errno 11] Resource temporarily unavailable
Ich habe dann im Raspberry Pi Forum (http://www.forum-
raspberrypi.de/) nachgefragt, bekam aber keine befriedigende Antwort.
Bei einem der Autoren des Buches, Herrn Christopher Scherbeck habe
ich dann per Mail angefragt, ob er mir helfen kann. Herr Scherbeck hat
mir sehr schnell geantwortet und hat sich viel Mühe gegeben. Nach
einigen Mails hin und her hatte er dann die Lösung mit der inittab
gefunden.
2. Auf der Suche nach einer Lösung für das Problem mit der main.py (siehe
oben) habe ich mein System (Raspbian) neu aufgesetzt. Die SQL Datei
rfid habe ich aber vor dem neu Aufsetzen und danach wieder
übernommen. Als das Problem mit er main.py gelöst war, wurde beim
Auslesen der Transponderkarte die richtige ID angezeigt, aber der Zutritt
verweigert. Nach einiger Zeit habe ich den Fehler gefunden. Ich habe die
alten Daten in der SQL-Datei gelöscht und mit add.py neu eingelesen.
Nun hat es funktioniert. Warum weiß ich bis heute nicht.
3. Ein anderes Problem war, dass im Buch nicht beschrieben war, wie man
einen RFID Reader beim Raspberry Pi B+ anschließt. Die Pinbelegung ist
Markus Schwer [12]
beim B+ anders als im Buch. Das hatte ich zuerst nicht beachtet, war aber
kein großes Problem.
4. Ein weiteres Problem war der Anschluss des Zugmagneten. Da der
Raspberry Pi nur maximal 5V liefert, habe ich zuerst ausprobiert, ob der
Magnet auch mit 5V funktioniert. Dies habe ich mit einer Batterie
überprüft und festgestellt, dass es mit 5V nicht geht, aber er mit 9V auch
nicht kaputt geht. Zu meiner Verwunderung habe ich dabei auch
festgestellt, dass der erste Magnet, sobald man Spannung anlegt, nur
anzieht. Auch bei Umpolung zog der Magnet an. Das stellte mich vor ein
weiteres Problem, da ich davon ausgegangen war, dass der Magnet, wie
online beschrieben, bei einem 6V-Impuls den Anker freigibt und bei
einem weiteren Impuls wieder einzieht. Als Lösung des Problems habe
ich mir überlegt eine Druckfeder zu benutzen.
Im Raspberry Pi Forum habe ich auf die Frage nach dem Anschluss eines
Zugmagneten keine befriedigende Antwort erhalten. Auch bei der
Internetrecherche habe ich nichts dazu gefunden. Deshalb habe ich
Herrn Barth kontaktiert. Von ihm habe ich zwei mögliche Lösungsansätze
erhalten. Entweder das PiFace (eine Erweiterungsplatine für den
Raspberry Pi) oder einen Motortreiber benutzen. Zuerst habe ich mich
für das PiFace entschieden, weil es einfacher erschien. Es stellte sich
jedoch heraus, dass das PiFace für diese Zwecke nicht geeignet ist, da ich
damit die serielle Schnittstelle nicht benutzen kann. Diese brauche ich
aber für den RFID-Reader. Auch im Internet habe ich dafür keine Lösung
gefunden. Mittlerweile hatte ich noch eine andere Idee, und zwar ein
MOSFET zu benutzen. Ich war mir nicht sicher, ob man einen
Motortreiber zum Ansteuern eines Zugmagneten verwenden kann.
Deshalb schrieb ich nochmals an Herrn Barth, ob das wirklich funktioniert
und ob man alternativ vielleicht auch einen MOSFET benutzen kann. Herr
Barth meinte, dass sowohl Motortreiber als auch MOSFET möglich sind.
Da ich bereits einen passenden Motortreiber zu Hause hatte, habe ich
nach Anleitung von Herrn Barth diesen ausprobiert. Nach einigen
Versuchen hat es auch funktioniert!
Markus Schwer [13]
6. Fazit
Bei der Suche nach Problemlösungen im Internet habe ich festgestellt, dass
dieses Projekt deutlich anspruchsvoller war, als mein Jugend forscht-Projekt
vom letzten Jahr. Ich habe bei diesem Projekt die Grundlagen von Python und
Linux gelernt, sowie für weitere Projekte interessante elektronische Kenntnisse
gesammelt. Dies hätte ich ohne externe Hilfe nicht geschafft.
7. Danksagung
Herrn Dr. Andreas Barth (Studiengang Ingenieurpädagogik, HTW Aalen) möchte
ich für seine wertvollen Tipps zum Anschluss des Zugmagneten und für die
schnelle Erreichbarkeit (selbst an Feiertagen) danken.
Herrn Christoph Scherbeck (Mitautor des Buches „Raspberry Pi, Das
umfassende Handbuch) danke ich für die Hilfe bei meinem größten Problem,
bei dem ich selbst von den Spezialisten im Raspberry Pi Forum keine
Unterstützung fand. Ich war verblüfft und erfreut von der schnellen
Unterstützung.
Bei meiner Mutter bedanke ich mich für viele Internetrecherchen und für sehr
viel Geduld.
Bei Herrn Bich bedanke ich mich für die hilfreiche Fixierung der Elektronik im
Koffer.