Catégories
MICRO PYTHON MICRO:BIT

Créer une calculatrice

Objectif :

Réalisation d’un programme pour gérer une calculette.

Mission :

  • Utilise les boutons A ou B pour réveiller a calculette,
  • Choix des nombres de 0 à 9 avec le bouton A ou B,
  • Choix des opérateurs +,-,*,/,= avec le bouton A ou B,
  • Calcul par le choix de l’opérateur =, afficher les opérations puis le résultat
  • Un appui long permet l’arrêt la mise en veille

Etapes :

  1. Affichage d’un caractère
  2. Affichage des nombres et des opérateurs
  3. Attendre la saisie de la touche A ou B
  4. Affichage d’une liste de caractères et le choix
  5. Affichage d’un chiffre avec virgule avec la notion d’un ascenseur
  6. Calcul des différentes opérations
  7. Choix d’un nombre puis d’un opérateur
  8. Mémorisation des différentes opérations
  9. Calcul

Table des matières

  • Découverte des instructions à utiliser.
  • Le dictionnaire en python.
  • Les fonctions en Python.
  • Etape 1 Affichage d’un caractère.
  • Etape 2 Affichage des nombres.
  • Etape 3 Attendre la saisie de la touche A ou B.
  • Etape 4 Détection de la saisie du bouton A ou B.
  • Etape 5 Afficher une liste de caractères et choix d’un caractère.
  • Etape 6 Afficher un chiffre à virgule.
  • Etape 7 Calcul des différentes opérations arithmétiques de base.
  • Etape 8 Calculette choix de deux nombres et d’un opérateur.
  • Etape 9 Calculette mémorisation des opérations.
  • Etape 10 Affichage du résultat de l’opération.
  • Etape 11 Sonoriser ta calculette.

Découverte des instructions à utiliser

#Affichage d’une LED
from pystubit.board import display
display.set_pixel(0, 0, 9)
display.set_pixel(colonne de 0 à 4, ligne de 0 à 4,intensité de la LED de 0 à 9)
INTENSITE_LED=9
display.set_pixel(0, 0, INTENSITE _LED)

Une liste de données :

En Python, une liste est un type de données qui permet de stocker une collection ordonnée d’éléments, tels que des nombres, des chaînes de caractères ou d’autres objets. Les listes sont définies en utilisant des crochets [].

ceci_est_une_liste = [0,1,2,3,4]
#pour accéder à un élément de la liste
premier_element = ceci_est_une_liste[0]

#pour lire toute la liste
for ligne in ceci_est_un_liste:
    display.set_pixel(0, ligne, 9)

Une liste de liste :

une_liste_de_leds = [0,4,2,9,5]
ligne=0

for intensite in une_liste_de_leds:  
    display.set_pixel(0, ligne, intensite)
    ligne+=1

Le dictionnaire en python

Un dictionnaire en Python est un type de données qui permet de stocker des éléments sous forme de paires clé-valeur. Contrairement à la liste, les éléments dans un dictionnaire ne sont pas stockés dans un ordre particulier, mais plutôt associés à une clé unique qui permet d’y accéder facilement.

Les dictionnaires sont définis en utilisant des accolades {} et des paires clé-valeur séparées par des virgules. Par exemple, voici comment vous pouvez créer un dictionnaire pour stocker des informations :

from microbit import display

allume = {"OUI" :9,"NON" :0}

for colonne in range(5):
    for ligne in range(5):
        display.set_pixel(colonne, ligne, allume["OUI"])

Déclaration de la fonction :

Commence par déclarer la fonction en utilisant le mot-clé def, suivi du nom de la fonction et des parenthèses qui contiennent éventuellement des paramètres d’entrée. Par exemple :

def ma_fonction(parametre1, parametre2):
    # Addition de deux nombres
    # En paramètre deux nombres
    # Retourne la somme de deux nombres (optionnel)
    resultat = parametre1 + parametre2
    return resultat

nombre1=5
nombre2=2

print(nombre1,"+",nombre2,"=",ma_fonction(nombre1,nombre2))
#Bibliothèques à importer
from microbit import display

t_zero = [
    [0, 9, 9, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 9, 9, 0],
    ]

# Affichage d’un caractère en utilisant le tableau de LEDs
def affichage(caractere):
    num_ligne = 0
    # Affichage des lignes
    for ligne in caractere:
        num_colonne = 0
        # Affichage des colonnes
        for led in ligne:
            display.set_pixel(num_colonne, num_ligne, led)
            num_colonne += 1
        num_ligne += 1

affichage(t_zero)

Flasher pour tester puis bouton reset pour lancer

from microbit import display

#Tableaux pour afficher les nombres de 0 à 9
t_zero = [
    [0, 9, 9, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 9, 9, 0],
    ]

t_un = [
    [0, 0, 9, 0, 0],
    [0, 9, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 9, 9, 0],
    ]

t_deux = [
    [0, 9, 9, 0, 0],
    [9, 0, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 9, 9, 9, 0],
    ]

t_trois = [
    [0, 9, 9, 0, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 0, 0],

]

t_quatre = [
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 9, 9, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    ]

t_cinq = [
    [0, 9, 9, 9, 0],
    [0, 9, 0, 0, 0],
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 0, 0],
]

t_six = [
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 9, 9, 0, 0],
    [9, 0, 0, 9, 0],
    [0, 9, 9, 0, 0],
    ]

t_sept = [
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    ]

t_huit = [
    [0, 0, 9, 0, 0],
    [0, 9, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 9, 0],
    [0, 0, 9, 0, 0],
    ]

t_neuf = [
    [0, 9, 9, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 0, 0],
    ]

# Tableaux pour afficher les opérateurs =,+,-,/,*

t_egal = [
    [0, 0, 0, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 0, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 0, 0, 0],
    ]

t_plus = [
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    ]

t_moins = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    ]

t_div = [
    [0, 0, 0, 0, 9],
    [0, 0, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 0, 0, 0, 0],
    ]

t_multiple = [
    [9, 0, 0, 0, 9],
    [0, 9, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 9, 0],
    [9, 0, 0, 0, 9],
    ]

# Tableaux pour afficher un séparateur

t_point = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 9, 9, 9, 0],
    [0, 9, 9, 9, 0],
    [0, 9, 9, 9, 0],
]  

# Affichage d’un caractère

def affichage(caractere):
    num_ligne = 0
    for ligne in caractere:
        num_colonne = 0
        for led in ligne:
            display.set_pixel(num_colonne, num_ligne, led)
            num_colonne += 1
        num_ligne += 1

# Test pour afficher un caractère

affichage(t_huit)

Flasher pour tester puis bouton reset pour lancer

Peux-tu répondre à ce QCM sur la boucle FOR et les tableaux :

Quelle est la sortie du code suivant ?

tableau = [2, 4, 6, 8, 10]

for i in tableau:
    print(i)
  • A) 0 1 2 3 4
  • B) 2 4 6 8 10
  • C) 1 2 3 4 5
  • D) 0 2 4 6 8

Quelle est la sortie du code suivant ?

tableau = [3, 6, 9, 12, 15]

for i in range(len(tableau)):

    print(tableau[i])
  • A) 0 1 2 3 4
  • B) 3 6 9 12 15
  • C) 1 2 3 4 5
  • D) 0 3 6 9 12

Comment parcourir un tableau en utilisant une boucle for et l’index du tableau ?

A)

tableau = [5, 10, 15, 20]
for i in tableau:
    print(tableau[i])

B)

tableau = [5, 10, 15, 20]
for i in range(len(tableau)):
    print(tableau[i])

C)

tableau = [5, 10, 15, 20]
for i in range(tableau):
    print(tableau[i])

D)

tableau = [5, 10, 15, 20]
for i in tableau:
    print(i)

Quel est le résultat de ce code ?

tableau = [1, 2, 3, 4, 5]
total = 0

for i in tableau:
    total += i

print(total)

Comment ajouter tous les éléments d’un tableau en utilisant une boucle for ?

A)

tableau = [1, 2, 3, 4, 5]
total = 0
for i in tableau:
    total += tableau[i]
print(total)

B)

tableau = [1, 2, 3, 4, 5]
total = 0
for i in range(len(tableau)):
    total += tableau[i]
print(total)

C)

tableau = [1, 2, 3, 4, 5]
total = 0
for i in tableau:
    total += i
print(total)

D)

tableau = [1, 2, 3, 4, 5]
total = 0
for i in range(tableau):
    total += i
print(total)
#Tableau de tous les nombres# Tableau de la liste des chiffres de 0 à 9

chiffres = {
    0: t_zero,
    1: t_un,
    2: t_deux,
    3: t_trois,
    4: t_quatre,
    5: t_cinq,
    6: t_six,
    7: t_sept,
    8: t_huit,
    9: t_neuf,
    }

# Tableau de tous les opérateurs

operateurs = {"=": t_egal, "+": t_plus, "-": t_moins, "*": t_multiple, "/": t_div}

#Test pour afficher un nombre
affichage(chiffres[3])

Flasher pour tester puis bouton reset pour lancer

Peux-tu répondre à ce QCM sur l’utilisation des dictionnaires Python :

Quelle est la sortie du code suivant ?

dictionnaire = {"a": 1, "b": 2, "c": 3}
print(dictionnaire["a"])
  • A) « a »
  • B) 1
  • C) « b »
  • D) 2

Comment parcourir un dictionnaire en utilisant une boucle for ?

A)

dictionnaire = {"a": 1, "b": 2, "c": 3}
for cle in dictionnaire:
    print(cle, dictionnaire[cle])

B)

dictionnaire = {"a": 1, "b": 2, "c": 3}
for cle, valeur in dictionnaire.items():
    print(cle, valeur)

C)

dictionnaire = {"a": 1, "b": 2, "c": 3}
for cle in dictionnaire.keys():
    print(cle, dictionnaire[cle])

D) Toutes les réponses précédentes sont correctes

Etape 3 Attendre la saisie de la touche A ou B

Attente de l’appui du bouton A ou bouton B

# Bibliothèques à importer
from microbit import display, button_a, button_b
import time

#Test pour attendre l’appui du bouton A ou B ou time out
def attendre_boutonA_ou_boutonB(delai_attente = 0):
    start = time.ticks_ms()

    # Attente appui sur le bouton A ou bouton B ou au bout d'un time out
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           ((delai_attente == 0) or ((time.ticks_ms()-start) < delai_attente *1000))):
        pass

    while button_a.is_pressed() or button_b.is_pressed():
        pass

affichage(chiffres[3])
attendre_boutonA_ou_boutonB(0)

affichage(chiffres[4])
attendre_boutonA_ou_boutonB(2)

affichage(chiffres[5])
attendre_boutonA_ou_boutonB(delai_attente = 2)

display.clear()

Flasher pour tester puis bouton reset pour lancer


Peux-tu répondre à ce QCM sur l’appel des fonctions Python :

Quelle est la sortie du code suivant ?

def fonction(a, b):
    return a + b
print(fonction(1, 2))
  • A) 1
  • B) 2
  • C) 3
  • D) Erreur

Comment définir une fonction avec un paramètre par défaut ? A)

def fonction(a = 1):
    return a

B)

def fonction(a):
    a = 1
    return a

C)

def fonction():
    a = 1
    return a

D) Toutes les réponses précédentes sont correctes

Comment appeler une fonction avec un argument nommé ?

A)

def fonction(a, b):
    return a + b
print(fonction(a = 1, b = 2))

B)

def fonction(a, b):
    return a + b
print(fonction(1, b = 2))

C)

def fonction(a, b):
    return a + b
print(fonction(a = 1, 2))

D) Toutes les réponses précédentes sont correctes

Comment définir une fonction avec un nombre variable d’arguments ?

A)

def fonction(*args):
    return args

B)

def fonction(args):
    return args

C)

def fonction(**args):
    return args

D) Toutes les réponses précédentes sont correctes

Etape 4 Détection de la saisie du bouton A ou B

Détection du bouton appuyé ou sur un délai d’attente

def attendre_boutonA_ou_boutonB(delai_attente = 0):

    button = "o"
    start = time.ticks_ms()

     # Attente appui sur le bouton A ou bouton B ou au bout d'un time out
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           ((delai_attente == 0) or ((time.ticks_ms()-start) < delai_attente *1000))):
        pass

    if button_a.is_pressed():
        button = "a"

    if button_b.is_pressed():
        button = "b"

    while button_a.is_pressed() or button_b.is_pressed():
        pass

    return button

while True:
    # Test pour afficher un caractère
    affichage(chiffres[3])
    print(attendre_boutonA_ou_boutonB(2))
    display.clear()

Flasher pour tester puis bouton reset pour lancer

Vérifier que vous avez en retour de la fonction dans la fenêtre REPL :

  • a après l’appui du bouton A
  • b après l’appui du bouton B
  • après une attente de plus de 2 secondes

Détection d’un appui long sur la touche A ou B

def attendre_boutonA_ou_boutonB(delai_attente = 0, delai_appui_long = 1500):

    button = "o"
    start = time.ticks_ms()
    start_button = 0

     # Attente appui sur le bouton A ou bouton B ou au bout d'un time out
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           ((delai_attente == 0) or ((time.ticks_ms()-start) < delai_attente *1000))):
        pass

    if button_a.is_pressed():
        button = "a"
        start_button = time.ticks_ms()

    if button_b.is_pressed():
        button = "b"
        start_button = time.ticks_ms()

    while button_a.is_pressed() or button_b.is_pressed():
        pass

    if (start_button > 0) and ((time.ticks_ms()-start_button) > delai_appui_long):
        button = button + "l"
    return button

while True:

    # Test pour afficher un caractère
    affichage(chiffres[3])
    print(attendre_boutonA_ou_boutonB(2))
    display.clear()

Flasher pour tester puis bouton reset pour lancer

Vérifier que vous avez en retour de la fonction dans la fenêtre REPL :

  • a après l’appui du bouton A
  • b après l’appui du bouton B
  • après une attente de plus de 2secondes
  • al après l’appui long sur le bouton A
  • bl après l’appui long sur le bouton B

Test de tous les nombres

nbr=0
while True:
    # Test pour afficher un caractère
    affichage(chiffres[nbr])
    print(attendre_boutonA_ou_boutonB(2))
    nbr += 1
    if nbr >= len(chiffres):
        nbr = 0

Flasher pour tester puis bouton reset pour lancer

En appuyant sur les boutons A ou B tu dois faire défiler les nombres de 0 à 9

Test de tous les opérateurs

nbr=0

# Mettre le dictionnaire des opérateurs en liste
operateurs_list = list(operateurs.items())

while True:
    # Test pour afficher un caractère
    # Utiliser la clé du dictionnaire pour afficher l'opérateur
    affichage(operateurs[operateurs_list[nbr][0]])
    print(attendre_boutonA_ou_boutonB(2))
    nbr += 1
    if nbr >= len(operateurs):
        nbr = 0

