Pages

mardi 17 janvier 2012

Mesure de distance avec PING)))

Pour mesurer la distance, j'utilise un capteur "PING)))" de chez parallax. En fait, ce capteur dispose d'un émetteur et d'un récepteur sonore pour mesurer le temps entre l'envoi et le retour. La distance se mesure alors en fonction de la vitesse du son dans l'air.

Un peu de théorie.
Regardons ce capteur de plus près grâce à la fiche technique.

Méthode de mesure du capteur.

Le capteur dispose de 3 pinoches. Une Vdd (de 5V, ça tombe bien, c'est la tension fournie par les entrées/sorties de l'ArbotiX), une masse et une pour le signal. D'après ce schéma, il faut envoyer une impulsion pour recevoir un impulsion écho d'un certain temps. Voyons cela de plus près.

Détails sur le mode opératoire du capteur PING))).

Il faut donc envoyer une impulsion de 5µs. 750µs plus tard, le capteur répondra par une impulsion comprise entre 115µs et 18.5ms (nous donnant la distance). La prochaine capture pourra se faire 200µs plus tard.

Pour calculer la distance, une formule est également donnée dans la doc. On remarque alors que c'est en fait celle du son :

Tc = températeure en °C
Il faudrait donc, pour être précis avoir un autre capteur de mesure de la température et d'appliquer la formule. Pour l'instant, je ne vais pas aller jusque là et considérer que chez moi, il fait environ 20°C. Soit 331.5 + (0.6*20) = 343,5 m/s. N'oublions pas d'ailleurs que la mesure concerne l'aller-retour, soit deux fois la distance à mesurer.

Voyons maintenant le branchement sur la carte. 

Branchement des capteurs. Le PING))) se branche sur une IO digitale.

Branchez donc le capteur sur une des entrées sorties digitales. L'avantage sur l'ArbotiX (contrairement à l'Arduino) c'est que chaque entrée/sortie dispose également d'un VCC et d'un GND. Du coup, vous pouvez utiliser directement des connecteurs 3-pin. Dans les exemples suivants, mon capteur sera branché sur D7.

Programme de test
Comme j'ai appris à utiliser un XBee, je ne vais pas m'embêter avec des câbles et l'utiliser directement pour la communication série (la console quoi).
Voici donc le programme pour mesurer la distance :
int png = 7; // position du PING)))

void setup()
{
    // Démarrage du réseau série. Les modules XBee sont configurés en 38400bps. 
    Serial.begin(38400);
}

void loop()
{
    // Si on a des données sur le port série
    if(Serial.available() > 0)
    {
      // lecture de la donnée reçue
      int incomingByte = 0;
      incomingByte = Serial.read();
      if (incomingByte == 114) // 114 = touche "r"
      {
        long temps, distance;
          
        // Mesure de la distance
        pinMode(png, OUTPUT); // pin signal en mode sortie
        
        // Envoi d'une impulsion
        digitalWrite(png, LOW); // initialistion à 0.
        delayMicroseconds(2);
        digitalWrite(png, HIGH); // envoi impulsion
        delayMicroseconds(5);    // durant 5µs
        digitalWrite(png, LOW);  // remise à 0
        
        // Ecoute de la réponse
        pinMode(png, INPUT); // mode entrée pour écouter la réponse
        
        // pulseIn mesure le temps d'une impulsion en microsecondes
        temps = pulseIn(png, HIGH); 
        
        // conversion en cm
        distance = tempsSonoreEnCentimetres(temps);
        
        
        // écriture dans la console XBee
        Serial.println();
        Serial.print("Temps : ");
        Serial.print(temps);
        Serial.print(" microsecondes.");
        Serial.println();
        Serial.print("Distance : ");
        Serial.print(distance);
        Serial.print(" cm.");
        Serial.println();
        
        // Attente 200µs (temps entre les mesures)
        delayMicroseconds(200);
      } 
      
    }
}

long tempsSonoreEnCentimetres(long tempsEnMicroSecondes)
{
  // D'après la formule = 343,5m/s, soit 0,03435 cm / microseconde
  // Soit divisé par 28,99
  // Sachant que le signal va faire un aller retour, on le divise par deux
  return tempsEnMicroSecondes / 29 / 2;
}
Pour effectuer une mesure, il vous suffit d'envoyer "r" par le réseau série XBee, donc dans le terminal de X-CTU. Le résultat sera le suivant :

Mesure de distance avec une ArbotiX !

Voilà, le robot pourra bientôt se repérer avec ses 4 capteurs de distance parallax ! D'ailleurs, j'ai trouvé le résultat particulièrement précis (testé à 20cm, 40cm et 1m).

Aucun commentaire:

Enregistrer un commentaire