Créer un portique de chronométrage pour mesurer le temps mis par un robot suiveur de ligne pour parcourir un circuit. Le portique détecte le passage du robot grâce à des capteurs infrarouges et affiche le temps sur l’écran du microcontrôleur UNIHIKER.
Le robot passe une première fois sous le portique au départ, puis une deuxième fois à l’arrivée.
Premier passage : démarrage du chronomètre.
Deuxième passage : arrêt du chronomètre.
Les composants du portique
Élément
Rôle
Description
🧠 Microcontrôleur UNIHIKER
Le cerveau du portique
Il gère les capteurs, mesure le temps et affiche les résultats sur son écran.
👀 Deux capteurs photoréflecteurs IR
Détecter le robot
Placés en vis-à-vis de chaque côté du portique, ils détectent quand le robot passe (interruption du faisceau).
💡 LED verte
Indiquer que le portique est prêt
Allumée : le portique attend le départ du robot.
🔴 LED rouge
Indiquer la mesure en cours
Allumée : le portique mesure le temps du parcours.
📺 Écran intégré à l’UNIHIKER
Affichage du résultat
Montre le message “Prêt”, “Course en cours…” et le temps mesuré.
Le portique attend le robot (LED verte). Le robot passe une première fois → démarrage du chrono. Le robot passe une deuxième fois → arrêt du chrono et affichage.
Programmation de l’interface
Détail des instructions pour l’affichage du temps :
Lance pour vérifier l’affichage
Programmation de la détection des passages
⚙️ Principe de détection du robot par le portique
🔦 1. Comment le portique détecte le passage du robot
Le portique utilise un photoréflecteur infrarouge. C’est un petit capteur qui envoie de la lumière invisible (infrarouge) et mesure la lumière qu’il reçoit en retour.
Quand rien ne passe, la lumière rebondit normalement : 👉 le capteur reçoit beaucoup de lumière.
Quand le robot passe devant, il bloque ou réfléchit moins la lumière : 👉 le capteur reçoit moins de lumière.
C’est ce changement de niveau de lumière que le portique utilise pour savoir qu’un robot vient de passer.
🧠 2. La variable mesure_en_cours
Pour que le portique sache s’il doit démarrer ou arrêter le chronomètre, on utilise une variable mémoire qu’on appelle ici :
Cette variable peut prendre deux valeurs :
Valeur
Signification
État du portique
0
Attente du robot au départ
Portique prêt, LED verte allumée
1
Chronométrage en cours
LED rouge allumée, le portique mesure le temps
⏱️ 3. Les deux passages du robot
🟢 Premier passage : le départ
Le portique attend (mesure_en_cours = 0).
Le robot passe → le capteur détecte un changement de lumière.
Le portique :
allume la LED rouge,
met mesure_en_cours = 1,
attente que le véhicule passe.
🔴 Deuxième passage : l’arrivée
Le robot repasse sous le portique.
Le capteur détecte à nouveau un changement de lumière.
Le portique :
rallume la LED verte,
remet mesure_en_cours = 0 (prêt pour une nouvelle mesure),
attente que le véhicule passe.
Le programme avec la détection et le comptage des passages :
Lance pour vérifier
Programmation du chronomètre
🟢 Premier passage : le départ
démarre le chronomètre,
⏱️ Affichage du temps
affiche le temps sur l’écran,
Lance pour vérifier
Programmation en python
Bibliothèques conseillées
import time import math from unihiker import GUI from pinpong.board import Board,Pin from pinpong.extension.unihiker import *
Objets à instancier # Interfaces u_gui=GUI() # Micro contrôleur Board().begin()
# Photo réflecteur IR sur le port P1 p_p1_analog=Pin(Pin.P1, Pin.ANALOG)
# LED rouge p_p14_out=Pin(Pin.P14, Pin.OUT)
# LED verte p_p15_out=Pin(Pin.P15, Pin.OUT)
# Lecture du photo réflecteur IR lumiere = p_p1_analog.read_analog()
# Gestion des LEDs p_p14_out.write_digital(0) p_p15_out.write_digital(1)
# Affichage du chronomètre mm = 0 ss = 0 chrono=u_gui.draw_clock( h=mm,m=0,s=ss, x=120,y=200,r=50, color= »#0000FF ») text_chrono = u_gui.draw_text( text= »Temps= »+ str(mm).zfill(2)+ »: »+str(ss).zfill(2), x=20,y=260, font_size=20, color= »#0000FF »)
# Affichage d’un texte u_gui.draw_text( text= »texte à afficher », x=40,y=25, font_size=20, color= »#0000FF »)
# Dessin d’une surface rectangle u_gui.fill_rect(x=5,y=5,w=230,h=90,color= »#CCFFFF »)
# Dessin d’un pourtour d’un rectangle u_gui.draw_rect(x=0,y=0,w=240,h=100,width=10,color= »#FF0000″)
# Gestion du temps (pour le chrono) # Récupération du temps start = time.time() # Calcul d’une durée en minutes et secondes duree = int(time.time() – start) mm = int(duree / 60) ss = int(duree – (mm * 60))
# Exemple pour l’affichage du temps chrono.config(h=mm,m=0,s=ss) text_chrono.config(text= »Temps= »+str(mm).zfill(2)+ »: »+str(ss).zfill(2))
Construis ce robot barrière automatique avec un servomoteur :
Clique sur le menu Edition en haut de l’écran et choisis Paramètres des ports.
Clique ensuite sur le bouton Tout décocher .
Puis coche D9 pour indiquer l’installation du servomoteur :
Vérifie que l’instruction sur le servomoteur est couleur bleue :
Active le test pour contrôler le servomoteur :
Utilise deux instructions servomoteur pour connaitre la position de la barrière ouverte et celle de la barrière fermée :
En cliquant sur les instructions, tu commande le servomoteur, attention il doit être sous tension.
Si tu veux contrôler la vitesse d’ouverture de la barrière :
Donne un nom à aux deux actions :
Installe un bouton poussoir pour piloter l’ouverture de ta barrière :
Installe le connecteur du bouton poussoir sur A0 et modifie les paramètres des ports :
Vérifie que l’instruction sur le capteur de pression est bien de la couleur bleue :
Programme pour ouvrir la barrière sur l’appui du capteur de pression, puis attendre un certain avant de refermer automatiquement la barrière :
Transfert ton programme et test le bon fonctionnement :
Rajoute une LED rouge pour prévenir que la barrière est fermée :
Installe la LED sur A1 :
Programme pour allumer la LED rouge quand la barrière est fermée.
Introduis la possibilité de deux modes de fonctionnement :
un mode avec une ouverture puis une fermeture automatique
un mode avec juste une ouverture
Pour distinguer les deux modes, un appui rapide sur le bouton poussoir permet une ouverture puis une fermeture, un appui long permet une ouverture simple :
Transfert ton programme et test le bon fonctionnement :
from unihiker import GUI
import time
gui = GUI()
# Dessin d'un cercle pour le visage
circle = gui.draw_circle(x = 120,y = 140,r = 50,width = 3,color = "#FF6666")
# Création de l'emoji
emj = gui.draw_emoji(emoji = "Wink", origin = "center", x=120, y=120, duration = 0.2, w=50)
# Affichage du prénom en bas de l'écran
Text = gui.draw_text(text='Hello , Patrick !',x=15,y=260,font_size=20)
Text.config(color='#0000FF')
width = 50
radius = 30
delta_radius = 2.5
delta_width = 5
while True:
# Animation de l'emoji
time.sleep(0.3)
width += delta_width
radius += delta_radius
circle.config(r=radius)
emj.config(w = width)
if not (50 <= width <= 240):
delta_width = -delta_width
delta_radius = -delta_radius
Si tu veux une progression plus douce (effet oscillation) Tu peux remplacer l’incrémentation linéaire par une fonction sinus :
from unihiker import GUI
import time, math
gui = GUI()
# Dessin d'un cercle pour le visage
circle = gui.draw_circle(x = 120,y = 140,r = 50,width = 3,color = "#FF6666")
# Création de l'emoji
emj = gui.draw_emoji(emoji = "Wink", origin = "center", x=120, y=120, duration = 0.2, w=50)
# Affichage du prénom en bas de l'écran
Text = gui.draw_text(text='Hello , Patrick !',x=15,y=260,font_size=20)
Text.config(color='#0000FF')
width = 50
radius = 30
delta_radius = 2.5
delta_width = 5
t = 0
while True:
time.sleep(0.03)
radius = 80 + 40 * math.sin(t)
width = 120 + 60 * math.sin(t)
circle.config(r=int(radius))
emj.config(w=int(width))
t += 0.1
Les différentes possibilité des emoji.
Angry,
Nerve,
Peace,
Shock,
Sleep,
Smile,
Sweat,
Think,
Wink
Changement des EMOJI avec les boutons A ou B
from unihiker import GUI
from pinpong.extension.unihiker import *
import time, math
gui = GUI()
# Dessin d'un cercle pour le visage
circle = gui.draw_circle(x = 120,y = 140,r = 50,width = 3,color = "#FF6666")
emoji_table = ["Angry", "Nerve", "Peace", "Shock", "Sleep", "Smile", "Sweat", "Think", "Wink"]index = 0
# Création de l'emoji
emj = gui.draw_emoji(emoji = emoji_table[index], origin = "center", x=120, y=120, duration = 0.2, w=50)
# Affichage du prénom en bas de l'écran
Text = gui.draw_text(text='Hello , Patrick !',x=15,y=260,font_size=20)
Text.config(color='#0000FF')
width = 50
radius = 30
delta_radius = 2.5
delta_width = 5
import time, math
t = 0
while True:
time.sleep(0.03)
radius = 80 + 40 * math.sin(t)
width = 120 + 60 * math.sin(t)
circle.config(r=int(radius))
emj.config(w=int(width))
t += 0.1
# Changement de l'emoji avec le bouton A ou B
if (button_a.is_pressed()==True):
index = index + 1 if index < 8 else 0
emj.config(emoji = emoji_table[index])
if (button_b.is_pressed()==True):
index = index - 1 if index > 0 else 8
emj.config(emoji = emoji_table[index])
Bouton A ou B lumineux
Les boutons A et B de l’UNIHIKER sont accessibles à l’utilisateur, ce qui permet de créer un projet impliquant une LED contrôlée par des boutons. Ce projet vérifie d’abord si les boutons A et B de l’UNIHIKER ont été enfoncés, puis contrôle l’allumage et l’extinction de la LED bleue située à l’arrière de l’UNIHIKER. La bibliothèque PinPong propose deux façons d’utiliser les boutons : la première consiste à lire directement la requête, la seconde à utiliser les rappels d’événements d’interruption. Voici un exemple de contrôle de l’allumage et de l’extinction de la LED à l’aide des boutons A et B.
Utilise ces librairies :
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from unihiker import GUI
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from unihiker import GUI
# Initialisation de l'interface et de la carte
gui=GUI()
Board().begin()
# Initialisation de la LED
ledUI = gui.fill_circle(x=120,y=100,r=50,color="#FFFF00")
led = Pin(Pin.P25, Pin.OUT)
while True:
# Bouton A appuyé
if (button_a.is_pressed()==True):
led.write_digital(1)
ledUI.config(color="#0000FF")
# Bouton B appuyé
if (button_b.is_pressed()==True):
led.write_digital(0)
ledUI.config(color="#FF0000")
Fonctions d’interception de l’événement de l’appui sur le bouton A ou B
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from unihiker import GUI
# Controle de l'appui du bouton A
def on_buttona_click_callback():
led.write_digital(1)
ledUI.config(color="#0000FF")
# Controle de l'appui du bouton B
def on_buttonb_click_callback():
led.write_digital(0)
ledUI.config(color="#FF0000")
# Initialisation de l'interface et de la carte
gui=GUI()
Board().begin()
ledUI = gui.fill_circle(x=120,y=100,r=50,color="#FFFF00")
# Eteindre la LED
led = Pin(Pin.P25, Pin.OUT)
# Intercpetion des boutons A et B
gui.on_a_click(on_buttona_click_callback)
gui.on_b_click(on_buttonb_click_callback)
while True:
pass
LED externe sur le port 22
led = Pin(Pin.P22, Pin.OUT)
Détecteur de luminosité
UNIHIKER est équipé d’un capteur de lumière placé au-dessus de l’écran frontal, permettant de détecter l’intensité lumineuse ambiante. Grâce à cette fonctionnalité, un détecteur de luminosité peut être développé. Ce projet consiste à afficher la valeur lumineuse détectée par le capteur sur l’écran.
from unihiker import GUI
import time
from pinpong.board import Board
from pinpong.extension.unihiker import *
# # initialization
Board().begin()
# Instantiate a GUI object
gui = GUI()
img = gui.fill_circle(x=120,y=100,r=50,color="#FFFF00")
value = gui.draw_text(x=145, y=28, text='0', font_size=18)
while True :
# Update the displayed light value
Light = light.read()
value.config(text = Light)
# Light value level
if Light < 600:
img.config(color="#FF6600")
elif 600 <= Light < 1024:
img.config(color="#FF9900")
elif 1024 <= Light < 2048:
img.config(color="#FFCC33")
elif 2048 <= Light < 3072:
img.config(color="#FFFF99")
else:
img.config(color="#FFFF00")
time.sleep(1)
Dans cet exemple, UNIHIKER est initialisé avec Board().begin(). Ensuite, un objet GUI est instancié et un objet image et un objet texte sont créés à l’aide des méthodes draw_image() et draw_text(), respectivement. Dans la boucle principale, l’intensité lumineuse ambiante est obtenue grâce à la méthode light.read() de la bibliothèque PinPong, et la valeur lumineuse est affichée à l’écran grâce à la méthode draw_text() de la bibliothèque GUI.
L’intensité lumineuse ambiante est divisée en cinq niveaux en moyenne, et différents niveaux de luminosité sont représentés par des cercles de couleurs différentes, selon les conditions d’éclairage.
Piano musical
L’UNIHIKER est équipé d’un buzzer capable d’émettre différentes tonalités en réglant différentes fréquences. Cette fonctionnalité permet de créer un piano électronique. Ce projet propose une interface utilisateur simple permettant aux utilisateurs de jouer différentes notes en appuyant sur des boutons à l’écran. Voici un exemple de piano électronique :
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from unihiker import GUI
import time
# Gestion des touches du piano
def button_click1():
buzzer.pitch(262,1)
text.config(text="C4")
def button_click2():
buzzer.pitch(294,1)
text.config(text="D4")
def button_click3():
buzzer.pitch(330,1)
text.config(text="E4")
def button_click4():
buzzer.pitch(349,1)
text.config(text="F4")
def button_click5():
buzzer.pitch(392,1)
text.config(text="G4")
def button_click6():
buzzer.pitch(440,1)
text.config(text="A4")
def button_click7():
buzzer.pitch(494,1)
text.config(text="B4")
def button_click8():
buzzer.pitch(277,1)
text.config(text="C#4")
def button_click9():
buzzer.pitch(311,1)
text.config(text="D#4")
def button_click10():
buzzer.pitch(370,1)
text.config(text="F#4")
def button_click11():
buzzer.pitch(415,1)
text.config(text="G#4")
def button_click12():
buzzer.pitch(466,1)
text.config(text="A#4")
# Initialisation de l'interface et de la carte
u_gui=GUI()
Board().begin()
# Affichage du titre
bg=u_gui.fill_rect(x=0,y=0,w=240,h=320,color="#CCCCFF")
text = u_gui.draw_text(x=185,y=160,text="Clavier musical",origin="center",font_size=28,angle=270)
# Zones sensibles du clavier musical (touches blanches)
do=u_gui.fill_rect(x=0,y=3,w=130,h=43,color="#FFFFFF",onclick=button_click1)
re=u_gui.fill_rect(x=0,y=48,w=130,h=43,color="#FFFFFF",onclick=button_click2)
mi=u_gui.fill_rect(x=0,y=93,w=130,h=43,color="#FFFFFF",onclick=button_click3)
fa=u_gui.fill_rect(x=0,y=138,w=130,h=43,color="#FFFFFF",onclick=button_click4)
so=u_gui.fill_rect(x=0,y=183,w=130,h=43,color="#FFFFFF",onclick=button_click5)
la=u_gui.fill_rect(x=0,y=228,w=130,h=43,color="#FFFFFF",onclick=button_click6)
xi=u_gui.fill_rect(x=0,y=273,w=130,h=43,color="#FFFFFF",onclick=button_click7)
# Zones sensibles du clavier musical (touches noires)
bian1=u_gui.fill_rect(x=50,y=32,w=80,h=30,color="#000000",onclick=button_click8)
bian2=u_gui.fill_rect(x=50,y=77,w=80,h=30,color="#000000",onclick=button_click9)
bian3=u_gui.fill_rect(x=50,y=167,w=80,h=30,color="#000000",onclick=button_click10)
bian4=u_gui.fill_rect(x=50,y=212,w=80,h=30,color="#000000",onclick=button_click11)
bian5=u_gui.fill_rect(x=50,y=257,w=80,h=30,color="#000000",onclick=button_click12)
while True:
time.sleep(0.1)
Dans cet exemple, UNIHIKER est initialisé avec Board().begin().
Ensuite, un objet GUI est instancié, sur un fond bleu plusieurs rectangles noirs et blancs (représentant différentes touches de piano) sont créés à l’aide de la fonction fill_rect().
Ensuite, une série de fonctions d’événements sur le click de chaque touche sont définies, chacune correspondant à une note de musique.
Dans les fonctions appelées par un click sur la touche, le buzzer est contrôlé pour émettre un son d’une fréquence et d’une durée spécifiques à l’aide de la fonction buzzer.pitch (frequency, duration).
Chaque note de musique est liée à une touche de piano, et lorsque la touche est enfoncée, la fonction de rappel correspondante est exécutée et le buzzer joue la note correspondante.
De plus, une zone de texte affiche le nom de la note jouée, permettant ainsi à l’utilisateur d’identifier la note jouée.
Sonde sonore
L’UNIHIKER est également équipé d’un microphone capable de capter l’intensité du bruit ambiant. Cette fonctionnalité permet de créer un dispositif de surveillance du bruit, affichant l’intensité du bruit ambiant à l’écran. De plus, un seuil de bruit peut être défini ; lorsqu’il est dépassé, un signal sonore retentit pour vous avertir. Voici un exemple de dispositif de surveillance du bruit :
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from unihiker import Audio
from unihiker import GUI
Board().begin()
# Instantiation des objets audio et interface
audio = Audio()
gui = GUI()
# Titre du dispositif
gui.draw_text(text="Sonde sonore",x=120,y=50,font_size=20, color="#0000FF", origin="center")
# Affichage du niveau sonore
sound_text = gui.draw_text(text="",x=120,y=170,font_size=55, color="#0000FF", origin="center")
while True:
# Récupération du niveau sonore et son affichage
sound_value = audio.sound_level()
sound_text.config(text=sound_value, color="#0000FF")
# Déctection du niveau sonore
if (sound_value > 50):
# Alerte visuelle et sonore
sound_text.config(color="#FF0000")
buzzer.pitch(392)
time.sleep(0.1)
buzzer.stop()
# On laisse le niveau sonore retomber avant de le mesurer à nouveau
time.sleep(1)
Dans cet exemple, l’UNIHIKER est initialisé avec la fonction Board().begin().
Ensuite, un objet Audio et un objet GUI sont instanciés, et deux objets texte sont créés avec la fonction draw_text(). Ces objets texte affichent respectivement la surveillance du bruit et les valeurs de bruit correspondantes.
Dans la boucle principale, la méthode sound_level() de l’objet Audio permet d’obtenir l’intensité sonore ambiante, puis la méthode config() de l’objet texte permet de mettre à jour la valeur de luminosité à l’écran. Parallèlement, l’intensité sonore est vérifiée pour vérifier si elle dépasse le seuil défini. Si tel est le cas, la fonction buzzer.pitch(frequency) émet une alarme sonore, puis la fonction buzzer.stop() désactive le buzzer.
Compteur de sauts
L’UNIHIKER est également équipé d’un accéléromètre et d’un gyroscope 6 axes, capables de lire les valeurs x, y et z de l’accéléromètre et du gyroscope individuellement. Cette fonctionnalité permet de créer un compteur de saut : les valeurs de l’accéléromètre et du gyroscope s’affichent à l’écran, et le nombre de saut est calculé et affiché en fonction de l’intensité de l’accélération.
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from unihiker import GUI
import time
# Chronomètre du temps du jeu
chrono = 0
# Compteur de sauts
value = 0
# Réinitialisation des compteurs avec le bouton A
def on_buttona_click_callback():
global chrono
global value
chrono = 0
value = 0
# Initialisation de la carte et de l'interface
Board().begin()
gui = GUI()
# Affichage des données
gui.draw_text(text="Accéléromètre",x=10,y=5,font_size=16, color="#0000FF")
gui.draw_text(text="Gyroscope",x=10,y=105,font_size=16, color="#0000FF")
gui.draw_text(text="Compteur de sauts",x=10,y=210,font_size=16, color="#0000FF")
accelerometer_x = gui.draw_text(text="X:",x=30,y=35,font_size=12, color="#000000")
accelerometer_y = gui.draw_text(text="Y:",x=30,y=60,font_size=12, color="#000000")
accelerometer_z = gui.draw_text(text="Z:",x=30,y=85,font_size=12, color="#000000")
gyroscope_x = gui.draw_text(text="X:",x=30,y=135,font_size=12, color="#000000")
gyroscope_y = gui.draw_text(text="Y:",x=30,y=160,font_size=12, color="#000000")
gyroscope_z = gui.draw_text(text="Z:",x=30,y=185,font_size=12, color="#000000")
pedometer=gui.draw_text(text=value,x=30,y=230,font_size=45, color="#000000")
# Attente appui bouton A pour commmencer
gui.wait_a_click()
# Initialisation pour interception l'appui sur le bouton A
gui.on_a_click(on_buttona_click_callback)
while True:
# Récupération des mouvements par l'accéléromètre et le gyroscope
accelerometer_x.config(text=(str("X:") + str(accelerometer.get_x())))
accelerometer_y.config(text=(str("Y:") + str(accelerometer.get_y())))
accelerometer_z.config(text=(str("Z:") + str(accelerometer.get_z())))
gyroscope_x.config(text=(str("X:") + str(gyroscope.get_x())))
gyroscope_y.config(text=(str("Y:") + str(gyroscope.get_y())))
gyroscope_z.config(text=(str("Z:") + str(gyroscope.get_z())))
# Comptage de sauts
if (accelerometer.get_strength() > 1.5):
value = (value + 1)
# Affichage des sauts et du chronomètre
pedometer.config(text=str(value) + "/" + str(int(chrono)))
time.sleep(0.1)
chrono +=0.1
Dans cet exemple, l’UNIHIKER est initialisé avec la fonction Board().begin() et un objet GUI est instancié. Ensuite, grâce à la méthode draw_text(), plusieurs objets texte sont créés pour afficher les valeurs d’accélération, de gyroscope et de nombre de pas, ainsi que leurs valeurs correspondantes.
Le programme principal utilise accelerometer.get_x(), accelerometer.get_y() et accelerometer.get_z() pour obtenir les valeurs x, y et z de l’accélération, et gyroscope.get_x(), gyroscope.get_y() et gyroscope.get_z() pour les valeurs x, y et z du gyroscope. Ces valeurs sont ensuite affichées à l’écran grâce à la méthode config() de l’objet texte.
De plus, le nombre de saut est calculé à l’aide de la fonction accelerometer.get_strength() et incrémenté de 1 lorsque l’intensité d’accélération dépasse 1,5.
Le nombre de sauts est affiché à l’écran avec le chronomètre via la méthode config() de l’objet texte.
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 :
Communication radio : Envoyez et recevez les coordonnées (ligne/colonne) des tirs entre toutes les micro:bits du jeu.
Contrôle du missile : Utilisez l’accéléromètre pour déplacer le missile en inclinant la carte.
Gestion des tirs :
Bouton A : Verrouillez la position du missile.
Bouton B : Lancez le tir et transmettez les coordonnées aux autres joueurs.
Position aléatoire du navire : À chaque début de partie, le navire apparaît à un endroit aléatoire.
Détection de collision : Si un missile touche un navire, affichez une croix et déclenchez une musique de défaite.
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.
Dans le cadre de notre participation à la RoboCup Junior, notre association a organisé la conception et la programmation de robots adaptés pour la compétition. Ce rapport détaille notre organisation, les rôles de chacun, et les étapes de notre travail pour préparer la compétition.
Présentation des Équipes
Notre association présente 7 équipes composées d’enfants âgés de 8 à 16 ans. Les équipes sont organisées en fonction de l’âge et des compétences des participants :
Les plus jeunes (8-14 ans) travaillent sur une base de robot MBOT avec une programmation en mode block. Les moins expérimentés optent pour RESCUE LINE ENTRY, les plus expérimentés pour RESCUE LINE.
L’équipe des plus grands (14-16 ans) choisissent de réaliser leur propre robot en utilisant le langage Python pour la RESCUE LINE.
Répartition des Tâches
Travail des Plus Jeunes
Les moins expérimentés se sont concentrés sur la programmation en mode block, ce qui leur a permis de comprendre les bases de la programmation et de la robotique. Ils ont travaillé sur des tâches simples mais essentielles, comme le déplacement du robot, la détection de couleurs et le suivi de ligne. Ils sont utilisés différents robots au plus simple jusqu’au MBOT :
Un robot avec deux capteurs de suivi de ligne :
Puis un robot avec cinq capteurs de suivi de ligne
Travail des plus expérimentés
Les plus expérimentés ont pris en charge la compréhension des problématiques techniques et l’élaboration de solutions pour la conception des robots. Ils ont travaillé sur des aspects plus complexes, comme la gestion du capteur de ligne, l’équilibrage du robot et l’optimisation globale des performances du robot en fonction des exigences du parcours pour la compétition de la Robocup junior.
Collaboration et Tests
Travail en Commun entre les différentes équipes
Bien que les plus grands aient été principalement responsables de la conception technique, un travail en commun a été essentiel. Les solutions techniques élaborées par les plus grands ont été testées par tous les membres des équipes. Cela a permis de valider les solutions et de faire des choix éclairés sur les meilleures options à adopter.
Tests et Validation
Nous avons organisé des sessions de tests régulières où chaque équipe pouvait tester les solutions proposées. Les retours des plus jeunes ont été précieux pour ajuster et améliorer les solutions techniques. Cette collaboration a permis de s’assurer que les robots étaient performants et prêts pour la compétition.
Écran couleur, offrant des interfaces utilisateur conviviales pour l’interaction homme-machine
Système CyberOS, vous permettant d’exécuter les programmes prédéfinis, de définir la langue du système et de mettre à jour le système via le joystick et les boutons intégrés
Un port Micro USB (Type-C) pour la connexion aux PC pour l’alimentation et la communication
Un port de module électronique pour connecter des modules électroniques
Un port de carte d’extension pour la connexion aux cartes d’extension
Plusieurs capteurs intégrés, tels qu’un capteur de lumière et un gyroscope, qui fournissent plusieurs types de sortie de données
Capteur RVB pour le suivi de la ligne noire
Plage de détection : 5 à 15 mm de l’objet à détecter :
Double pression : lorsque vous appuyez deux fois sur le bouton, le capteur quad RVB commence à mémoriser les valeurs des couleurs de l’arrière-plan (le blanc) et de la ligne noire pour le suivi de ligne. Pour effectuer cette opération, placez les capteurs de lumière sur le parcours avec une ligne noire et appuyez deux fois sur le bouton. Lorsque vous voyez les LED clignoter rapidement, faites glisser les capteurs RVB d’un côté à l’autre au-dessus de la ligne noire sur le fond blanc du parcours pendant environ 2,5 secondes. Les valeurs des paramètres obtenues sont automatiquement stockées.
Si l’apprentissage échoue, les LED clignotent lentement et vous devez recommencer l’apprentissage.
Capteur ultrasons
Le capteur à ultrasons 2 peut être utilisé pour détecter la distance entre un obstacle et celui-ci. L’émetteur de gauche transmet les ondes ultrasonores et le récepteur de droite reçoit les ondes ultrasonores réfléchies. Les êtres humains peuvent entendre des sons de 20 à 20 000 Hz. Les ondes sonores dont les fréquences sont supérieures à 20 000 Hz sont appelées ondes ultrasonores. Les ondes sonores sont réfléchies par les obstacles rencontrés et sont reçues par le récepteur du capteur à ultrasons. En fonction du temps écoulé entre l’émission et la réception, les distances entre le capteur à ultrasons et les obstacles peuvent être calculées.
Distance avec un obstacle :
Gestion des deux moteurs encodeurs
Un moteur électrique encodeur est un moteur équipé d’un dispositif appelé encodeur. L’encodeur est un capteur qui mesure la position angulaire ou la vitesse de rotation du moteur. Il fournit des informations précises sur la position du moteur, ce qui est essentiel pour contrôler avec précision le mouvement du robot.
EM1 : correspond au moteur gauche
EM2 : correspond au moteur droit (attention il est monté à l’envers, pour le faire avancer mettre un nombre négatif)
Rapport Technique : Adaptation du Robot MBOT 2 pour la RoboCup
Introduction
Dans le cadre de notre participation à la RoboCup, nous avons adapté le robot MBOT 2 pour améliorer ses performances, notamment pour le passage des pentes et son équilibrage. Ce rapport détaille les modifications apportées, les défis rencontrés et les solutions mises en place pour atteindre nos objectifs.
Objectifs du Projet
Améliorer l’adhérence du robot pour le passage des pentes.
Optimiser l’équilibrage du robot pour une meilleure stabilité.
Assurer une performance optimale lors de la compétition.
Modifications Apportées
Changement des Roues
Nous avons opté pour des roues avec une bande de caoutchouc afin que le robot adhère mieux au sol, surtout lors du passage des pentes. Ces roues offrent une meilleure traction et permettent au robot de monter et descendre les pentes sans glisser.
Équilibrage du Robot
Pour améliorer l’équilibrage du robot, nous avons inversé la coque du robot afin de placer la pile plus au centre. Cette modification a permis de répartir le poids de manière plus uniforme et d’améliorer la stabilité globale du robot.
Ajout d’un Caisson avec Poids
Nous avons imaginé un caisson sous le robot, à l’avant, pour ajouter un poids. Après plusieurs essais, nous avons trouvé qu’un gros écrou était la solution idéale. Ce poids supplémentaire aide à maintenir l’avant du robot au sol, ce qui est crucial pour le passage des pentes.
Tests et Validation
Nous avons effectué plusieurs tests pour valider nos modifications. Les résultats ont montré que le robot MBOT 2 est maintenant capable de monter et descendre les pentes avec une meilleure adhérence et une stabilité accrue.
Rapport Technique : Conception d’un Adaptateur pour la roue bidirectionnelle
Introduction
Dans le cadre de notre projet, nous avons conçu un adaptateur pour le robot MBOT 2 afin d’améliorer sa capacité à suivre une ligne noire et à franchir des obstacles. Ce rapport détaille les étapes de conception, les défis rencontrés et les solutions mises en place pour atteindre nos objectifs.
Objectifs du Projet
Permettre au robot MBOT 2 de suivre une ligne noire de manière précise.
Assurer le franchissement des obstacles.
Améliorer la stabilité et la maniabilité du robot.
Conception de l’Adaptateur
Remplacement de la Rotule par une Roue Bidirectionnelle
Le robot MBOT 2 dispose de base d’une rotule lui permettant de tourner. Cependant, cette rotule ne permet pas au robot de passer les obstacles. Nous avons donc choisi de remplacer la rotule par une roue bidirectionnelle. L’avantage de cette roue est qu’elle permet de tourner dans toutes les directions comme la rotule de base, tout en permettant le franchissement des obstacles.
Première version : deux roues bidirectionnelles
Nous avons conçu une première version avec deux roues bidirectionnelles. Cependant, après réflexion, nous avons réalisé que cette configuration n’était pas optimale.
Deuxième version : une roue bidirectionnelle centrale
Nous avons donc réalisé une deuxième version avec une seule roue bidirectionnelle au centre du robot. Cette version a donné de bons résultats et nous a permis d’économiser une roue par robot. Dans cette version, nous avons installé la roue avec l’axe vers l’avant du robot, la roue contre l’avant du robot.
Troisième version : roue parallèle au robot
Nous avons remarqué que dans la disposition précédente, la roue bidirectionnelle avait tendance à rouler sur le côté sur les obstacles et dans le bas de la pente. Nous avons donc réalisé une troisième version avec la roue parallèle au robot. Cette configuration a amélioré la stabilité et la maniabilité du robot.
Intégration de capteurs
Traqueur de Ligne
Nous avons intégré un traqueur de ligne pour améliorer le suivi de ligne du robot, notamment pour qu’il puisse se redresser sur les lignes droites afin que le robot soit bien parallèle à la ligne noire pour une meilleur prise en compte des carrés verts.
Capteur ultrasons
Un capteur ultrasons a été ajouté pour la détection des obstacles, permettant au robot de les éviter.
Dispositif de détection de bande Conductrice
Nous avons également intégré un dispositif pour détecter la bande conductrice d’électricité afin d’avoir la connaissance de l’arrivée dans la zone de survie.
Conception des Adaptateurs avec Blender
Utilisation de Blender
Le travail de conception des adaptateurs du MBOT 2 a été réalisé avec l’outil Blender. Juliette, qui avait déjà une maîtrise de cet outil, a pris en charge le dessin des pièces suite à nos échanges, constatations et idées.
Organisation du Travail
Afin de bien organiser son travail, Juliette a mis en place sous Blender des collections en fonction des configurations de nos adaptateurs. Cette organisation a permis de structurer les différentes pièces et de faciliter les modifications et les ajustements.
Modification des Unités
Juliette a également modifié les unités de base dans Blender pour se mettre à l’unité millimètre. Cette modification a été essentielle pour assurer la précision des dimensions des pièces conçues.
Tests et Validation
Nous avons effectué plusieurs tests pour valider nos modifications. Les résultats ont montré que les adaptateurs conçus avec Blender permettent au robot MBOT 2 de mieux répondre aux exigences de la compétition. Les pièces dessinées par Juliette ont été fabriquées et intégrées au robot, améliorant ainsi ses performances.
Conception d’un Adaptateur RGB pour le Robot MBOT 2
Introduction
Dans le cadre de notre projet, nous avons conçu un adaptateur RGB pour le robot MBOT 2 afin d’améliorer sa capacité à suivre une ligne noire dans diverses conditions, notamment sur des pentes et des angles droits. Ce rapport détaille les étapes de conception, les défis rencontrés et les solutions mises en place pour atteindre nos objectifs.
Objectifs du Projet
Permettre au robot MBOT 2 de suivre une ligne noire de manière précise.
Assurer une bonne mesure de la ligne noire même sur des pentes.
Adapter la position du capteur RGB pour qu’il soit au plus proche du sol sans dépasser les roues.
Conception de l’Adaptateur RGB
Positionnement du Capteur
Pour que le robot suive correctement la ligne noire, notamment sur des angles droits, nous avons dû rapprocher le capteur RGB des roues. Nous avons déterminé une distance optimale entre l’axe des roues et la position du capteur RGB. Cette distance permet au capteur de détecter la ligne noire avec précision.
Réglage de la Distance
Dans la conception de l’adaptateur, nous avons prévu une fente qui permet de régler cette distance. Cette fente offre une flexibilité nécessaire pour ajuster la position du capteur en fonction des conditions spécifiques de la piste.
Adaptation pour les Pentes
Nous avons constaté que dans les pentes, le capteur RGB s’éloignait du sol, ce qui rendait la mesure de la ligne noire imprécise. Pour résoudre ce problème, nous avons conçu l’adaptateur de manière à ce que le capteur RGB soit positionné sous les roues, au plus proche du sol. Nous avons également donné un angle au capteur pour qu’il reste proche du sol lors de l’attaque de la pente.
Contraintes Mécaniques
Le capteur RGB ne doit pas dépasser les roues pour éviter les obstacles. Nous avons donc veillé à ce que l’adaptateur respecte cette contrainte tout en permettant une mesure précise de la ligne noire.
Tests et Validation
Nous avons produit plusieurs adaptateurs à l’imprimante 3D et effectué de nombreux tests pour valider la conception de l’adaptateur. Les résultats ont montré que l’adaptateur permet au robot de suivre la ligne noire avec précision, même sur des pentes et des angles droits. Le réglage de la distance via la fente s’est avéré très utile pour optimiser la performance du capteur dans différentes conditions.
Conclusion
La conception de cet adaptateur RGB pour le robot MBOT 2 a été un défi technique intéressant. Grâce à notre travail, le robot peut maintenant suivre une ligne noire de manière précise dans diverses conditions. Nous avons compris l’importance de l’ajustement et de l’adaptation dans la conception des adaptateurs avec l’impression 3D pour répondre aux exigences de la compétition.
Le robot à l’horizontale, le capteur RGB mesure correctement la ligne noire.
Lorsque le robot attaque une pente, le capteur RGB s’éloigne de la ligne noire. Si la distance est trop importante entre le capteur RGB et le sol, la mesure devient imprécise et fausse.
Avec l’adaptateur que nous avons conçu, le capteur RGB est sous les roues pour une distance optimum entre les capteurs et l’axe des roues pour un suivi des angles droits de la ligne noire et pour une mesure optimum lors du passage des pentes.
La fente permet un réglage fin de l’adaptateur sur le MBOT2 et l’inclinaison permet au capteur RGB d’être au plus près du sol lors de la montée de la pente.
A noter les points importants à vérifier avant une compétition :
La veille :
Valider et donner un numéro de version au programme de la compétition (afficher la version sur le MBOT)
Charger la batterie des MBOT V2
Identifier chaque robot (étiqueter le nom du robot)
Une clé USB par équipe avec le programme de l’équipe chargé
Avant de partir :
Emporter les MBOT V2 équipés chargés de la version du logiciel testé pour la compétition et identfiés pour chaque équipe
Vérifier les fixations des vis des différents éléments (emporter un tournevis)
Vérifier le niveau de batterie des robots (afficher le niveau de batterie sur les robots)
Chargement des piles pour robot ADA
Vérifier la présence des câbles USB pour chaque équipe
Amener une feuille blanche et verte pour étalonnage RGB
Penser au HUB USB pour chargement des MBOT V2 lors de la compétition
Chargeur des piles ADA
Prendre les trois batteries supplémentaires
Emporter sur une clé USB identifiée pour chaque équipe avec le programme de la compétition
Emporter un PC avec mBlock et les dernières versions pour chaque équipe
Emporter la documentation sur le MBOT, notre programme, le règlement de la compétition
Emporter des tournevis, des vis 3mm et 5mm de différentes longueurs ainsi que des écrous et rondelles
Prendre du scotch, de la patafix
Prendre des capteurs de lignes et capteurs RGB en remplacement
Prendre moteurs en remplacement
Prendre des roues bidirectionnelles en remplacement
Prendre des crayons et des feuilles
Fer à souder et fil en étain
Prendre la boite d’élastiques
Ecrous pour l’équilibre du robot
Câbles
Une carte micro bit
Ensemble des cartes du robot ADA
Capteur sonore pour détection obstacle
Avant la compétition :
Régler le dispositif RGB avec le tapis de compétition (double click, le dispositif clignote, passer le dispositif du blanc au noir, attention les 4 capteurs doivent mesurer le noir, prévoir une marge de sécurité, les LEDs s’allument sur le blanc et s’éteignent sur la ligne noire)