Activité 1
Allumer une LED en Python
Lancer un terminal. 
Commande basique du terminal :
pwd : pour avoir le chemin courant
ls -a ou ll : liste les fichiers présent dans le répertoire courant
cd : se déplacer dans l'arborescence
cd .. : attention bien taper cd (espace) (point) (point) permet de remonter dans l'arborescence
cd xxx : xxx est le nom du répertoire à atteindre
mkdir xx : crée un répertoire xx
touch xx : crée un fichier vide du nom de votre choix xx
Plus de commandes linux ici
Placez-vous dans /home/pi/travailNomGroupe, si le répertoire n'existe pas créer le avec la commande suivante.
mkdir travailNomGroupe
remplacer travailNomGroupe par votre binôme
puis déplacez vous dans ce répertoire
cd travailNomGroupe
Créer un fichier vide avec la commande suivante :
touch exo1.py
Ouvrir le fichier avec un éditeur de texte.
CR1: Faire une capture d'écran du système de fichier
Cablâge (interdiction de câbler sans avoir débrancher le raspberry):


Calcul de la résistance à utiliser ntrôler la LED avec Python 3 sur Raspberry Pi OS
Pour câbler le circuit :
- Connecter un fil entre la masse (Ground ou GND) du raspberry pi et la ligne bleu du breadboard.
- Prenez le LED et vérifier les 2 pattes. La patte la moins longue est la borne négative que vous placerez à l'aide d'un cable dans la ligne bleu. Et la patte plus longue sera placer de l'autre coté du connecteur. Vous pouvez brancher dirtectemetn cette patte plus courte sur la ligne bleu du breadboard si vous le voulez ou ajouter un cable pour le faire.
- Brancher une des pattes de la résistance (peu importe lequel) sur la même ligne que la patte la plus longue de la LED, et l'autre patte de la résistance sur une autre ligne.
- POur finaliser le branchement, brancher un câble entre la patte non connectée de la résistance et la sortie GPIO17 (voir ici pour le schéma de câblage). C'est la 6ème patte du connecteur GPIO, qui commence à gauche sur la ligne du bas.
Contrôler la LED avec Python 3 sur Raspberry Pi OS
Maintenant que tout (matériel + logiciel) est correctement configuré, vous pouvez commencer à contrôler la LED sur Raspberry Pi avec Python3.
Ouvrez Thonny IDE sur Raspberry Pi OS (Menu > Programmation > Thonny Python IDE) ou tout autre IDE/éditeur de texte que vous aimez.
Contrôle simple de la LED
Écrivons un programme minimal pour simplement allumer et éteindre la LED.
import RPi.GPIO as GPIO
import time
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW)
GPIO.cleanup()
Ce programme allumera la LED pendant une seconde, puis l'éteindra. Décomposons le programme ligne par ligne.
import RPi.GPIO as GPIO
import time
Tout d'abord, nous importons le module Python RPi.GPIO qui nous permettra de contrôler tous les GPIO à partir de l'en-tête GPIO du Raspberry Pi. Vous verrez que ce module est assez simple à utiliser.
Nous importons également le module de temps que nous utiliserons plus tard pour attendre 1 seconde.
LED_PIN = 17
Pour coder plus proprement, nous créons une variable globale « constante » contenant le numéro GPIO de la LED. Cela vous permettra d'utiliser directement le nom de la variable au lieu du numéro. Vous ferez moins d'erreurs, et à l'avenir si vous souhaitez changer le GPIO de la LED, il vous suffira de mettre à jour cette variable.
GPIO.setmode(GPIO.BCM)
Cette ligne doit être la première ligne que vous exécutez avec le module RPi.GPIO. Cela vous permettra d'utiliser les numéros GPIO au lieu des numéros de broche "standard".

