Ruban de LED
| from neopixel import * | importer le module du ruban |
| np = NeoPixel(pin0, 30) | ruban de 30 LED branché sur pin0 |
| np[4] = (0, 255, 0) | LED n°4 (la 5e) en vert : (rouge, vert, bleu), de 0 à 255 |
| np.show() | envoyer les couleurs au ruban |
| np.clear() | tout éteindre |
| len(np) | nombre de LED |
Radio
| import radio | importer le module radio |
| radio.config(address=1, group=12) | régler l'adresse et le groupe (identiques sur les deux cartes) |
| radio.on() | allumer la radio |
| radio.send("A") | envoyer un texte |
| m = radio.receive() | texte reçu, ou None si rien n'est arrivé |
| radio.send(str(d)) | envoyer un nombre : le convertir en texte |
| int(m) | reconvertir le texte reçu en nombre |
Fonctions
| def nom(a, b): | définir une fonction avec deux paramètres |
| return valeur | renvoyer un résultat |
| nom(3, 5) | appeler la fonction |
Capteurs et actionneurs
| distance_cm() | distance mesurée par le capteur à ultrasons (fonction fournie) |
| pin1.read_digital() | capteur infrarouge : 0 si un véhicule est détecté |
| ouvre_barriere() | lever la barrière (fonction fournie) |
| ferme_barriere() | baisser la barrière (fonction fournie) |
| import music | importer le module son |
| music.pitch(440, 200, pin0) | son de 440 Hz pendant 200 ms sur pin0 |
| pin1.write_digital(1) | allumer la LED Grove branchée sur pin1 |
Rappels
| while True: | répéter sans fin |
| for i in range(30): | i = 0, 1, …, 29 |
| if … : / elif … : / else : | si / sinon si / sinon |
| == != < > <= >= | comparaisons |
| sleep(1000) | pause d'une seconde |
Compléments pour l'enseignant. Ces explications ne sont pas destinées aux élèves de seconde.
Pilotage du servomoteur de la barrière
Le servomoteur attend un signal périodique de période 20 ms (50 Hz). La largeur de l'impulsion fixe l'angle : environ 0,5 ms pour une butée, 2,5 ms pour l'autre, selon les modèles.
pin0.set_analog_period(20) règle la période du signal PWM à 20 ms. pin0.write_analog(v), avec v entre 0 et 1023, règle le rapport cyclique : l'impulsion dure v / 1023 × 20 ms.
Le programme du fabricant calcule pilotage(angle) = round(0,5125 × angle + 46) :
pilotage(0) = 46 → 46 / 1023 × 20 ms ≈ 0,90 ms pilotage(90) = 92 → 92 / 1023 × 20 ms ≈ 1,80 ms
Les valeurs 46 et 0,5125 sont empiriques. Elles dépendent du servomoteur et du montage de la barrière : impulsion_minimale déplace les deux positions, coefficient règle l'amplitude du mouvement. Dans ce simulateur, l'angle commandé est retrouvé par la formule inverse (v − 46) / 0,5125 : 0° correspond à la barrière levée et 90° à la barrière baissée. Le bras met environ 0,3 s pour faire 90°.
Si l'on enchaîne ouvre_barriere() et ferme_barriere() sans pause, le second ordre remplace le premier avant que le servomoteur ait bougé : en réalité, il vibre sur place.
Capteur à ultrasons Grove
Le module n'utilise qu'une broche (SIG) pour l'émission et la réception. La fonction distance_cm() :
1. envoie une impulsion de déclenchement de 5 µs sur pin1 ; 2. le module émet une salve à 40 kHz, puis met SIG à 1 pendant la durée de l'aller-retour de l'onde ; 3. machine.time_pulse_us(pin1, 1, 1000000) mesure cette durée en µs (délai maximal : 1 s) ; 4. distance = temps × 0,0340 / 2 (+ 0,55 de correction).
0,0340 est la vitesse du son en centimètres par microseconde (340 m/s). Le commentaire « micromètres par seconde » de la fiche d'origine est à corriger. Le simulateur renvoie la durée (d − 0,55) × 2 / 0,034 µs pour la distance d choisie avec le curseur.
Liaison radio
Deux cartes communiquent si elles ont la même address, le même group (0 à 255) et le même canal (7 par défaut). Chaque carte garde au plus 3 messages reçus en attente (paramètre queue). Au-delà, les nouveaux messages sont perdus, d'où l'intérêt d'une petite pause dans une boucle d'envoi rapide. radio.receive() renvoie None si aucun message n'est en attente.
En classe, une adresse commune à la classe (par exemple address=1) et un groupe par îlot (par exemple group=12) évitent les interférences entre îlots. La vraie radio ne garantit pas la réception de chaque message. Le simulateur, lui, transmet tout instantanément, sauf quand la file d'attente est pleine.
Ruban NeoPixel
Chaque LED WS2812 contient trois diodes (rouge, verte, bleue) pilotées par un circuit qui lit les données en série sur une seule broche. Une LED consomme jusqu'à environ 60 mA en blanc à pleine puissance. La carte micro:bit fournit 3,3 V et un courant limité : au-delà d'une huitième LED allumée, les composantes verte et bleue faiblissent et les couleurs dérivent. Le simulateur imite ce défaut quand la case « Ruban alimenté par la carte » est cochée. Un ruban de 30 LED demande une alimentation externe.
Capteur infrarouge
Module réflectif à sortie numérique : la sortie passe à 0 quand un obstacle renvoie l'infrarouge émis, et la LED rouge du module s'allume. Le potentiomètre règle le seuil, donc la distance de détection (environ 7,5 à 40 cm). Le shield doit être alimenté pour utiliser les capteurs.
Ce que le simulateur ne fait pas
La liaison Bluetooth (module HC-06 et uart), le GPS, le shield BitMaker et le module speech ne sont pas simulés. Les durées sont proches de la réalité sans être exactes, et le langage est exécuté par Skulpt et non par MicroPython : le matériel réel reste la référence.
Les vérifications automatiques jugent le comportement des cartes simulées (ce qui s'affiche, s'allume ou bouge) dans plusieurs situations, et non le texte du programme. Un programme juste mais écrit autrement que la correction est donc accepté. Pour masquer les corrections, mettre corrections: false dans CONFIG, au début du script de la page.
D'autres programmes peuvent aussi être justes : « Vérifier mon défi » les accepte.