Contrôle des GPIOs avec Python

Matériel utilisé dans le cours

Tout se fait depuis la Raspberry Pi en SSH.

PS : Pour trouver votre IP, vous avez whatsmyip, démerdez-vous !
Pour les montages
On va utiliser des breadboard et des câbles Dupont, donc pas besoin de souder.
On travaillera en groupe de 5.
Hésitez pas à nous appeler si ça marche pas !
IMPORTANT !
Un montage, ça se fait raspberry pi débranchée !

Vous avez 5 minutes pour :

Faire un groupe
de 5


Trouver l'IP de
votre pi & installer Python 3.5




Venir chercher
les composants
Présentation des ports GPIO

Un port GPIO c'est quoi ?
Port GPIO = un port physique sous forme de contact métallique qui permet de transmettre un signal électrique.
Un port GPIO transmet un signal relativement binaire (pas de courant ou courant). Il travail en 3.3V et environ 20mA.
C'est un moyen simple de communiquer entre équipements physiques. Très utilisé par les micro-contrôleurs.
Les différents types de protocoles/ports.
Power + : Alimentation électrique continue
GND : Ground = Retour à la terre
I2C : Protocole série synchrone
SPI : Autre protocole série synchrone
UART : Protocole asynchrone + conversion communication série vers parallèle.
GPIO : Port général qui peut éventuellement être transformé en I2C ou SPI.

Utiliser Python pour contrôler les GPIO

