Archiv der Kategorie: Raspberry Pi

Ausgabe des NFC Moduls über die Shell verwenden

Die Inbetriebnahme des NFC Moduls ist wie in dem Artikel zu lesen sehr einfach. Leider lässt sich die Ausgabe mit Hilfe von | nicht umleiten und kann somit auf der Shell nicht weiter verwendet werden.
Ich habe mit den Sourcecode(main.c) der mitgelieferten Polling Software angesehen und ein wenig angepasst, nun wird die UID des Tags in die Datei polling.log geschrieben.

Um so wenig Ausgaben wie möglich zu erhalten habe ich die meisten printf... Ausgaben aus dem Code entfernt, ausgegeben werden nun nur noch Fehlerausgaben und die UID.

Damit die Ausgabe in eine Datei geschrieben wird, habe ich folgendes in der main.c ausgetauscht.
Vorher:
printf("UID: ");
uint8_t i;
for(i = 0; i < bLength; i++) { printf("%02X ", bUid[i]); } printf("\n\n");

Nachher:
uint8_t i;
FILE *f = fopen("polling.log","a+");
for(i = 0; i < bLength; i++) { fprintf(f,"%02X", bUid[i]); } fprintf(f,"%s\n", ""); fclose(f);

Zusätzlich habe ich sleep(1) auf sleep(4) gesetzt.

Nach dem kompilieren kann die Software wie vorher über ./card_polling gestartet werde und die UID´s werden in die polling.log geschrieben.

Die UID´s aus der polling.log greife ich über ein kleines Shellscript ab, hierfür mussten zuvor die inotify-tools installiert werden.

apt-get install inotify-tools

Das Script selbst ist wie folgt aufgebaut:
#!/bin/bash
FILE="polling.log"
while true;
do
inotifywait -e modify "${FILE}"
for i in `cat ${FILE}`
do
echo $i
echo "" > ${FILE}
done
done

Wenn das Shellscript gestartet wurde, wird die polling.log überwacht.
Sobald es eine Änderung gibt wird die UID(echo $i) ausgegeben und im Anschluss wird die polling.log geleert.
Anstatt der echo $i Ausgabe könnte die UID auch in eine mysql Datenbank geschrieben werden, diese könnte dann in einem Webfrontend für zum Beispiel eine Zeiterfassung verwendet werden.
Es wäre auch möglich mit zusätzlicher Hardware ein Türschloss zu öffnen oder ein Programm auf dem Raspberry Pi zu starten.

Natürlich wäre das ganze einfacher wenn man den Sourcecode komplett anpassen würde, um zum Beispiel die UID in die mysql Datenbank zu schreiben, für mich reicht jedoch die Verwendung der UID über die Shell.

NFC Modul für den Raspberry Pi

Zu dem NFC Modul welches ich bei Farnell element14 bestellt habe gehört das Modul selbst, ein kleiner Zettel mit Mini Anleitung und eine RFID Karte. Das Modul ist ungefähr so groß wie der Rasbperry Pi und wird direkt auf die GPIO Ports gesetzt. Durch das aufsetzen des Moduls sind leider die anderen GPIO Ports nicht mehr nutzbar.

Damit das Modul genutzt werden kann muss SPI aktiviert werden.
Hierfür auf der Kommandozeile sudo raspi-config ausführen und unter den Advancded Options SPI aktivieren, im Anschluss den Rasbperry Pi neustarten.

Über einem Windows oder Linux Rechner (nicht über den Rasbperry Pi) die benötigte Software hier herunterladen und entpacken. In den entpackten Verzeichnissen befindet sich die card_polling.zip, diese muss auf den Rasbperry Pi kopiert und werden.

Für das kompilieren der polling Software muss zunächst cmake installiert werden.

Als root auf der Kommandozeile:
apt-get update
apt-get install cmake

Nun als Pi user in das Verzeichniss wechseln in der die zip Datei liegt und mit unzip card_polling.zip entpacken.
Nach dem entpacken müssen folgende Befehle ausgeführt werden:

