Où sommes nous ?

Retour

Faire clignoter une LED avec son BananaPI

Lorsqu'on se met au développement, le premier programme qu'on réalise est souvent le fameux "Hello World". Et bien dans ce billet, nous allons faire le "Hello World" de l'électronique et de l'automatisme, à savoir faire clignoter une Led. Simple, de prime abord, nous aborderons l'utilisation des GPIOs et comment apprivoiser les docs ...

Le principe

Voici les différentes étapes qu'il nous faudra suivre :

  1. Choisir un port GPIO
  2. Calculer la résitance de limitation
  3. Cabler / souder le tout
  4. passer à la phase logiciel et bidouiller !

Simple non, allez, c'est parti.

Le choix du port GPIO

Les "General Purpose Input/Output" ou plus communément appelés GPIO sont, comme leur nom l'indique, sont des ports à usage général ... on est bien avancé ! Même si cette définition sous-entend qu'ils peuvent faire beaucoup plus de choses, il s'agit ici de broches sur lesquelles on peut appliquer un signal (hors scope de ce billet) ou générer une information binaire, 0 volt ou 3,3 volts. La doc du BananaPI nous indique que par défaut, 9 broches sont à notre disposition sur les connecteurs CON3 et J12.

Quand je dis "par défaut", c'est que ces pins peuvent avoir plusieurs rôles qui sont sélectionnés par le fameux fichiers FEX dont nous parlerons plus tard.

Dans mon exemple, je prendrais le pin nommé IO-8 sur le connecteur J12.

Le schéma de principe est la résistance de limitation

Le schéma est hyper simple et des plus classique :

C'est maintenant qu'il faut se pencher sur les caractéristiques de notre LED.

Si l'on prend Vd moyenne de 1,7v, la résistance doit faire chuter la tension de 3,3-1,7 = 1,6v. L'intensité devant être de 10 mA, on arrive à R = 1,6/0,01 = 160Ω

Montage / soudage

Ben à vous de jouer !

Avec le kernel 3.4.x (SunXI) et ses Fex

Ce qui suit ne fonctionnera qu'avec un kernel < 4, en particulier avec le kernel 3.4.x de SunXI fournit généralement avec les images du fabriquant. Si vous utilisez un kernel récent, voir plus bas dans cette page.

Identifier le GPIO

On pourrait s'attendre que le PIN IO-8 corresponde au GPIO-8 de l'OS ... c'est sans compter sur l'inventivité de nos amis chinois ! Comme je le disais précédemment, les PINs ont plusieurs fonctions et celle par défaut (elle peut être changée logicielement par la suite ... mais on va rester simple dans ce billet) est définie par le fichier FEX du Banana.

Prenons le cas de notre fameux IO-8, on voit dans la doc qu'il correspond à la patte PH03 du A20. Donc :

# grep PH03 script.fex                                            
gpio_pin_13 = port:PH03<1><default><default><default>                          
gpio_pin_30 = port:PH03<1><default><default><default>                          
lcdd3 = port:PH03<2><0><default><default>                                      
usb_drv_vbus_gpio = port:PH03<1><0><default><0>     

On voit que ce fameux PH03 est lié au GPIO 13 et 30 (pourquoi les 2 ? Une erreur à mon avis) ainsi qu'à d'autres trucs non utilisés.

J'ai donc fait un joli tableau de synthèse pour vous :

CON3
Pin on Board Pin Definition IO on A20 GPIO #
CON3-P01 VCC-3.3V
CON3-P02 VCC-5V
CON3-P03 TWI2-SDA PB21 2
CON3-P04 VCC-5V
CON3-P05 TWI2-SCK PB20 1 & 3
CON3-P06 GND
CON3-P07 GPCLK PI3 4
CON3-P08 UART3-TX PH0 14
CON3-P09 GND
CON3-P10 UART3-RX PH1 15 & 16
CON3-P11 IO-0(UART2-RX) PI19 17
CON3-P12 IO-1 PH2 18 & 19
CON3-P13 IO-2(UART2-TX) PI18 27
CON3-P14 GND
CON3-P15 IO-3(UART2-CTS) PI17 22
CON3-P16 IO-4(CAN_TX) PH20 23
CON3-P17 VCC-3.3V
CON3-P18 IO-5(CAN_RX) PH21 24
CON3-P19 SPI0_MOSI PI12 10
CON3-P20 GND
CON3-P21 SPI0-MISO PI13 9
CON3-P22 IO-6(UART2_RTS) PI16 25 & 26
CON3-P23 SPI0_CLK PI11 11
CON3-P24 SPI0_CS0 PI10 8
CON3-P25 GND
CON3-P26 SPI0_CS1 PI14 7
J12
J12-P01 VCC-5V
J12-P02 VCC-3.3V
J12-P03 IO-7 PH5 12 & 28
J12-P04 UART7_RX PI21 21 & 29
J12-P05 IO-8 PH3 13 & 30
J12-P06 UART7_TX PI20 20 & 31
J12-P07 GND
J12-P08 GND

