deutsch     english    français     Imprimer

 

1.4 RASPBERRY PI

 

 

INTRODUCTION

 
On peut utiliser TigerJython sur le Raspberry Pi pour apprendre le langage de programmation Python pour accéder à ses ports GPIO ou sa carte son. Bien que TigerJython s’exécute de manière assez lente sur le Raspberry Pi, il offre une interface bien plus agréable que l’éditeur IDLE fourni avec Python. TigerJython met en effet à disposition les fonctionnalités suivantes fortes utiles : débogage, visualisation de l’état de la mémoire durant l’exécution du programme, graphiques avec la tortue, robotique, développement de jeux, etc …
 

 

 

INSTALLATION

 

La meilleure façon de débuter consiste à télécharger le système d’exploitation NOOS disponible  sur http://www.raspberrypi.org/downloads et à le copier sur une carte SD de 8 Go au minimum et de classe 10 de préférence. Lors du démarrage, choisir le système raspbian (une variante de Linux Ubuntu optimisée pour le Raspberry Pi). Puisque cette distribution contient déjà une JRE, il suffit de copier le fichier tigerjython2.jar dans le dossier de votre choix, par exemple /home/pi/tigerjyton et d’attribuer à ce fichier les droits d’exécution avec la commande chmod ou dans le gestionnaire de fichiers sous File Properties.

Pour démarrer TigerJython, saisir les commandes suivantes dans un terminal (console bash):

java -jar /home/pi/tigerjython/tigerjython2.jar

Pour être en mesure d’utiliser le module GPIO, TigerJython nécessite des droits administrateur. Il faut alors obligatoirement démarrer TigerJython en faisant précéder la commande d’invocation par le mot sudo :

sudo java -jar /home/pi/tigerjython/tigerjython2.jar

Au lieu de saisir à chaque fois cette commande, il est possible de spécifier dans le gestionnaire de fichiers que les fichiers dont l’extension est .jar doivent toujours être exécutés avec cette commande. Il est également possible de créer un script de démarrage dans le même but. Il est même possible de se simplifier encore un peu plus la vie en créant un raccourci sur le bureau de la manière suivante:

  • Cliquer droit et copier l’icône IDLE puis le coller sur le bureau, afin de créer un nouvel icône de lien.

  • Pour éditer le script de lancement associé à cet icône, cliquer droit sur l’icône et choisir Leafpad. Il est ensuite possible d’ajuster les entrées de manière appropriée et même de spécifier un icône représentant TigerJython (téléchargement). Voici un exemple:

Une fois ces manipulations effectuées, il est possible de démarrer Tiger Jython en cliquant sur l’icône. Il faudra se munir de patience (environ 1 minute) avant l’ouverture de Tiger Jython car le Raspberry Pi n’est pas une bête de course … Même si le chargement initial est lent, l’exécution des programmes Python est ensuite étonnamment rapide. Remarque : pour accélérer le chargement de TigerJython, prévoir une carte SD rapide (classe 10) et préférer un Raspberry Pi 2 nettement plus rapide que la première génération.

 

 

ENTRÉES / SORITES DIGITALES SUR LE GPIO

 

Le Raspberry Pi met à disposition 17 ports d’entrées / sorties digitales pouvant être branchés sur un connecteur 26 pins (40 pins pour la nouvelle version). Chaque canal peut être défini comme une entrée ou une sortie avec une résistance interne pull-up, pull-down ou sans résistance interne. Il y a des pins 5 V, 3.3 V et masse (GND) sur les connecteurs. La tension d’entrée ne doit jamais excéder 3.3V, ce qui interdit le branchement de circuits externes dont les sorties sont en 5V directement sur les entrées GPIO.

Dans TigerJython, on trouve la classe GPIO dans le module PRi_GPIO permettant de contrôler facilement les ports GPIO. Le module utilise la bibliothèque Pi4J de Robert Savage mais a l’avantage d’adopter une interface similaire au module RPi.GPIO disponible en standard pour l’implémentation CPython. Tous les fichiers nécessaires sont inclus dans la distribution de TigerJython.

