Thymio II en véhicule tout terrain

Sur les roues du robot Thymio II on peut ajouter des chenilles pour lui permettre de franchir des obstacles plus importants. Voici un exemple de construction:

global-tout-terrain.jpg
frontal.jpg
side-view.jpg

Ce qui peut être intéressant ici est de programmer le robot pour qu'il détecte les pentes et pour qu'il donne des signaux d'alerte en cas de danger. Voici comment on peut faire cela:

Pour détecter l'inclinaison du robot on peut utiliser le code ci-dessous. Dans ce code on fait un moyennage sur 4 mesures des accéléromètres 0 et 1. On somme ces quatre valeurs (dans sumacc0 et sumacc1) et on les multiplie par elle-mêmes pour n'avoir que des valeurs positives. On obtient ainsi pente, qui prend une valeur en fonction de l'inclinaison du robot. Vous pouvez essayer ce code et visualiser pente en inclinant le robot. Selon la valeur de pente on change la couleur du robot et on met la variable danger_level à 0, 1, 2 ou 3. C'est en quelque sorte le niveau de danger que court le robot de se tourner sur lui-même. Au niveau 3 on émet un signal d'alarme. Ce signal est un son enregistré sur la carte SD sous le nom p3.raw. Un ficher zip avec les sons à mettre sur la carte SD pour cette démo se trouve ici.

var accTampon0[4] = 0,0,0,0
var accTamponPos0 = 0
var accTampon1[4] = 0,0,0,0
var accTamponPos1 = 0
var sumacc0
var sumacc1
var pente
var danger_level
var r
var g
var b=0

onevent acc
# vérification de l'inclinaison avec un petit moyennage su 4 mesures
  accTampon0[accTamponPos0] = acc[0]-3
  accTamponPos0 = (accTamponPos0 + 1) % 4
  sumacc0 = accTampon0[0] + accTampon0[1] + accTampon0[2] + accTampon0[3]
  accTampon1[accTamponPos1] = acc[1]-2
  accTamponPos1 = (accTamponPos1 + 1) % 4
  sumacc1 = accTampon1[0] + accTampon1[1] + accTampon1[2] + accTampon1[3]

  pente = sumacc0*sumacc0 + sumacc1*sumacc1

  if pente<500 then
      danger_level = 0
      g=32
      r=0
  else 
    if pente<1000 then
      danger_level = 1
      r=10
      g=10
    else 
      if pente<1500 then
           danger_level = 2
          r=10
          g=10
      else 
        when pente<2000 do
             danger_level = 3
             call sound.play(danger_level)
            r=32
            g=0
        end 
      end
    end
  end

  call leds.top(r,g,b)

D'autres signaux d'alarme sont émis en cas de niveau de danger 1 et 2 avec le code suivant:

onevent temperature #toutes les secondes
  if danger_level != 0 then
    if danger_level != 3 then
      call sound.play(danger_level)
    end
  end

Enfin pour pouvoir faire avancer le robot on peut utiliser le code suivant:

onevent buttons #gestion de la commande
  when button.forward==1 do
    motor.left.target=200 
    motor.right.target=200 
  end

  when button.center==1 do 
    motor.left.target=0 
    motor.right.target=0 
  end

  when button.backward==1 do 
    motor.left.target=-200 
    motor.right.target=-200 
  end

  when button.left==1 do 
    motor.left.target=-200 
    motor.right.target=200 
  end

  when button.right==1 do 
    motor.left.target=200 
    motor.right.target=-200
  end

Le tout combiné (ne pas oublier les fichers sons dans la cadre SD) donne le comportement suivant:

On peut naturellement ajouter d'autre fonctionalités, comme par exemple la détection d'obstacles trop importants ou le ralentissemement en fonction de la présence d'obstacles.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License