[Tutoriel] Les GPIO du Raspberry Pi

Forum d'échange autour du Raspberry-Pi

[Tutoriel] Les GPIO du Raspberry Pi

Message non lude Laetitia » Ven 1 Juil 2016 15:40

Bonjour,

Aujourd'hui nous allons apprendre à manipuler les GPIO du Raspberry Pi ! C'est en effet via ces pins que nous allons pouvoir faire interagir la carte avec le monde extérieur.

Note : Ce tutoriel est à destination des débutants-mais-pas-trop, qui connaissent déjà Raspbian et l'environnement en ligne de commande ;)

    Comment les désigner ?
Elles peuvent être désignées de plusieurs manières et cela peut parfois être confus lorsque l'on passe d'un tutoriel à un autre, puisque chacun utilise la numérotation qui l'arrange.

  • On peut d'abord les repérer grâce à leur emplacement sur le connecteur, en leur attribuant un numéro en commençant par l'une des pins situées à l'extrémité du connecteur : il s'agit de la pin #1 et toutes celles situées sur sa ligne (13 pour le Raspberry Pi 1, 20 pour les modèles suivants) sont les numéros impairs, dans l'ordre, et en face les numéros pairs en commençant par la #2 en face de la #1.
  • Ensuite vient la numérotation Broadcom, soit celle utilisée par le fabricant du processeur. Il s'agit de celle figurant sur la datasheet du composant, elle est un peu plus exotique que la précédente.
  • Enfin la numérotation utilisée par la bibliothèque WiringPi, différente de la précédente. Notons cependant que la bibliothèque permet avec une simple ligne de code de signifier la numérotation employée dans la suite du script (WiringPi ou Broadcom).
Pour éviter toute confusion, voici le schéma permettant de visualiser la correspondance entre les trois numérotations (les numéros des pins physiques à côté de leur emplacement, les numéros Broadcom repérés par BCM, et enfin les WiringPi) :

rpi_pinout.png
rpi_pinout.png (44.22 Kio) Vu 519 fois

    Comment les piloter ?
Nous avons à notre disposition deux bibliothèques (en réalité il y en a plus que ça mais ce sont les deux plus répandues) : la WiringPi dont je parlais en début de tutoriel, non incluse dans la distribution Raspbian bien que très pratique, et la bibliothèque RPi.GPIO qui, elle, fait partie de la distribution. Je présenterai ici les deux puisque ce sont celles que vous risquez de rencontrer le plus souvent.

      Avec la bibliothèque WiringPi
Pour l'installer il faut rentrer dans le terminal les commandes suivantes :

Code: Tout sélectionner
sudo pip install wiringpi2

Ensuite lancez python depuis le terminal :

Code: Tout sélectionner
sudo python3

Puis lorsque le prompt s'affiche :

Code: Tout sélectionner
import wiringpi

Nous pouvons maintenant exploiter les fonctions de la bibliothèque ! Ces dernières sont plutôt pratiques lorsque l'on connaît l'environnement Arduino, parce qu'elles en sont inspirées : ça évite d'avoir à retenir 15 noms de fonctions différents pour le même usage.

La première, et la plus utile à mon sens, est celle qui permet de choisir en début de script le type de numérotation utilisée. Même si le schéma fourni un peu plus haut permet de passer relativement rapidement de l'un à l'autre, on peut se faciliter la tâche. Ainsi, pour exploiter la numérotation Broadcom, il vous faudra taper :

Code: Tout sélectionner
wiringpi.wiringPiSetupGpio()

Pour utiliser la numérotation WiringPi, remplacez la ligne précédente par :

Code: Tout sélectionner
wiringpi.wiringPiSetup()

Et pour utiliser la numérotation physique :

Code: Tout sélectionner
wiringpi.wiringPiSetupPhys()

Maintenant que nous avons fixé le mode de numérotation des GPIO du Raspberry Pi, nous pouvons préciser le sens de fonctionnement des pins utilisées, grâce à la fonction wiringpi.pinMode(numéro de pin, sens) :

Code: Tout sélectionner
wiringpi.pinMode(4, INPUT) # pin configurée en entrée
wiringpi.pinMode(23, OUTPUT) # pin configurée en sortie

On peut également activer les résistances de tirage ou de rappel sur les pins configurées en entrée : wiringpi.pullUpDnControl(numéro de pin, résistance)

Code: Tout sélectionner
wiringpi.pullUpDnControl(4, PUD_UP) # résistance de tirage
wiringpi.pullUpDnControl(4, PUD_DOWN) # résistance de rappel
wiringpi.pullUpDnControl(4, PUD_OFF) # aucune résistance

Nous pouvons maintenant lire l'état d'une pin configurée en entrée grâce à wiringpi.digitalRead(numéro de pin) :

Code: Tout sélectionner
var = wiringpi.digitalRead(4)

Nous pouvons également piloter l'état d'une sortie grâce à wiringpi.digitalWrite(numéro de pin, état) :