cd ~/card_polling/build
cmake ../source
make

Nun über ./card_polling die kompilierte Software starten und das polling beginnt.

/home/pi/card_polling/build# ./card_polling
/****** Begin Polling ******/
No card or Tag detected
No card or Tag detected
MIFARE Ultralight detected
UID: 04 F1 DE 81 A0 22 80

MIFARE Ultralight detected
UID: 04 F1 DE 81 A0 22 80

No card or Tag detected
No card or Tag detected

Sobald eine RFID Karte auf das Modul gelegt wird, gibt die Software den Typ und die UID der Karte aus.

NFC Paket

NFC montiert

UPDATE:Leider hatte ich vergessen die verwendete Distribution mit anzugeben, ich nutze hier Raspian. Danke für den Hinweis Marco

[Raspberry Pi] Browser nach Systemstart im Fullscreen starten

Ein Kollege fragte mich neulich wie er am einfachsten auf drei Fernsehern verschiedene Urls für Präsentationen öffnen könnte. Er dachte zunächst daran einen Rechner mit entsprechender Grafikkarte zu kaufen, ich konnte ihn jedoch überzeugen anstatt eines Rechners, drei Raspberry Pi´s zu verwenden.

Der Plan ist, das der Raspberry Pi hochfährt und automatisch den Browser öffnet.
Um Resourcen zu sparen, wird der midori Browser über die Kommandozeile gestartet und nicht über einen Desktop. Das setzt voraus, das der Pi Benutzer nach dem hochfahren des Systems an der Kommandozeile angemeldet ist.

Hierfür muss die Datei /etc/inittab wie folgt angepasst werden:

Vorher
1:2345:respawn:/sbin/getty --noclear 38400 tty1
nachher
#1:2345:respawn:/sbin/getty --noclear 38400 tty1
1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1

Damit der Browser den gesamten Bildschirm ausfüllt (Kiosk Mode) und zum Beispiel der Mauszeiger nicht dargestellt wird, müssen noch weitere Programme installiert werden.

apt-get install matchbox x11-xserver-utils unclutter

Das Script sieht dann wie folgt aus:
#!/bin/sh
unclutter &
matchbox-window-manager & :
xset -dpms
xset s off
while true; do
/usr/bin/midori -e Fullscreen -a https://www.itbasic.de
done

Hier eine kurze Erklärung:
unclutter – lässt den Mauszeiger verschwinden
matchbox-window-manager – sorg für den Kiosk Modus
midori -e Fullscreen -a URL – startet den Browser
xset -dpms und xset s off deaktiviert den Bildschirmschoner
Die while Schleife sorgt dafür, das der Browser bei einem Absturz neu gestartet wird.

Nach einem chmod 755 presentation.sh, lässt sich das ganze dann über xinit /home/pi/presentation.sh starten. Um es wieder zu beenden reicht strg + alt + F1 und im Anschluss strg + c.

Automatischer Start

Ein Eintrag in der /home/pi/.profile reicht nun aus, damit die Präsentation nach dem Systemstart gestartet wird.

Ich habe jedoch das folgende Script in der /home/pi/.profile hinterlegt, welches prüft ob der Raspberry Pi eine IP Adresse über den dhcp Server bekommen hat. Wenn keine IP Adresse vorhanden ist, wird die Präsentation nicht gestartet und dafür ein Hinweis auf der Konsole ausgegeben.

start.sh:
#!/bin/bash
ifconfig | grep 192
if [ $? -eq 0 ]
then
xinit /home/pi/presentation.sh
else
echo "!!! keine Netzwerkverbindung !!!"
echo "Bitte stellen Sie eine Netzwerkverbindung her und"
echo "fuehren Sie xinit /home/pi/presentation.sh aus"
fi

Betriebssystem klonen

Für die zwei weiteren Fernseher muss mein Kollege einen Klone der SD Karte erstellen.
Das ganze lässt sich unter linux über dd einfach realisieren.

