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 ...
Voici les différentes étapes qu'il nous faudra suivre :
Simple non, allez, c'est parti.
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 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Ω
Ben à vous de jouer !
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.
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 |
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 ...
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
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
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
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 : Nos sorties Ski et rando |
Copyright Laurent Faillie
2001-2024
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 au total. |
Vous pouvez
laissez un commentaire
sur cette page.