Thymio la calculatrice
Par Joel Sonnard, élève du Gymnase Intercantonal de la Broye, juillet 2014
Présentation générale
Nous avons du, dans le cadre de notre travail de maturité, coder un Thymio II de manière à ce qu'il puisse servir dans la vie de tous les jours. J'ai choisi de coder mon robot afin qu'il serve de compteur en premier lieu. Mais le code était malheureusement beaucoup trop simple donc je l'ai transformé en un compteur/calculatrice combinés. Le robot permet de réaliser les quatre opérations de base, à savoir:
- addition
- soustraction
- multiplication
- division
Le résultat des calculs ne peu pas excéder les 999.
Mode d'emploi
- Tout d'abord, il faut donner une petite tape amicale au Thymio afin de lancer le programme.
- Ensuite le compteur entre en action, il s'auto-incrémente toutes les 0.4 secondes.
- Après il faut choisir quelle opération on souhaite réaliser, les boutons sur la face supérieure du robot équivalent chacun à une opération, la correspondance bouton-opération est montrée sur la photo ci-dessous.
- L'étape suivante est obligatoire, même si on souhaite effectuer des opérations en chaîne, il est nécessaire d'appuyer sous le bouton Total.
- Pour la suite, on à le choix, soit on laisse le robot énoncer le nombre, soit on ré-appuie sur une opération qu'on souhaite réaliser.
Voici le code utilisé
var allume # différent etats du robot suivant les taches qu'il doit effectuer au moment donné
var moyenne
var nbre[2]
var plus
var moins
var foix
var divise
var x
var centaine
var dizaine
var unite
var decal
timer.period[0]=1000
timer.period[1]=400
call leds.top(0,0,0) #initialisation de la couleur
call leds.circle(0,0,0,0,0,0,0,0)
allume=0
#définition du code qui permet au robot de compter
onevent timer1
if allume==1 then
moyenne=(prox.horizontal[1]+prox.horizontal[2]+prox.horizontal[3])/3
if moyenne > 500 then # verifie si il y a vraiment quelquechose devant le robot et lui permet de detecter sur tout l'avant
call sound.system(6) #fait un bruit lors de l'addition comme ca on se rend compte de la frequence
nbre[x-1]++ #itération
end
end
onevent tap #allume en tapant
call leds.top(0,32,0) # vert donc en train de compter sur la premiere case du tableau
call leds.circle(0,0,0,0,0,0,0,0) #petit reset des leds si ils étaient allumes
allume=1 #allume = 1 donc capable de compter
nbre[0]=0 #on reset les 2 nombres du tableau
nbre[1]=0
x=1 #x=1 donc on compte sur le premier nombre
onevent button.forward #ce que le robot doit faire quand on appuie sur le bouton avant
x=2 #x=2 donc on compte sur la deuxieme case du tableau
allume=1 #permet au compteur de fonctionner
plus=1 # reset des valeurs des nombres qui definissent le calcul a faire
moins=0
foix=0
divise=0
nbre[1]=0 # reset de la deuxieme case comme ca on commence a compter a 0
call leds.top(32,0,0) #couleur pour dire qu'on compte sur le 2eme nombre
onevent button.backward
x=2 #x=2 donc on compte sur la deuxieme case du tableau
allume=1 #permet au compteur de fonctionner
plus=0 # reset des valeurs des nombres qui definissent le calcul a faire
moins=1
foix=0
divise=0
nbre[1]=0 # reset de la deuxieme case comme ca on commence a compter a 0
call leds.top(32,0,0) #couleur pour dire qu'on compte sur le 2eme nombre
onevent button.right
x=2 #x=2 donc on compte sur la deuxieme case du tableau
allume=1 #permet au compteur de fonctionner
plus=0 # reset des valeurs des nombres qui definissent le calcul a faire
moins=0
foix=1
divise=0
nbre[1]=0 # reset de la deuxieme case comme ca on commence a compter a 0
call leds.top(32,0,0) #couleur pour dire qu'on compte sur le 2eme nombre
onevent button.left
x=2 #x=2 donc on compte sur la deuxieme case du tableau
allume=1 #permet au compteur de fonctionner
plus=0 # reset des valeurs des nombres qui definissent le calcul a faire
moins=0
foix=0
divise=1
nbre[1]=0 # reset de la deuxieme case comme ca on commence a compter a 0
call leds.top(32,0,0) #couleur pour dire qu'on compte sur le 2eme nombre
onevent button.center # ici on dit au robot qu'il a fini de compter la deuxieme fois et on lui indique quel operation il doit faire
if button.center==1 and allume==1 then #le bouton du centre sert a effectuer le resultat de l'operation qui va s'enregistrer sur nbre[0]
call leds.top(0,0,32) #changement de couleur des leds pour montrer que le resultat a bien ete effectuer
call sound.system(2) #petit bruit pour s'ignifier la meme chose
allume=2 # le robot passe au deuxieme etat, qui rend impossible toute autre operation que le resultat
if plus==1 then # ici on a simplement une suite d'instruction pour faire une addition
nbre[0]=nbre[0]+nbre[1]
end
if moins==1 then # Suite d'operation pour une soustraction
if nbre[0]<=nbre[1] then # ici on regarde quel nombre est le plus grand afin d'obtenir un resultat positif, je pourrai aussi utiliser la valeur absolue
nbre[0]=nbre[1]-nbre[0]
else
nbre[0]=nbre[0]-nbre[1]
end
end
if foix==1 then # ici les operations pour faire une multiplication
nbre[0]=nbre[0]*nbre[1]
end
if divise==1 then # les operation pour faire une division
if nbre[0]<=nbre[1] then
nbre[0]=nbre[1]/nbre[0] #on regarde quel nombre est le plus grand afin de ne pas obtenir de 0
else
nbre[0]=nbre[0]/nbre[1]
end
end
if button.center==1 and allume==2 then # ici on indique au robot de calculer combien il y a de centaines, de dizaines et d'unités
call leds.top(32,0,32)#changement de couleur des leds pour indiquer que le robot va dire le résultat
decal=1 # l'etat decal qui sert a savoir quel nombre il faut dire en ce moment
centaine=nbre[0]/100 # calcul pour trouver le nombre de centaines
dizaine=nbre[0]/10%10 # calcul pour trouver le nombre de dizaines
unite=nbre[0]%10 # calcul pour trouver le nombre d'unités
end
end
onevent timer0 # on appelle le deuxieme timer afin d'avor un intervalle de dix seconde en l'énoncé de chaque chiffre
if decal==3 then #decal 3 donc on enonce le troisieme chiffre a savoir l'unite
call sound.play(unite)#sound.play pour diffuser un son venant de la carte SD et le numero de la piste correspond au nombre de unites
decal=0 #decal = 0 comme a l'origine donc rien ne se passe a moin qu'on refasse des operations et qu'on rappuie sur le bouton résultat
end
if decal==2 then # decal =2 donc 2eme chiffre => dizaines
call sound.play(dizaine)#sound.play pour diffuser un son venant de la carte SD et le numero de la piste correspond au nombre de dizaines
decal++ # on passe au chiffre a dire en troisieme
end
if decal==1 then # decal =1 on va donc dire le premier chiffre qui sont les centaines
call sound.play(centaine) #sound.play pour diffuser un son venant de la carte SD et le numero de la piste correspond au nombre de centaines
decal++ # on passe au chiffre a dire en deuxieme
end
Vidéo
Voici une petite vidéo montrant le robot en action.