mardi 27 octobre 2015

Contrôler les pins GPIO de l'OrangePi PC

Mise à jour (1er janvier 2017): Dans cet article, je fais référence à l'OS Rasbpian pour OrangePi PC, qui semblait la meilleure option à l'époque. De nos jours, il est nettement préférable d'utiliser Armbian).

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":

view raw blink_port.py hosted with ❤ by GitHub

Ce script fait la même chose, mais utilise le mode "connector":


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":

#!/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)
view raw bouton_port.py hosted with ❤ by GitHub

Et voici le script en version "connector":

#!/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   (TwitterFacebook)

2 commentaires:

  1. Merci pour cet article ! génial !

    RépondreSupprimer
  2. Fantastique ! J'attends avec impatience mes 2 cartes !
    Mes tes articles mettent l'eau à la bouche, merci

    RépondreSupprimer