Flasher pour tester puis bouton reset pour lancer

En appuyant sur les boutons A ou B tu dois faire défiler les opérateurs de 0 à 9

L’utilisation de fonctions dans un code Python permet d’améliorer la visibilité et la maintenance du code. Voici quelques raisons pour lesquelles cela est vrai :

  1. Structuration du code : Les fonctions permettent de diviser le code en blocs logiques et fonctionnels, ce qui facilite la compréhension du code par les autres développeurs ou par soi-même plus tard. En regroupant les instructions qui effectuent une tâche spécifique dans une fonction, on peut rendre le code plus facile à lire et à comprendre.
  • Réutilisation du code : Les fonctions peuvent être réutilisées dans différentes parties du code, ce qui évite de dupliquer des instructions similaires à plusieurs endroits. Cela permet également de simplifier le code et de réduire les erreurs de copier-coller.
  • Facilité de maintenance : Les fonctions permettent de modifier le code plus facilement. Si une partie du code doit être modifiée, il suffit de modifier la fonction correspondante plutôt que de modifier plusieurs lignes de code dans différentes parties du programme. Cela permet de gagner du temps et de réduire les risques d’introduire de nouvelles erreurs.
  • Amélioration de la visibilité : Les fonctions peuvent être nommées de manière à décrire leur fonctionnalité, ce qui facilite la compréhension du code. En utilisant des noms de fonctions significatifs, on peut rendre le code plus facile à comprendre pour les autres développeurs ou pour soi-même plus tard.
  • Réduction des erreurs : Les fonctions permettent de réduire les erreurs en limitant la portée des variables et en évitant les conflits de noms. En utilisant des variables locales à l’intérieur d’une fonction, on peut éviter les conflits de noms avec des variables globales ou des variables d’autres fonctions.

En résumé, l’utilisation de fonctions permet de structurer le code, de faciliter la réutilisation et la maintenance du code, d’améliorer la visibilité et de réduire les erreurs. Il est donc recommandé d’utiliser des fonctions dans un code Python pour améliorer sa qualité et sa lisibilité.

Etape 5 Afficher une liste de caractères et choix d’un caractère

"""
Choix des chiffres ou des opérateurs
les boutons A et B pour faire défiler les caractères
Appui long sur A ou B pour valider le caractère
"""

def choix_caractere(caracteres, item=0, delai_attente=0, delai_appui_long=1500):
    button = ""
    caractereres_keys = list(caracteres.keys())
    try:
        item = caractereres_keys.index(item)
    except ValueError:
        item=0

    while True:
        if caractereres_keys[item] in caracteres:
            # Affichage du caratère
            affichage(caracteres[caractereres_keys[item]])
            # Attente bouton A ou B
            button = attendre_boutonA_ou_boutonB(delai_attente, delai_appui_long)
            # Défilement des caratères
            if button == "a":
                item -= 1
            if button == "b":
                item += 1
            # Appui long sur A ou B
            if button == "al" or button == "bl":
                return caractereres_keys[item]
            # Délai d'attente dépassé
            if button == "o":
                return None
        if item >= len(caractereres_keys):
            item = 0
        if item < 0:
            item = len(caractereres_keys) - 1

#Tester le défilement des chiffres               
while True:
    print(choix_caractere(chiffres, 0, 5, 1000))

#Tester le défilement des opérateurs
while True:
    print(choix_caractere(operateurs, 0, 5, 1000))

Flasher pour tester puis bouton reset pour lancer

QCM sur les différentes possibilités pour arrêter une boucle infinie while True: utilisée dans une fonction en Python :

Comment arrêter une boucle infinie en utilisant les instructions ?

  • A) En utilisant l’instruction continue
  • B) En utilisant l’instruction return
  • C) En utilisant l’instruction pass
  • D) En utilisant l’instruction break

Comment arrêter une boucle infinie en utilisant une variable de contrôle ?

  • A) En utilisant l’instruction continue
  • B) En utilisant l’instruction break
  • C) En utilisant une variable de contrôle
  • D) En utilisant l’instruction pass

Quelle instruction permet de sauter une itération dans une boucle ?

  • A) L’instruction break
  • B) L’instruction return
  • C) L’instruction pass
  • D) L’instruction continue
# Affichage d'un ascenceur pour les nombres de plusieurs chiffres
def barre_ascenceur(maxi, ascenceur):
    if maxi > 5:
        maxi = 5

    if ascenceur >= maxi:
        ascenceur = maxi - 1

    # Effacement 5éme colonne
    for ligne in range(5):
        display.set_pixel(4, ligne, 0)

    # Affichage de l'ascenceur
    display.set_pixel(4, ascenceur, 5)

#Affichage d’un nombre avec une virgule
# Affichage d’un nombre avec une virgule
def affichage_nombre(nombre, delai_attente=0, delai_appui_long=1500):
    # Convertir le nombre en une chaine de caractère
    nombreString = str(nombre)
    grandeur = len(nombreString)
    ascenceur = 0
    button = ""

    # Affichage du nombre jusqu'à appui long ou hors délai d'attente
    while (not (button == "al") and
           not (button == "bl") and
           not (button == "o")):

        # Affichage d'un caractère du nombre et de l'ascenceur
        if nombreString[ascenceur] == ".":
            affichage(t_point)
        elif nombreString[ascenceur] == "-":
            affichage(t_moins)
        else:
            affichage(chiffres[int(nombreString[ascenceur])])

        barre_ascenceur(grandeur, ascenceur)
        # Attente récation de l'utilisateur
        button = attendre_boutonA_ou_boutonB(delai_attente, delai_appui_long)
        if button == "a":
            ascenceur -= 1
        if button == "b":
            ascenceur += 1
        if ascenceur >= grandeur:
            ascenceur = 0
        if ascenceur < 0 :
            ascenceur = grandeur-1
    return button

# Tester un nombre avec deux chiffres, défilement de l’ascenseur avec les bouton A ou B
# Validation par un appui long               
while True:
    affichage_nombre(-123456.4,0)
    affichage_nombre(-987)
    affichage_nombre(-55.1234)

Etape 6 Afficher un chiffre à virgule

Flasher pour tester puis bouton reset pour lancer

Afficher un nombre avec plusieurs chiffres, avec éventuellement un signe moins, une virgule :

  • Faire défiler le nombre avec les touches A et B
  • Valider le nombre par un appui long sur A ou B
  • Vérifier la présence du signe moins – et la présence de la virgule .

Etape 7 Calcul des différentes opérations arithmétiques de base

# Calcul avec deux nombres
def calcul(nombre1, operateur="=", nombre2=0):
    resultat = 0
    if operateur == "=":
        resultat = nombre1
    if operateur == "+":
        resultat = nombre1 + nombre2
    if operateur == "-":
        resultat = nombre1 - nombre2
    if operateur == "*":
        resultat = nombre1 * nombre2
    if operateur == "/":
        if nombre2 > 0:
            resultat = nombre1 / nombre2
    return resultat

while True:
    # Initialiser
    resultat = calcul(2)
    affichage_nombre(resultat)
    # Additionner
    resultat = calcul(resultat, "+", 4)
    affichage_nombre(resultat)
    # Soustraire
    resultat = calcul(resultat, "-", 4)
    affichage_nombre(resultat)
    # Multiplier
    resultat = calcul(resultat, "*", 2)
    affichage_nombre(resultat)
    # Diviser
    resultat = calcul(resultat, "/", 2)
    affichage_nombre(resultat)
    # Division par zéro impossible
    resultat = calcul(resultat, "/", 0)
    affichage_nombre(resultat)

Flasher pour tester puis bouton reset pour lancer

Vérifier que le calcul est correct après chaque opération :

  • Faire défiler le résultat par les touches A et B
  • Valider le résultat par un appui long sur A ou B

Etape 8 Calculette choix de deux nombres et d’un opérateur

operateur = "+"
while True:
    nombre1 = choix_caractere(chiffres)
    operateur = choix_caractere(operateurs, operateur)
    nombre2 = choix_caractere(chiffres)
    resultat = calcul(nombre1, operateur, nombre2)
    affichage_nombre(resultat)

Flasher pour tester puis bouton reset pour lancer

Les opérateurs +, -, * et / sont respectivement appelés :

  • L’opérateur d’addition (+)
  • L’opérateur de soustraction (-)
  • L’opérateur de multiplication (*)
  • L’opérateur de division (/)

Ces opérateurs sont utilisés pour effectuer des opérations arithmétiques de base sur des nombres en Python. Par exemple :

# Addition
5 + 3  # Résultat : 8

# Soustraction
5 - 3  # Résultat : 2

# Multiplication
5 * 3  # Résultat : 15

# Division
5 / 3  # Résultat : 1.6666666666666667

Il est important de noter que l’opérateur de division (/) renvoie un résultat sous forme de nombre à virgule flottante, même si les nombres utilisés sont des entiers. Pour obtenir un résultat sous forme d’entier, il est possible d’utiliser l’opérateur de division entière (//) :

# Division entière
5 // 3  # Résultat : 1

L’opérateur de division entière renvoie le quotient entier de la division, en arrondissant vers le bas. Le reste de la division peut être obtenu en utilisant l’opérateur de modulo (%) :

# Modulo
5 % 3  # Résultat : 2

L’opérateur de modulo renvoie le reste de la division entière.

Etape 9 Calculette mémorisation des opérations

En Python, une liste est une structure de données qui permet de stocker une collection ordonnée d’éléments. Les éléments d’une liste peuvent être de n’importe quel type (entiers, chaînes de caractères, listes, etc.).

Pour ajouter des éléments à une liste en Python, on peut utiliser la méthode append(). La méthode append() ajoute un élément à la fin de la liste. Voici un exemple :

# Création d'une liste vide
ma_liste = []

# Ajout d'éléments à la liste
ma_liste.append(1)
ma_liste.append(2)
ma_liste.append(3)

# Affichage de la liste
print(ma_liste)  # Résultat : [1, 2, 3]

Dans cet exemple, on crée une liste vide ma_liste. On ajoute ensuite les éléments 1, 2 et 3 à la liste en utilisant la méthode append(). Enfin, on affiche la liste à l’aide de la fonction print(). Le résultat affiché est [1, 2, 3].

Il est également possible d’ajouter plusieurs éléments à une liste en utilisant la méthode extend(). La méthode extend() prend une liste en argument et ajoute tous les éléments de cette liste à la fin de la liste existante. Voici un exemple :

# Création d'une liste
ma_liste = [1, 2, 3]

# Ajout de plusieurs éléments à la liste
ma_liste.extend([4, 5, 6])

# Affichage de la liste
print(ma_liste)  # Résultat : [1, 2, 3, 4, 5, 6]

Dans cet exemple, on crée une liste ma_liste contenant les éléments 1, 2 et 3. On ajoute ensuite les éléments 4, 5 et 6 à la liste en utilisant la méthode extend(). Enfin, on affiche la liste à l’aide de la fonction print(). Le résultat affiché est [1, 2, 3, 4, 5, 6].

def saisie_operation():
    operation = []
    item = 0
    retour = 0

    operateur = "+"
    while ((retour is not None) and
            (retour != "=")):
        item += 1
        resultat = None
        # Saisie de l'opération nombre opérateur nombre ... jusqu'au égal =
        if item % 2 == 0:
            retour = choix_caractere(operateurs, operateur,
                                     delai_attente=60,
                                     delai_appui_long=700)

            if retour :
                operateur = retour
        else:
            retour = choix_caractere(chiffres,
                                     delai_attente=60,
                                     delai_appui_long=700)

        if retour :
            operation.append(retour)

    if retour :
        return operation
    else:      
        return None

while True:
    # Saisie de l’opération   
    print(saisie_operation())

Flasher pour tester puis bouton reset pour lancer et visualise le résultat dans REPL

  1. Fait le choix des nombres par les touches A et B puis valide le nombre par un appui long par les touches A ou B
  2. Puis fait le choix de l’opérateur de ton opération par les touches A et B puis valide par un appui long par les touches A ou B
  3. Valide ton calcul par le choix de l’opérateur « = » par un appui long sur A ou B
  4. Vérifie ton calcul dans la console REPL

Etape 10 Affichage du résultat de l’opération

def affichage_calcul(operation):
    resultat = 0
    if operation :
        item = 0
        for operande in operation:
            item += 1
            if item % 2 == 0:
                operateur = operande
                affichage(operateurs[operateur])
                attendre_boutonA_ou_boutonB(1)
            else:
                affichage(chiffres[operande])
                attendre_boutonA_ou_boutonB(1)
                # Calcul de l'opération
                if item == 1 :
                    resultat = calcul(operande)
                else:
                    resultat = calcul(resultat, operateur, operande)
    return resultat

button = ""   
while True:
    # Saisie de l'opération
    operation = saisie_operation()
    # Affichage de l'opération et calcul de l'opération
    if operation :
        # Affichage et calcul de l'opération
        resultat = affichage_calcul(operation)
        # Affichage du résultat
        button = affichage_nombre(resultat,
                         delai_attente=60,
                         delai_appui_long=700)

    if operation is None or button == "o" :
        # Mise en veille
        display.clear()
        attendre_boutonA_ou_boutonB()

Flasher pour tester puis bouton reset pour lancer

QCM sur les différentes possibilités d’ajouter des éléments dans une liste en Python :

Comment ajouter un élément à la fin d’une liste en Python ?

  • A) En utilisant la méthode add() 
  • B) En utilisant la méthode insert() 
  • C) En utilisant la méthode append() 
  • D) En utilisant la méthode extend()

Comment ajouter plusieurs éléments à la fin d’une liste en Python ?

  • A) En utilisant la méthode add() 
  • B) En utilisant la méthode insert() 
  • C) En utilisant la méthode append() 
  • D) En utilisant la méthode extend()

Comment ajouter un élément à une position spécifique dans une liste en Python ?

  • A) En utilisant la méthode add() 
  • B) En utilisant la méthode insert() 
  • C) En utilisant la méthode append() 
  • D) En utilisant la méthode extend()

Comment ajouter une liste à une autre liste en Python ?

  • A) En utilisant la méthode add() 
  • B) En utilisant la méthode insert() 
  • C) En utilisant la méthode append() 
  • D) En utilisant la méthode extend()

Comment ajouter un élément au début d’une liste en Python ?

  • A) En utilisant la méthode add() avec l’index 0.
  • B) En utilisant la méthode insert() avec l’index 0.
  • C) En utilisant la méthode append() avec l’index 0.
  • D) En utilisant la méthode extend()avec l’index 0.

Exemple pour comprendre :

liste1= [1,2,3,4]

liste2= [10,11,12,13]

liste1.append(6)