1. Image der SD Karte erstellen
dd if=/pfad/zur/sd/karte of=/home/user/sd-image.img
2. SD Karte wechseln und Image auf die neue SD Karte spielen
dd if=/home/user/sd-image.img of=/pfad/zur/sd/karte

Auf diesem Weg lässt sich ein Backup des gesamten System erstellen, hilfreich wenn man des öfteren verschiedene Programm etc ausprobieren möchte.

Hostnamen ändern

Zum Abschluss muss noch der Hostname in der /etc/hostname und /etc/hosts angepasst werden, da sonst der Hostname dreimal im Netzwerk vorhanden ist.

Quellen:
Browser im Kiosk Modus starten: https://github.com/MobilityLab/TransitScreen/wiki/Raspberry-Pi
Autologin:http://elinux.org/RPi_Debian_Auto_Login

[FHEM] mehrere 433 MHz Steckdosen auf einmal schalten

Mittlerweile werden mehrere Steckdosen über den Raspberry Pi geschaltet und die Funksteckdosen lassen sich ohne Probleme einzeln schalten. Alle Steckdosen über einen Taster zu schalten, ist jedoch bei den 433 MHz Steckdosen nicht auf dem Standardweg möglich.

Um die Steckdosen Licht1 und Licht2 über einen Taster (Flur) zu schalten, würde man es normalerweise wie folgt konfigurieren:

define Flur dummy
attr Flur eventMap on:an off:aus
attr Flur devStateIcon an:on:off aus:off:on
attr Flur room Flur
define FlurLichtOn notify Flur:on set Licht1,Licht2 on
define FlurLichtOff notify Flur:off set Licht1,Licht2 off

Leider funktioniert es nicht, denn der 433 MHz Sender ist nicht in der Lage die Schaltsignale gleichzeitig zu senden. Werden die einzelnen Schaltsignale mit einer kleinen Verzögerung gesendet, ist das Schalten über nur einen Taster möglich.

define Flur dummy
attr Flur eventMap on:an off:aus
attr Flur devStateIcon an:on:off aus:off:on
attr Flur room Flur
define FlurLichtOn notify Flur:on set Licht1 on;; sleep 5;; set Licht2 on
define FlurLichtOff notify Flur:off set Licht1 off;; sleep 5;; set Licht2 off

[fhem] Icons nicht klickbar

Als ich die erste Funksteckdose im FHEM angelegt hatte, sah die Konfiguration wie folgt aus:

define Licht_Telefon dummy
attr Licht_Telefon eventMap on:an off:aus
attr Licht_Telefon room Flur

Die Steckdosen werden zur Zeit alle zeitgesteuert geschaltet und somit ist mir erst spät aufgefallen, das die Icons nach einem Update nicht mehr klickbar waren.

Damit die Steckdose wieder über das Icon ein und ausgeschaltet werden können, wird ein weiteres Attribute benötigt:
attr Licht_Telefon devStateIcon an:on:off aus:off:on

Die Werte an:on:off setzen sich wie folgt zusammen

an – Wenn der Status an ist, greifen die nachkommenden Werte
on – legt das zu verwendende Icon fest
off – Status der beim klicken gesetzt wird

Insgesamt sieht es bei mir jetzt so aus

define Licht_Telefon dummy
attr Licht_Telefon eventMap on:an off:aus
attr Licht_Telefon devStateIcon an:on:off aus:off:on
attr Licht_Telefon room Flur

Als ich die Attribute über den eingebauten Editor hinterlegt hatte und speicherte, kam es zu folgender Fehlermeldung:

unknown attribute devStateIcon

Die Zeile selbst war korrekt, denn wenn ich über das Eingabefeld im webfrontend „attr Licht_Telefon devStateIcon an:on:off aus:off:on“ absendete, kam es zu keiner Fehlermeldung und es funktionierte.

Nach einem Neustart des fhem, waren die Icons jedoch klickbar so wie es laut der Konfiguration sein sollte.

Hilfe bei dem Problem bekam ich im übrigen über das FHEM Forum.