Je vous présente aujourd'hui quelques conseils pour interagir avec les pins GPIO de l'OrangePi PC par l'intermédiaire d'un script en python. Nous allons d'abord faire clignoter une LED, puis lire l'état d'un bouton poussoir.
Tout d'abord, je précise que j'ai fait tous mes tests en utilisant Raspbian (version pour OrangePi PC disponible ici). En principe, je suppose que ça devrait fonctionner avec n'importe quelle distro conçue pour l'OrangePi PC, mais la semaine dernière j'avais essayé sans succès sous Linux Vivid Mate (version Loboris), et l'installation de la bibliothèque avait échoué.
Installation de la bibliothèque OrangePi PC GPIO pyH3
Pour interagir avec les pins GPIO en python, j'ai installé la bibliothèque "OrangePi PC GPIO pyH3" qui a été mise au point par un utilisateur de l'OrangePi PC à partir d'une bibliothèque mise au point chez Olymex pour une autre carte utilisant le même processeur. Tout d'abord, vous téléchargez le fichier sur votre OrangePi (bouton "Download Zip" à droite de la page), vous le décompressez, et vous exécutez le script d'installation en écrivant "python setup.py install" dans le terminal.
Numérotation des pins
Tout comme pour le Raspberry Pi, il existe deux façons de numéroter les pins GPIOs de l'OrangePi PC. En mode "connector", les pins sont numérotées dans le même ordre que leur disposition sur la carte. Il s'agit des mêmes numéros que pour le Raspberry Pi en mode "board". En mode "port", les pins sont numérotées en fonction de leur disposition sur le processeur.
Le schéma ci-dessous montre le numéro des 40 pins en mode "connector" (en bleu) et en mode "port" (en jaune).
Par exemple, vous pouvez constater que la pin qui porte le numéro 3 en mode "connector" est désignée "PA12" en mode "port". Ainsi, vous pouvez accéder à cette pin en l'appelant "port.PA12" ou encore "connector.gpio1p3".
La pin qui porte le numéro 40 en mode "connector" est désignée "PG7" en mode "port". Vous pouvez donc l'appeler "port.PG7" ou "connector.gpio1p40".
J'ai toutefois remarqué que les pins 11 et 13 sont interverties en mode "connector", dans la bibliothèque: "connector.gpio1p11" fait référence à la pin 13, et "connector.gpio1p13" fait référence à la pin 11! (Ce sera certainement réparé dans une future version de la bibliothèque).
Autre bizzarerie: pour faire fonctionner la pin 13, je dois l'appeler "port.PA0", mais d'après le manuel d'utilisateur de l'OrangePi PC, elle devrait s'appeler PA2.
Pin en sortie: clignotement d'une LED
Voici, comme premier exemple, l'utilisation de la pin 3 (PA 12) en sortie, pour faire clignoter une LED.
Ce script utilise la désignation "port":
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
''' | |
On fait clignoter une LED branchée à la pin numéro 3 (PA12) | |
de l'OrangePi PC. | |
Pour plus de détails: | |
http://electroniqueamateur.blogspot.com/2015/10/controler-les-pins-gpio-de-lorangepi-pc.html | |
''' | |
from time import sleep # gestion du temps | |
from pyA20.gpio import gpio # gestion des pins GPIO | |
from pyA20.gpio import port # numérotation des pins en mode "port" | |
laPin = port.PA12 #la pin 3, en numérotation port | |
gpio.init() # démarrage de la bibliothèque | |
gpio.setcfg(laPin, gpio.OUTPUT) # la pin 3 réglée en sortie (output) | |
while True: # boucle répétée jusqu'à l'interruption du programme | |
gpio.output(laPin, 1) # sortie au niveau logique haut (3.3 V) | |
sleep(1) # on ne change rien pendant 1 seconde | |
gpio.output(laPin, 0) # sortie au niveau logique bas (0 V) | |
sleep(1) # on ne change rien pendant 1 seconde |
Ce script fait la même chose, mais utilise le mode "connector":
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
''' | |
On fait clignoter une LED branchée à la pin numéro 3 (PA12) | |
de l'OrangePi PC. | |
Pour plus d'informations: | |
http://electroniqueamateur.blogspot.com/2015/10/controler-les-pins-gpio-de-lorangepi-pc.html | |
''' | |
from time import sleep # gestion du temps | |
from pyA20.gpio import gpio # gestion des pins GPIO | |
from pyA20.gpio import connector # numérotation des pins en mode "connector" | |
laPin = connector.gpio1p3 # la pin 3, en numérotation connector | |
gpio.init() # démarrage de la bibliothèque | |
gpio.setcfg(laPin, gpio.OUTPUT) # la pin 3 réglée en sortie (output) | |
while True: # boucle répétée jusqu'à l'interruption du programme | |
gpio.output(laPin, 1) # sortie au niveau logique haut (3.3 V) | |
sleep(1) # on ne change rien pendant 1 seconde | |
gpio.output(laPin, 0) # sortie au niveau logique bas (0 V) | |
sleep(1) # on ne change rien pendant 1 seconde |
Pin en entrée: lecture d'un bouton poussoir
Voici maintenant un exemple d'utilisation de la pin 3 (PA 12) en entrée, afin de lire l'état d'un bouton poussoir.
Voici le script en version "port":
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
''' | |
On détecte l'état d'un bouton branché à la pin numéro 3 (PA12) | |
de l'OrangePi PC. | |
Pour plus d'informations: | |
http://electroniqueamateur.blogspot.com/2015/10/controler-les-pins-gpio-de-lorangepi-pc.html | |
''' | |
from time import sleep # gestion du temps | |
from pyA20.gpio import gpio # gestion des pins GPIO | |
from pyA20.gpio import port # numérotation des pins en mode "port" | |
laPin = port.PA12 #la pin 3, en numérotation port | |
etat_precedent = 0 | |
gpio.init() # démarrage de la bibliothèque | |
gpio.setcfg(laPin, gpio.INPUT) # la pin 3 réglée en entrée (input) | |
while True: # boucle répétée jusqu'à l'interruption du programme | |
if gpio.input(laPin) == 0: # bouton enfoncé | |
if etat_precedent == 1: # mais il état relâché avant | |
print "Le bouton est enfoncé." | |
etat_precedent = 0 | |
sleep(0.1) | |
else: # bouton relâché | |
if etat_precedent == 0: # mais il était enfoncé | |
print "Le bouton n'est pas enfoncé." | |
etat_precedent = 1 | |
sleep(0.1) | |
Et voici le script en version "connector":
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
''' | |
On détecte l'état d'un bouton branché à la pin numéro 3 (PA12) | |
de l'OrangePi PC. | |
Pour plus d'informations: | |
http://electroniqueamateur.blogspot.com/2015/10/controler-les-pins-gpio-de-lorangepi-pc.html | |
''' | |
from time import sleep # gestion du temps | |
from pyA20.gpio import gpio # gestion des pins GPIO | |
from pyA20.gpio import connector # numérotation des pins en mode "connector" | |
laPin = connector.gpio1p3 #la pin 3, en numérotation connector | |
etat_precedent = 0 | |
gpio.init() # démarrage de la bibliothèque | |
gpio.setcfg(laPin, gpio.INPUT) # la pin 3 réglée en entrée (input) | |
while True: # boucle répétée jusqu'à l'interruption du programme | |
if gpio.input(laPin) == 0: # bouton enfoncé | |
if etat_precedent == 1: # mais il état relâché avant | |
print "Le bouton est enfoncé." | |
etat_precedent = 0 | |
sleep(0.1) | |
else: # bouton relâché | |
if etat_precedent == 0: # mais il était enfoncé | |
print "Le bouton n'est pas enfoncé." | |
etat_precedent = 1 | |
sleep(0.1) | |
Un message nous indique l'état du bouton chaque fois qu'il change:
Yves Pelletier (Twitter, Facebook)
Merci pour cet article ! génial !
RépondreSupprimerFantastique ! J'attends avec impatience mes 2 cartes !
RépondreSupprimerMes tes articles mettent l'eau à la bouche, merci