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;

Installation von GPIO

Um auf dem Raspberry Pi innerhalb von Perl GPIO benutzen zu können sind die folgenden Installationen notwendig:

  1. die C library für Broadcom BCM 2835 von http://www.open.com.au/mikem/bcm2835
  2. die BCM2835 perl library von CPAN http://search.cpan.org/~mikem/Device-BCM2835/lib/Device/BCM2835.pm

Folgende Schritte sind für die Installation der C library von Broadcom BCM 2835 durchzuführen:

 wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.17.tar.gz
 tar zxvf bcm2835-1.17.tar.gz
 cd bcm2835-1.17
 ./configure
 make
 sudo make test
 sudo make install
 

Für die BCM 2835 perl library sind die folgenden Schritte zu befolgen:

 wget http://search.cpan.org/CPAN/authors/id/M/MI/MIKEM/Device-BCM2835-1.6.tar.gz
 tar –xvfz Device-BCM2835-1.6.tar.gz
 perl Makefile.PL
 make
 sudo make test
 sudo make install
 

Die korrekte Funktion lässt sich mit der im Folgenden dargestellten Teststellung überprüfen.

Blink LED Breadboard

Blink LED Schaltplan

Sehr gute Dienste leistet hier das Beispiel Skript von http://elinux.org/RPi_Low-level_peripherals#GPIO_Driving_Example_.28Perl.29

 #!/usr/bin/perl

use Device::BCM2835;
 use strict;

# call set_debug(1) to do a non-destructive test on non-RPi hardware
 #Device::BCM2835::set_debug(1);
 Device::BCM2835::init()
 || die "Could not init library";

# Blink pin 11:
 # Set RPi pin 11 to be an output
 Device::BCM2835::gpio_fsel(&Device::BCM2835::RPI_GPIO_P1_11,
 &Device::BCM2835::BCM2835_GPIO_FSEL_OUTP);

while (1){
 # Turn it on
 Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_11, 1);
 Device::BCM2835::delay(500); # Milliseconds
 # Turn it off
 Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_11, 0);
 Device::BCM2835::delay(500); # Milliseconds
 }
 

Das Skript macht nichts anderes als die LED jeweils für 500 Millisekunden an beziehungsweise auszuschalten und läuft bis es durch die Eingabe von ctrl+c abgebrochen wird.

Blink LED Wiring