[Raspberry/Python] Sortir des programmes GPIO proprement

Comment sortir des programmes GPIO proprement, éviter les avertissements et protéger votre Pi

Utilisation correcte de GPIO.cleanup()

RPi.GPIO fournit une fonction GPIO.cleanup() pour nettoyer tous les ports que vous avez utilisés . Mais soyez très clair ce que cela fait. Elle affecte uniquement les ports que vous avez définis dans le programme en cours. Il réinitialise tous les ports que vous avez utilisés dans ce programme en mode d'entrée. Cela évite les dommages causés par, par exemple, une situation dans laquelle un port est réglé sur ÉLEVÉ (HIGHT) en tant que sortie et vous le raccordez accidentellement à GND (LOW), ce qui court-circuiterait le port. 

 

import RPi.GPIO as GPIO
 
# ... Le reste de votre code irait ici ...
  
# Lorsque votre code se termine, la dernière ligne avant la sortie du programme serait ...
GPIO.cleanup()

 

 

N'utiliser pas GPIO.cleanup() début d'un programme pensant qu'il va nettoyer tous les ports sur le Pi. Il ne fait pas une telle chose. 
Si vous le placez en haut de votre script, c'est juste une ligne de code gaspillée. Il ne fait rien jusqu'à ce que vous avez configuré certains ports pour l'entrée ou la sortie.

La bonne méthode est donc d'utiliser GPIO.cleanup() durant une sortie de votre programme.

 

Raisons de la sortie d'un programme
Il y a au moins trois raisons pour provoquer une sortie d'un programme ... Les type 2 et 3 sont des "types d'exceptions".
  • Naturel, fin contrôlée - le programme a fini de faire ce qu'il a été écrit pour faire. Hourra! Ça a marché :)
  • Erreur - quelque chose s'est mal passé et le programme "jette un wobbly" et "erreurs out". Soit un processus a échoué d'une manière imprévisible, soit il y avait une erreur de codage dans le programme.
  • Interruption du clavier - vous avez appuyé sur CTRL+C pour arrêter le programme . C'est ce qu'on appelle une interruption de clavier.

Le problème est que, à moins que vous codez pour ces situations, tous les ports qui sont en cours d'utilisation au moment d'une erreur ou l'interruption du clavier restent définis exactement comme ils étaient, même après le programme se termine.
Si vous essayez alors de lancer le programme à nouveau, lorsque vous essayez de configurer les ports qui sont «encore définis» vous obtiendrez des avertissements que les ports sont «déjà en cours d'utilisation» ("already in use").

Désactiver les avertissements?
Vous pouvez éteindre les avertissements, mais c'est jouer à cache-cache avec la mort. Il cache le problème, mais ne le résout pas. Pourtant, vous pouvez choisir de le faire, alors voici comment vous faites. Il suffit de définir le GPIO.setwarnings() à False près du début de votre script, avant de commencer à configurer tous les ports.

 

GPIO.setwarnings(False)

Essayons: d'une meilleure façon !
Une des méthodes préférées pour détecter les erreurs et les interruptions du clavier utilise un try: except: block. 
Vous pouvez spécifier différents types d'exceptions, y compris KeyboardInterrupt , et / ou avoir un général pour attraper chaque exception. Liste drd exceptions Python : (https://docs.python.org/2/library/exceptions.html) . 

Jetez un oeil au code ci-dessous pour voir comment les exceptions sont codées ...

 

import RPi.GPIO as GPIO 
 
 # Vous mettez ici tout votre code pour la configuration de GPIO,
 # Nous allons couvrir cela demain
 # Valeurs initiales des variables etc ...
counter = 0 
   
try
     # Ici vous mettez votre boucle principale ou bloc de code
    while counter < 9000000
        # count up to 9000000 - takes ~20s 
        counter += 1 
    print "Target reached: %d" % counter 
 
except KeyboardInterrupt: 
     # Ici vous mettez n'importe quel code que vous voulez exécuter avant le programme
     # Sort lorsque vous appuyez sur CTRL + C
      print "\n", counter # valeur d'impression du compteur
 
except:
     # Cela retient TOUTES les autres exceptions, y compris les erreurs.
     # Vous ne recevrez aucun message d'erreur pour le débogage
     # Donc n'utilisez-le qu'une fois que votre code fonctionne
    print "Other error or exception occurred!" 
   
finally
    GPIO.cleanup()

 

 

Si vous laissez le programme exécuter pendant ~ 22 secondes, il compte jusqu'à 9 millions, vous dire qu'il a atteint sa cible, nettoyer tous les ports GPIO que vous avez utilisé et sortir normalement. Il s'agit du code dans le bloc try: (lignes 8-13).

Le code dans le bloc except KeyboardInterrupt: (lignes 15-18) couvre la situation CTRL + C. Ainsi, lorsque vous appuyez sur CTRL + C, il affiche la valeur actuelle du counter , nettoie les ports GPIO que vous avez utilisés et quitte.

Le code dans le bloc except: (lignes 20-24) couvre toutes les autres exceptions - y compris les erreurs de programme. Ainsi, si une autre exception se produit, elle vous avertit, nettoie tous les ports GPIO que vous avez utilisés et quitte.

Ce programme s'exécute jusqu'à ce qu'il se termine, ou une interruption clavier ou autre exception se produit. Quel que soit le cas, le bloc finally: (lignes 26-27) s'exécute, le nettoyage des ports GPIO à la sortie.

Notez également que nous n'avons pas utilisé de ports GPIO ici, donc le nettoyage n'est pas encore fait, mais c'est un modèle que vous pouvez utiliser lorsque nous commençons à utiliser les ports.