liste1.extend([7,8,9])

liste1.insert(4,5)

liste1.extend(liste2)

liste1.insert(0,0)

print(liste1)

Etape 11 Sonoriser ta calculette

La sonorisation des logiciels est un domaine de recherche qui vise à améliorer l’interaction entre l’utilisateur et le logiciel en utilisant des sons. Les sons peuvent être utilisés pour fournir des commentaires à l’utilisateur sur ses actions, pour signaler des événements importants ou pour renforcer la compréhension de l’interface utilisateur.

from microbit import display, button_a, button_b
import time
import music

def attendre_boutonA_ou_boutonB(delai_attente=0, delai_appui_long=1500):
    button = "o"
    start = time.ticks_ms()
    start_button = 0
    # Attente appui sur le bouton A ou bouton B ou au bout d'un time out
    while (
        not (button_a.is_pressed())
        and not (button_b.is_pressed())
        and ((delai_attente == 0) or ((time.ticks_ms() - start) < delai_attente * 1000))
    ):
        pass

    if button_a.is_pressed():
        button = "a"
        start_button = time.ticks_ms()

    if button_b.is_pressed():
        button = "b"
        start_button = time.ticks_ms()

    premierefois = True

    while button_a.is_pressed() or button_b.is_pressed():
        if ((time.ticks_ms() - start_button) > delai_appui_long):
            music.pitch(200, duration=40)
        else:
            if premierefois:
                music.pitch(500, duration=20)
                premierefois = False

    if (start_button > 0) and ((time.ticks_ms() - start_button) > delai_appui_long):
        button = button + "l"
        return button

    return button

Flasher pour tester puis bouton reset pour lancer

Voici quelques raisons pour lesquelles la sonorisation des logiciels peut être importante pour améliorer l’utilisation par l’humain des logiciels :

  1. Fournir des commentaires auditifs : Les sons peuvent être utilisés pour fournir des commentaires auditifs à l’utilisateur sur ses actions. Par exemple pour confirmer l’appui sur un bouton.
  2. Renforcer la compréhension de l’interface utilisateur : Les sons peuvent être utilisés pour renforcer la compréhension de l’interface utilisateur en fournissant des indices auditifs sur la fonctionnalité des différents éléments de l’interface. Par exemple lors de la confirmation d’un appui long sur un bouton.
  3. Signaler des événements importants : Les sons peuvent être utilisés pour signaler des événements importants dans le logiciel. Par exemple sur une erreur de saisie, indique par exemple l’erreur de la division par zéro.
  4. Améliorer l’accessibilité : Les sons peuvent être utilisés pour améliorer l’accessibilité des logiciels pour les personnes malvoyantes ou non voyantes. Les sons peuvent être utilisés pour fournir des commentaires auditifs sur les actions de l’utilisateur, pour décrire les éléments de l’interface utilisateur et pour signaler des événements importants. Les sons peuvent également être utilisés pour fournir une alternative auditive aux informations visuelles. Essaye de rendre la calculette utilisable par une personne non voyante ?

En résumé, la sonorisation des logiciels peut aider à améliorer l’interaction entre l’utilisateur et le logiciel en fournissant des commentaires auditifs, en renforçant la compréhension de l’interface utilisateur, en signalant des événements importants et en améliorant l’accessibilité. Les sons peuvent être utilisés pour fournir des informations supplémentaires à l’utilisateur, pour renforcer la compréhension de l’interface utilisateur et pour améliorer l’expérience utilisateur globale.

# Bibliothèques à importer
from microbit import display, button_a, button_b
import time

t_zero = [
    [0, 9, 9, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 9, 9, 0]]

t_un = [
    [0, 0, 9, 0, 0],
    [0, 9, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 9, 9, 0]]

t_deux = [
    [0, 9, 9, 0, 0],
    [9, 0, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 9, 9, 9, 0]]

t_trois = [
    [0, 9, 9, 0, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 0, 0]]

t_quatre = [
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 9, 9, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0]]

t_cinq = [
    [0, 9, 9, 9, 0],
    [0, 9, 0, 0, 0],
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 0, 0]]

t_six = [
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 9, 9, 0, 0],
    [9, 0, 0, 9, 0],
    [0, 9, 9, 0, 0]]

t_sept = [
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0]]

t_huit = [
    [0, 0, 9, 0, 0],
    [0, 9, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 9, 0],
    [0, 0, 9, 0, 0]]

t_neuf = [
    [0, 9, 9, 9, 0],
    [0, 9, 0, 9, 0],
    [0, 9, 9, 9, 0],
    [0, 0, 0, 9, 0],
    [0, 9, 9, 0, 0]]

# Tableaux pour afficher les opérateurs =,+,-,/,*
t_egal = [
    [0, 0, 0, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 0, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 0, 0, 0]]

t_plus = [
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 9, 0, 0],
    [0, 0, 9, 0, 0]]

t_moins = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [9, 9, 9, 9, 9],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0]]

t_div = [
    [0, 0, 0, 0, 9],
    [0, 0, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 0, 0],
    [9, 0, 0, 0, 0]]

t_multiple = [
    [9, 0, 0, 0, 9],
    [0, 9, 0, 9, 0],
    [0, 0, 9, 0, 0],
    [0, 9, 0, 9, 0],
    [9, 0, 0, 0, 9]]

# Tableaux pour afficher un séparateur
t_point = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 9, 9, 9, 0],
    [0, 9, 9, 9, 0],
    [0, 9, 9, 9, 0]]

# Tableau de tous les nombres# Tableau de la liste des chiffres de 0 à 9
chiffres = {
    0: t_zero,
    1: t_un,
    2: t_deux,
    3: t_trois,
    4: t_quatre,
    5: t_cinq,
    6: t_six,
    7: t_sept,
    8: t_huit,
    9: t_neuf,
    }

# Tableau de tous les opérateurs
operateurs = {"=": t_egal, "+": t_plus, "-": t_moins, "*": t_multiple, "/": t_div}

# Affichage d’un caractère en utilisant le tableau de LEDs
def affichage(caractere):
    num_ligne = 0
    # Affichage des lignes
    for ligne in caractere:
        num_colonne = 0
        # Affichage des colonnes
        for led in ligne:
            display.set_pixel(num_colonne, num_ligne, led)
            num_colonne += 1
        num_ligne += 1

# Test pour attendre l’appui du bouton A ou B ou time out
def attendre_boutonA_ou_boutonB(delai_attente=0,
        delai_appui_long=1500):
    button = "o"
    start = time.ticks_ms()
    start_button = 0

    # Attente appui sur le bouton A ou bouton B ou au bout d'un time out
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           ((delai_attente == 0) or
           ((time.ticks_ms() - start) < delai_attente * 1000))):
        pass

    if button_a.is_pressed():
        button = "a"
        start_button = time.ticks_ms()

    if button_b.is_pressed():
        button = "b"
        start_button = time.ticks_ms()

    while button_a.is_pressed() or button_b.is_pressed():
        pass

    if (start_button > 0) and ((time.ticks_ms()-start_button) > delai_appui_long):
        button = button + "l"

    return button

"""
Choix des chiffres ou des opérateurs
les boutons A et B pour faire défiler les caractères
Appui long sur A ou B pour valider le caractère
"""

def choix_caractere(caracteres,
        item=0,
        delai_attente=0,
        delai_appui_long=1500):

    button = ""
    caractereres_keys = list(caracteres.keys())
    try:
        item = caractereres_keys.index(item)
    except ValueError:
        item = 0

    while True:
        if caractereres_keys[item] in caracteres:
            # Affichage du caratère
            affichage(caracteres[caractereres_keys[item]])
            # Attente bouton A ou B
            button = attendre_boutonA_ou_boutonB(delai_attente, delai_appui_long)
            # Défilement des caratères
            if button == "a":
                item -= 1
            if button == "b":
                item += 1
            # Appui long sur A ou B
            if button == "al" or button == "bl":
                return caractereres_keys[item]
            # Délai d'attente dépassé
            if button == "o":
                return None

        if item >= len(caractereres_keys):
            item = 0
        if item < 0:
            item = len(caractereres_keys) - 1

# Affichage d'un ascenceur pour les nombres de plusieurs chiffres
def barre_ascenceur(maxi, ascenceur):
    if maxi > 5:
        maxi = 5

    if ascenceur >= maxi:
        ascenceur = maxi - 1

    # Effacement 5éme colonne
    for ligne in range(5):
        display.set_pixel(4, ligne, 0)

    # Affichage de l'ascenceur
    display.set_pixel(4, ascenceur, 5)

# Affichage d’un nombre avec une virgule
def affichage_nombre(nombre,
    delai_attente=0,
    delai_appui_long=1500):

    # Convertir le nombre en une chaine de caractère
    nombreString = str(nombre)
    grandeur = len(nombreString)
    ascenceur = 0
    button = ""

    # Affichage du nombre jusqu'à appui long ou hors délai d'attente
    while (not (button == "al") and
           not (button == "bl") and
           not (button == "o")):

        # Affichage d'un caractère du nombre et de l'ascenceur
        if nombreString[ascenceur] == ".":
            affichage(t_point)
        elif nombreString[ascenceur] == "-":
            affichage(t_moins)
        else:
            affichage(chiffres[int(nombreString[ascenceur])])

        barre_ascenceur(grandeur, ascenceur)

        # Attente récation de l'utilisateur
        button = attendre_boutonA_ou_boutonB(delai_attente, delai_appui_long)
        if button == "a":
            ascenceur -= 1
        if button == "b":
            ascenceur += 1
        if ascenceur >= grandeur:
            ascenceur = 0
        if ascenceur < 0 :
            ascenceur = grandeur-1

    return button

# Calcul avec deux nombres
def calcul(nombre1, operateur="=", nombre2=0):

    resultat = 0
    if operateur == "=":
        resultat = nombre1

    if operateur == "+":
        resultat = nombre1 + nombre2

    if operateur == "-":
        resultat = nombre1 - nombre2

    if operateur == "*":
        resultat = nombre1 * nombre2

    if operateur == "/":
        if nombre2 > 0:
            resultat = nombre1 / nombre2

    return resultat

def saisie_operation():
    operation = []
    item = 0
    retour = 0
    operateur = "+"
    while ((retour is not None) and
            (retour != "=")):
        item += 1
        resultat = None

        # Saisie de l'opération nombre opérateur nombre ... jusqu'au égal =
        if item % 2 == 0:
            retour = choix_caractere(operateurs, operateur,
                                     delai_attente=60,
                                     delai_appui_long=700)
            if retour :
                operateur = retour
        else:
            retour = choix_caractere(chiffres,
                                     delai_attente=60,
                                     delai_appui_long=700)
        if retour :
            operation.append(retour)

    if retour :
        return operation
    else:      
        return None

def affichage_calcul(operation):
    resultat = 0
    if operation :
        item = 0
        for operande in operation:
            item += 1
            if item % 2 == 0:
                operateur = operande
                affichage(operateurs[operateur])
                attendre_boutonA_ou_boutonB(1)
            else:
                affichage(chiffres[operande])
                attendre_boutonA_ou_boutonB(1)
                # Calcul de l'opération
                if item == 1 :
                    resultat = calcul(operande)
                else:
                    resultat = calcul(resultat, operateur, operande)

    return resultat

button = ""   
while True:
    # Saisie de l'opération
    operation = saisie_operation()
    # Affichage de l'opération et calcul de l'opération
    if operation :
        # Affichage et calcul de l'opération
        resultat = affichage_calcul(operation)
        # Affichage du résultat
        button = affichage_nombre(resultat,
                         delai_attente=60,
                         delai_appui_long=700)

    if operation is None or button == "o" :
        # Mise en veille
        display.clear()
        attendre_boutonA_ou_boutonB()
Catégories
MICRO PYTHON MICRO:BIT

Eclairage vélo

Objectif :

Réalisation d’un programme pour gérer un éclairage arrière personnalisable d’un vélo.

Tu apprendras l’utilisation des boucles For, l’importation des bibliothèques, l’utilisation des tableaux (liste) en python.

Mission :

  • Affichage d’une animation fixe.
  • Affichage d’une animation dynamique
  • Accélération de l’animation par le bouton A
  • Allumer ou éteindre l’animation par le bouton B

A découvrir avant de commencer : l’instruction For

En Python, la boucle for est utilisée pour itérer sur une séquence d’éléments tels qu’une liste, une chaîne de caractères, un tuple, un dictionnaire, etc. La boucle for exécute un bloc de code pour chaque élément de la séquence, jusqu’à ce que tous les éléments aient été parcourus.

for element in sequence:

    # Bloc de code à exécuter

Une explication pour chaque élément de la syntaxe :

  • Le mot-clé for est utilisé pour déclarer la boucle for.
  • element est une variable qui représente l’élément en cours d’itération dans la séquence. Tu peux choisir n’importe quel nom valide pour cette variable.
  • Le mot-clé in est utilisé pour spécifier la séquence sur laquelle itérer.
  • sequence est la séquence (liste, chaîne de caractères, tuple, etc.) sur laquelle la boucle for va itérer.
  • Le bloc de code qui suit le : est indenté et sera exécuté pour chaque élément de la séquence.

Voici un exemple simple pour illustrer son fonctionnement :

liste = [1, 2, 3, 4, 5]

for nombre in liste:

    print(nombre)  # Affiche chaque nombre de la liste

Utilise les indications suivantes pour réaliser ton premier programme. Reproduit le code en caractère GRAS avec l’icône « REPL »

Dans cet exemple, la boucle for itère sur chaque élément de la liste liste. À chaque itération, la variable nombre prend la valeur de l’élément en cours d’itération, puis le bloc de code indenté est exécuté, qui dans ce cas affiche le nombre. La boucle for se répète jusqu’à ce que tous les éléments de la liste aient été parcourus.

Il est également courant d’utiliser la fonction range() en conjonction avec la boucle for pour itérer sur une séquence de nombres. Par exemple :

for i in range(1, 6):

    print(i)  # Affiche les nombres de 1 à 5

Dans cet exemple, range(1, 6) génère une séquence de nombres de 1 à 5 (la borne supérieure spécifiée est exclusive). La boucle for itère sur chaque nombre de cette séquence, assigne la valeur à la variable i, puis exécute le bloc de code indenté.

QCM sur l’instruction FOR

Question 1 : Quelle est la principale utilité de l’instruction « for » en programmation ?

  1. Déclarer une fonction
  2. Répéter une séquence d’instructions un nombre fixe de fois
  3. Gérer les exceptions
  4. Établir une condition logique

Question 2 : Comment se structure généralement une boucle « for » en Python ?

  1. for (int i = 0; i < 5; i++)
  2. for i in range(5):
  3. loop (i = 0; i < 5; i++)
  4. repeat i in range(5):

