Raspberry Pi mit C programmieren

(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.

Verwendete Bauteile

GPIO-Anschlüsse

Anschlüsse des Raspberry Pi 3+
Abb.: Anschlüsse des Raspberry Pi 3+

Programm I. - Einfacher LED-Blinker

Schaltungsaufbau

Die LED wird mit einem 470Ω-Vorwiderstand an den Pin #7 (=GPIO4) -wie im folgenden Bild gezeigt- verkabelt.

Schaltungsaufbau für LED-Blinker

Code

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.

Programm II. - LED faden mit PWM

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.

Programm III. - Digitale Eingabe

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.

Alternative Library

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!)

Einfacher LED-Blinker

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