Thymio télécommande

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.

thymioremotecontrol_presentation.jpg

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.

thymioremotecontrol_setup.jpg

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é

  1. Appairer les Thymio pour qu'ils soient sur le même réseau;
  2. Définir des événements globaux (fenêtre de droite dans Aseba Studio) en indiquant le [nom_du_message] et le [nombre_d_arguments];
  3. Emettre le message en utilisant : emit [nom_du_message] [variable]
  4. Détecter le message en utilisant : onevent [nom_du_message]
  5. Exploiter la/les variables transmises avec la variable event.args, qui est un tableau contenant [nombre_d_arguments] variables.
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License