Question 3 : Quelle est la fonction de la fonction intégrée range() utilisée fréquemment avec une boucle « for » en Python ?

  1. Générer une liste de nombres
  2. Calculer la moyenne d’une série de nombres
  3. Vérifier la présence d’un élément dans une liste
  4. Créer une chaîne de caractères

Question 4 : Comment peut-on sortir prématurément d’une boucle « for » en utilisant l’instruction « break » ?

  1. break for
  2. break loop
  3. exit for
  4. break

Question 5 : Quel mot-clé est utilisé pour passer à l’itération suivante dans une boucle « for » sans exécuter le reste du code à l’intérieur de la boucle ?

  1. pass
  2. skip
  3. continue
  4. next

Mu est un éditeur de code spécialement conçu pour les microcontrôleurs et plus particulièrement la carte micro :bit.

Utilise le menu « Mode » dans Mu pour choisir « BBC micro ».

Ainsi, tu pourras flasher directement ton programme sur la carte micro.

Choisis de créer un nouveau fichier pour ton programme en cliquant sur « + nouveau », puis demande à enregistrer ton fichier sous le nom de ton choix en utilisant l’option « Enregistrer ».

from microbit import display

Une bibliothèque en Python est comme une boîte à outils magique pleine de fonctions spéciales que tu peux utiliser pour rendre ton programme plus puissant. Plutôt que de tout créer depuis zéro, tu peux simplement emprunter des outils déjà créés par d’autres personnes.

Pour utiliser une bibliothèque, tu dois l’importer dans ton programme. C’est comme si tu vas à la bibliothèque emprunter un livre pour le lire. En Python, nous utilisons le mot clé import pour faire cela.

Tu vas utiliser deux bibliothèques une pour gérer ton robot et une autre pour gérer le temps.

#Double boucle pour afficher l’éclairage

for c in range(0, 5, 1):
for l in range(0, 5, 1):
      display.set_pixel(c, l, 9)

 Flasher puis bouton reset pour lancer puis vérifie que toutes les LEDs s’affichent

from microbit import display
import time
#Boucle sur la colonne pour afficher une LED
for c in range(0, 5, 1):
    #Boucle sur la ligne pour afficher une LED
    for l in range(0, 5, 1):
        #Attente de 300 millisecondes avant affichage de la LED
        time.sleep_ms(300)
        #Affichage de la LED
        display.set_pixel(c, l, 9)

Flasher puis bouton reset puis regarde comment fonctionne les LEDs

Amuse-toi en changeant les valeurs des boucles !!!

  • for c in range(2, 5, 1):
  • for c in range(0, 3, 1):
  • for c in range(0, 5, 2):
  • for l in range(2, 5, 1):
  • for l in range(0, 3, 1):
  • for l in range(0, 5, 2):

 Flasher puis bouton reset entre chaque essai

Question 1 : Comment peut-on importer une bibliothèque entière en Python ?

  1. import microbit
  2. include microbit
  3. import mocrobit as lib
  4. import microbit

Question 2 : Quelle est la méthode recommandée pour importer uniquement une fonction spécifique d’une bibliothèque en Python ?

  1. import display from microbit
  2. from microbit import display
  3. include display from microbit
  4. import microbit.display

Question 3 : Comment peut-on vérifier l’existence d’une bibliothèque dans l’éditeur MU ?

  1. Vérification manuelle dans le répertoire Python
  2. Import library, puis vérification avec la fonction library.check()
  3. Utiliser la commande pip show library dans le terminal
  4. Vérification avec le bouton du menu « REPL » puis saisir import microbit

Question 4 : Comment connaitre toutes les fonctions d’une bibliothèque dans l’éditeur MU ?

  1. List microbit.Image
  2. print microbit.Image
  3. dir(microbit.Image)
  4. show(microbit.Image )
from microbit import display, button_a, button_b

while not(button_a.is_pressed()) and not(button_b.is_pressed()):
            pass

while button_a.is_pressed() or button_b.is_pressed():
            pass

L’instruction while permet de répéter un ensemble d’instructions tant qu’une condition donnée est vraie. Elle est très utile lorsque tu as besoin d’exécuter le même code à plusieurs reprises sans avoir à le réécrire plusieurs fois.

while condition:
    # Code à exécuter tant que la condition est vraie

#Effacement de l’écran
display.clear()

Flasher puis bouton reset et vérifie que l’écran s’éteint après l’appui sur le bouton A ou B

display.set_pixel(…) et button_a.is_pressed() sont des objets de la bibliothèque microbit La première permet d’allumer ou éteindre une LED, la deuxième permet de contrôler les boutons A et B

L’instruction print est un outil précieux pour le débogage en programmation. Elle permet d’afficher des informations spécifiques à un moment donné de l’exécution du programme, ce qui permet de comprendre ce qui se passe dans ton code. Voici pourquoi elle est utile et comment l’utiliser pour le débogage :

Intérêt d’utiliser l’instruction print pour le débogage :

  1. Visualisation des données : La principale utilité de print est d’afficher des valeurs de variables, des résultats intermédiaires, ou des messages pour comprendre comment votre programme évolue pendant son exécution.
  2. Vérification des états : Vous pouvez utiliser print pour vérifier l’état des variables à différents points de votre code, ce qui te permet de confirmer que les valeurs sont correctes ou de repérer des erreurs potentielles.
  3. Traçage de l’exécution : En insérant des déclarations print aux différentes étapes de votre programme, tu peux « tracer » l’exécution du code et suivre son flux pour identifier les erreurs ou les incohérences.

Un exemple :

a = 10
print("La valeur de 'a' est :", a)

Tu veux rendre l’éclairage arrière de ton vélo super cool et dynamique !

Pour cela, tu veux créer un programme avec la carte micro:bit. Voici ce que ton éclairage puisse faire :

  1. Choisir ton Animation : Tu veux pouvoir appuyer sur le bouton A pour changer le style de l’éclairage. Chaque fois que tu appuies, l’éclairage passe à une nouvelle animation dynamique.
  2. Mettre en Veille : Si tu veux éteindre l’éclairage (peut-être quand tu es à l’arrêt ou que tu n’en as pas besoin), tu appuies sur le bouton B.
  3. Automatique : si la lumière du jour est trop forte ou si tu n’as pas bougé pendant un moment, l’éclairage doit se mette en veille tout seul pour économiser.

Maintenant, imagine les animations magiques que tu veux ! Ça pourrait être des clignotements, des pulsations ou même un effet de fondu. Quand tu as une idée, tu peux réaliser ton programme pour rendre ton vélo encore plus génial !

Objectif de la Mission : Programmer ton éclairage pour allumer toutes les LEDs en une seule fois.

#Bibliothèques à utiliser
from microbit import display, button_a, button_b
import time

Une fonction en programmation est une manière de regrouper un ensemble d’instructions pour effectuer une tâche spécifique.

def ma_fonction():
    # Corps de la fonction

C’est ainsi tu écris et utilises des fonctions en Python. Elles te permettent d’organiser ton code, de le rendre plus lisible et de le rendre plus réutilisable.

#Fonction pour l'affichage du tableau de LEDs
def affichage():
    for c in range(0, 5, 1):
        for l in range(0, 5, 1):
            time.sleep_ms(300)
            display.set_pixel(c, l, 9)

while True:
    #Appel de la fonction d'affichage
    affichage()
    #Attente de l'appui du bouton A ou B
    while not(button_a.is_pressed()) and not(button_b.is_pressed()):
        pass
    while button_a.is_pressed() or button_b.is_pressed():
        pass

    #Effacement de l'écran
    display.clear()

 Flasher puis bouton reset et constate l’animation.

En Python, les tableaux sont appelés des listes, et ils permettent de stocker une collection ordonnée d’éléments. Les listes peuvent contenir des valeurs de différents types tels que des entiers, des flottants, des chaînes de caractères, et même d’autres listes.

Création d’une liste : Pour créer une liste, tu utilises des crochets [] puis tu sépares les éléments de la liste par des virgules. Par exemple :

liste = [1, 2, 3, 4, 5]

Accès aux éléments d’une liste : Les éléments d’une liste sont accessibles par leur indice, qui commence à 0 pour le premier élément. Tu peux utiliser cet indice entre crochets [] pour accéder à un élément spécifique. Par exemple :

premier_element = liste[0]  # Accès au premier élément
deuxieme_element = liste[1]  # Accès au deuxième élément
print(premier_element)
print(deuxieme_element)

Modification d’un élément de liste : Les éléments d’une liste sont mutables, ce qui signifie qu’ils peuvent être modifiés. Tu peux assigner une nouvelle valeur à un élément spécifique en utilisant son indice. Par exemple :

liste[0] = 10  # Modification du premier élément
print(liste[0])

Longueur d’une liste : Tu peux obtenir la taille (le nombre d’éléments) d’une liste en utilisant la fonction len(). Par exemple :

taille = len(liste)  # Renvoie la taille de la liste
print(taille)

Opérations sur les listes : Les listes en Python offrent de nombreuses opérations utiles, telles que l’ajout d’éléments avec append(), l’insertion d’éléments avec insert(), la suppression d’éléments avec remove() ou del, la concaténation de listes avec +, etc. Tu peux également utiliser des boucles pour itérer sur les éléments d’une liste.

Voici un exemple illustrant certains de ces concepts :

liste = [1, 2, 3, 4, 5]  # Création d'une liste
print(liste[0])  # Affiche le premier élément (1)

liste[2] = 10  # Modification du troisième élément
print(len(liste))  # Affiche la taille de la liste (5)

liste.append(6)  # Ajout d'un nouvel élément (6) à la fin de la liste

for element in liste:
    print(element)  # Affiche chaque élément de la liste

print(len(liste))  # Affiche la taille de la liste (6)

Objectif de la Mission : Programmer ton éclairage pour allumer toutes les LEDs avec l’aide d’un tableau python !

Tu vass utiliser un tableau contenant des chiffres qui correspondent à l’état des LEDs. Ainsi, quand tu changes ces chiffres, tu contrôles la lumière de ton vélo !

from microbit import display, button_a, button_b
import time

# Tableau pour décrire le tableau des LEDs
affichageFixe_1 = [[9, 7, 5, 7, 9],
                   [7, 1, 1, 1, 7],
                   [5, 1, 9, 1, 5],
                   [7, 1, 1, 1, 7],
                   [9, 7, 5, 7, 9]]

# Fonction pour l'affichage du tableau de LEDs
def affichage(animation,vitesse=300):
    l = 0
    for ligne in animation:
        c = 0
        for led in ligne:
            time.sleep_ms(vitesse)
            display.set_pixel(c, l, led)
            c+= 1
        l+= 1

while True:
    # Appel de la fonction d'affichage
    affichage(affichageFixe_1,50)
    # Attente de l'appui du bouton A ou B
    while not(button_a.is_pressed()) and not(button_b.is_pressed()):
        pass

    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Effacement de l'écran
    display.clear()

 Flasher puis bouton reset et change les valeurs dans le tableau : affichageFixe_1 !!

Objectif de la Mission : Programmer plusieurs tableaux pour créer une animation dynamique !

from microbit import display, button_a, button_b
import time

# Tableau pour décrire le tableau des LEDs
affichageFixe_1 = [[9, 7, 5, 7, 9],
                   [7, 1, 1, 1, 7],
                   [5, 1, 9, 1, 5],
                   [7, 1, 1, 1, 7],
                   [9, 7, 5, 7, 9]]

affichageFixe_2 = [[0, 0, 9, 0, 0],
                   [0, 0, 9, 0, 0],
                   [9, 9, 9, 9, 9],
                   [0, 0, 9, 0, 0],
                   [0, 0, 9, 0, 0]]

affichageFixe_3 = [[9, 0, 0, 0, 9],
                   [0, 9, 0, 9, 0],
                   [0, 0, 9, 0, 0],
                   [0, 9, 0, 9, 0],
                   [9, 0, 0, 0, 9]]

affichageDynamique = [affichageFixe_1,
                      affichageFixe_2,
                      affichageFixe_3]

# Fonction pour l'affichage du tableau de LEDs
def affichage(animation, vitesse=300):
    l = 0
    for ligne in animation:
        c = 0
        for led in ligne:
            time.sleep_ms(vitesse)
            display.set_pixel(c, l, led)
            c += 1
        l += 1
animation = 0

while True:
    # Appel de la fonction d'affichage
    affichage(affichageDynamique[animation], 10)
    # Attente de l'appui du bouton A ou B
    while not(button_a.is_pressed()) and not(button_b.is_pressed()):
        pass

    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Effacement de l'écran
    display.clear()
    animation += 1

    if animation >= (len(affichageDynamique)):
        animation = 0

 Flasher puis bouton reset et créer ton affichage dynamique !! 

Objectif de la Mission : Gère dans ton tableau d’animation des temps pour l’affichage des LEDs pour des animations spectaculaires !

affichageDynamique = [[affichageFixe_1, 10],
                      [affichageFixe_2, 200],
                      [affichageFixe_3, 500]]

def affichage(animation, vitesse=300):
    l = 0
    for ligne in animation:
        c = 0
        for led in ligne:
            if led > 0 :
                time.sleep_ms(vitesse)
            display.set_pixel(c, l, led)
            c += 1
        l += 1

et dans le corps principal du programme :

    affichage(affichageDynamique[animation][0],affichageDynamique[animation][1]) 

Flasher puis bouton reset

Question 1 : Quel est le terme utilisé en Python pour désigner une structure de données ordonnée qui peut contenir différents types d’éléments ?

  1. Ensemble
  2. Liste
  3. Dictionnaire
  4. Tuple

Question 2 : Comment créer une liste vide en Python ?

  1. list()
  2. empty_list()
  3. []
  4. new List()

Question 3 : Comment accéder au deuxième élément d’une liste en Python (en supposant que l’index commence à 0) ?

  1. list[1]
  2. list(2)
  3. list[2]
  4. list.second()

Question 4 : Comment déclarer une liste de listes ?

  1. [[],[],[]…]
  2. {(),(),()…}
  3. new List(new List, new List …)
  4. ((),(),()…)

Question 5 : Comment accéder au deuxième élément d’une liste en Python qui est elle-même dans la troisième occurrence d’une liste (en supposant que les index des listes commencent à 0) ?

  1. List[2][1]
  2. list(2,1)
  3. list[3][2]
  4. list[3,1]

Objectif de la Mission : Programme l’enchainement dynamique des tableaux lumineux en utilisant la bibliothèque time et en créant un chronomètre de temps pour gérer la durée d’affichage d’un écran.

# Départ du chronomètre       
def start_chronometre(temps):
    global start
    global chrono
    start = time.ticks_ms()
    chrono = temps

# Si temps du chronomètre écoulé   
def chronometre():
    if time.ticks_ms() - start > chrono :
        return True
    else:
        return False

