1. Introduction

Combien de fois a-t-on râlé parce que la salière se trouvait trop loin de nous à table? Et il faut bien l'admettre que, aussi sportifs soit-on, nous préférerions de loin ne pas avoir à nous déplacer pour prendre cette fichue salière en bout de table. C'est en pensant au film Les Temps modernes de Charlie Chaplin, et plus particulièrement à la scène de la machine qui donne à manger, que m'est venue l'idée de mon projet. Bien entendu, mon ambition n'est pas comparable à celle des ingénieurs de M. Chaplin. Néanmoins, si je parviens à réaliser ce projet, je pourrais peut-être, qui sait, proposer mes services pour le prochain film qui parlera de machines qui mettent leur grain de sel dans notre vie.
Mon projet consiste en effet à demander à un robot de se charger d'aller chercher le sel pour moi, en n'ayant qu'à le positionner en face de la salière. L'objectif de ce projet est de devenir plus à l'aise avec le langage de code ASEBA et d'être capable de faire face aux différents problèmes qui pourraient surgir.

2. Matériel et méthodes

2.1 Matériel

  • 2 robots Thymio
  • du ruban adhésif double face
  • un plot en bois
  • des petits cubes Lego
  • des tiges en plastic (type Lego)
  • de la ficelle
  • petite plateforme Lego
  • une salière (haute de préférence)
  • un rectangle de carton blanc (pour réfléchir les infrarouges)

2.2 Méthode

Pour ce projet, j'ai superposé deux robots Thymio l'un sur l'autre de sorte que l'un puisse faire office de moyen de transport, et que l'autre se charge de la prise de possession du sel. Le problème a été divisé en plusieurs parties, et principalement deux:
Le codage et la construction.

2.2.1 la construction

Je ne m'en suis en réalité préoccupée que plus tard, mais il me semble préférable de commencer par cette partie, pour que la compréhension de mon projet soit optimale. Pour commencer, j'ai placé les Thymio l'un sur l'autre et dos à dos. Ils sont séparés par un plot de bois et y sont fixés par du ruban adhésif double face. J'ai placé les tiges lego sur les cubes lego, eux-mêmes placés sur les roues (les cubes lego ne servent qu'à ce que les tiges ne soient pas trop près des côtés du robot). J'ai enfin fixé une ficelle à l'extrémité de chaque tige et ai placé une petite plateforme lego au milieu de la tige gauche pour faire office de cache lors du passage de celle-ci devant les capteurs horizontaux.

2.2.2 les codes

Tout le codage a été réalisé en langage ASEBA. Il a lui aussi été fragmenté en divers parties (4 pour être précis) puis assemblées et réarrangées.

Le premier code concerne le Thymio se trouvant au-dessus. Il se charge de:

  • l'initialisation qui consiste à amener les deux tiges, où qu'elles aient été, à l'arrière du robot.
  • une fois l'initialisation lancée, le robot attendra un signal infrarouge qui fera passer les tiges et la corde devant (tel un lasso), prenant ainsi la salière entre le fil et le robot. Les tiges s'arrêtent lorsque le capteur horizontal gauche (prox.horizontal 4 ) détecte le cache attaché à la tige.

Voici donc le code de l'initialisation. Les roues commencent à tourner et, lorsque le cache fixé à la tige est détecté, les roues continuent de tourner jusqu'à ce qu'elles se trouvent à l'arrière du robot

var isInitializing = 1

#avance
motor.left.target = 300
motor.right.target = 300

#quand prox à droite fait un demitour par le haut à l'initialisation
onevent prox
if isInitializing == 1 and prox.horizontal[4] > 2000 then
motor.left.target = 0
motor.right.target = 0
timer.period[0] = 900
motor.left.target = 300
motor.right.target = 300

Une fois l'initialisation terminée, le robot se concentre sur la prochaine partie du code: lorsque le Thymio reçoit un signal infrarouge, il émet un son défini par défaut, s'allume en jaune et actionne les roues qui tournent dans l'autre sens cette fois, c'est-à-dire vers l'avant (le son et la lumière jaune sont des éléments qui ne sont présents que pour les tests de contrôle et ne sont pas nécessaires). Lorsque le cache sera à nouveau détecté par le capteur horizontal 4, le robot enverra un signal infrarouge pendant un court instant contrôlé par les timers.

#quand prox à driote stop les moteurs
elseif isInitializing == 0 and prox.horizontal[4]>2000 then
motor.left.target=0
motor.right.target=0
call leds.top(6,32,32)
call prox.comm.enable(1)
timer.period[1] = 900
end

onevent timer0
isInitializing = 0
motor.left.target = 0
motor.right.target = 0
timer.period[1] = 900 #arrête l'envoi de signal

onevent timer1
call prox.comm.enable(0)
call leds.top (0,0,0)

