Ascenseur à base de Thymio II

L'ascenseur est un exercice de programmation très connu. Il existe par exemple sous forme de Kidule. Cette page illustre un exemple de réalisation d'ascenseur programmable avec le Thymio II. L'ascenseur consiste essentiellement en un chariot vertical motorisé, des points de repère sur son parcours pour marquer les étages et une interface pour que l'utilisateur puisse choisir l'étage où aller.

Voici un exemple de réalisation sur une étagère:

ascenseur-global_label.jpg

Avec le détail de la cabine:

detail-cabine.jpg

Quelques explications:
Le Thymion II est utilisé pour motoriser le déplacement vertical de la cabine, pour repérer les étages et recevoir les commandes de l'utilisateur.
La cabine est montée sur un rail de guidage vertical fixé à l'étagère. Une ficelle est fixée en haut du guidage. La ficelle est enroulée dans la cabine par un des deux moteurs du Thymio. Ceci permet d'avoir le déplacement vertical de la cabine le long du guidage.
Pour repérer les étages, des marques sont disposées à la bonne hauteur. Ces marques sont blanches et bien réflechissantes. Elles peuvent être détectées avec les capteurs de sol du Thymio II. Dans l'image ci-dessous on peut bien voir le Thymio II et le repère blanc de marquage de l'étage:

marquage-etage.jpg

Finalement on peut utiliser les boutons du Thymio II pour indiquer à la cabine si monter ou déscendre, et de combien d'étages. Avec le code ASEBA ci dessous il suffit de peser sur le bouton flêche vers le haut ou vers le bas le nombre de fois qu'on veut passer d'étages, et une fois pesé le bouton du milieu l'ascenseur va passer le nombre d'étages indiqués (voir vidéo en fin de page).

var vitesse         # vitesse d'avancement de la cabine
var etage           # nombre d'étages à passer (relatif)
etage = 0           # initialisation de l'étage

# interface utilisateur:
onevent buttons    
  when button.forward==1 do  # monte
     if vitesse == -300 then
         etage = 0
     end
     vitesse = 300
     etage = etage + 1          # on augmente le nombre d'étages à passer
  end

  when button.backward==1 do  # descend
      if vitesse == 300 then
          etage = 0
      end
      vitesse = -300
      etage = etage + 1
  end

  when button.center==1 do  # on démarre
      motor.left.target = vitesse
  end

# contrôle du passage d'étage:
onevent prox
  when prox.ground.reflected[0] > 100 do     # ici on détecte une marque d'étage. La valeur 100 dépend de la distance et la couleur de la marque
      etage = etage - 1
      if etage == 0 then        # on est arrivés
          vitesse = 0
          motor.left.target = vitesse
      end
  end

Ce code est très minimal. On peut ajouter l'affichage de l'étage (ou de la couleur de l'étage), initialiser l'ascenseur au niveau zéro avec les capteurs de proximité arrière, annoncer l'étage avec un son pré-enregistré (la voix de l'ascenseur), motoriser la porte avec le deuxième moteur etc.

Enfin une vidéo du fonctionnement:

Un autre exemple d'ascenseur:

L'ascenseur décrit plus haut nécessite d'énormément de briques de construction assez particulières, surtout pour réaliser le rail vertical. Ce nouveau exemple montre comment faire un ascenseur de façon beaucoup plus simple, sans rail, sans cabine, afin de permettre un exercice de programmation tout en ayant une version d'ascenseur minimale.

4etagesVertical3-700.jpg

Le Thymio est suspendu sur une tôle noire (le boîtier du PC).
Une ficelle est fixée en haut de la tôle et enroulée avec les deux moteurs du Thymio.
Ceci permet d'avoir le déplacement vertical du Thymio. Toutefois ceci demande à que les deux roues enroulent la ficelle à la même vitesse.
Des bandes blanches simulent les étages et sont détectées avec les capteurs de sol du Thymio.
L'interface utilisateur est très simple:

  • les boutons du haut et du bas permettent de donner l'étage visé
  • le bouton central permet de démarrer le déplacement
  • le bouton de droite de stopper
  • le bouton de gauche de tout reinitialiser
interaction-scheme.jpg

Pour définir la position de départ de l’ascenseur on fait déscendre le thymio II et on utilise le capteur « prox.horizontal[2] » (à l'avant) pour détecter le sol et initialiser l’étage à 0.

Cet exemple fonctionne sur 4 étages mais peut être augmenté jusqu’à 7 au maximum.
L’étage est affiché par les « leds » : « leds.circle ».

Les problèmes rencontrés avec ce type de disposition sont les suivants:

  • le Thymio II doit rester bien vertical contre la paroi, afin de bien détecter les marques. Ceci implique de:
    • bien situer l'enroulement de la ficelle par rapport au centre de gravité du Thymio II
    • fixer la ficelle en haut de la paroi à une certaine distance de la surface
    • dans ce cas il a fallu ajouter un patin pour éviter que les roues frottent contre la surface
  • les deux roules latérales, même si elles tournent à même vitesse, peuvent ne pas enrouler à même vitesse et ceci en fonction de comment s'enroule la ficelle. Il a donc fallu utilise l'accéléromètre pour garder le Thymio II équilibré latéralement.

En conclusion cette configuration est très simple mais demande des ajustements avait de fonctionner parfaitement.

Voici enfin un exemple de code qui réalise ces fonctionnalités:

var vitesse             # vitesse d'avancement de la cabine
var etage =-1         # nombre d'étages à passer (relatif)
var init =0
var positetage=0
var ledetage[8]
var i =0

call leds.circle(31, 0, 0, 0, 0, 0, 0, 0)

# interface utilisateur:
onevent buttons 
 when button.right ==1 do
 vitesse=-300
 motor.left.target = vitesse
 motor.right.target =vitesse
end

 when button.forward==1 do             # Décrémente étage
 if etage>1 then
  etage = etage - 1 #
  end
end
 when button.backward==1 do         # Incrémente étage
 if etage<4 then 
  etage = etage + 1 
 end 
end

when button.left ==1 do             #Stop
 vitesse=0
 init=0
 motor.left.target = vitesse
 motor.right.target =vitesse
end
when button.center==1 and init==1 do     # Start
 if etage > positetage and init==1 then
  vitesse=300 
  motor.left.target = vitesse 
  motor.right.target = vitesse 
end
if etage < positetage and init ==1 then 
 vitesse =-300
 motor.left.target = vitesse 
 motor.right.target = vitesse 
end 
end

# contrôle du passage d'étage:
onevent prox
when prox.ground.reflected[0] >600 do
 if etage > positetage and init==1 then
  positetage = positetage + 1
  vitesse=300 
  motor.left.target = vitesse 
  motor.right.target = vitesse 
 end
if etage < positetage and init ==1 then
 positetage = positetage - 1 
 vitesse =-300
 motor.left.target = vitesse 
 motor.right.target = vitesse 
end
if etage==positetage and init==1 then
 vitesse = 0
 motor.left.target = vitesse 
 motor.right.target = vitesse 
end 
#Affiche etage
for i in 0:7 do         #tableau à 0
 ledetage[i]=0 
end

ledetage[positetage]=31
call leds.circle(ledetage[0] , ledetage[1], ledetage[2], ledetage[3], ledetage[4], ledetage[5], ledetage[6], ledetage[7]) 
end 
when prox.horizontal[2] >3900 do #etage =0
 vitesse=0
 motor.left.target = vitesse
 motor.right.target =vitesse
 etage=0
 positetage=0
 init=1
end
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License