animation = 0
while True:
    # Appel de la fonction d'affichage
    affichage(affichageDynamique[animation][0], affichageDynamique[animation][1])
    start_chronometre(1000)

    # Attente de l'appui du bouton A ou B ou le chronometre
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           not (chronometre())):
        pass

    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Effacement de l'écran
    display.clear()
    animation += 1
    if animation >= (len(affichageDynamique)):
        animation = 0

 Flasher puis bouton reset

Les variables globales en programmation avec Python sont des variables qui sont définies en dehors de toute fonction et qui peuvent être utilisées à n’importe quel endroit du programme. Elles sont accessibles de manière globale, d’où leur nom.

Tu peux utiliser des variables globales lorsque tu as besoin de partager des données entre plusieurs parties de ton programme et que ces données ont une signification globale. Cependant, évite de les utiliser pour des données temporaires ou des valeurs qui ne sont pertinentes que dans des parties spécifiques de ton code. Cela aidera à rendre ton code plus lisible et à éviter des erreurs potentielles.

Si la même information est utilisée dans plusieurs fonctions, une variable globale peut être pratique. Cela évite de passer la valeur en paramètre à chaque appel de fonction.

Si tu as une valeur constante qui reste la même tout au long du programme, tu peux la définir comme une variable globale plutôt que de la répéter à chaque fois dans différentes fonctions.

Objectif de la Mission : Programme pour que le temps d’affichage d’un écran soit variable et que l’on puisse le programmer dans le tableau d’affichage dynamique.

affichageDynamique = [[affichageFixe_1, 10,1000],
                      [affichageFixe_2, 200,5000],
                      [affichageFixe_3, 500,10000]]

 start_chronometre(affichageDynamique[animation][2])

 Flasher puis bouton reset

Objectif de la Mission : Donne la possibilité de créer plusieurs animations et que l’utilisateur puisse changer d’animation avec le bouton A.

"""
Enchainement de plusieurs affichages fixes :
 - affichage fixe
 - temps de l'affichage des LEDs de l'affichage fixe
 - temps entre chaque affichage fixe
"""

affichageDynamique_1 = [[affichageFixe_1, 10, 1000],
   [affichageFixe_2, 200, 5000],
   [affichageFixe_3, 500, 10000]]

affichageDynamique_2 = [[affichageFixe_3, 2, 100],
   [affichageFixe_2, 2, 100]]

affichageDynamique_3 = [[affichageFixe_1, 2, 1000],
   [affichageFixe_2, 2, 1000]]

# Liste des affichages dynamiques
affichageDynamique = [affichageDynamique_1, affichageDynamique_2, affichageDynamique_3]

animation = 0
choix = 0
while True:
    # Appel de la fonction d'affichage
    affichage(affichageDynamique[choix][animation][0],
              affichageDynamique[choix][animation][1])
    start_chronometre(affichageDynamique[choix][animation][2])

    # Attente de l'appui du bouton A ou B ou le chronometre
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           not (chronometre())):
        pass

    # Changement du choix de l'animation dynamique
    if button_a.is_pressed():
        choix += 1
        animation = 0

    if choix >= (len(affichageDynamique)):
        choix = 0

    # Attente du bouton relâché
    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Effacement de l'écran
    display.clear()

    # Progression de l'animation de l'affichage dynamique
    animation += 1
    if animation >= (len(affichageDynamique[choix])):
        animation = 0

 Flasher puis bouton reset

Objectif de la Mission : Par le bouton B, l’utilisateur met le dispositif en veille, puis par l’appui du bouton  A ou B l’utilisateur réveille le dispositif.

# Mise en veille du dispositif attendre un appui sur les touches A ou B
def mettre_en_veille():
    display.clear()
    # Attentre que les boutons A et B soient relachés
    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Attentre l’appui d’un bouton A ou A pour le réveil du dispositif
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed())):
        pass

animation = 0
choix = 0
mettre_en_veille()

while True:
    # Appel de la fonction d'affichage
    affichage(affichageDynamique[choix][animation][0],
              affichageDynamique[choix][animation][1])

    start_chronometre(affichageDynamique[choix][animation][2])

    # Attente de l'appui du bouton A ou B ou le chronometre
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           not (chronometre())):
        pass

    # Changement du choix de l'animation dynamique
    if button_a.is_pressed():
        choix += 1
        animation = 0

    if choix >= (len(affichageDynamique)):
        choix = 0

    # Fermeture des animations par l'appui du bouton B
    if button_b.is_pressed():
        mettre_en_veille()

    # Attente du bouton relaché
    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Effacement de l'écran
    display.clear()

    # Progression de l'animation de l'affichage dynamique
    animation += 1
    if animation >= (len(affichageDynamique[choix])):
        animation = 0

Objectif de la Mission : Le dispositif se met automatiquement en veille lorsque la luminosité dépasse un seuil de la luminosité du jour.

La carte MICRO :BIT est équipée de plusieurs capteurs, dont un capteur de luminosité. Le capteur de luminosité sur la carte micro:bit est constitué d’une photorésistance (capteur de lumière) qui mesure l’intensité de la lumière réfléchie.

Voici comment vous pouvez utiliser le capteur de luminosité sur la carte micro:bit en programmation avec MicroPython :

from microbit import *

while True:
    # Lire la valeur de luminosité du capteur
    luminosite = display.read_light_level()

    # Afficher la valeur de luminosité sur l'écran LED
    display.scroll("Lum: " + str(luminosite))

    # Pause avant la prochaine mesure
    sleep(1000)

# Initialisation varaible pour la luminosité
def init_luminosite():
    global chrono_luminosite
    chrono_luminosite = time.ticks_ms()       

# Détection si la luminosité actuelle est supérieure à celle de la luminosité du jour
def lec_luminosite():
    global chrono_luminosite
    if display.read_light_level() < LUMINOSITE_JOUR:
        chrono_luminosite = time.ticks_ms()

# Si depuis un certain temps dans la luminosité du jour
def si_luminosite():
    if (chrono_luminosite and
       (time.ticks_ms() - chrono_luminosite > (DELAI_LUMINOSITE*1000))):
        return True
    else:
        return False

# Mise en veille du dispositif attendre un appui sur les touches A ou B
def mettre_en_veille():
    display.clear()
    # Attentre que les boutons A et B soient relachés
    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Attentre l’appui d’un bouton A ou A pour le réveil du dispositif
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed())):
        pass

    init_luminosite()

LUMINOSITE_JOUR = 100
DELAI_LUMINOSITE = 2
animation = 0
choix = 0
mettre_en_veille()

while True:
    # Appel de la fonction d'affichage
    affichage(affichageDynamique[choix][animation][0],
              affichageDynamique[choix][animation][1])
    start_chronometre(affichageDynamique[choix][animation][2])

    # Test de la luminosité
    lec_luminosite()

    # Attente de l'appui du bouton A ou B ou le chronometre
    while (not (button_a.is_pressed()) and
           not (button_b.is_pressed()) and
           not (chronometre())):
        pass

    # Changement du choix de l'animation dynamique
    if button_a.is_pressed():
        choix += 1
        animation = 0

    if choix >= (len(affichageDynamique)):
        choix = 0

    # Fermeture des animations par l'appui du bouton B
    if button_b.is_pressed():
        mettre_en_veille()

    # Si luminosité du jour depuis un certain temps alors mise en veille

    if si_luminosite():
        mettre_en_veille()

    # Attente du bouton relaché
    while button_a.is_pressed() or button_b.is_pressed():
        pass

    # Effacement de l'écran
    display.clear()

    # Progression de l'animation de l'affichage dynamique
    animation += 1
    if animation >= (len(affichageDynamique[choix])):
        animation = 0
Catégories
MICRO PYTHON RASPBERRY PICO W

CAPTEURS COULEURS TCS34725

RASPBERRY PICO W

Le capteur de couleur TCS34725 (Gravity)

À quoi ça sert sur notre robot ?

Le TCS34725 est un capteur de couleur.
Sur la compétition Rescue Line, il sert principalement à :

  • suivre la ligne noire
  • repérer les carrés verts pour savoir quand tourner à droite ou à gauche

Comment “voit” le capteur ?

Il éclaire le sol

Le capteur possède quatre petites LEDs blanches.

  • Elle éclaire le sol juste en dessous du robot
  • La lumière rebondit sur le sol et revient vers le capteur
  • Un sol clair renvoie beaucoup de lumière
  • Un sol foncé (ligne noire) renvoie peu de lumière

Il sépare la lumière en couleurs

À l’intérieur du capteur, il y a 4 détecteurs :

  • 🔴 Rouge (R)
  • 🟢 Vert (G)
  • 🔵 Bleu (B)
  • ⚪ Luminosité totale (Clear)

Pour chaque couleur, le capteur donne un nombre.

Ces nombres sont envoyés au microcontrôleur (ex : Raspberry Pico, mBot, etc.).

Le multiplexeur I2C

Pourquoi on en a besoin avec plusieurs capteurs de couleur ?

Rappel : c’est quoi le bus I2C ?

Le bus I2C, c’est comme une route avec quatres fils :

  • SDA : pour envoyer et recevoir les données
  • SCL : pour donner le rythme (l’horloge)

Tous les capteurs sont branchés sur la même route et parlent avec le microcontrôleur.

Avec un bus I2C ont peut dialoguer avec plusieurs dispositifs sur le même bus.

Chaque capteur a une adresse

Sur cette route, chaque capteur a une adresse, comme un numéro de maison.

Exemple :

  • Capteur température : adresse 0x48
  • Capteur distance : adresse 0x29
  • Capteur couleur TCS34725 : adresse 0x29

Quand le microcontrôleur veut parler à un capteur, il dit :

« Je parle au capteur numéro 0x29 »

Le problème avec plusieurs capteurs identiques

Dans notre robot, on utilise plusieurs capteurs de couleur identiques :

  • gauche
  • centre
  • droite

Et ils ont tous la même adresse I2C

Résultat :

  • Le microcontrôleur dit :
    « Capteur 0x29, réponds ! »
  • Tous répondent en même temps
  • Ça crée un conflit → le bus ne fonctionne plus

La solution : le multiplexeur I2C

Un multiplexeur I2C (ex : TCA9548A) est comme :

un aiguillage ou un feu de circulation pour le bus I2C

Il permet de choisir quel capteur est connecté au bus à un instant donné.

Comment fonctionne le multiplexeur ?

Le multiplexeur est lui-même un appareil I2C

  • Il a sa propre adresse
  • Le microcontrôleur peut lui parler

Il possède plusieurs “canaux” de 1 à 8 canaux

Par exemple :

  • canal 0
  • canal 1
  • canal 2
  • …
  • jusqu’à 8 canaux

Chaque canal peut avoir :

  • un capteur
  • ou même plusieurs capteurs (s’ils ont des adresses différentes)

On ouvre un canal à la fois

Le microcontrôleur dit au multiplexeur :

« Ouvre le canal 2 »

Résultat :

  • Seul le capteur branché sur le canal 2 est visible
  • Les autres sont déconnectés temporairement

Pour programmer, le capteur TCS34725 utilise la librairie class tcs34725.py à télécharger sur le microcontroleur :

Dans ton programme importe ces bibliothèques :

from machine import I2C
import time
from tcs34725 import TCS34725

Recherche les adresses sur le bus i2c :

from machine import I2C
import time
from tcs34725 import TCS34725

print("Initialisation I2C...")
i2c = I2C(0)
print("Scan I2C en cours...")
devices = i2c.scan()
print("Adresses trouvées:", [hex(d) for d in devices])
  • 0x29 : capteur de couleur
  • 0x72 : multiplexeur i2c

Exemple d’un programme de test pour lire les valeurs de deux capteurs sur les port 0 et 1 :

from machine import I2C
import time
from tcs34725 import TCS34725

print("Initialisation I2C...")
i2c = I2C(0)
print("Scan I2C en cours...")
devices = i2c.scan()
print("Adresses trouvées:", [hex(d) for d in devices])
# Initialisation du capteur
# Si vous n'utilisez PAS de multiplexeur, laissez multiplexer_addr=None
# Si vous en utilisez un, changez multiplexer_addr=0x70 (ou autre) et le port=0-7
ADDRESS_MULTIPLEXER = const(0x72)
try:
    print("Initialisation TCS34725...")
    #sensor = TCS34725(i2c)
    # Pour un multiplexeur:
    sensor01 = TCS34725(i2c, ADDRESS_MULTIPLEXER, 0)
    sensor02 = TCS34725(i2c, ADDRESS_MULTIPLEXER, 1)

    print("Capteur trouvé !")

    # Configuration optionnelle
    sensor01.integration_time(50) # 50ms (plus rapide mais moins précis que 2.4ms * n)
    sensor01.gain(4) # Gain 4x (1, 4, 16, 60)
    sensor02.integration_time(50)
    sensor02.gain(4)
    while True:
        # Lecture brute
        r, g, b, c = sensor01.read(raw=True)

        # Lecture interprétée
        temp, lux = sensor01.read(raw=False) # Note: refait une lecture

        print(f"R:{r} G:{g} B:{b} C:{c} | Temp:{temp}K Lux:{lux}")

        gray01 = sensor01.read_grayscale()
        gray02 = sensor02.read_grayscale()
        print("Read Gray : ", gray01)

        # Détection simple couleur
        if sensor01.is_red():
            print(" >> ROUGE détecté !")
        elif sensor01.is_green():
            print(" >> VERT détecté !")
        elif sensor01.is_blue():
            print(" >> BLEU détecté !")

        time.sleep(1)

except RuntimeError as e:
    print("ERREUR FATALE:", e)
except Exception as e:
    print("Erreur inattendue:", e)

Exemple initialisation capteur de couleur en direct sans le multiplexeur :

    sensor = TCS34725(i2c)

Exemple initialisation capteurs couleur via le multiplexeur :

    sensor01 = TCS34725(i2c, ADDRESS_MULTIPLEXER, 0)
    sensor02 = TCS34725(i2c, ADDRESS_MULTIPLEXER, 1)

Lecture de la nuance de gris :

        gray01 = sensor01.read_grayscale()
        print("Read Gray : ", gray01)

Détection d’une couleur :

if sensor01.is_red():
print( » >> ROUGE détecté ! »)
elif sensor01.is_green():
print( » >> VERT détecté ! »)
elif sensor01.is_blue():
print( » >> BLEU détecté ! »)

Catégories
MICRO PYTHON RASPBERRY PICO W Robotique

Entrées et sorties numériques

CARTE DE DEVELOPPEMENT RASPBERRY PICO W

LED intégrée à la carte

Sur la Raspberry Pi Pico, il y a une petite LED intégrée à la carte.

Cette LED est reliée à une broche spéciale.

