PIR Sensor

Da ich möchte, dass meine Hausautomatisierung in der Lage ist meinen Tagesablauf zu erlernen benötigt der Raspberry Pi ein paar Sensoren. Für den Anfang beginne ich mit einem PIR (passiver IR) Sensor.
Der Fritzing Screenshot unten zeigt wie der Sensor mit dem Cobbler verbunden wird. Im Prinzip wird das rote Kabel mit 5V0, das schwarze Kabel mit GND und das gelbe Kabel mit dem GPIO Pin 25 verbunden.
PIR Fritzing

Für einen ersten Test habe ich den folgenden Befehl von der Kommando Zeile aus ausgeführt.

 while true; do gpio read 6; done
 

Der Befehl gibt eine 0 aus, wenn der PIR nicht ausgelöst wurde und eine 1, wenn der PIR ausgelöst wurde.

Im nächsten Schritt habe ich die gleiche Funktionalität in einem einfachen perl Skript unter Verwendung des wiringPi-Perl Framework implementiert.

 #!/usr/local/bin/perl -w

use lib "/appco.de/WiringPi-Perl";

require "wiringpi.pm";

if (wiringpic::wiringPiSetup () == -1)
 { exit 0};

# set pin #6 (marked with #25 on the T-Cobbler) to mode INPUT
 wiringpic::pinMode (6, 0);

while (1){
 # read from PIR

# PIR not triggered
 if (wiringpic::digitalRead (6) == 0){
 print ("off \n");
 wiringpic::delay (500); # milliseconds
 }

# PIR triggered
 if (wiringpic::digitalRead (6) == 1){
 print ("on \n");
 wiringpic::delay (500); # milliseconds
 }
 }
 

Dieser Quellcode schreibt „off“ auf die Standard Ausgabe, wenn der PIR nicht ausgelöst wurde und „on“, wenn er ausgelöst wurde. Das Skript läuft bis er mit ctrl+c abgebrochen wird.

Blinkende LED mit WiringPi-Perl

Ich habe das Skript „Installation von GPIO“ von gestern überarbeitet, es nutzt jetzt das WiringPi-Perl Framework.

 #!/usr/local/bin/perl -w

use lib "/appco.de/WiringPi-Perl";

require "wiringpi.pm";

if (wiringpic::wiringPiSetup () == -1)
 { exit 0};

# set pin #0 (marked with #17 on the T-Cobbler) to mode OUTPUT
 wiringpic::pinMode (0, 1);

while (1){
 # LED off
 wiringpic::digitalWrite (0, 0);
 wiringpic::delay (500); # milliseconds

# LED on
 wiringpic::digitalWrite (0, 1);
 wiringpic::delay (500); # milliseconds
 }
 

Während des Programmierens fand ich eine gute Übersicht der Funktionen im Framework in der Datei ../WiringPi-Perl/wiringpi.pm.

package wiringpi;

*wiringPiSetup = *wiringpic::wiringPiSetup;
*wiringPiSetupSys = *wiringpic::wiringPiSetupSys;
*wiringPiSetupGpio = *wiringpic::wiringPiSetupGpio;
*wiringPiGpioMode = *wiringpic::wiringPiGpioMode;
*pullUpDnControl = *wiringpic::pullUpDnControl;
*pinMode = *wiringpic::pinMode;
*digitalWrite = *wiringpic::digitalWrite;
*pwmWrite = *wiringpic::pwmWrite;
*digitalRead = *wiringpic::digitalRead;
*shiftOut = *wiringpic::shiftOut;
*shiftIn = *wiringpic::shiftIn;
*delay = *wiringpic::delay;
*delayMicroseconds = *wiringpic::delayMicroseconds;
*millis = *wiringpic::millis;
*serialOpen = *wiringpic::serialOpen;
*serialClose = *wiringpic::serialClose;
*serialPutchar = *wiringpic::serialPutchar;
*serialPuts = *wiringpic::serialPuts;
*serialDataAvail = *wiringpic::serialDataAvail;
*serialGetchar = *wiringpic::serialGetchar;
*serialPrintf = *wiringpic::serialPrintf;

WiringPi-Perl

Bei der Kompilierung von WiringPi-Perl traten bei mir einige Probleme auf, hier eine kurze Beschreibung wie es bei mir letztendlich funktioniert hat:

Zunächst den Quellcode von GitHub herunter laden:
git clone git://github.com/WiringPi/WiringPi-Perl.git

Dies erzeugt ein Verzeichnis mit dem Namen:
WiringPi-Perl

Als ich dann versuchte WiringPi-Perl mit dem Skript
./build.sh
zu kompilieren traten ein paar Fehler auf.

Zunächst musste der Verweis zur perl Bibliothek von
/usr/lib/perl/5.10.1/CORE
zu
/usr/lib/perl/5.14.2/CORE modifiziert werden.

Zusätzlich war das Unterverzeichnis WiringPi leer, um dies zu beheben habe ich lediglich den Quellcode für WiringPi in dieses Verzeichnis herunter geladen.
git clone git://github.com/WiringPi/WiringPi.git

Der letzte verbleibende Fehler war ein fehlende Datei: WiringPi/wiringPi/serial.h
Als ich das entsprechende Verzeichnis überprüfte fand ich eine Datei: wiringSerial.h.
Also erzeugte ich mein eigenes serial.h mit dem Befehl cp wiringSerial.h serial.h

Mit diesen Anpassungen lief die Kompilierung ohne weitere Probleme.

GPIO Pin Zuordnung

Auf der Suche nach einer einfachen Lösung um die Raspberry PI GPIO Pins direkt aus perl heraus anzusprechen fand ich das wiringPi Framework von Gordon, für das Gadgetoid einen perl Wrapper wiringPi-Perl erstellt hat. Gordon hat auch eine sehr nützliche PIN Zuordnung erstellt, die ich als Vorlage für die unten gezeigte Tabelle diente. Ich habe sie lediglich um eine Zuordnung der Adafruit T-Cobbler Pins ergänzt.
PIN Mapping