Pages

Affichage des articles dont le libellé est arbotix. Afficher tous les articles
Affichage des articles dont le libellé est arbotix. Afficher tous les articles

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).

XBee : Hello World !

Les modules XBee sont des petits modems assez fascinants de par leur simplicité d'utilisation dans un univers embarqué, surtout si vous utilisez l'IDE Arduino (avec le shield adéquat) ou tout simplement ma divine ArbotiX.

Hello World
Le module XBee est directement connecté au port série de l'ATmega644P si bien qu'une simple commande "Serial." utilisera directement la communication XBee si vous en avez branché un. Alors si vous avez placé un autre XBee en écoute de l'autre côté, votre réseau fonctionnera comme par magie. De cette façon, on pourrait alors facilement imaginer un réseau de deux robots communicants (avec serial.print et serial.read)

En ce qui me concerne, je souhaite juste pouvoir lire la sortie de l'XBee connecté à mon USB Explorer. Pour cela, ouvrez X-CTU, connectez vous au XBee et utilisez l'onglet terminal.

Ensuite, il suffit juste de faire un tout petit programme pour la lecture et envoyer une réponse :

// valeur lue
int myData = 0;

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)
    {
        myData = Serial.read();
        Serial.print("Hello World !");
    }
}

Dans le terminal, si on appuie sur une touche, on obtiendra alors :


Hello World sur XBee ;)
MAGIE =)

jeudi 12 janvier 2012

Installation des outils


Pour commencer, il faut s'équiper des logiciels nécessaires pour la programmation. Sachant que j'utiliserai les outils fournis avec l'ArbotiX, j'ai besoin des fichiers suivants (je travaille principalement sous Windows 7) :
  • Visual Studio Express : pour développer en C/C++/C#. C/C++ car les librairies AX-12 sont développés en C. C# si je veux créer facilement des interfaces Windows.
  • Python : pour développer en Python. Des outils fournis par le créateur de l'ArbotiX (Mike Ferguson) ont été développés en Python. Du coup, pas le choix même si je n'y connais rien dans ce langage :)
  • wxPython et PySerial : le premier pour créer facilement des interfaces graphiques et le second pour permettre à Python de communiquer avec un port série (comme l'USB).
  • Arduino : l'IDE/SDK pour développer les applications à télécharger dans le chip de l'ArbotiX. C'est un langage propre à Arduino mais qui ressemble beaucoup au Java/C#.
  • Les librairies ArbotiX : disponibles sur la page "Getting Setup" de l'ArbotiX. Il s'agit des librairies propres à la carte, notamment pour contrôler les AX-12. Le téléchargement contient également l'application PyPose qui facilite la programmation des servos en enregistrant leur position à un instant T. Un petit raccourci assez pratique même si je devrait de toute façon commencer par apprendre à les capturer moi-même (bon, chut, je sais déjà le faire mais pas sur Arduino).
  • La librairie RoboControllerLib : pour ajouter des librairies propres à l'ArbotiX afin de contrôler des capteurs, moteurs et surtout, le pad ;)

L'interface de développement Arduino. Simple mais efficace.


A partir de là, il suffit de suivre un peu la page GettingSetup afin de savoir où et comment installer tout ça.