Configurer l'accès au GPIO du Raspberry Pi

18 septembre 2015 - Mots-clés : Linux Raspberry Pi

Cet articlé décrit l'utilisation de pigpio sur un Raspberry Pi tournant sous Arch Arm. pigpio permet d'accéder aux entrée/sorties du Raspberry Pi qui se situent sur le connecteur d'extension.

Mes recherches pour pouvoir accéder aux ports GPIO en mode utilisateur (c'est à dire sans passer en mode root) ont été fastidieuses. En effet, la plupart des gens se contente d'exécuter leurs programmes en mode super-utilisateur, ce qui est une aberration.

J'ai exploré la voie du sysfs où j'ai essayé de modifier les propriétés des fichiers du répertoire /sys/class/gpio grâce à des règles udev. Cela m'a mené à une impasse à cause des liens symboliques remontants contenu dans /sys/class/gpio.

Les autre solutions passent par un accès direct à /dev/mem, ce qui mène à une impasse aussi. Une des solutions acceptables serait d'utiliser d'un driver dédié (cf Thèse de VU Nguyen dans les liens en fin d'article).

J'utilise maintenant la librairie pigpio. Elle n'a pas été facile à dégotter tant les fausses pistes furent nombreuses. Elle est bien faite, un module Python est disponible.

Instalation de git, si ce n'est pas déjà fait :

# apt install git

Modification du chemin de recherche des librairies : Modifiez le fichier /etc/ld.so.conf et ajoutez-y la ligne suivante :

/usr/local/lib

Mettez à jour la liste des répertoires des librairies dynamiques :

# ldconfig

Téléchargez pigpio :

$ git clone https://github.com/joan2937/pigpio.git
$ cd pigpio
$ make all
$ su
# make install

Création d'une unité systemd pour le daemon soit lancé au démarrage : Créez le fichier /etc/systemd/system/pigpiod.service contenant les lignes suivantes :

[Unit]
Description=Gpio daemon

[Service]
ExecStart=/usr/local/bin/pigpiod
Type=forking

[Install]
WantedBy=multi-user.target
# systemctl start pigpiod
# systemctl enable pigpiod
# systemctl status pigpiod
* pigpiod.service - pigpio daemon
   Loaded: loaded (/etc/systemd/system/pigpiod.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2015-09-18 19:51:36 CEST; 1min 16s ago
 Main PID: 512 (pigpiod)
   CGroup: /system.slice/pigpiod.service
           `-512 /usr/local/bin/pigpiod

Sep 18 19:51:36 jannequin systemd[1]: Starting Gpio daemon...
Sep 18 19:51:36 jannequin systemd[1]: Started Gpio daemon.

Vérification que ça marche sur le classique exemple de la led clignotante (connectée ici sur le gpio 24 soit la pin 18) :

#!/usr/bin/env python

import time
import pigpio

GPIO_LED = 24

pi = pigpio.pi()

pi.set_mode(GPIO_LED, pigpio.OUTPUT)

while True:

    pi.write(GPIO_LED, 1)
    time.sleep(1)

    pi.write(GPIO_LED, 0)
    time.sleep(1)

pi.stop()