Quand on met cette broche :

  • à 1 (ON) → la LED s’allume
  • à 0 (OFF) → la LED s’éteint

Comment la Pico contrôle la LED ?

La Pico utilise une sortie numérique.

C’est comme un interrupteur :

  • ON = courant qui passe
  • OFF = courant coupé

En MicroPython, on utilise la classe Pin.

Allumer la LED

from machine import Pin

led = Pin("LED",Pin.OUT) # LED sur la carte
led.on()                # Allumer la LED

La LED s’allume

Eteindre la LED

led.off()  # Éteindre la LED

La LED s’éteint

Faire clignoter la LED

from machine import Pin
from time import sleep

led = Pin("LED", Pin.OUT)

while True:
    led.on()      # LED allumée
    sleep(1)      # attendre 1 seconde
    led.off()     # LED éteinte
    sleep(1)      # attendre 1 seconde

Résultat :

  • la LED s’allume 1 seconde
  • puis s’éteint 1 seconde
  • et recommence en boucle

Une autre façon

from machine import Pin, Timer

# led de la carte
led=Pin("LED",Pin.OUT)

timerLed=Timer() # déclare un objet timer

def loopLed(timerLed): 
    led.toggle()

timerLed.init(freq=5, callback=loopLed)

La LED clignote toute seule, sans bloquer le programme.

C’est comme une alarme tous les x secondes :

  • tu règles l’heure
  • et il sonne tout seul
  • même si tu fais autre chose

Création du timer

  • Timer → pour créer un minuteur automatique

timerLed = Timer()

On crée un minuteur qui appellera une fonction tout seul.

Démarrage du timer

timerLed.init(freq=5, callback=loopLed)

  • freq=5 → 5 fois par seconde
  • callback=loopLed → appelle la fonction loopLed

La fonction appelée par le timer

def loopLed(timerLed):
led.toggle()

Cette fonction :

  • est appelée automatiquement par le timer
  • change l’état de la LED à chaque appel (allumée, éteinte)

Faire clignoter une LED sur le PIN GP2

Installe une LED de couleur bleue sur le port GP2 :

from machine import Pin, Timer

# led de la carte
ledBlue=Pin(2,Pin.OUT)

timerLedBlue=Timer() # déclare un objet timer

def loopLedBlue(timerLedBlue): 
    ledBlue.toggle()

timerLedBlue.init(freq=1, callback=loopLedBlue)

Faire clignoter une LED bleue avec un Timer

(sans boucle while)

  • La LED clignote toute seule,
  • une fois par seconde,
  • sans bloquer le programme.

C’est comme un réveil :

  • tu règles le rythme
  • et il déclenche la LED tout seul
  • pendant que le programme fait autre chose

La LED

ledBlue = Pin(2, Pin.OUT)

La LED est branchée sur la broche 2
C’est une sortie (ON / OFF)

Allumer / éteindre une LED avec un bouton poussoir (interruption)

Quand on appuie sur le bouton poussoir :

  • la LED change d’état
    • allumée → éteinte
    • éteinte → allumée

Installe une LED de couleur bleue sur le port GP2 et un bouton poussoir sur GP3 :

Le code complet

from machine import Pin, Timer

# led de la carte
ledBlue = Pin(2, Pin.OUT)
button1 = Pin(3, Pin.IN, Pin.PULL_UP)

ledBlue.off()

button1.irq( 
        #définition de l'interruption sur la broche
        handler = lambda btn1: ledBlue.toggle(),
        # mode de déclenchement IRQ_RISING IRQ_FALLING
        trigger = button1.IRQ_FALLING 
       )

Explication ligne par ligne

Importation

from machine import Pin, Timer

On utilise :

  • Pin → pour la LED et le bouton

La LED bleue sur GP2

ledBlue = Pin(2, Pin.OUT)

La LED est branchée sur la broche 2
C’est une sortie (ON / OFF)

Le bouton poussoir sur GP3

button1 = Pin(3, Pin.IN, Pin.PULL_UP)

Le bouton est :

  • sur la broche 3
  • configuré en entrée
  • avec une résistance pull-up interne

Pull-up, ça veut dire :

  • sans appui → niveau 1
  • bouton appuyé → niveau 0

Éteindre la LED au départ

ledBlue.off()

On commence avec la LED éteinte
État connu = pas de surprise

La partie la plus importante : l’interruption

button1.irq(
handler = lambda btn1: ledBlue.toggle(),
trigger = button1.IRQ_FALLING
)

C’est quoi une interruption ? :

  • le programme fait autre chose
  • Ding ! → bouton appuyé
  • la Pico réagit tout de suite

IRQ_FALLING

L’interruption se déclenche :

  • quand le signal passe de 1 à 0
  • donc quand on appuie sur le bouton

(parce qu’il est en pull-up)

ledBlue.toggle()

toggle() le LED inverse son état :

  • ON → OFF
  • OFF → ON

Pourquoi lambda btn1: ?

C’est une petite fonction rapide :

lambda btn1: ledBlue.toggle()

  • Elle est appelée automatiquement
  • btn1 représente le bouton (obligatoire)
  • On n’en a pas besoin ici, mais MicroPython l’exige

Pourquoi utiliser une interruption ? (le gros avantage)

Sans interruption

while True:
    if button1.value() == 0:
        ledBlue.toggle()
        sleep(0.3)

Le programme regarde le bouton tout le temps
Risque de rater un appui
Le robot est ralenti

Avec interruption

  • Le bouton est détecté instantanément
  • Le programme reste rapide

C’est quoi lambda en Python ?

lambda permet de créer une toute petite fonction,

  • en une seule ligne,
  • sans lui donner de nom.

Une fonction jetable, rapide à écrire.

Une fonction normale (classique)

def addition(a, b):
    return a + b

Cette fonction :

  • a un nom (addition)
  • fait une action
  • renvoie un résultat

La même chose avec lambda

addition = lambda a, b: a + b

C’est exactement pareil, mais :

  • en une seule ligne
  • plus court
  • sans def

Comment lire une lambda

lambda a, b: a + b

Ça se lit comme :

« Une fonction qui prend a et b et qui retourne a + b »

Tout ce qui est après : est le résultat

Catégories
MICRO PYTHON RASPBERRY PICO W

L’écran OLED SSD1306

CARTE DE DEVELOPPEMENT RASPBERRY PICO W

C’est quoi un écran OLED SSD1306 ?

Un écran OLED SSD1306 est un petit écran que l’on branche à un microcontrôleur (comme une Raspberry Pi Pico) pour afficher du texte ou des dessins sur un port I2C.

OLED, ça veut dire quoi ?

  • Chaque pixel s’allume tout seul
  • Pas besoin de rétroéclairage
  • Noir = pixel éteint → économie d’énergie

Taille courante :

  • 128 × 64 pixels
  • 128 × 32 pixels

Comment la Pico communique avec l’écran ?

La Pico communique avec l’écran grâce au bus I²C.

C’est comme une conversation :

  • La Pico = celui qui parle
  • L’écran = celui qui écoute

Les 2 fils importants du bus i2c

FilRôle
SDADonnées envoyées à l’écran
SCLCadence (rythme de communication)

L’écran a une adresse (souvent 0x3C) pour qu’on sache à qui on parle.

À quoi sert la bibliothèque micropython-ssd1306 ?

La bibliothèque sert à :

  • permettre d’écrire simplement :
    • du texte
    • des pixels
    • des formes

https://github.com/stlehmann/micropython-ssd1306

Comment fonctionne l’affichage ? (idée clé)

L’écran ne s’actualise pas tout seul.

  1. La Pico dessine dans une image invisible (le buffer)
  2. Quand tout est prêt, on dit :
oled.show()

Et l’image apparaît à l’écran

Comme dessiner sur une feuille, puis l’afficher d’un coup

Exemple simple de programme

# Création du bus I2C
i2c = I2C(0)

# Création de l'écran
oled = SSD1306_I2C(128, 64, i2c)

# Effacer l'écran
oled.fill(0)

# Écrire du texte
oled.text("Bonjour !", 0, 0)
oled.text("Initialisation", 0, 10)

# Afficher à l'écran
oled.show()

Les commandes principales (les plus utiles)

Écrire du texte

oled.text("Texte", x, y)
  • x → position horizontale
  • y → position verticale

🧹 Effacer l’écran

oled.fill(0)

Allumer tous les pixels

oled.fill(1)

Allumer un pixel

oled.pixel(x, y, 1)

Dessiner une ligne

oled.line(x1, y1, x2, y2, 1)

0 ou 1 pour éteindre ou allumer la ligne

Exemple amusant (point qui bouge)

for x in range(128):
    oled.fill(0)
    oled.pixel(x, 30, 1)
    oled.show()

Le point se déplace à l’écran

Catégories
MICRO PYTHON MICRO:BIT

Python avancé avec la micro:bit

Tu as déjà appris les bases de Python et tu veux aller plus loin ? Avec la micro:bit, tu vas coder des jeux, des calculatrices, des capteurs, et bien plus encore.
Tu vas manipuler des boucles, des fonctions, des événements, et même des conversions de bases (binaire, hexadécimal, etc.) — des compétences utiles pour le lycée, les études, et même dans le monde professionnel.
La micro:bit interagit avec le monde réel grâce à ses boutons, ses capteurs et son écran LED. Tu pourras voir le résultat de ton code en temps réel !

Partie 01 : Découverte des tables en Python

Apprendre à utiliser et manipuler des tables (ou listes) en Python, en affichant une séquence de chiffres ou d’images sur l’écran de la micro:bit.

  • Une table en Python s’écrit entre crochets : [ ].
  • Les éléments sont séparés par des virgules.
  • Pour afficher une image, utilise Image.NOM_DE_L_IMAGE (ex : Image.SMILE).
from microbit import *

while True:
    all_images = [str(1), str(2), str(3)]
    display.show(all_images, delay=300)

Modifie le programme suivant pour qu’il affiche, dans l’ordre, les chiffres de 1 à 5 sur l’écran de la micro:bit, avec un délai de 300 ms entre chaque chiffre.

  1. Comprendre la table all_images Actuellement, la table all_images contient les chaînes de caractères "1", "2" et "3". Question : Comment faire pour qu’elle contienne les chiffres de 1 à 5 ?
  2. Modifier la table Ajoute les chiffres manquants ("4" et "5") dans la table all_images.
  3. Tester le programme Télécharge ton programme sur la micro:bit et vérifie que les chiffres défilent bien de 1 à 5.
  4. Personnalisation (défis bonus !)
    • Défi 1 : Fais défiler les chiffres de 5 à 1.
    • Défi 2 : Crée ta propre table avec des motifs ou des lettres (ex : "A", "B", "C").
    • Défi 3 : Remplace les chiffres par des images (ex : Image.HAPPY, Image.SAD, Image.HEART).

Crée une animation graphique :

from microbit import *

while True:
    image1 = Image("99999:"
                  "90009:"
                  "90009:"
                  "90009:"
                  "99999")
    image2 = Image("00000:"
                   "09990:"
                   "09090:"
                   "09990:"
                   "00000")
    image3 = Image("00000:"
                   "00000:"
                   "00900:"
                   "00000:"
                   "00000")
    image4 = Image("00000:"
                   "00000:"
                   "00000:"
                   "00000:"
                   "00000")
    image5 = Image("99999:"
                  "99999:"
                  "99999:"
                  "99999:"
                  "99999")
    all_images = [image1, image2, image3, image4, image5]
    display.show(all_images,delay=300)

Partie 02 : Chronomètre avec la micro:bit – booléens et gestion du temps

Découvrir le fonctionnement d’une variable booléenne (True/False) et la gestion du temps en Python, en créant un chronomètre qui se lance et s’arrête quand on touche le logo de la micro:bit

from microbit import *
import time

start = 0
triggered = False

while True:
    if pin_logo.is_touched():
        triggered = not triggered
        while pin_logo.is_touched():
            start = time.ticks_ms()
          
    else:
        if triggered :
            display.scroll(int((time.ticks_ms() - start)/1000))
        else:
            display.show(Image.HEART)
  1. Comprendre la variable booléenne triggered
    • triggered vaut False au début : le chronomètre est arrêté.
    • Quand on touche le logo, triggered devient True (chronomètre lancé), et redevient False si on retouche le logo (chronomètre arrêté).
    • Question : Que fait l’instruction triggered = not triggered ?
  2. Lancer et arrêter le chronomètre
    • Si triggered est True, le chronomètre doit compter les secondes.
    • Si triggered est False, le chronomètre doit s’arrêter.
  3. Afficher le temps écoulé
    • Utilise time.ticks_ms() pour mesurer le temps en millisecondes.
    • Convertis ce temps en secondes et affiche-le sur l’écran.
  4. Tester le programme
    • Télécharge ton programme sur la micro:bit.
    • Vérifie que le chronomètre se lance et s’arrête bien en touchant le logo.

Chronomètre lancé :

Défis bonus

  • Défi 1 : Ajoute un bouton pour remettre le chronomètre à zéro.
  • Défi 2 : Lance une musique toutes les secondes.
  • Défi 3 : Lance une musique toutes les 10 secondes.
from microbit import *
import time
import music

start = 0
triggered = False

while True:
    if pin_logo.is_touched():
        triggered = not triggered
        while pin_logo.is_touched():
            start = time.ticks_ms()

    elif button_a.is_pressed():
        while button_a.is_pressed() :
            start = time.ticks_ms()
          
    else:
        if triggered :
            duration = int((time.ticks_ms() - start)/1000)
            music.pitch(200, 50)
            if (duration % 10) == 0:
                music.pitch(300, 80)
            display.scroll(duration)
        else:
            display.show(Image.HEART)

Partie 01 : Convertisseur décimal

Consigne : Écrire un programme Python qui demande à l’utilisateur de saisir un nombre entier décimal, puis affiche sa représentation en base dans une base de 2 à 36.

Exemple : Pour une conversion en base 16 (hexadécimal), si l’utilisateur saisit 10, le programme doit afficher E.

Indices pour réussir l’exercice

  1. Comprendre par exemple pour la base 16 : En hexadécimal, on utilise les chiffres de 0 à 9 et les lettres A à F pour représenter les valeurs de 10 à 15.
  2. Méthode de conversion : Pour convertir un nombre décimal en hexadécimal, on divise successivement le nombre par 16 et on garde le reste de chaque division.
  3. Utilisation des restes : Chaque reste correspond à un chiffre hexadécimal, mais il faut les lire à l’envers à la fin.
  4. Gestion des lettres : Si un reste est égal à 10, 11, 12, 13, 14 ou 15, il faut le remplacer par A, B, C, D, E ou F.

Exemple de programme :

from microbit import display, Image, button_a, pin_logo

# base donnée (2 ≤ base ≤ 36)
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
base = 16