La bibliothèque RPi.GPIO
Pour utiliser les ports GPIO de la Raspberry Pi avec Python on utilise la bibliothèque RPi.GPIO.
Vous allez donc devoir installer cette librairie à l'aide de la commande ci-dessous.
sudo pip3 install RPi.GPIOComment sont numérotés les broches GPIO
Sur la Pi il existe deux façon de numéroter les GPIO.
L'ordre logique, que tout le monde devrait utiliser (BOARD).
Et l'ordre tout pourri qu'on a introduit pour casser les co****es (BCM)...
BOARD
Pour "carte", correspond à l'ordre physique des pins métalliques, en partant coté carte SD de gauche à droite.
Pour "Broadcom SoC Channel" (même l'acronyme est pas bon), correspond à la numérotation selon le SoC.
Simple à comprendre, à tester, à visualiser.
Reste valable sur TOUS les modèles de Pi.
On utilisera QUE celui-ci.


BCM
Pas de logique, impossible à comprendre et visualiser.
Pas compatible selon les modèles.
Ne recoupe pas tous les numéros.
Le premier qui l'utilise il prend un 0.
Choisir le mode de numérotation
Au début d'un programme chargé d'utiliser les GPIOs, vous devrez donc préciser à RPi.GPIO le type de numérotation que vous souhaitez employer.
Pour cela, on utilisera la fonction setmode() de la lib GPIO.
GPIO.setmode(GPIO.BOARD)Allumer une LED avec Python

Brancher une LED
Pour faire clignoter une LED en python il faut créer le circuit électronique permettant de la relier à la Raspberry Pi.
Il faut donc comprendre comment fonctionne l'électricité, les LED, et comment appliquer le tout à la Raspberry Pi.

Comment brancher une LED
Quand vous branchez une LED, vous devez TOUJOURS avoir une résistance.
Pourquoi ? Parce-que les LED ont une tension de seuil. En gros, dès qu'il y a un peu de trop de courant, elles crâment !
Où brancher la résistance ?
N'importe où dans le circuit. Avant, après, c'est pareil, la résistance fait baisser l'intensité de TOUT le circuit.
Quelle résistance choisir ?
Ça se calcule ! Pour savoir quelle résistance choisir, il faut connaître la tension de seuil supportée par la LED et son intensité max ainsi que la tension fournie par l'alimentation.
La formule est alors la suivante :
Rmin = (Ualim - Uled) / Imax
Notre circuit
Sera composé de :



Une Raspberry Pi
Une LED
Une résistance
Quelle sera la taille de la résistance ?
La Pi fourni 3.3V en 20mA. La LED fonctionne aussi en 20mA et 1.5 à 1.9V.
La résistance devra au moins faire :
(3.3 - 1.5)/(20/1000) = 90 ohms -> 100 ohms.
On peut prendre plus, genre 300 ohms, comme ça on est large.
Quelle sera la forme de notre circuit ?
On branche l'anode avec un fil rouge à un GPIO (le pin 7), puis on relie la cathode à la résistance et la résistance à un Ground (le pin 6), avec un fil noir.
Pour tout ça, on passe par une breadboard.
(Schéma fait avec Fritzing.)

Notre code
Notre code va faire clignoter la LED.
Concrètement, cela signifie envoyer du courant sur le pin n°7, puis le couper, puis le rallumer, etc.

#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
LED = 7
def turn_high (gpio) :
GPIO.setup(gpio, GPIO.OUT)
GPIO.output(gpio, GPIO.HIGH)
def turn_low (gpio) :
GPIO.setup(gpio, GPIO.OUT)
GPIO.output(gpio, GPIO.LOW)
while True :
turn_high(LED)
time.sleep(2)
turn_low(LED)
time.sleep(2)On stock le numéro du pin sous un nom de variable propre
On définie une fonction qui va allumer une LED.
On définie l'état du pin GPIO comme en mode sortie.
On envoie le courant sur le pin.
On définie une fonction relativement équivalente qui va éteindre la LED.
On allume, on attend 2s, on éteind, on attend 2s, on recommence.
Lire une puce RFID avec Python
Le RFID c'est quoi ?
Le Radio Frequency IDentification est un moyen de récupérer des infos sans contact généralement pour identifier un objet/individu.
Le badge RFID contient une antenne et une puce, tandis que le lecteur contient le récepteur et fourni l'alimentation électrique.
L'échange de données et d'énergie se fait sans fil par radio.
Le matériel
Pour lire un badge RFID nous allons avoir besoin d'un lecteur RFID.
Nous allons utiliser une carte RC522. Elle ne coûte presque rien et est très utilisée, donc bon support logiciel.

Le branchement
la RC522 utilise le protocole SPI, nous allons donc devoir la brancher en partie sur des GPIO SPI.
Par ailleurs, la bibliothèque que nous allons utilisée nous force à utiliser certains GPIO plutôt que d'autres, etc.
Nous n'avons donc pas tellement le choix au niveau des branchements.


Activer SPI
Comme la carte RFID utilise le protocole SPI vous allez devoir l'activer sur la Raspberry Pi.
À vous de vous débrouiller avec raspi-config !
Vous avez littéralement une minute.

La bibliothèque
Contrairement au contrôle classique des GPIO, nous allons utiliser une bibliothèque spécifique pour la RC522.
Il s'agit de la bibliothèque pi-rc522. À vous de l'installer.
Vous avez littéralement une minute.

Le code source
Notre code va faire une boucle qui attendra qu'on scann un tag RFID et qui l'affichera.

#!/usr/bin/env python3.5
# -*- coding: utf-8 -*-
from pirc522 import RFID
import time
rc522 = RFID()
while True :
rc522.wait_for_tag()
(error, tag_type) = rc522.request()
if not error :
(error, uid) = rc522.anticoll()
if not error :
print('UID : {}'.format(uid))
time.sleep(1)
On instancie la lib pour lire la carte RFID.
On fait une boucle infinie.
On attend qu'une puce RFID passe a proximité.
Une fois qu'une puce RFID déclenche, on récupère les infos.
Si on a pas d'erreur, on nettoie les possibles collisions (plusieurs tag RFID en même temps) et on récupère les infos du tag.
Si on a bien nettoyer, on affiche le tag RFID, on attend 1 seconde et on recommence.
Questions ?
Contrôle des GPIOs avec Python
By plebweb
Contrôle des GPIOs avec Python
- 847