(siehe: Setup des RPi)
(siehe: Anschlüsse des RPi)
In dem Beitrag Sensoren und Aktoren mit Raspberry Pi wurde
der RPi schon mit der Außenwelt verbunden. Allerdings wurde hier auch mit der Skript-Sprache
Python programmiert. Aus der Arduino-Welt ist man C bzw. C++ gewohnt und durch eine zusätzliche
Software-Library ist es auch möglich die GPIOs mit C anzusprechen.
Dazu wird die WiringPi-Library verwendet,
die schon vorinstalliert sein sollten, wenn man das Betriebssystem Raspbian verwendet.
Die LED wird mit einem 470Ω-Vorwiderstand an den Pin #7 (=GPIO4) -wie im folgenden Bild gezeigt- verkabelt.
Es wird lediglich die WiringPi-Library
eingebunden und in main()
wird dann ein dem Arduino-Sketch sehr ähnlicher Code verwendet,
um die LED im Sekundentakt zum Blinken zu bekommen.
#include <wiringPi.h>
#define PIN_LED 7
int main() {
if(wiringPiSetup() == -1) {
return 1;
}
pinMode(PIN_LED, OUTPUT);
while(1) {
delay(1000);
digitalWrite(PIN_LED, 0);
delay(1000);
digitalWrite(PIN_LED, 1);
}
return 0;
}
Dieses C-Programm wird in einer Datei (z.B. blink.c) abgespeichert. Nun muss eine
ausführbare Datei daraus kompiliert werden:
gcc -Wall -o blink blink.c -lwiringPi
Nun kann man die Datei ausführen mit:
./blink
Durch das while(1)
wird ein endloser Loop erstellt, den man nur durch einen Abbruch
des Programms mit Ctrl-C beenden kann. Bei diesem Programm wird jedoch kein Handling im Falle
eines unerwarteten Programmabbruchs vorgenommen, d.h. die LED bleibt in dem Zustand, den sie beim
Programmende hatte.
Der Aufbau bleibt derselbe wie im ersten Versuch, nur wird dieses Mal zusätzlich die Software PWM Library verwendet.
#include <wiringPi.h>
#include <softPwm.h>
#define PIN_LED 7
int main() {
if(wiringPiSetup() == -1) {
return 1;
}
softPwmCreate (PIN_LED, 0, 100);
for(int i=0; i<=100; i++) {
softPwmWrite (PIN_LED, i);
delay(50);
}
for(int i=100; i>=0; i--) {
softPwmWrite (PIN_LED, i);
delay(50);
}
return 0;
}
Nach dem Kompilieren des Programms analog zum ersten Versuch wird die LED dieses Mal langsam anfangen zu leuchten und dann wieder langsam erlöschen.
Für dieses Setup benutzen wird den Aufbau von "Ausschalter für Raspberry Pi", wobei der Button hier am GPIO2 befestigt wird.
#include <stdio.h>
#include <wiringPi.h>
#define PIN_BUTTON 2
int main() {
wiringPiSetupGpio();
pinMode (PIN_BUTTON, INPUT);
pullUpDnControl(PIN_BUTTON, PUD_UP);
while(1) {
if (digitalRead(PIN_BUTTON) == LOW) {
printf("Button pressed\n");
delay(200);
}
delay(1);
}
return 0;
}
Nach dem Kompilieren wird eine Ausgabe in der Shell angezeigt, jedesmal, wenn der Button gedrückt wird.
wiringPi ist schon etwas älter und es wird sogar vom Autor empfohlen, für neue Projekte andere Libraries zu benutzen. Hier wäre z.B. pigpio (Repository: github.com/joan2937/pigpio) zu nennen.
Um pigpio auf dem Raspberry Pi zu nutzen zu können wird die Library folgendermaßen installiert:
wget https://github.com/joan2937/pigpio/archive/master.zip
unzip master.zip
cd pigpio-master
make
sudo make install
(Der make-Vorgang kann einige Minuten dauern!)
Es wird wieder der Aufbau vom ersten Versuch verwendet. Dieses Mal muss im Code jedoch darauf geachtet werden, dass die GPIO-Nummer und nicht die Pin-Nummer verwendet wird.
#include <pigpio.h>
#include <unistd.h>
#define PIN_LED 4
int main() {
if (gpioInitialise()<0) {
return 1;
}
gpioSetMode(PIN_LED, PI_OUTPUT);
int secs=10;
while(secs > 0) {
gpioWrite(PIN_LED, 1);
sleep(1);
gpioWrite(PIN_LED, 0);
sleep(1);
secs-=2;
}
gpioTerminate();
}
Wenn der Code in der Datei blink.c abgespeichert wurde, dann kann man ihn kompilieren mit:
gcc -o blink blink.c -lpigpio -lrt -lpthread
und dann ausführen mit:
sudo ./blink
Eine ausführliche Referenz über die Möglichkeiten von pigpio ist unter http://abyz.me.uk/rpi/pigpio/cif.html zu finden.
zurück