Codons !

Attention

On branche le Banana et ... la LED s'allume ! A-t-on foiré le montage ? Non, c'est simplement que les GPIOs sont configurés par défaut en sorti avec un niveau haut.
Heureusement, ceci est configurable dans le fichier FEX ...

Géré par le kernel à travers sysfs

Les GPIOs sont exposés dans le sysfs tel qu'expliqué dans cette très bonne doc (et hop, j'évite d'écrire un gros pavé). Donc résumons :

On se place dans le répertoire /sys/class/gpio et on indique au kernel que nous allons jouer avec le GPIO-13

torchwood gpio # ls
export gpiochip1 unexport
torchwood gpio # echo 13 > export
torchwood gpio # ls
export gpio13 gpiochip1 unexport

Un répertoire gpio13 est apparu ... et par la même la LED s'éteind : le PH03 n'a plus la valeur par défaut du fichier FEX mais est initialisé par le kernel en entrée par défaut.

torchwood gpio # cd gpio13
torchwood gpio13 # ls
active_low device direction edge power pull subsystem uevent value
torchwood gpio13 # cat direction
in

On la remet en sortie et on alume la LED.

torchwood gpio13 # echo out > direction
torchwood gpio13 # echo 1 > value

On voulais la faire clignoter ... voici le code

torchwood gpio13 # while true
> do
> echo 0 > value
> sleep 1
> echo 1 > value
> sleep 1
> done

Et comme nous sommes propre, nous faisons le ménage :

torchwood gpio13 #cd ..
torchwood gpio # echo 13 > unexport                                                                                                
torchwood gpio # ls                                                             
export  gpiochip1  unexport

Géré par le kernel à travers sysfs à travers le driver Leds

Le BananaPI dispose d'une Leds "user definable", la fameuse Led verte qui brille par défaut comme des battements de coeur. Notez le "Par défaut", car "user definable" indiquent que nous pouvons changer son fonctionnement grâce au pseudo device /sys/class/leds/green:ph24:led1, plus de détails ici.
Et bien, il nous est possible d'en créer une seconde, simplement en modifiant le fichier Fex comme suit :

[leds_para]
leds_used = 1
leds_num = 2
leds_pin_1 = port:PH24<1><default><default><0>
leds_name_1 = "green:ph24:led1"
leds_default_1 = 1
leds_trigger_1 = "heartbeat"
leds_pin_2 = port:PH03<1><default><default><0>
leds_name_2 = "red:ph03:led2"
leds_default_2 = 1
leds_trigger_2 = "heartbeat"

(seules les lignes en gras ont été modifiées).

Et si on va dans on trouvera un nouveau sous-répertoire.

torchwood ~ # cd /sys/class/leds/
torchwood leds # ls
green:ph24:led1  red:ph03:led2
torchwood leds #

On trouvera plus d'explications dans la doc du kernel. Mais penchons nous sur le fichier le plus intéressant, trigger, qui contient la liste des stimulus pour cette Led.

torchwood leds # cd red:ph03:led2/
torchwood red:ph03:led2 # cat trigger
none battery-charging-or-full battery-charging battery-full battery-charging-blink-full-solid ac-online usb-online mmc0 timer [heartbeat] backlight gpio cpu0 cpu1 default-on

La valeur entre crochet est la valeur active.
Le code suivant reprend le même principe que précédement :

torchwood red:ph03:led2 # echo none > trigger 
torchwood red:ph03:led2 # while true
> do
> echo 1 > brightness
> sleep 1
> echo 0 > brightness
> sleep 1
> done

Laissons le kernel bosser à notre place

Grace au trigger "timer", nous pouvons demander au kernel de faire tout le travail à notre place :

torchwood red:ph03:led2 # echo timer > trigger 
torchwood red:ph03:led2 # ls
brightness  delay_off  delay_on  device  max_brightness  power  subsystem  trigger  uevent

Deux nouveaux fichiers sont créés, delay_off et delay_on : on y placera les durées en millisecondes d'extinction et d'illumination de la Led.
Le code suivant donne le même résultat que précédement :

torchwood red:ph03:led2 # echo timer > trigger 
torchwood red:ph03:led2 # echo 1000 > delay_off
torchwood red:ph03:led2 # echo 1000 > delay_on

Avec un Kernel >= 4 et les DTS

Les kernel récents n'utilisent plus les fichiers FEX, mais les Device Tree ou DTS : beaucoup moins facile à aborder que les FEX, mais d'un autre côté, ils sont pris en charge directement par le kernel mainline.


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2017
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.