Les balances à curseur mobile fonctionnent sur la base de deux leviers dont un est à longueur variable:
Le Thymio II utilisé comme curseur peut savoir, grâce à son accéléromètre, l'inclinaison de la barre et se positionner correctement, par exemple avec un système à crémaillère. Voici un exemple de réalisation:
La balance a un support central et un levier équilibré. Malgré la différence de longueur entre gauche et droite, les pièces supplémentaires noires sur la droite permettent d'équilibrer le levier.
Sur la droite se trouve une nacelle qui permet de poser un objet, ici une voiture en bois. La nacelle a un poids de 47 grammes et est placée à une distance de 24 unités du pivot de la balance. Sur le côté gauche se trouve le contrepoids formé par le Thymio. Son poids est de 317g. Ce contrepoids peut bouger le long du levier grâce à une crémaillère et la motorisation d'une roue du Thymio II. Le détail de cette motorisation est donné ici:
Le Thymio II dispose d'un accéléromètre qui lui permet de mesurer son inclinaison par rapport à la gravité. Il peut donc savoir si le levier est horizontal ou pas, et si pas, dans quelle direction il penche. Il est donc facile d'écrire un programme qui cherche le point d'équilibre.
Voici un exemple de programme qui lance la recherche une fois pesé le bouton du milieu, puis affiche vert quand le point d'équilibre est trouvé :
var mesure # indique si on est en mode mesure ou pas
var vieuxacc0 # ici on sauvegarde quelques vieilles mesures de l'accéléromètre
var vieuxacc1
var vieuxacc2
var vieuxacc3
var sumacc # ici on somme les vieilles mesures de l'accéléromètre
mesure = 0
onevent buttons
when button.center==1 do # on lance/stoppe la mesure avec le bouton du milieu
if mesure == 0 then
mesure = 1
call leds.top(255,0,0) # on affiche du rouge pour dire qu'on mesure
else
mesure = 0
end
end
onevent acc
if mesure==1 then # on fait des choses seulement si on mesure
vieuxacc0 = vieuxacc1
vieuxacc1 = vieuxacc2
vieuxacc2 = vieuxacc3
vieuxacc3 = acc[1]-2 # ici on prend la dernière mesure. Le "2" est le point d'équilibre, car le Thymio II n'est pas horizontal lorsque la balance est équilibrée.
sumacc = vieuxacc0+vieuxacc1+vieuxacc2+vieuxacc3
motor.left.target=-60*sumacc # on avance avec le moteur en fonction de combien on est incliné
else
motor.left.target=0
end
if sumacc==0 then # on stoppe si toutes les mesures donnent zéro
mesure=0
call leds.top(0,255,0) # vert
end
Il est possible de rendre ce code plus compact et plus efficace, en utilisant un tampon circulaire :
var accTampon[4] = 0,0,0,0
var accTamponPos = 0
...
accTampon[accTamponPos] = acc[1]-2
accTamponPos = (accTamponPos + 1) % 4
sumacc = accTampon[0] + accTampon[1] + accTampon[2] + accTampon[3]
Voici comment fonctionne la balance :
Dans ce cas précis la voiture verte pèse 191g et le Thymio II trouve l'équilibre à environ 19 unités du pivot. Je vous laisse faire les calculs ;-)