14
KOFFER- SICHERUNG MIT RASPBERRY PI Markus Schwer (13) DOS Lauchheim Schüler experimentieren 2015 Regionalwettbewerb Heilbronn-Franken

Markus schwer jufo

Embed Size (px)

Citation preview

Page 1: Markus schwer jufo

KOFFER-

SICHERUNG

MIT

RASPBERRY PI

Markus Schwer (13)

DOS Lauchheim

Schüler experimentieren 2015

Regionalwettbewerb Heilbronn-Franken

Page 2: Markus schwer jufo

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

Page 3: Markus schwer jufo

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

Page 4: Markus schwer jufo

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:

Page 5: Markus schwer jufo

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)

Page 6: Markus schwer jufo

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):

Page 7: Markus schwer jufo

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+

Page 8: Markus schwer jufo

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.

Page 9: Markus schwer jufo

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:

Page 10: Markus schwer jufo

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

Page 11: Markus schwer jufo

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.

Page 12: Markus schwer jufo

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

Page 13: Markus schwer jufo

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!

Page 14: Markus schwer jufo

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.