RPI GPIO & Python

nous allons aborder ici les bases de l’utilisation des entrées sorties du RPI avec Python sous thonny Python par exemple.

PERMISSIONS:

pour utiliser les GPIO en Python sur un raspberry Pi , il faut etre membre du groupe GPIO . l’utilisateur PI est membre par defaut , par contre , tout autre utilisateur doit etre déclaré manuellement:

sudo usermod -a -G gpio <username>

LES BIBLIOTHEQUES pour la gestion du GPIO:

il existe beaucoup de bibliotheques python pour le raspberry PI , les plus courantes pour la gestion GPIO sont les bibliotheques “RPi.GPIO” et “gpiozero” .

nous allons dans un premier temps explorer les modalité de fonctionnement avec la bibliotheque RPI.GPIO.

CONFIGURATION GENERALE:

le raspberry Pi utilise 2 numerotations , celle du connecteur 40 broches et celle liée a la numerotation de la puce (GPIO.BCM). suivant la numerotation choisie il faudra éventuellement adapter le mode avec les commandes python suivantes:

GPIO.setmode(GPIO.BOARD)

ou

GPIO.setmode(GPIO.BCM)

CONFIGURATION DES ENTREES/SORTIES:

pour initialiser les entrées-sorties , il faut préciser son numero en fonction de la configuration générale choisie et son paramétrage (entrée ou sortie) et peut etre son etat initial si nécessaire . ci dessous 3 exemples de bases:

GPIO.setup(14, GPIO.IN)

GPIO.setup(13, GPIO.OUT)

GPIO.setup(13, GPIO.OUT, initial=GPIO.HIGH)

LIRE UNE ENTREE:

pour recuperer l’etat d’entrée d’une broche , la commande est simple:

GPIO.input(12)

CHANGER L’ETAT D’UNE SORTIE:

GPIO.output(12, GPIO.LOW)

LE PWM:

le PWM fonctionne comme un objet sous python , il faut donc créer une instance avec le canal utilisé et la frequence souhaitée. ci dessous un exemple:

p = GPIO.PWM(channel, frequence)
p.start(rapport_cyclique) #rapport_cyclique entre 0.0 et 100.0
p.ChangeFrequency(nouvelle_frequence)
p.ChangeDutyCycle(nouveau_rapport_cyclique)
p.stop()

regardons maintenant quelques exemples avec la bibliotheque GPIOzero:

PREMIER EXEMPLE SIMPLE , la LED :

pour cet exemple nous allons utiliser la librairie GPIO zero. tous les détails de cette librairie sont disponible ici ( en anglais uniquement malheureusement):

https://gpiozero.readthedocs.io/en/stable/

petit avantage de la gestion GPIO sous Python du RPI par rapport a l’arduino, beaucoup de librairies spécifiques existent pour tous les composants basiques ou plus evolués , par exemple pour gérer l’allumage et l’extinction d’une led , on utilise une librairie , exemple ci dessous ( on fait clignoter une LED a frequence d’une seconde):

NOTA: pour l’utilisation de LEd sur RPI , avec une tension de sortie GPIO a 3,3 V , les resistance standard de 220 Ohms pour du 5V passent a 180 Ohms pour du 3,3V (165 Ohms en calcul theorique pour un courant a 20 mA).

from gpiozero import LED
from time import sleep

led = LED(17)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

DEUXIEME EXEMPLE , le Bouton :

après avoir testé la commande d’une “sortie” , deuxieme cas simple , une entrée avec la réception d’un appui bouton:

ici , comme avec la LED , on branche le bouton entre la masse et la broche GPIO 2 et suivant la situation du bouton un message est affiché dans la zone de message en bas de l’IDE Thonny Python.

from gpiozero import Button
from time import sleep

button = Button(2)

while True:
    if button.is_pressed:
        print("Pressed")
    else:
        print("Released")
    sleep(1)

TROISIEME EXEMPLE , Bouton + LED:

ici on combine les 2 exemples précédents. après appui sur le bouton , la led s’allume.

from gpiozero import LED, Button

led = LED(17)
button = Button(2)

while True:
    if button.is_pressed:
        led.on()
    else:
        led.off()

COMMANDE de la PI camera avec un Bouton

dans cet exemple , nous allons déclencher la prise d’une image par la PIcamera ( voir rubrique TUTO et généralités pour la PIcamera). le branchement sera le même que pour le bouton seul sans PIcam car rien a rajouter:

et le programme tres simple également:
from gpiozero import Button
from picamera import PiCamera
from datetime import datetime
from signal import pause

button = Button(2)
camera = PiCamera()

def capture():
    timestamp = datetime.now().isoformat()
    camera.capture('/home/pi/%s.jpg' % timestamp)

button.when_pressed = capture

pause()

COMMANDE de la PI camera avec deux Boutons

variante du programme précédent avec 2 boutons qui vont pour l’un commander le start and stop de la camera et l’autre la prise d’une image .le deuxieme bouton est branché sur le GPIO 3.

from gpiozero import Button
from picamera import PiCamera
from datetime import datetime
from signal import pause

left_button = Button(2)
right_button = Button(3)
camera = PiCamera()

def capture():
    timestamp = datetime.now().isoformat()
    camera.capture('/home/pi/%s.jpg' % timestamp)

left_button.when_pressed = camera.start_preview
left_button.when_released = camera.stop_preview
right_button.when_pressed = capture

pause()

de la même façon, on pourrait remplacer le bouton par un détecteur de présence infrarouge ou une barrière lumineuse avec détecteur de luminosité pour détecter le passage dans le faisceau et ainsi déclencher la prise de vue.