Codeur JUNIOR confiné - Episode 8, la GPIO
Pour la suite de notre programme "découverte de l'informatique", je souhaitais aborder la notion d'informatique embarquée. Le concept n'est pas simple en soi, et avec des ordinateurs classiques il n'est pas évident à mettre en pratique... Heureusement, les micro:bits s'y prêtent bien !
La GPIO, c'est quoi
GPIO est l'acronyme de "General Purpose Input / Output", soit en français "entrée / sortie à usage général". Ça n'est pas forcément plus clair...
D'un point de vue pratique : ce sont les pistes en bas de notre puce. On en dénombre 25, certaines larges et la plupart fines.
D'un point de vue théorique, ça signifie que cette GPIO va nous servir à transmettre (output) ou recevoir (input) de l'information, sous différentes formes, peu importe quel type en réalité (general purpose).
Avant de mettre les mains dans le cambouis, une petite étape intermédiaire pour bien faire rentrer les notions de "pistes" et "d'information".
La prise jack
L'exemple retenu est particulièrement simple à mettre en place. Il s'agit de faire jouer au micro:bit un son, qui sera entendu via des écouteurs normaux (filaires).
Ça peut paraitre complexe dit comme ça, mais en réalité c'est enfantin : il y a une action toute faite qui permet de jouer une mélodie.
Problème : comment entendre cette mélodie ? Le micro:bit ne possède pas de haut-parleur !
Réponse : en utilisant les pistes de la GPIO. On n'a rien à faire de particulier en réalité, l'action "joue la mélodie" se charge déjà d'envoyer un signal sur la piste "0".
En prime, le simulateur nous montre exactement la marche à suivre : relier la piste 0 à la pointe du jack de nos écouteurs, et la piste GND à la base du jack.
On l'a fait, ça marche, même si c'est assez galère de tenir tous les fils à leur place...
Note : cette expérience n'a de sens qu'avec un micro:bit V1. Le micro:bit V2 intègre un haut-parleur miniature...
On a néanmoins retenu deux choses importante à l'issue de cette expérience :
- ces pistes peuvent servir à envoyer de l'information (comme par exemple "écouteurs, jouez cette musique !")
- c'est assez pénible à mettre en place, sur des pistes...
Les Raspberry Pi / Arduino ont des broches. C'est assez facile de s'enrouler autour (ceux qui ont connu les "wrappers" auront surement une pensée nostalgique ^^) ou simplement de se fixer dessus.
Mais là... avec les grosses pistes c'est assez compliqué de maintenir le fil sans bouger. Et avec les pistes les plus fines, c'est mission impossible ! Il va nous falloir une solution pour ça !
L'extension board
La solution retenue : une carte d'extension, qui permet essentiellement de relier chacune de nos pistes à des broches. On plante notre micro:bit dedans et c'est réglé.
Pour les montages plus complexes, on peut aussi se servir de cette carte pour d'autres fonctionnalités, comme par exemple une alimentation 9V, ... Mais enfin bref, pour l'instant on n'en a pas eu besoin.
On a donc fait l'acquisition de cette carte, avec tout un kit de semi-conducteurs pour aller avec : des diodes, des résistances, des interrupteurs, des condensateurs, des moteurs / servos, des fils, et j'en passe; et aussi une plaque d'essai 830 points (ces petites plaquettes qui permettent de planter dans des trous des fils, des composants, ...)
A la découverte de l'électricité
Problème : comment parler GPIO et informatique embarquée à des enfants qui n'ont aucune notion de base dans les domaines de la physique et de l'électricité ?
J'ai donc imaginé une série d'expérience destinées à illustrer tout ça, le but étant de mettre en scène à chaque fois un comportement / une notion clef pour la suite, sans entrer dans les détails théoriques et/ou calculatoires (genre U=RI, courant continu / courant alternatif, tension efficace, etc...). On se restreint à ce qui va nous servir uniquement.
Voici donc le résumé de ces différentes saynètes.
Le fil électrique
Préparation : on balise un chemin entre deux points de la pièce, avec des chaises, des tabourets, peu importe. On place l'enfant à un des deux points et on appelle l'autre "la sortie"
Toi, tu es l'électricité. Va jusqu'à la sortie.
Voilà. On laisse simplement l'enfant suivre le chemin jusqu'au bout.
Le circuit ouvert
Préparation : on ajoute un obstacle infranchissable (une autre chaise) avant la sortie.
Toi, tu es l'électricité. Va jusqu'à la sortie.
L'enfant se retrouve coincé (normalement). Là on lui indique que si l'électricité ne peut pas rejoindre la sortie, elle ne passe pas. Elle reste à son point de départ
La résistance
Préparation : on repart d'un chemin "faisable" jusqu'à la sortie, on se met debout au milieu en bloquant le passage, et on écarte légèrement les jambes
Toi, tu es l'électricité. Va jusqu'à la sortie.
L'enfant doit se faufiler, et donc il va "moins vite". On peut répéter l'expérience plusieurs fois en jouant sur l'écart entre les jambes, pour montrer qu'il y a plusieurs valeurs de résistances.
Le court-circuit
Préparation : pareil qu'avant, mais on dégage un second passage vers la sortie (on bloque un des deux en jouant la "résistance", mais l'autre est dégagé)
Toi, tu es l'électricité. Va jusqu'à la sortie, le plus vite possible.
Normalement, l'enfant doit avoir compris le truc : le chemin qui n'est pas gêné est le plus rapide. Pareil pour un court-circuit, l'électricité préfère passer au plus rapide
Voilà, c'est tout pour nos saynètes, on a attaqué ensuite un circuit simple.
Les circuits réalisés
Allumer une LED
Tout d'abord, on a commencé par une version "sans micro:bit", juste avec l'extension board pour l'alimentation.
Détails du montage :
- on fait venir le courant depuis la broche 3.3V
- arrive ensuite une résistance de 220 ohms
- puis une LED rouge
- et enfin, le courant repart sur la masse (GND)
Pour mieux illustrer l'impact de chaque composant et broche, on peut
- débrancher un fil. Circuit ouvert = plus d'électricité qui passe.
- changer la broche 3.3V pour la broche 5V, la LED brille plus fort
- changer la résistance 220 ohms pour plus gros (1k ohm par exemple), la LED brille moins fort.
Allumer une LED avec le micro:bit
On garde le même montage. On relie simplement le premier fil à P0 plutôt que 3.3V
On crée aussi un programme (très succinct) pour notre micro:bit. En boucle, on va "écrire sur la broche P0", tantôt 1, tantôt 0.
Traduction : on va parfois envoyer de l'électricité, et parfois non.
Visuellement : ça fait une lampe qui clignote !!! on a aussi changé la lampe pour une bleue ("c'est plus joli")
Note : oui je sais, on n'envoie pas vraiment de l'électricité. On fixe simplement un potentiel, la différence entre ce potentiel et la masse fera le reste. Mais je ne voyais pas l'intérêt de rentrer dans ce genre de détails.
Voilà qui bouclait dans un premier temps notre découverte des "sorties" de la GPIO. On a ensuite attaqué les "entrées".
Le rôle de l'interrupteur
On est reparti de notre premier circuit (sans micro:bit), et on a ajouté sur le passage un bouton (interrupteur à pression). On a pu constater simplement que lorsque l'interrupteur est appuyé, le courant passe.
L'interrupteur comme source d'entrée de la GPIO
On aurait pu se contenter de relier les broches 3.3V et P0 entre elles avec un interrupteur au-milieu, on est parti sur un schéma un peu plus compliqué pour illustrer les courts-circuits (vus plus haut dans nos mises en scène).
On a donc relié la broche 3.3V à une première résistance (on a pris 1k ohms), puis à la fois :
- une seconde résistance de 1k ohms, relié à P0
- un interrupteur, relié à la masse GND
Description du comportement : l'électricité arrive et n'a qu'un seul choix, celui d'aller vers P0 malgré la résistance qui gêne...
Par contre, quand on appuie sur le bouton, l'électricité trouve un autre chemin, beaucoup plus intéressant, et va donc vers GND à la place ! c'est le court-circuit.
Par rapport à notre programme : quand on appuie sur le bouton, le courant ne va plus vers P0, on y "lit" donc la valeur 0, et on affiche un sourire. L'autre cas correspond au bouton non pressé. On lit "1", et on affiche un autre dessin.
Un vrai projet : le Simon
Note : pour ceux qui ignorent ce qu'est le Simon, c'est ça.
Un jeu électronique, lancé vers la fin des années 1970, dont le but est de répéter une séquence de couleurs, qui augmente à chaque fois.
(Pour l'anecdote : ce jeu s'appelle le Simon, parce que c'est l'équivalent de notre "Jacques a dit" français : "Simon says")
La conception
Avant de foncer dans la réalisation du jeu, on a passé un peu de temps sur sa conception. Et plus particulièrement, le "hardware". La partie "software" viendra plus tard.
- Il nous faut des boutons de couleurs, et des lampes, de même couleurs.
- Il nous faudra probablement des résistances (220 ohms, une par LED)
- Il faut que le micro:bit soit au courant (blague) quand on appuie sur un bouton
- Il faut qu'une lampe puisse s'allumer, soit lorsqu'on appuie sur le bouton, soit lorsque le micro:bit le demande
- Question : comment faire pour que la lampe s'allume quand on appuie sur le bouton ?
Deux réponses à cette question :
- Solution logicielle : on capte les pressions sur le bouton, et on déclenche un allumage dans la foulée.
- Solution matérielle : on place le bouton entre la source 3.3V et la diode (ou la résistance).
La première solution est peut-être plus rentable sur le long-terme. Corriger du software est souvent couteux, mais moins que de corriger du hardware !
On est malgré tout parti sur la seconde solution. Pour être franc, je pense que cette question-là est probablement trop complexe pour des enfants qui découvrent ces concepts.
Pour une LED donnée, notre schéma était donc :
- Lorsque le bouton SW1 n'est pas pressé : c'est l'état la broche utilisée (P0, P1, ...) qui permet d'allumer, ou pas, notre diode.
- Lorsque le bouton est pressé, on va à la fois allumer notre diode et mettre une tension sur la broche correspondante.
Grace à ce modèle on répond à toutes nos demandes : on peut déclencher l'allumage via le micro:bit (définir la sortie de la broche, P0 par exemple); on peut notifier le micro:bit quand le bouton est pressé (lecture de la broche P0); on peut allumer la lampe quand le bouton est pressé (ça c'est gratuit).
Le matériel
Il va nous falloir 4 diodes, 4 boutons (rouge, vert, bleu, jaune), quatre résistances, quelques fils, et c'est tout.
Détails techniques :
- Le 3.3V est relié à la ligne (+) pour alimenter toute la longueur
- Pour chaque diode, on part de la ligne (+) jusqu'à un bouton poussoir, et en sortie du bouton une résistance et la diode
- chaque diode est reliée en sortie à la ligne (-) du bas, qui est elle-même reliée à la masse GND directement
- enfin, chaque broche utilisée est reliée à l'assemblage correspondant, entre bouton poussoir et résistance.
Le logiciel
On commence par des fonctions de base : pouvoir allumer une lampe, et pouvoir lire quel bouton est pressé en ce moment.
On ajoute ensuite quelques fonctions de plus haut niveau : comment jouer toute une séquence de couleurs, comment lire une telle séquence et la comparer avec celle attendue; comment ajouter un nouvel élément à la séquence.
Et voilà. Il ne reste plus qu'à faire un enchainement de tout ça : on ajoute une valeur à la séquence, on la joue entièrement et on essaye de la lire. En cas d'échec, la fonction "Lire_la_sequence" se chargera de faire une "remise à zéro" pour redémarrer une nouvelle partie.
Voilà. C'est tout. Ça marche plutôt bien, il y a une vidéo pour en faire une démo ici. (Oui, désolé, mais LinkedIn ne laisse pas uploader de vidéo dans les articles, uniquement dans les posts...)