----------------------------------------------------------------------------------------------------------------------------
En résumé :
GPIO.setmode(GPIO.BOARD)
Cette ligne indique le numéro de pin en gris.
Par exemple, vous pouvez voir ici que la broche numéro 17 est une broche d'alimentation 3,3 V.
GPIO.setmode(GPIO.BCM)
Cette ligne indique le numéro de pin en GPIOxx.
Par exemple, vous pouvez voir ici que GPIO 17 correspond à la broche numéro 11.
----------------------------------------------------------------------------------------------------------------------------
GPIO.setup(LED_PIN, GPIO.OUT)
OK, nous pouvons maintenant commencer à configurer le GPIO pour la LED. Nous devons utiliser la fonction GPIO.setup() et fournir le mode du GPIO : soit GPIO.OUT pour la sortie, soit GPIO.IN pour l'entrée. Comme nous voulons dire à la LED quoi faire, au lieu de lire son état, nous devons utiliser GPIO.OUT.
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW)
Toute la configuration est terminée, nous pouvons allumer/éteindre la LED. Pour ce faire, il vous suffit d'utiliser une simple commande : GPIO.output(), avec soit GPIO.HIGH pour allumer la LED, soit GPIO.LOW pour éteindre la LED.
GPIO.cleanup()
Et nous terminons le programme en nettoyant les GPIO, avec GPIO.cleanup(). Cette ligne est super importante. Elle réinitialisera tous les états et modes de tous les GPIO, ce qui peut vous éviter d'avoir des erreurs dans les futurs programmes. Ou pire encore, faites frire votre Raspberry Pi (si maintenant vous mettez un bouton-poussoir dans GPIO 17 et essayez de lire à partir de celui-ci, et que le GPIO n'a pas été nettoyé, alors vous aurez un problème).
Remarque : ici, l'écriture de GPIO.output(LED_PIN, GPIO.LOW) n'était pas obligatoire car GPIO.cleanup() le fera automatiquement.
CR2: A quoi sert une variable globale ? sur quelle patte est bracnhée la LED ? quel est l'équivalent de GPIO.setup en arduino ? et GPIO.output ? Quel résultat obtenez-vous ?
Faire clignoter la LED
Améliorons le programme en faisant clignoter la LED indéfiniment.
import RPi.GPIO as GPIO
import time
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
while True:
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW)
time.sleep(1)
GPIO.cleanup()
Nous allons alterner simplement entre GPIO.HIGH et GPIO.LOW chaque seconde, à l'intérieur d'une boucle infinie. Cet exemple est le même que l'exemple Blink LED que vous pouvez trouver avec Arduino.
Maintenant, ce programme fonctionne mais il y a un petit problème que nous devons résoudre.
Quel est ce problème ?
Eh bien, lorsque vous exécutez le programme, vous pouvez voir qu'il ne se ferme pas tout seul - à cause de la boucle infinie. Ainsi, vous devez arrêter/tuer le programme vous-même, soit en cliquant sur le bouton « arrêter » sur Thonny IDE, soit en appuyant sur CTRL+C dans le panneau du shell (également si vous avez exécuté le programme Python directement depuis le terminal).
Et, lorsque vous tuez le programme, la ligne GPIO.cleanup() n'aura pas la chance d'être exécutée. Ainsi, le GPIO 17 ne sera pas réinitialisé et nettoyé.
Si vous redémarrez le programme après l'avoir tué, cela fonctionne toujours bien et il n'y a aucun risque pour votre Raspberry Pi (car vous utilisez le GPIO dans le même but), mais vous obtiendrez cet avertissement :
RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(LED_PIN, GPIO.OUT)
Ainsi, comme suggéré, vous pouvez utiliser GPIO.setwarnings(False) au début de votre programme afin que vous n'ayez plus l'avertissement.
Mais ce n'est pas une vraie solution à notre problème.
Assurez-vous que la LED GPIO est nettoyée à chaque fois
Pour être sûr que le GPIO LED (et tous les autres GPIO) est nettoyé à chaque fois que nous tuons/killer le programme Python, nous utiliserons une structure try/catch, pour pouvoir "attraper" le CTRL+C, donc nous pouvons faire une action juste avant la fin du programme.
Mais avant de l'utiliser dans le programme avec nos LED, voyons un usage concret de cette fonction :
Lorsque l'on utilise une division par zéro, le nombre obtenu tend vers l'infini, en informatique, nous constatons une erreur :
Programme Python a tester :
a = 15.0
b = 0
result = a / b
print(result)
CR3. Lancer le programme et indiquez le résultat obtenu dans le compte rendu. Est-ce que c'est normal ?
On peut maintenant essayer d'améliorer le programme en vérifiant que la valeur divisée n'est pas égale à zéro.
Programme Python a tester :
a = 15.0
b = 0
if b != 0:
result = a / b
else:
result = 0
print(result)
CR4. Lancer le programme et faites varier b, indiquez le résultat obtenu dans le compte rendu. Est-ce que c'est mieux maintenant ?
On peut maintenant essayer d'améliorer le programme encore une fois en essayant cela :
Programme Python a tester :
a = 15.0
b = 0
try :
result = a / b
except ZeroDivisionError:
result = 0
print(result)
CR5. Lancer le programme et faites varier b, indiquez le résultat obtenu dans le compte rendu. Est-ce que le comportement est le même que le programme précédent ? Pourquoi ? Quelle méthode préférez-vous utiliser ?
On peut maintenant essayer d'améliorer le programme des LEDs en essayant la commande try/except :
import RPi.GPIO as GPIO
import time
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
try:
while True:
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW)
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
Ici, nous n'avons rien changé dans la configuration et la fonctionnalité principale reste la même.
Ce que nous avons fait est de mettre la boucle infinie dans une structure try/catch (try/except en Python3).
Voici ce qui se passera lorsque vous exécuterez ce programme :
- Tout d'abord (ligne 1-7), la LED GPIO sera configurée.
- Ensuite, nous entrons dans la boucle while et faisons clignoter la LED.
- Étant donné que la boucle while est à l'intérieur d'un bloc « try », alors lorsque nous appuierons sur CTRL+C, nous pourrons intercepter l'exception correspondante (de type KeyboardInterrupt).
- Nous ajoutons un "except KeyboardInterrupt" pour exécuter du code lorsque l'exception a été interceptée.
- Dans ce bloc « except », nous utilisons GPIO.cleanup().
- Après cela, le programme continue son exécution après le try/catch. Dans ce cas, comme il n'y a plus rien, le programme se termine.
Remarque : si vous utilisez l'IDE Thonny Python, pour tuer le programme, vous devrez sélectionner le panneau Shell et appuyer sur CTRL+C. Si vous arrêtez le programme avec le bouton rouge « stop », le KeyboardInterrupt ne sera pas déclenché et votre GPIO ne sera pas nettoyé.
CR6: Sur la même base que l'exemple ci-dessus, créer un programme qui affiche je dors dans une boucle infinie et qui lorsque l'on appuie sur CTRL +C, affiche je sors maintenant. Faites valider par le professeur.
CR7: Mettez en oeuvre cette méthode et expliquer le résultat obtenu avec les LEDs.
Créé avec HelpNDoc Personal Edition: Générateur de documentation d'aide HTML gratuit