def decimal_to_base_n(decimal_num, base):
    """
    Convertit un nombre décimal (int) dans une base donnée (2 ≤ base ≤ 36).
    Retourne une chaîne représentant le nombre dans la base souhaitée.
    """
    if base < 2 or base > 36:
        raise ValueError("La base doit être comprise entre 2 et 36.")

    result = []

    if decimal_num == 0:
        return "0"

    decimal_num = abs(decimal_num)

    while decimal_num > 0:
        # Obtenir le reste de la division entière du nombre par la base
        remainder = decimal_num % base
        result.append(digits[remainder])
        decimal_num = decimal_num // base

    return ''.join(reversed(result))
    
# Addition de deux nombres
i = 0
display.show(Image.PACMAN)

while True:
    # Résultat de l'addition
    if pin_logo.is_touched():
        display.show("=" + decimal_to_base_n(i, base))
        i = 0
        while pin_logo.is_touched():
            pass
    # Choix d'un nombre avec le bouton A
    elif button_a.is_pressed():
        i = i+1
        display.show(str(i))
        while button_a.is_pressed() :
            pass

Choisis avec le bouton A le chiffre 10 :

Convertis le chiffre 10 en décimal en base 16 avec la zone sensitive :


Partie 02 : Calculette de programmeur

Tu vas programmer une micro:bit pour qu’elle fonctionne comme une calculette permettant d’additionner deux nombres dans une base choisie (entre 2 et 36). Par exemple, si la base est 16, tu pourras additionner deux chiffres hexadécimaux (comme A + 5 = F).

Consignes

  1. Reprend la Fonction de conversion de l’exercice précédent decimal_to_base_n(decimal_num, base) qui convertit un nombre décimal en une chaîne de caractères représentant ce nombre dans la base choisie.
    • Exemple : decimal_to_base_n(15, 16) doit retourner "F".
  2. Choix de la base La variable base est déjà initialisée à 16, mais tu pourras la changer pour tester d’autres bases (entre 2 et 36).
  3. Sélection des nombres
    • Appuie sur le bouton A pour incrémenter le premier nombre (i) et l’afficher.
    • Appuie sur le bouton B pour incrémenter le deuxième nombre (j) et l’afficher.
    • Les nombres doivent rester inférieurs à la base choisie.
  4. Affichage du résultat
    • Touche le logo de la micro:bit pour afficher le résultat de l’addition i + j dans la base choisie, sous la forme =X (où X est le résultat de l’addition de i + J).
  5. Réinitialisation Après chaque calcul, les nombres i et j doivent être remis à zéro.
from microbit import display, Image, button_a, button_b, pin_logo

# base donnée (2 ≤ base ≤ 36)
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
base = 16

def decimal_to_base_n(decimal_num, base):
    """
    Convertit un nombre décimal (int) dans une base donnée (2 ≤ base ≤ 36).
    Retourne une chaîne représentant le nombre dans la base souhaitée.
    """
    if base < 2 or base > 36:
        raise ValueError("La base doit être comprise entre 2 et 36.")

    result = []

    if decimal_num == 0:
        return "0"

    decimal_num = abs(decimal_num)

    while decimal_num > 0:
        # Obtenir le reste de la division entière du nombre par la base
        remainder = decimal_num % base
        result.append(digits[remainder])
        decimal_num = decimal_num // base

    return ''.join(reversed(result))
    
# Addition de deux nombres
i = 0
j = 0
display.show(Image.PACMAN)

while True:
    # Résultat de l'addition
    if pin_logo.is_touched():
        display.show("=" + decimal_to_base_n(i+j, base))
        i, j = 0, 0
        while pin_logo.is_touched():
            pass

    # Choix d'un nombre avec le bouton A
    elif button_a.is_pressed():
        i = i+1 if i < base-1 else 0
        display.show(digits[i])
        while button_a.is_pressed() :
            pass

    # Choix du deuxième nombre par la touche B
    elif button_b.is_pressed():
        j = j+1 if j < base-1 else 0
        display.show(digits[j])
        while button_b.is_pressed() :
            pass

Choix du premier nombre par la touche A :

Choix du deuxième nombre par la touche B :

Demande le résultat de la somme par la zone sensitive :

Catégories
MICRO PYTHON MICRO:BIT

Découverte de Python avec la MICRO:BIT

Découvrir le code en python :

Bienvenue dans ce livret qui va te permettre de découvrir le monde
passionnant de la programmation avec le langage Python et la carte
micro:bit ! Tu vas t’amuser à apprendre les bases du codage tout en
explorant les fonctionnalités géniales de la carte micro:bit. Python est un langage de programmation puissant, mais pas compliqué une fois qu’on le comprend bien. Avec lui, tu pourras créer des jeux, contrôler des robots, afficher des messages et bien plus encore sur ta carte micro:bit.

Contrôler la carte micro:bit en python :

Dans ce livret, tu vas découvrir pas à pas comment écrire des lignes de code en Python pour contrôler ta carte micro:bit. N’aie pas peur, on va commencer par les bases, et tu verras à quel point coder peut-être amusant et créatif ! Alors, prêt à plonger dans le monde magique de la programmation avec Python et la carte micro:bit ? C’est parti !

Editeur MU Python :

MU est choisi comme éditeur pour sa simplicité d’utilisation et sa
convivialité, spécialement conçu pour les débutants en programmation.
Son interface intuitive offre une plateforme idéale pour coder en Python pour la carte micro:bit. Avec ses fonctionnalités adaptées, MU facilite l’écriture, la modification et l’exécution du code, offrant ainsi une expérience d’apprentissage agréable et efficace dans le cadre de la robotique.


PARTIE 01 : Découverte de la MICRO:BIT et de PYTHON

Découverte de MU

Dans MU par le bouton Mode sélectionner BBC microbit :

Puis créé un nouveau fichier

Nouveau fichier

La première fonction, toute simple, de la carte micro:bit consiste à afficher un texte qui va défiler lettre par lettre sur l’écran :

from microbit import display 
display.show('Bonjour comment vas-tu ?') 
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
Le texte doit défilé sur la carte micro :bit.

Tu peux simuler ton code sur le site : https://create.withcode.uk/
Copie et colle ton programme Python
Appuie ensuite sur les touches Ctrl+Entrée. Le simulateur démarre et affiche la carte micro:bit avec laquelle il est possible d’interagir.


PARTIE 02 : Afficher un dessin

Il est possible d’afficher des icônes sur l’écran composé d’une matrice de 5×5 LEDs en utilisant la commande display.show().

from microbit import display
display.show(Image.ANGRY)

Utilise l’icône « Vérifier » pour ton code : il te manque l’objet « Image »

from microbit import display, Image 
display.show(Image.ANGRY) 
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
L’icone s’affiche sur l’écran des 25 LEDs ?

Pour connaître toutes les images possibles deux solutions :

Solution 1 :

Solution 2 :

Utilise l’icône « REPL » et dans la fenêtre ouverte frappe les indications
suivantes :

from microbit import *
dir(display)
dir(Image)

PARTIE 03 : Créer sa propre icône

Tu peux concevoir ta propre icône en spécifiant quelles LEDs doivent être allumées pour dessiner l’image désirée.

from microbit import display, Image
led_image = Image('00900:00900:99999:00900:00900')
display.show(led_image)
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
A quoi correspond les 0 et les 9 de led_image ?
Comment modifier led_image pour avoir ton icône ?
Tu as la possibilité de contrôler l’intensité de chaque LED en ajustant la valeur de chacune sur une échelle de 1 à 9.

from microbit import display, Image
led_image = Image( '00900:00500:95959:00500:00900')
display.show(led_image)
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
Vois-tu des différences d’intensité entre chaque LED ?

Documentation sur Image


PARTIE 04 : Faire clignoter une icône

Pour créer un effet de clignotement d’une icône, tu dois afficher cette dernière pendant une durée déterminée, puis éteindre la matrice de LEDs.

from microbit import display,Image
import time
while True:
    led_image = Image('00900:00900:99999:00900:00900')
    display.show(led_image)
    time.sleep(0.5)
    display.clear()
    time.sleep(0.5) 
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
Comment peux-tu modifier pour un clignotement plus rapide ou plus lent ?


PARTIE 05 : Afficher un chronomètre en seconde

Afficher les aiguilles toutes les secondes.

from microbit import display,Image 
import time 
 
seconde=0 
while True: 
    if seconde==0: 
        display.show(Image.CLOCK12) 
    if seconde==1: 
        display.show(Image.CLOCK1) 
    if seconde==2: 
        display.show(Image.CLOCK2) 
    if seconde==3: 
        display.show(Image.CLOCK3)     
    if seconde==4: 
        display.show(Image.CLOCK4) 
    if seconde==5: 
        display.show(Image.CLOCK5) 
    if seconde==6: 
        display.show(Image.CLOCK6) 
    if seconde==7: 
        display.show(Image.CLOCK7) 
    if seconde==8: 
        display.show(Image.CLOCK8) 
    if seconde==9: 
        display.show(Image.CLOCK9) 
    if seconde==10: 
        display.show(Image.CLOCK10) 
    if seconde==11: 
        display.show(Image.CLOCK11) 
        seconde=-1 
    time.sleep(1) 
    seconde+=1 
Flasher pour tester puis bouton reset pour lancer

PARTIE 06 : Animer des images et jouer une note

La carte micro:bit dispose d’un buzzer. Programme le battement d’un cœur !

from microbit import * 
import time 
import music 
# Buzzer on pin_speaker 
while True: 
    display.show(Image.HEART) 
    time.sleep(1) 
    led_image = Image('00000:09090:09990:00900:00000') 
    display.show(led_image) 
    music.pitch(200, duration=500) 
Flasher pour tester puis bouton reset pour lancer

Documentation sur music


PARTIE 07 : Utiliser les boutons

La carte micro:bit dispose de deux boutons permettant de déclencher des actions : le bouton A à gauche de la carte, le bouton B à droite.
Programme en utilisant le bouton A :

from microbit import display, button_a, Image 
import time 
 
while True: 
    if button_a.is_pressed(): 
        led_image = Image("40004:06060:00900:06060:40004") 
        display.show(led_image) 
        time.sleep(0.5) 
        display.clear() 
        time.sleep(0.5) 
    led_image = Image("33333:30003:30003:30003:33333") 
    display.show(led_image)
Flasher pour tester puis bouton reset pour lancer

Optimise ton code :

from microbit import display, button_a, Image 
import time 
 
led_image_a = Image("40004:06060:00900:06060:40004") 
led_image = Image("33333:30003:30003:30003:33333") 
 
while True: 
    if button_a.is_pressed(): 
        display.show(led_image_a) 
        time.sleep(0.5) 
        display.clear() 
        time.sleep(0.5) 
    display.show(led_image) 

Programme en utilisant le bouton A et le bouton B:

from microbit import display, button_a, button_b, Image 
import time 

led_image_a = Image("90009:09090:00900:09090:90009") 
led_image_b = Image("99999:99999:99999:99999:99999") 
led_image = Image("33333:30003:30003:30003:33333") 

while True: 
    if button_a.is_pressed(): 
        display.show(led_image_a) 
        time.sleep(0.5) 
        display.clear() 
        time.sleep(0.5) 
    if button_b.is_pressed(): 
        display.show(led_image_b) 
        time.sleep(0.5) 
        display.clear() 
        time.sleep(0.5) 
    display.show(led_image) 
Flasher pour tester puis bouton reset pour lancer

Documentation sur les boutons


PARTIE 08 : Utiliser la touche sensitive

Touche la touche sensitive pour changer les LEDs.

from microbit import display, Image, pin_logo
import time
while True:
    # Détection de la zone sensible  
    if pin_logo.is_touched(): 
        led_image = Image('90009:09090:00900:09090:90009') 
        display.show(led_image) 
        # Affichage tant que la zone sensible est touchée
        while pin_logo.is_touched():
          pass
    led_image = Image('00900:00900:99999:00900:00900') 
    display.show(led_image)
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
Les LEDs changent quand tu passes ton doigt sur la zone sensitive ?

Documentation zone_sensible


PARTIE 09 : Utiliser la touche sensitive et les boutons

Modifie ton programme sur le battement du cœur pour augmenter ou baisser la note par les touches A et B, activer ou éteindre le son avec la zone sensitive.

from microbit import display, Image, button_a, button_b, pin_logo 
import time 
import music 
 
note = 200 
on = True 
start = time.time() 

while True:
    # Battement du coeur toutes les 1 seconde
    if time.time() - start > 1:
        start = time.time()
        display.clear()
        if on : 
            music.pitch(note, 200)
        time.sleep(0.1)
    else:  
        display.show(Image.HEART) 
              
    # Modification de la note avec la touche A  
    if button_a.is_pressed(): 
        if note > 0 : 
            note -= 10 
        while button_a.is_pressed(): 
            pass  
        on = True 
         
    # Modification de la note avec la touche B  
    if button_b.is_pressed(): 
        if note < 600 : 
            note += 10 
        while button_b.is_pressed(): 
            pass  
        on = True 
         
    # Activer ou non le battement du coeur  
    if pin_logo.is_touched(): 
 
        if on : 
            on = False 
        else: 
            on = True 
        while pin_logo.is_touched() : 
            pass 
Flasher pour tester puis bouton reset pour lancer

PARTIE 10 : Secouer les LEDs

Secouer la carte pour allumer les LEDs.

from microbit import display, Image, accelerometer 
import time
while True: 
    if accelerometer.current_gesture() == 'shake' : 
        led_image = Image('90009:09090:00900:09090:90009') 
        display.show(led_image) 
        time.sleep(0.1)
    led_image = Image('00900:00900:99999:00900:00900') 
    display.show(led_image)
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
Tu peux essayer ces différentes possibilités :

  • « shake » : secoué
  • « up » : vers le haut
  • « down » : vers le bas
  • « face up » : écran vers le haut
  • « face down » : écran vers le bas
  • « left » : penché à gauche
  • « right » : penché à droite
  • « freefall » : chute libre
  • « 3g » : 3g
  • « 6g » : 6g
  • « 8g » : 8g

Documentation sur l’accéléromètre

from microbit import * 
led_image = Image("33333:30003:30003:30003:33333") 
while True: 
    if accelerometer.current_gesture() == 'face up': 
        display.show(Image.ARROW_N) 
    elif accelerometer.current_gesture() == 'face down': 
        display.show(Image.ARROW_S) 
    elif accelerometer.current_gesture() == 'left': 
        display.show(Image.ARROW_W) 
    elif accelerometer.current_gesture() == 'right': 
        display.show(Image.ARROW_E) 
    else: 
        display.show(led_image)
Flasher pour tester puis bouton reset pour lancer

PARTIE 11 : Utiliser le microphone

Claque des mains pour allumer les LEDs.

