Sur Raspberry Pi, la gestion des entrées/sorties (GPIO) est souvent le premier point de contact avec le monde matériel. Parmi les nombreuses solutions disponibles, pigpio et son démon pigpiod se distinguent par leur précision, leur stabilité et leur polyvalence.
Cet article propose une prise en main progressive de pigpiod, en commençant par des opérations simples de lecture et d’écriture sur les GPIO, avant d’aborder l’utilisation du port série et du bus I²C, afin de fournir une base solide pour des projets matériels fiables et évolutifs.
sudo apt-get update
sudo apt-get install pigpiod pigpio-tools libpigpio-dev
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
systemctl status pigpiod#include <stdio.h>
#include <pigpiod_if2.h>
#define LED_GPIO 20 // GPIO20 (BCM)
int main(void)
{
int pi;
// Connexion au démon pigpiod
pi = pigpio_start(NULL, NULL);
if (pi < 0) {
printf("Erreur : impossible de se connecter à pigpiod\n");
return 1;
}
// Configuration GPIO "LED_GPIO" en sortie
set_mode(pi, LED_GPIO, PI_OUTPUT);
printf("Blink pigpiod sur GPIO %d\n", LED_GPIO);
for (int i = 0 ; i < 10 ; i++) {
gpio_write(pi, LED_GPIO, 1); // LED ON
time_sleep(0.5);
gpio_write(pi, LED_GPIO, 0); // LED OFF
time_sleep(0.5);
}
// Fermeture de la connexion
pigpio_stop(pi);
return 0;
}Important : La variable "pi" représente la connexion au démon. Elle doit être passée en paramètre à toutes les fonctions de l’API.
gcc blink.c -o blink -lpigpiod_if2 -lrt -pthread
./blink
Attention à bien mettre "lpigpiod_if2" et non pas "lpigpiod_if".
Exemple : lecture d’un bouton sur GPIO 26
#include <stdio.h>
#include <pigpiod_if2.h>
#define BUTTON_GPIO 26
#define LED_GPIO 20
int main(void)
{
// Connexion au démon pigpiod
int pi = pigpio_start(NULL, NULL);
if (pi < 0) return 1;
// Configuration GPIO "BUTTON_GPIO" en entrée
set_mode(pi, BUTTON_GPIO, PI_INPUT);
// Configuration GPIO "LED_GPIO" en sortie
set_mode(pi, LED_GPIO, PI_OUTPUT);
// Configure une résistance de pullup interne au Raspberry PI
// Inutile si vous avez une résistance de pullup externe
set_pull_up_down(pi, BUTTON_GPIO, PI_PUD_UP);
printf("Lecture état GPIO %d et recopie sur GPIO %d\n", BUTTON_GPIO, LED_G>
while (1) {
// Lecture bouton
int level = gpio_read(pi, BUTTON_GPIO);
// Recopie sur LED et affichage
gpio_write(pi, LED_GPIO, level);
printf("Bouton : %d\n", level);
time_sleep(0.2);
}
// Fermeture de la connexion
pigpio_stop(pi);
return 0;
}
gcc lecture_gpio.c -o lecture_gpio -lpigpiod_if2 -lrt -pthread
./lecture_gpioPigpio permet de générer des signaux PWM matériels très précis, idéal pour contrôler :
Dans cet exemple nous utiliserons une LED. Le câblage est identique aux précédents : la LED est connecté sur la GPIO 20.
#include <stdio.h>
#include <pigpiod_if2.h>
#define LED 20
int main(void)
{
// Connexion au démon pigpiod
int pi = pigpio_start(NULL, NULL);
if (pi < 0)
{
printf("Erreur : impossible de se connecter à pigpiod\n");
return 1;
}
// Configuration GPIO "LED" en sortie
set_mode(pi, LED, PI_OUTPUT);
// Augmentation progressive de l'intensité dans la LED
for (int duty = 0 ; duty <= 255 ; duty++) {
set_PWM_dutycycle(pi, LED, duty); // Valeur 0-255
time_sleep(0.02);
}
// Ralentir et éteindre
for (int duty = 255; duty >= 0; duty--) {
set_PWM_dutycycle(pi, LED, duty);
time_sleep(0.02);
}
set_PWM_dutycycle(pi, LED, 0);
// Fermeture de la connexion
pigpio_stop(pi);
return 0;
}
Remarque : la PWM matériel fonctionne mieux sur certains GPIO (12, 13, 18, 19 sur Raspberry Pi).