Par défaut, les pins du port GPIO sont utilisés avec les nombres 1 à 26. Chaque pin peut être configuré avec GPIO.setup() en tant que canal d’entrée ou de sortie. On peut assigner une valeur à un canal donné avec GPIO.output(channel, state). De manière similaire, on peut lire la valeur présente en entrée avec GPIO.input(channel). Une documentation détaillée est disponible dans le menu d’aide sous Aide > Documentation > APLU.

Voici un montage permettant de tester les possibilités des ports GPIO. On y branche en série une LED et une résistance de 220 Ohms entre le port 6 (masse) et le port 12. Il faut remarquer qu’il faut disposer la LED dans le bon sens et branchant la cathode (patte la plus courte) sur la masse et l’anode (patte longue) sur le port 12. En cas de doute, il n’y a pas de souci à se faire, il faut juste la tourner si rien ne se passe. On connecte encore un boutton-poussoir entre le port 6 et le port 26.

Le programme suivant commence par définir le canal 12 comme un port de sortie et fait ensuite clignoter la LED 10 fois par seconde en attendant 100 ms entre chaque inversion du signal.

from RPi_GPIO import GPIO 

GPIO.setup(12, GPIO.OUT)
  
while True:
    GPIO.output(12, 1)
    GPIO.delay(100)
    GPIO.output(12, 0)
    GPIO.delay(100)
 

Pour utiliser un port d’entrée, on peut connecter un boutton-poussoir au port 26. Cela nécessite typiquement quelques drapeaux permettant d’enclencher et déclencher le clignotement.

Sélectionner tout le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Dans la boucle, on commence par lire l’état actuel du boutton-poussoir. On nomme « polling » la technique consistant à lire de façon répétée la valeur d’un port. Lorsque ce dernier est enfoncé, il connecte la masse (port 6) au port 26, ce qui a pour conséquence de mettre le port 26 en tension basse (0V). L’instruction input(26) retourne donc la valeur GPIO LOW qui vaut 0. Lorsque le boutton-poussoir est relâché, la résistance interne pull-up du port 26 force la tension sur HIGH (3.3V) sans qu’il soit nécessaire d’appliquer cette tension depuis l’extérieur.

L’utilisation d’un boutton-poussoir est un peu compliquée du fait que, malgré le polling continuel du port 26, il est nécessaire de détecter un changement de tension en générant un événement qui ne survient que lors d’un passage d’une tension haute vers une tension basse. On utilise pour cela le drapeau buttonPressed qui passe à True lors d’une première pression sur le bouton. Suite à cela, on ne repasse pas dans la partie du code correspondante jusqu’à ce que le bouton soit pressé à nouveau après avoir été relâché.

Puisque la boucle est également responsable du clignotement, on utilise un drapeau blinking qui représente le statut allumé/éteint du clignotement. Le drapeau lenOn permet de se rappeler dans chaque itération si la LED doit être allumée ou éteinte.
En fin de boucle, puisque l’on ne sait pas si la LED est allumée ou éteinte lorsque le bouton pressoir est relâché, on met le pin 12 sur LOW pour être certain qu’elle soit éteinte. Le fait que le programme entre ensuite de manière répétée et de manière inutile dans le dernier else est une petite imperfection dont on peut s’accommoder.

Un ingénieur en électronique sait bien que lorsque le bouton est pressé, le contact produit des rebonds (bounces en anglais) avant de se stabiliser. Cela n’est pas gênant dans notre situation puisque le signal a largement le temps de se stabiliser en 100ms.

 

 

UTILISER LES ÉVÉNEMENTS

 

Au lieu d’utiliser de nombreux drapeaux dans la boucle, il vaut mieux utiliser la programmation événementielle. Dans ce modèle de programmation, le fait d’enfoncer et de relâcher le boutton-poussoir correspond à un événement qui va automatiquement appeler la fonction onButtonPressed() appelée fonction de rappel. Il suffit alors de maintenir le drapeau blinking.

Sélectionner tout le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Pour utiliser les événements, il suffit  de spécifier à l’aide de la méthode add_event_detect() si l’on désire déclencher l’événement sur un front montant (transition de la tension basse à la tension haute), un front descendant (transition de la tension haute vers la tension basse) ou les deux. Suite à cela, on spécifie à l’aide de add_event_callback() une fonction de rappel qui va être appelée à chaque fois que l’événement de pression survient.