PiFace, Softpwm i WiringPi

Biblioteki WiringPi mają wbudowaną obsługę PiFaceDigital, dlatego w łatwy sposób można obsłużyć te rozszerzenie do Raspberry. Niestety szybkie wysyłanie danych przez SPI mocno obciąża procesor, dlatego nie polecam załączać więcej niż 2 soft PWM. Aby uruchomić PiFace za pomocą WiringPi wystarczy wpisać:

wiringPiSetupSys () ;
piFaceSetup (200) ;

Gdzie 200 oznacza port wyjściowy o numerze 0. Następnie należy nasz plik skompilować przy użyciu komendy:

cc -o wyk pwm.c -lwiringPi -lpthread -lwiringPiDev

i uruchomić program za pomocą:

sudo ./wyk

Program powinien zadeklarować piny 0,1,4,5,6,7 jako wyjścia, a piny 2 i 3 jako SoftPwm.

Działający program pwm.c można zobaczyć poniżej:

#include <wiringPi.h>
#include <softPwm.h>
 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <piFace.h>
 
#define PIFACE_BASE 200
 
int main (void)
{
int i, j,pin ;
 
printf ("Raspberry Pi PiFace + PWM test program\n") ;
 
wiringPiSetupSys () ;
piFaceSetup (PIFACE_BASE) ;
 
pullUpDnControl (PIFACE_BASE + 0, PUD_UP) ;
digitalWrite    (PIFACE_BASE + 0, 0) ;
pullUpDnControl (PIFACE_BASE + 1, PUD_UP) ;
digitalWrite    (PIFACE_BASE + 1, 0) ;
pullUpDnControl (PIFACE_BASE + 4, PUD_UP) ;
digitalWrite    (PIFACE_BASE + 4, 0) ;
pullUpDnControl (PIFACE_BASE + 5, PUD_UP) ;
digitalWrite    (PIFACE_BASE + 5, 0) ;
pullUpDnControl (PIFACE_BASE + 6, PUD_UP) ;
digitalWrite    (PIFACE_BASE + 6, 0) ;
pullUpDnControl (PIFACE_BASE + 7, PUD_UP) ;
digitalWrite    (PIFACE_BASE + 7, 0) ;
 
softPwmCreate (PIFACE_BASE+2, 0, 100) ;
softPwmCreate (PIFACE_BASE+3, 0, 100) ;
for (;;)
{
 digitalWrite    (PIFACE_BASE + 0, 0) ;
 digitalWrite    (PIFACE_BASE + 1, 0) ;
 
 softPwmWrite (PIFACE_BASE+2, 50) ;
 softPwmWrite (PIFACE_BASE+3, 50) ;
 
 digitalWrite    (PIFACE_BASE + 4, 0) ;
 digitalWrite    (PIFACE_BASE + 5, 0) ;
 digitalWrite    (PIFACE_BASE + 6, 0) ;
 digitalWrite    (PIFACE_BASE + 7, 0) ;
 delay(200);
 
 digitalWrite    (PIFACE_BASE + 0, 1) ;
 digitalWrite    (PIFACE_BASE + 1, 1) ;
 digitalWrite    (PIFACE_BASE + 4, 1) ;
 digitalWrite    (PIFACE_BASE + 5, 1) ;
 digitalWrite    (PIFACE_BASE + 6, 1) ;
 digitalWrite    (PIFACE_BASE + 7, 1) ;
}
return 0 ;
}