Code: Tout sélectionner
wiringpi.digitalWrite(23, HIGH) # mise à l'état haut
wiringpi.digitalWrite(23, LOW) # mise à l'état bas


      Avec la bibliothèque Rpi.GPIO
Lancer python depuis le terminal :

Code: Tout sélectionner
sudo python3

Puis taper lorsque le prompt s'affiche :

Code: Tout sélectionner
import RPi.GPIO as GPIO

Si un message d'erreur s'affiche, c'est que la bibliothèque n'est pas correctement installée. Revenez dans le terminal et tapez les commandes suivantes:

Code: Tout sélectionner
sudo apt-get update
sudo apt-get install python3-rpi.gpio

Nous pouvons maintenant exploiter les fonctions de la bibliothèque !

La première, et la plus utile à mon sens, est GPIO.setMode(mode), permettant de choisir en début de script le type de numérotation utilisée. Même si le schéma fourni un peu plus haut permet de passer relativement rapidement de l'un à l'autre, on peut se faciliter la tâche. Ainsi, pour exploiter la numérotation Broadcom, il vous faudra taper :

Code: Tout sélectionner
GPIO.setMode(GPIO.BCM)

Pour utiliser la numérotation RPi.GPIO, remplacez la ligne précédente par :

Code: Tout sélectionner
GPIO.setMode(GPIO.BOARD)

Maintenant que nous avons fixé le mode de numérotation des GPIO du Raspberry Pi, nous pouvons préciser le sens de fonctionnement des pins utilisées, grâce à la fonction GPIO.setup(numéro de pin, sens) :

Code: Tout sélectionner
GPIO.setup(4, GPIO.IN) # pin configurée en entrée
GPIO.setup(23, GPIO.OUT) # pin configurée en sortie

Il existe deux variantes de cette fonction.

  • La première permet d'activer les résistances de tirage ou de rappel sur les pins configurées en entrée : GPIO.setup(numéro de pin, sens, résistances)

    Code: Tout sélectionner
    GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) # résistance de tirage
    GPIO.setup(4, GPIO.IN, GPIO.PUD_DOWN) # résistance de tirage

  • La seconde permet de fixer l'état initial des pins configurées en sortie: GPIO.setup(numéro de pin, sens, état initial)

    Code: Tout sélectionner
    GPIO.setup(23, GPIO.OUT, GPIO.HIGH) # mise à l'état haut
    GPIO.setup(23, GPIO.OUT, GPIO.LOW) # mise à l'état bas
Nous pouvons maintenant lire l'état d'une pin configurée en entrée grâce à GPIO.input(numéro de pin) :

Code: Tout sélectionner
var = GPIO.input(4)

Nous pouvons également piloter l'état d'une sortie grâce à GPIO.output(numéro de pin, état) :

Code: Tout sélectionner
GPIO.OUTPUT(23, GPIO.HIGH) # mise à l'état haut
GPIO.OUTPUT(23, GPIO.LOW) # mise à l'état bas

Autre fonction utile si vous ne voulez pas avoir à constamment surveiller une pin configurée en entrée, la fonction GPIO.add_event_detect(numéro de pin, type), elle permet de détecter automatiquement un changement d'état sur une pin :

Code: Tout sélectionner
GPIO.add_event_detect(4, GPIO.RISING) # détection de front montant
GPIO.add_event_detect(4, GPIO.FALLING) # détection de front descendant
GPIO.add_event_detect(4, GPIO.BOTH) # n'importe quel changement d'état

Une fois la détection activée, vous pouvez exploiter le changement d'état avec la fonction GPIO.event_detected(numéro de pin) à l'intérieur d'une structure conditionnelle comme if...elif...else :

Code: Tout sélectionner
if GPIO.event_detected(4) :
   # bloc à exécuter
   # en cas de détection
# Instructions suivantes exécutées dans tous les cas

Lorsque vous avez fini de surveiller l'entrée, vous pouvez utiliser la fonction GPIO.remove_event_detect(numéro de pin) :

Code: Tout sélectionner
GPIO.remove_event_detect(4)

Une petite dernière pour la route, qui permet, comme son nom l'indique, de réinitialiser toutes les entrées/sorties préalablement définies :

Code: Tout sélectionner
GPIO.cleanup()

Les pins reviennent à leur état par défaut, c'est-à-dire des entrées sans résistance de tirage/rappel et sans détection de changement d'état.


Voilà, il s'agissait d'un aperçu des commandes de base pour interagir avec les GPIO, il existe évidemment bien plus de fonctions dans les bibliothèques WiringPi et RPi.GPIO que celles listées ici, je vous invite à parcourir leurs documentations respectives pour avoir un aperçu des fonctionnalités disponibles.


Sources : Documentation GPIO officielle Raspberry Pi | Raspberry Pi : Prise en main et premières réalisations, C.Tavernier | Carte interactive, gadgetoid | WiringPi | WiringPi-Python |
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Retourner vers Raspberry-Pi

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité