TP micro:bit — Boucles, boutons et pixels

Denis Dréano
PROG4-03

TP micro:bit — Boucles, boutons et pixels

Objectifs cantonaux : ROBO-1, ROBO-2 (rattachés à O1.5, O1.6). Semaine dédoublée (×2, groupes A/B séparés).

Cours complet sur la plateforme Runestone de Cédric Donner : TP micro:bit — bases.

Vous venez de voir la boucle while — c’est justement l’outil qui manquait la semaine dernière pour faire tourner un programme micro:bit en continu.

La boucle infinie sur le micro:bit

▷ À retenir — while True

while True: crée une boucle qui ne s’arrête jamais (True est toujours vrai). C’est exactement ce qu’il faut pour qu’un micro:bit surveille en continu ses capteurs (boutons, accéléromètre) sans jamais s’arrêter tout seul.

→ Exemple 1 — un coeur qui bat à l’infini
from microbit import *

while True:
    display.show(Image.HEART)
    sleep(1000)
    display.show(Image.HEART_SMALL)
    sleep(1000)

Utiliser les boutons A et B

Le micro:bit possède deux boutons, button_a et button_b.

◈ Syntaxe — Détection des boutons

button_a.was_pressed()   # True si le bouton a été enfoncé depuis le dernier appel
button_a.is_pressed()    # True si le bouton est enfoncé maintenant
→ Exemple 2 — réagir à un bouton
from microbit import *

display.show(Image.ARROW_W)
sleep(3000)   # temps pour appuyer sur le bouton

if button_a.was_pressed():
    display.show(Image.HAPPY)
else:
    display.show(Image.SAD)

Pour surveiller les boutons en continu, on combine while True et if :

→ Exemple 3 — surveillance continue des boutons
from microbit import *

while True:
    if button_a.was_pressed():
        display.show(Image.HAPPY)
    elif button_b.was_pressed():
        display.show(Image.SAD)

Exercice 1 — was_pressed() vs is_pressed()

Testez les deux programmes suivants et décrivez la différence entre was_pressed() et is_pressed().

from microbit import *

while True:
    if button_a.was_pressed():
        display.show(Image.HAPPY)
    else:
        display.show(Image.SAD)
    sleep(200)
from microbit import *

while True:
    if button_a.is_pressed():
        display.show(Image.HAPPY)
    else:
        display.show(Image.SAD)
    sleep(200)

Allumer un pixel

Un pixel est repéré par ses coordonnées (x, y) : (0, 0) est le coin en haut à gauche.

◈ Syntaxe — Pixels

display.set_pixel(x, y, intensite)   # allume la LED (x, y), intensité de 0 (éteint) à 9 (max)
display.get_pixel(x, y)              # renvoie l'intensité actuelle de la LED (x, y)
→ Exemple 4 — cinq pixels
from microbit import *

display.set_pixel(2, 2, 9)   # LED du milieu, intensité max
display.set_pixel(0, 0, 5)   # coin, intensité intermédiaire
display.set_pixel(4, 0, 5)
display.set_pixel(0, 4, 5)
display.set_pixel(4, 4, 5)

Exercice 2 — parcourir tout l’écran

En réutilisant la boucle imbriquée for (déjà connue), faites parcourir tout l’écran à un pixel allumé, du haut à gauche au bas à droite :

from microbit import *

x = 0
y = 0
for _ in range(5):
    for _ in range(5):
        display.set_pixel(x, y, 9)
        sleep(200)
        display.set_pixel(x, y, 0)
        x += 1
    x = 0
    y += 1

Exercice 3 — déplacer un pixel avec les boutons

En combinant while True, if/elif et display.set_pixel, écrivez un programme qui :

  • allume un pixel au centre de l’écran,
  • le déplace à gauche quand on appuie sur le bouton A,
  • le déplace à droite quand on appuie sur le bouton B,
  • ne fait rien si le pixel est déjà au bord de l’écran.

! Effacer avant de redessiner

display.clear() éteint toutes les LED. Pensez à effacer l’écran à chaque tour de boucle avant de redessiner le pixel à sa nouvelle position, sinon la trace du pixel reste allumée.

Devoir donné par Cédric

Terminer les exercices boutons/pixels du TP micro:bit.