#reçois l'infrarouge
call prox.comm.enable(1)

onevent prox.comm
call sound.system(1)
call leds.top(32,32,0)
#et avance
motor.left.target=-400
motor.right.target=-400

Le deuxième code concerne le Thymio se trouvant au-dessous. Celui-ci se charge de:

  • faire avancer le Thymio (en ligne droite) jusqu'à un obstacle (la salière) et d'envoyer le signal infrarouge destiné à enclencher la deuxième partie du code du Thymio supérieur.
  • faire reculer le robot, à la réception du signal infrarouge envoyé par le Thymio du haut, jusqu'à un obstacle se trouvant à l'arrière.

Pour commencer, le Thymio (du bas) est juste allumé et attend le passage des tiges et du cache devant son capteur horizontal 0 pour avancer et émettre une lumière blanche jusqu'à la détection d'un obstacle par son capteur horizontal 2 (central). À ce moment, le Thymio s'arrête et émet une lumière cyan en même temps qu'il envoie un signal infrarouge. Le signal n'est envoyé que pour un court instant, après lequel le robot éteint également ses led supérieurs.

#on
call leds.top (32,0,32)
#avance quand prox gauche
onevent prox
when prox.horizontal[0] > 2000 do
motor.left.target = 300
motor.right.target = 300
call leds.top (32,32,32)
end
#quand obstacle devant stop et envoie signal
when prox.horizontal[2] > 2000 do
motor.left.target = 0
motor.right.target = 0
call leds.top (6,32,32)
call prox.comm.enable(1)
timer.period[1] = 2000
end
onevent timer1
call prox.comm.enable(0)
call leds.top (0,0,0)

Ensuite, lors de la réception du signal infrarouge envoyé par le Thymio du dessus, le robot du dessous recule jusqu'à la détection d'un obstacle par son capteur arrière gauche. A cet événement, il s'arrête.

#on et regarde signal
call leds.top (32,0,32)
call prox.comm.enable(1)

#quand rignal reçu recule
onevent prox.comm
motor.left.target =-300
motor.right.target = -300
call leds.top (32,32,32)

#quand obstacle arrière stop et envoi signal
if prox.horizontal[5] > 2000 then
motor.left.target = 0
motor.right.target = 0
call leds.top (6,32,32)
timer.period[1] = 2000
end

3. Résultats

Les codes fonctionnent parfaitement de façon séquencée et lorsque les Thymio se trouvent l'un en face de l'autre, c'est- à-dire quand les infrarouges ne rencontrent pas d'obstacle pour passer. Mais, du côté pratique, lorsqu'ils sont l'un sur l'autre, l'infrarouge a besoin de rebondir.

4. Discussion

J'ai tenté de remédier à ce problème en construisant un petit mur de legos blancs que je place contre la salière et qui doit former une sorte de bloc réfléchissant qui envoie les infrarouges du bas vers le haut. Mais cette technique est très approximative, car je ne maîtrise pas très bien les infrarouges ni l'angle qui leur convient. Et pour ce qui est des infrarouges envoyés par le Thymio du haut, je tente le même exercice, mais en tenant manuellement le petit mur. Le résultat est très insatisfaisant et rend tout le code inefficace. De plus, le type de ficelle utilisé (ici une ficelle partiellement rigide) peut influencer la bonne prise de la salière, et l'augmentation de la taille de la salière facilite la manœuvre également.

5. Conclusion

Mes sentiments vis à vis de mon projet sont mitigés: je suis contente qu'en soi les codes et la partie informatique fonctionnent. J'ai pu ressentir le sentiment d'excitation qui survient lorsque les choses fonctionnent. Mais je reste très déçue que, pour une question de construction, ce projet ne fonctionne pas quand il s'agit de tout faire aller à la chaine et sous la bonne configuration. J'ai malgré tout beaucoup aimé réaliser ce projet, car j'ai appris à m'adapter à la situation et à retourner les problèmes sous plusieurs angles avant de trouver une solution. Mon projet ne ressemble pratiquement pas à mon idée de départ, mais c'est en cherchant à contourner ou à résoudre les problèmes partie par partie que j'en suis venue à ce résultat.
Pour finir, je pense que l'objectif de faire communiquer deux Thymio n'a été que partiellement atteint. Mais je pense que cela est dû principalement à un problème de construction, et donc de mécanique, plutôt qu'à un problème de compréhension. Si je devais refaire ce projet, je pense que je chercherai un moyen de contourner le problème physique pour me concentrer sur le codage, car c'est la partie la plus interessante à mon goût. Au final mes robots ne fonctionnent pas mieux que ceux des ingénieurs de Chaplin et je comprends leur frustration. Pauvre convive qui devra se passer de sel!

Références

https://www.thymio.org/en:thymioapi