Comment une toute petite puce lit-elle un bouton ?
Dans un lave-linge, un thermostat ou une manette de jeu, il y a une petite puce sans écran ni clavier. Elle doit remarquer un bouton, allumer une lumière et régler la vitesse d'un moteur, rien qu'en écrivant et en lisant quelques nombres. Cette leçon utilise une puce inventée, simulée en Python, pour que tu voies ces nombres changer.
À la fin de cette leçon
Remarque
Je peux lire un registre en binaire et dire ce que fait la mise à 1, la mise à 0 ou l'inversion d'un bit.
Mots clés
- Registre : une petite mémoire numérotée à l'intérieur de la puce, ici large de 8 bits.
- Bit : un 0 ou un 1. Le bit 0 est celui de droite.
- Masque : un nombre qui sert à isoler ou à modifier certains bits.
- Broche : une patte métallique de la puce, au niveau haut (1) ou bas (0).
- PWM : modulation de largeur d'impulsion, une broche allumée et éteinte très vite, la part de temps allumée réglant la force de son effet.
- Interruption : un signal qui fait arrêter la puce pour exécuter un gestionnaire.
Pour commencer : ce que tu sais déjà
Remarque
Réponds dans ta tête. 1. À combien de nombres ordinaires correspond le nombre binaire 1010 ? 2. Combien de valeurs différentes 8 bits peuvent-ils contenir ? 3. À quoi sert print en Python ? Réponses : 10 ; 256, de 0 à 255 ; elle affiche une valeur à l'écran.
Avant de commencer
Remarque
Appuie sur Démarrer le lab dans la barre en haut de la leçon et attends qu'il indique qu'il est en marche. Il y a un seul conteneur, jupyter, et le terminal atteint son Python avec docker exec jupyter, qui lance une commande à l'intérieur. La puce est un simulateur d'une puce inventée, pas une vraie carte : les vraies puces ont d'autres registres, d'autres noms et bien plus de règles. Le lien JupyterLab ouvre sa page web, sur le port 8888. Chaque bouton Exécuter ci-dessous tape sa commande dans le terminal de ton lab, l'une après l'autre, dans la même session. Pour suivre les commandes ou taper les tiennes, appuie sur Ouvrir le terminal (nouvel onglet) dans la barre.
Une puce, c'est une poignée de registres
ls liste le dossier de travail : mcu.py est la puce, start.ipynb un notebook et steps les scripts. Le premier script réinitialise la puce et affiche chaque registre en binaire, en hexadécimal et en nombres ordinaires. Il y en a sept : DDR (quelles broches sont des sorties), PORT (ce que pilotent les sorties), PIN (ce que lisent les broches), TCCR (la commande du minuteur), TCNT (le compteur du minuteur), OCR (la valeur de comparaison) et IFR (le drapeau d'interruption). Après une réinitialisation, les sept valent 0b00000000.
docker exec jupyter lsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
docker exec jupyter python3 steps/registers.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
On modifie un bit avec un masque
Le script part de PORT à 0b00001010. Un OU avec un masque met un bit à 1 et donne 0b00001011. Un ET avec le contraire d'un masque le met à 0 et donne 0b00001001. Un OU exclusif l'inverse et donne 0b00000001, et la même inversion refaite redonne 0b00001001. Seul le bit choisi change à chaque fois, et c'est tout l'intérêt d'un masque.
docker exec jupyter python3 steps/bits.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une broche est un bit qu'on voit de l'extérieur
Un 1 dans DDR fait d'une broche une sortie. Le script fait de la broche 0 une sortie, écrit un 1 dans le bit 0 de PORT, et PIN relit 0b00000001. Puis il inverse le bit à chaque top pendant huit tops et affiche #.#.#.#., une lumière qui clignote : # veut dire allumé et . éteint.
docker exec jupyter python3 steps/pins.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Vérifie
Astuce
Quel registre décide si une broche est une sortie, et que montrerait PIN pour une broche de sortie que PORT a mise à 1 ? Réponse : DDR, et 1, car une broche de sortie montre ce que la puce pilote.
Le PWM, c'est une broche allumée une partie de chaque période
Le minuteur compte de 0 à 15 puis recommence : une période dure 16 tops. Tant que TCNT est inférieur à OCR, la broche 5 est au niveau haut. Le script essaie OCR à 4, 8 et 12 et affiche une période de chacun : quatre tops allumée et 12 éteinte font 25 pour cent, huit et huit font 50 pour cent, et 12 allumée et quatre éteinte font 75 pour cent. Cette part est le rapport cyclique, et c'est ainsi qu'une vraie puce peut atténuer une lumière ou ralentir un moteur avec seulement allumé et éteint.
docker exec jupyter python3 steps/pwm.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un bouton rebondit : la façon d'écouter compte
Un vrai bouton ne passe pas de 0 à 1 une seule fois : il vacille. Le premier script interroge la broche à chaque top, et un seul appui lui fait voir deux fronts montants, aux tops 2 et 4, donc il compte 2 appuis. Le second script laisse la puce lever le drapeau d'interruption et appeler un gestionnaire. Il est appelé deux fois, aux tops 2 et 4, les deux mêmes fronts. Puis le gestionnaire ignore un appel survenu moins de trois tops après le dernier qu'il a gardé, et un seul appui est compté.
docker exec jupyter python3 steps/poll.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
docker exec jupyter python3 steps/interrupt.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu'une interruption supprime le rebond. Ce n'est pas le cas : le gestionnaire a tourné pour chaque front, deux fois pour un seul appui. Une interruption signifie seulement que la puce n'a plus besoin de demander sans cesse. Le rebond est toujours dans le signal et ton code doit s'en occuper. Rappelle-toi aussi que c'est un simulateur : sur une vraie puce, les noms de registres et les positions des bits sont différents, et c'est la fiche technique qui fait foi.
Le même travail dans un notebook
Ouvre JupyterLab depuis la barre et double-clique sur start.ipynb. Il construit la puce, écrit dans les registres et produit un signal PWM, une cellule à la fois. Clique sur une cellule et appuie sur Maj et Entrée pour l'exécuter. La dernière cellule te demande de changer la valeur de comparaison et de dire quel est maintenant le rapport cyclique. mcu.py est court et commenté : ouvre-le à côté du notebook et lis-le.
Vérification finale
Astuce
Réponds sans revenir en arrière. 1. Quelle opération met un bit à 1, et laquelle l'inverse ? 2. Avec une période de 16 tops et une valeur de comparaison de 8, quel est le rapport cyclique ? 3. Pourquoi un seul appui a-t-il été compté deux fois ? 4. Cette puce est-elle une vraie puce ? Réponses : le OU met à 1 et le OU exclusif inverse ; 50 pour cent ; le bouton a rebondi et chaque front montant a été compté ; non, c'est un simulateur d'une puce inventée.
Pour les enseignants
Astuce
Cette leçon est un petit exemple de leçon travaillée dans un lab : les étapes et les boutons Exécuter sont la leçon, et le lab est la copie de chaque élève. Le lab est un seul service, JupyterLab avec un court simulateur Python d'une puce 8 bits inventée, et rien ici ne se corrige tout seul : l'élève rend un court script ou notebook à lui qui utilise mcu.py, téléchargé depuis JupyterLab, et une phrase sur ce que les registres ont montré. Points clés : 1. Un registre est un nombre dont chaque bit a un sens. 2. Un masque met à 1, à 0 ou inverse des bits choisis. 3. Un minuteur et une valeur de comparaison produisent un signal PWM. 4. Un bouton peut être interrogé ou traité par une interruption, et dans les deux cas il rebondit. Erreur fréquente : croire qu'une interruption supprime le rebond. Matériel : le lab et un navigateur. Conseil : demandez aux élèves de prévoir chaque ligne affichée avant d'appuyer sur Exécuter. Précisez bien que c'est un simulateur : les vraies puces diffèrent, et c'est la fiche technique qu'il faut lire pour une vraie. Copiez-la dans votre propre module et modifiez-la, ou créez-en une de zéro avec le menu Lab du créateur de leçons.