SlideShare a Scribd company logo
1 of 14
Download to read offline
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 Zugangsberechtigtern"
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.

More Related Content

Similar to Markus schwer jufo

Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppetinovex GmbH
 
German: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit JavascriptGerman: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit JavascriptRalf Schwoebel
 
Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)
Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)
Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)nwilbert
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit RustJens Siebert
 
Check cisco voice
Check cisco voiceCheck cisco voice
Check cisco voicebboguhn
 
OSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware Monitoring
OSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware MonitoringOSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware Monitoring
OSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware MonitoringNETWAYS
 
OSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-Monitorings
OSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-MonitoringsOSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-Monitorings
OSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-MonitoringsNETWAYS
 
Docker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugDocker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugAlexander Bohndorf
 
Jpgraph - eine Einführung
Jpgraph - eine EinführungJpgraph - eine Einführung
Jpgraph - eine Einführungfrankstaude
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersUlrich Krause
 
OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...
OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...
OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...NETWAYS
 
Raspberry Pi Lehrerworkshop
Raspberry Pi LehrerworkshopRaspberry Pi Lehrerworkshop
Raspberry Pi LehrerworkshopClaus Brell
 
Coffee Backone Introduction
Coffee Backone IntroductionCoffee Backone Introduction
Coffee Backone IntroductionTino Isnich
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...NETWAYS
 
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...LeanIX GmbH
 
Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Martin Alfke
 
Automation with Ansible
Automation with AnsibleAutomation with Ansible
Automation with AnsibleSusannSgorzaly
 

Similar to Markus schwer jufo (20)

Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppet
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
German: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit JavascriptGerman: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit Javascript
 
Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)
Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)
Python in Computational Neuroscience & Modular toolkit for Data Processing (MDP)
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 
Check cisco voice
Check cisco voiceCheck cisco voice
Check cisco voice
 
OSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware Monitoring
OSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware MonitoringOSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware Monitoring
OSMC 2016 - Hello Redfish, Goodbye IPMI - The future of Hardware Monitoring
 
OSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-Monitorings
OSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-MonitoringsOSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-Monitorings
OSMC 2016 | Hello Redfish, goodbye IPMI - Die Zukunft des Hardware-Monitorings
 
Docker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugDocker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebug
 
Jpgraph - eine Einführung
Jpgraph - eine EinführungJpgraph - eine Einführung
Jpgraph - eine Einführung
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
 
OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...
OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...
OSMC 2009 | Entwicklung von Nagios-Plugins mit Net::SNMP und Nagios::Plugin b...
 
Raspberry Pi Lehrerworkshop
Raspberry Pi LehrerworkshopRaspberry Pi Lehrerworkshop
Raspberry Pi Lehrerworkshop
 
Coffee Backone Introduction
Coffee Backone IntroductionCoffee Backone Introduction
Coffee Backone Introduction
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
 
Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Automation with Ansible
Automation with AnsibleAutomation with Ansible
Automation with Ansible
 

Markus schwer jufo

  • 1. KOFFER- SICHERUNG MIT RASPBERRY PI Markus Schwer (13) DOS Lauchheim Schüler experimentieren 2015 Regionalwettbewerb Heilbronn-Franken
  • 2. 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
  • 3. 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
  • 4. 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:
  • 5. 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)
  • 6. 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):
  • 7. 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 Zugangsberechtigtern" 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+
  • 8. 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.
  • 9. 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:
  • 10. 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
  • 11. 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.
  • 12. 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
  • 13. 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!
  • 14. 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.