from microbit import * 
 
microphone.set_threshold(SoundEvent.LOUD, 80) 
 
while True: 
    if microphone.current_event() == SoundEvent.LOUD: 
 
        led_image = Image('90009:09090:00900:09090:90009') 
        display.show(led_image) 
 
    led_image = Image('00900:00900:99999:00900:00900') 
    display.show(led_image)
Flasher pour tester puis bouton reset pour lancer
from microbit import * 
import time 
 
while True: 
    if microphone.sound_level() > 64: 
        led_image = Image('90009:09090:00900:09090:90009') 
        display.show(led_image) 
        time.sleep(0.3) 
    else: 
        led_image = Image('00900:00900:99999:00900:00900') 
        display.show(led_image)
Flasher pour tester puis bouton reset pour lancer

Que constates-tu après avoir téléversé le programme ?
Essaye d’allumer les LEDs d’un claquement de mains, elles doivent rester allumer. Puis claque des mains pour les éteindre.


PARTIE 12 : Jouer de la musique

Joue différentes musiques en appuyant sur les boutons A et B et sur la zone sensitive.

from microbit import button_a, button_b, pin_logo, pin_speaker 
import time 
def pitch(pin, noteFrequency, noteDuration, silence_ms=10): 
    if noteFrequency != 0: 
        microsecondsPerWave = 1e6 / noteFrequency 
        millisecondsPerCycle = 1000 / (microsecondsPerWave * 2) 
        loopTime = noteDuration * millisecondsPerCycle 
        for x in range(int(loopTime)): 
            pin.write_digital(1) 
            time.sleep(int(microsecondsPerWave)) 
            pin.write_digital(0) 
            time.sleep(int(microsecondsPerWave)) 
    else: 
        time.sleep_ms(noteDuration) 
        time.sleep_ms(silence_ms) 

def BuzzerStarWars(pin): 
    NOTES = ([293.66, 293.66, 293.66, 392.0, 622.25, 554.37, 
            523.25, 454, 932.32, 622.25, 554.37, 523.25, 
            454, 932.32, 622.25, 554.37, 523.25, 554.37, 454]) 
    DURATIONS = ([180, 180, 180, 800, 800, 180, 180, 180, 800, 
        400, 180, 180, 180, 800, 400, 180, 180, 180, 1000]) 
    SILENCE_DELAYS = ([40, 40, 40, 100, 100, 40, 40, 40, 100, 50, 
        40, 40, 40, 100, 50, 40, 40, 40, 100]) 
    for i in range(len(NOTES)): 
        pitch(pin, NOTES[i], DURATIONS[i], SILENCE_DELAYS[i]) 

def BuzzerR2D2(pin): 
    R2D2_NOTES = ([3520, 3135.96, 2637.02, 2093, 2349.32, 
        3951.07, 2793.83, 4186.01, 3520, 3135.96, 
        2637.02, 2093, 2349.32, 3951.07, 2793.83, 4186.01]) 
    for i in range(len(R2D2_NOTES)): 
        pitch(pin, R2D2_NOTES[i], 80, 20) 

def BuzzerCarribeanPirates(pin): 
    NOTES_1 = ([330, 392, 440, 440, 0, 440, 494, 523, 523, 
        0, 523, 587, 494, 494, 0, 440, 392, 440, 0]) 
    DURATIONS_1 = ([125, 125, 250, 125, 125, 125, 125, 250, 
        125, 125, 125, 125, 250, 125, 125, 125, 125, 375, 125]) 
    NOTES_2 = ([330, 392, 440, 440, 0, 440, 523, 587, 587, 0, 
        587, 659, 698, 698, 0, 659, 587, 659, 440, 0, 
        440, 494, 523, 523, 0, 587, 659, 440, 0, 440, 
        523, 494, 494, 0, 523, 440, 494, 0]) 
    DURATIONS_2 = ([125, 125, 250, 125, 125, 125, 125, 250, 125, 
        125, 125, 125, 250, 125, 125, 125, 125, 125, 
        250, 125, 125, 125, 250, 125, 125, 250, 125, 
        250, 125, 125, 125, 250, 125, 125, 125, 125, 375, 375]) 
    for j in range(2): 
        for i in range(len(NOTES_1)): 
            pitch(pin, NOTES_1[i], DURATIONS_1[i]) 
    for k in range(len(NOTES_2)): 
        pitch(pin, NOTES_2[k], DURATIONS_2[k]) 

while True: 
    if button_a.is_pressed(): 
        BuzzerStarWars(pin_speaker) 
    if button_b.is_pressed(): 
        BuzzerR2D2(pin_speaker) 
    if pin_logo.is_touched(): 
        BuzzerCarribeanPirates(pin_speaker) 
Flasher pour tester puis bouton reset pour lancer

Etape 13 Jouer aux dés

Secoue la micro :bit pour jouer aux dés.

from microbit import * 
import random 
import music 

de_1 = Image('00000:00000:00900:00000:00000') 
de_2 = Image('00009:00000:00000:00000:90000') 
de_3 = Image('00009:00000:00900:00000:90000') 
de_4 = Image('90009:00000:00000:00000:90009') 
de_5 = Image('90009:00000:00900:00000:90009') 
de_6 = Image('90009:00000:90009:00000:90009') 
display.show('?') 
nombre = 0

while True: 
    if accelerometer.current_gesture() == 'shake' : 
        nombre = random.randint(1, 6) 
        music.pitch(440, 50) 
    if nombre == 1: 
        display.show(de_1) 
    if nombre == 2: 
        display.show(de_2) 
    if nombre == 3: 
        display.show(de_3) 
    if nombre == 4: 
        display.show(de_4) 
    if nombre == 5: 
        display.show(de_5) 
    if nombre == 6: 
        display.show(de_6) 
Flasher pour tester puis bouton reset pour lancer
Catégories
MICRO PYTHON MICRO:BIT

Bataille navale Micro:bit

🚀 Mission : Détruire les navires ennemis et rester le dernier survivant !

Principe du jeu

Votre objectif ? Couler les navires adverses et être le dernier joueur encore en lice ! Chaque micro:bit représente un champ de bataille : à vous de viser juste.

Comment ça marche ?

  • Un navire caché : Dès que vous allumez votre micro:bit, un navire apparaît aléatoirement sur la grille de LEDs (reconnaissable à sa lumière plus faible).
  • Un missile à guider : La LED la plus brillante, c’est votre missile ! Inclinez votre micro:bit (avant/arrière, gauche/droite) pour le déplacer et viser l’ennemi.
  • Prêt à tirer ?
    • Bouton A : Figez la position de votre missile pour ajuster votre tir.
    • Bouton B : FEU ! Envoyez votre missile vers les adversaires.
  • Touché ! Si votre missile atteint un navire, la micro:bit de la victime joue une musique de défaite… mais attention, elle reviendra en jeu après un délai ! À vous de la neutraliser à nouveau.

💻 À vous de coder ! Pour créer ce jeu, voici les fonctionnalités clés à programmer :

  1. Communication radio : Envoyez et recevez les coordonnées (ligne/colonne) des tirs entre toutes les micro:bits du jeu.
  2. Contrôle du missile : Utilisez l’accéléromètre pour déplacer le missile en inclinant la carte.
  3. Gestion des tirs :
    • Bouton A : Verrouillez la position du missile.
    • Bouton B : Lancez le tir et transmettez les coordonnées aux autres joueurs.
  4. Position aléatoire du navire : À chaque début de partie, le navire apparaît à un endroit aléatoire.
  5. Détection de collision : Si un missile touche un navire, affichez une croix et déclenchez une musique de défaite.
  6. Temps de réapparition : Un navire touché réapparaît après quelques secondes : soyez prêt à recommencer !

💡 Pourquoi c’est génial ?

  • Un jeu multijoueur : Affrontez vos amis en temps réel !
  • De la stratégie : Mémorisez les tirs et neutralisez vos adversaires.
  • Un projet complet : Codez la logique, l’affichage des LEDs, les sons et la communication entre cartes.

🛠️ Prêt à relever le défi ? Avec la micro:bit, vous allez apprendre à : ✔ Utiliser des capteurs (accéléromètre, boutons). ✔ Programmer l’affichage des LEDs et des sons. ✔ Faire communiquer plusieurs cartes entre elles.

À vos micro:bits ! Qui sera le dernier survivant ? 🎮💥

Le champ de bataille :

Ton navire : LED reconnaissable à sa lumière plus faible.

Ton missile : la LED la plus brillante

Déplace ton missile penche à droite/gauche

En avant / en arrière

Bouton A : fige le tir

Bouton B : Lance le missile

Touché

Programme en mode bloc

sous vittascience : https://fr.vittascience.com/microbit

Utiliser la radio pour envoyer les coordonnées du missile

Un exemple de programmation pour émettre les coordonnées x, y du missile et les recevoir :

Envoyer les données par radio de la position d’une LED à allumer

Afficher la LED avec les données envoyées par radio :

Télécharge le programme et demande à tes voisins de pouvoir tester l’affichage de la LED


Comment positionner le tir du missile avec l’accéléromètre

Pour gérer le roulis (droite/gauche) :

Pour gérer le tangage (avant/arrière) :

Pour gérer l’affichage de la position du missile :

Envoyer le missile :

Télécharge ton programme et essaye d’envoyer un missile chez tes voisins.


Positionne aléatoirement ton navire

Pour gérer l’affichage aléatoire du navire :

Puis dans Répéter indéfiniment :

Si touché :

Télécharge ton programme et teste avec tes voisins si tu arrives à toucher leur bateau.


Recommence à jouer

Efface l’ancien tir de missile :

Si tu veux rejouer avec un nouveau navire :

Télécharge ton programme


Programme en python

Librairie à importer :

from microbit import *
import radio
import random
import math
import music

Pour configurer la radio :

radio.on()
radio.config(channel = 83, power = 6, length = 32, group=5)

Fonction pour émettre les coordonnées pour correspondre au programme en mode bloc :

def radio_sendValue(name, value):
    radio.send("&&&" + "int:" + "[" + name + ";" + str(value) + "]&&&")

Fonction pour recevoir les coordonnées pour correspondre au programme en mode bloc :

def radio_receiveValue():
    data = radio.receive()

    if data:
        print("receive", data)
        parseData = data[8:-4].split(';')
        return parseData[0], int(parseData[1])
    else:
        return None, None

Pour afficher une image de LEDs :

led_image = Image('00000:00000:00000:00000:00000')
display.show(led_image)

Affichage d’une LED :

 display.set_pixel(x, y, 9)
 display.set_pixel(x_cible, y_cible, 4)

pour générer un nombre aléatoire :

x_cible = random.randint(0, 4)
y_cible = random.randint(0, 4)

Affichage d’une croix :

display.show(Image.NO)

Affichage signe envoyé :

display.show(Image.YES)

Gestion des boutons A et B :

if button_a.is_pressed():
    while not (not button_a.is_pressed()):
        pass

Gestion de l’accéléromètre :

if (
   math.atan2(
       accelerometer.get_x(),
       math.sqrt(accelerometer.get_y()**2 + accelerometer.get_z()**2)
       ) * 180.0 / math.pi > 30
   ):
   x = 4
if (
   math.atan2(
       accelerometer.get_y(), -accelerometer.get_z()) *
       180.0 / math.pi > 30
   ):
   y = 4

Lancement de la musique :

music.play(music.JUMP_DOWN, loop=False)
Catégories
MICRO PYTHON RASPBERRY PICO W

MICRO PYTHON RASPBERRY

CARTE DE DEVELOPPEMENT RASPBERRY PICO W

La carte dispose :

  • et 2Mo de Flash programme, ce qui veut dire un espace de stockage à minima intégré.
  • d’un microcontrôleur ARM M0 double coeur cadencé à 130 MHz,
  • de plus de 200 Ko de RAM

La carte propose l’écosystème C/C++ mais également celui du Micropython.

Pi Pico bénéficie des avantages de micro-python et on peut citer notamment :

  • le mode interpréteur qui permet d’interagir avec la carte « à la volée » ce qui est très pratique pour apprendre, faire des essais, etc.
  • une programmation « puissante », synthétique et facile à apprendre à la fois,
  • la programmation par fichiers (et non plus code compilé) ce qui rend la maintenance d’un projet très facile : sur la carte on dispose du code !

Sur une carte à microcontrôleur, on dispose :

  • Processeur ARM Cortex M0 à double cœur
  • Horloge 133 Mhz.
  • 2 Mo de mémoire Flash.
  • 264 ko de RAM.
  • 2 interfaces UART.
  • 2 interfaces SPI.
  • 2 contrôleurs I2C.
  • 16 canaux PWM.
  • 3 ADC 12 bits.
  • Un module Wifi.
https://www.youtube.com/watch?v=o-tRJPCv0GA&t=29s

Le pico pi est vendu « vide », autrement dit, il ne dispose pas du Micropython et il faut le programmer sur la carte avant toute chose.

Vous pouvez voir Micropython comme une sorte de firmware, un micrologiciel, que l’on flashe dans la carte et qui va ajouter l’interpréteur Python à la carte

Documentation Raspberry PI

https://micropython.org/download

Puis rechercher :

Download Firmware :

https://micropython.org/download/RPI_PICO2_W

Appuyez sur le bouton BOOTSEL de votre pico et maintenez le enfoncé.

Connectez votre Pico au port USB de votre PC tout en maintenant le bouton enfoncé.

Attendez quelques secondes et relâchez le bouton BOOTSEL.

Le Pico doit apparaître comme un lecteur amovible baptisé RP2350 :

Copier le fichier sur le Pico. Lorsque la copie du Firmware, le pico se relance.

Lancer l’IDE Thonny :

Cliquer sur «Options » dans le menu « Outils».

Choisir l’interpréteur « MicroPython (Raspberry Pi Pico) »

et indiquer le port COM utilisé par la carte Raspberry PICO puis
cliquer sur « OK ».

Ma présence du MicroPython du Pico apparaît dans la console.

Saisir ce code dans la console pour allumer la LED du Pico :

>>> from machine import Pin
>>> led=Pin("LED",Pin.OUT)
>>> led.on()
>>> 

Saisie ce programme et demande son exécution sur la Pico :

from machine import Pin 
import time 
pin_led = Pin('LED', mode = Pin.OUT) # La broche de la LED built-in est placée en sortie 
while True: 
    pin_led.value(True) 
    time.sleep(1) 
    pin_led.value(False) 
    time.sleep(1) 

Si sous Thonny, vous rencontrez ce problème :
Unable to connect to COM24: port not found

Vérifier la configuration de Thonny :

  • Outils → Options
  • Onglet Interpréteur

Vérifie :

  • Interpréteur : MicroPython (Raspberry Pi Pico)

Port :

  • soit Automatique