Contrôler un Thymio avec un autre
Comme chaque Wireless Thymio est équipé d'un module wireless, on peut faire communiquer deux Thymio pour en contrôler un avec l'autre, comme on utiliserait une télécommande. On peut, par exemple, réaliser une une voiture de course télécommandée.
Matériel
- 2x Wireless Thymio
- 1x Dongle
Préparation: Appairage des Thymio
Il faut tout d'abord mettre les deux Thymio sur le même réseau. Il suffit d'utiliser le Configurateur de réseau Wireless Thymio. Au terme de la manipulation, on peut programmer les deux Thymio avec un seul Dongle et dans la même fenêtre de Aseba Studio.
A présent, les deux Thymio appairés discutent sur le même canal et peuvent donc communiquer entre eux.
Code émetteur
Pour émettre un message sur le réseau, on utilise la commande suivante:
emit [nom_du_message] [variable]
Par exemple:
onevent buttons
when button.forward == 1 do
emit button_emit 2
end
envoie un message avec le nom "button_emit" contenant 1 argument de valeur 2 lorsque l'on appuie sur le bouton avant.
Seulement, il faut indiquer au réseau de Thymio qu'un tel message existe et qu'il transporte une valeur. Pour se faire, il faut créer un événement global (dans la fenêtre de droite), en indiquant comme nom d'événement "bouton_emit" et nombre d'arguments "1".
On peut d'ailleurs envoyer plusieurs valeurs dans le même message. Par exemple:
onevent acc
emit acc_control acc
envoie les 3 valeurs de l'accéléromètre dans un message appelé "acc_control". Il faut donc définir un événement global avec le nom "acc_control" et le nombre d'arguments "3".
On peut aussi décider de n'envoyer aucun argument, en écrivant par exemple:
emit prox
et en déclarant un événement global avec 0 arguments. Les autres Thymio verront le message et pourront y réagir, mais aucune valeur n'est transmise.
Code récepteur
Nous voulons maintenant récupérer le message qui a été émis par un Thymio. Il suffit d'utiliser la commande:
onevent [nom_du_message]
et d'écrire en dessous le code pour réagir à l'événement. Dans cette partie du code, on peut utiliser la variable
event.args
qui contient les valeurs envoyées dans le message. Il s'agit d'un tableau ; il faut donc utiliser event.args[0], event.args[1], etc. pour accéder aux différentes valeurs.
Par exemple:
onevent button_emit
if event.args[0] == 0 then
call leds.top(32,0,0)
elseif event.args[0] == 1 then
call leds.top(0,0,32)
end
allumera les LEDs suppérieurs du Thymio en fonction de la valeur envoyées dans le message "button_emit".
Exemple: Thymio télécommandé
Voici maintenant comment réaliser la voiture télécommandée.
Le but est simple: piloter un Thymio en utilisant un autre Thymio comme télécommande. Entre autre, on veut:
- pouvoir démarrer et arrêter le Thymio voiture;
- pouvoir faire aller le Thymio voiture en avant et en arrière, à différentes vitesses (par exemple 3);
- pouvoir faire tourner le Thymio voiture en tourne la télécommande, comme un volant.
Thymio télécommande
# Remote controller
onevent acc
emit acc_control acc
if acc[0] > 0 then
call leds.top(acc[0]*2,0,0)
else
call leds.top(0,abs(acc[0]*2),0)
end
onevent buttons
when button.forward == 1 do
emit button_emit 1
end
when button.center == 1 do
emit button_emit 0
end
when button.backward == 1 do
emit button_emit -1
end
Dans ce code, le Thymio émetteur envoie deux types de messages.
- A chaque événement "acc" (en continue donc), il envoie les 3 valeurs de son accéléromètre dans un message "acc_control". De plus, il change de couleur en fonction de l'accélération détectée;
- A chaque événement "buttons" (lorsqu'un bouton est appuyé), il envoie un message "button_emit" avec une valeur qui dépend du bouton (-1 pour le bouton arrière, 0 pour le bouton central, 1 pour le bouton avant).
Thymio voiture
# Remote controlled car
var state = STOP
var acceleration = 0
var speed = 0
onevent acc_control
if state == START then
motor.left.target = speed - COEFF*event.args[0]
motor.right.target = speed + COEFF*event.args[0]
if speed > 0 and timer.period[0] == 0 then
call leds.bottom.left(0,speed/15,0)
call leds.bottom.right(0,speed/15,0)
call leds.top(0,speed/15,0)
elseif speed < 0 and timer.period[0] == 0 then
call leds.bottom.left(abs(speed/15),0,0)
call leds.bottom.right(abs(speed/15),0,0)
call leds.top(abs(speed/15),0,0)
end
end
onevent button_emit
if event.args[0] == 0 then
if state == STOP then
state = START
speed = 0
motor.left.target = 0
motor.right.target = 0
elseif state == START then
state = STOP
speed = 0
motor.left.target = 0
motor.right.target = 0
end
elseif event.args[0] == -1 then
speed = speed - 100
if speed < -MAX_SPEED then
speed = -MAX_SPEED
end
elseif event.args[0] == 1 then
speed = speed + 100
if speed > MAX_SPEED then
speed = MAX_SPEED
end
end
onevent timer0
if state == STOP then
call leds.buttons(32,32,32,32)
elseif state == START then
call leds.buttons(0,0,0,0)
end
if speed == 0 then
call leds.bottom.left(0,0,0)
call leds.bottom.right(0,0,0)
call leds.top(0,0,0)
elseif speed >= 0 then
call leds.bottom.left(0,speed/10,0)
call leds.bottom.right(0,speed/10,0)
call leds.top(0,speed/10,0)
elseif speed < 0 then
call leds.bottom.left(-speed/10,0,0)
call leds.bottom.right(-speed/10,0,0)
call leds.top(-speed/10,0,0)
end
Dans ce code, le Thymio réagit aux messages qu'il reçoit. Lorsqu'il reçoit le message "button_emit", il réagit en fonction du bouton appuyé, grâce à la valeur envoyée avec le message:
- button_emit avec la valeur 0 (bouton central du Thymio télécommande): il change d'état (start <-> stop);
- button_emit avec la valeur -1 (bouton arrière du Thymio télécommande): il descend la vitesse, par pas de 100, jusqu'à un minimum donné;
- button_emit avec la valeur 1 (bouton avant du Thymio télécommande): il augmente la vitesse, par pas de 100, jusqu'à un maximum donné;
- acc_control (accéléromètre du Thymio télécommande): il modifie la vitesse de base avec un coefficient tiré de l'accélération reçue. En mettant un "+" sur une roue et un "-" sur l'autre, on fait tourner Thymio.
Enfin, les instructions qui suivent "onevent timer0" gèrent la couleur du Thymio dans les différents états.
Résultat
A noté qu'une fois programmés, les Thymio sont indépendants de l'ordinateur et du Dongle.
Résumé
- Appairer les Thymio pour qu'ils soient sur le même réseau;
- Définir des événements globaux (fenêtre de droite dans Aseba Studio) en indiquant le [nom_du_message] et le [nombre_d_arguments];
- Emettre le message en utilisant : emit [nom_du_message] [variable]
- Détecter le message en utilisant : onevent [nom_du_message]
- Exploiter la/les variables transmises avec la variable event.args, qui est un tableau contenant [nombre_d_arguments] variables.