Balises ultrason

L'objectif de ces balises est d'utiliser le temps de propagation d'un message sonore pour connaitre la position du robot.

Etapes pour mesurer la distance de la balise 1 au robot :

Le robot envoie un pulse de synchronisation à la balise 1 et envoie son message ultrason..

La balise reçoit le  pulse lance un compteur. Le message se propage dans l'air à la vitesse du son.

La balise de réception écoute en permanence, et détecte le temps écoulé entre le pulse zigbee et la réception de l'ultrason.
Le décalage doppler peut aussi être mesuré.

La balise renvoie les informations sur le temps de propagation et le doppler au robot, qui les utilise pour calculer sa position.

$ Distance = T_{propagation} * V_{son} $. La vitesse du son dépend la température.

La mesure de la distance à plus de trois balises permet d'améliorer la mesure et de compenser la température.

Le doppler peut aussi être utilisé pour améliorer le résultat, au moyen d'un filtre de Kalmann.

La suite de cet article présentera plus précisément les différentes sous-parties:

Organisation du projet

Cette page présente les étapes principales de ce projet et la répartition des tâches.

Electronique

Liens

Carte Emettrice

La carte émettrice reçoit le pulse de synchronisation émis par le robot via le zigbee, détermine si ce pulse lui est destiné ou non.

Si le pulse lui est destiné, la carte émet ou reçoit le message prévu par ultrason.

Synchronisation

Un octet envoyé par le robot contenant le numéro de la balise activée.

Emission ultrason

Les émetteurs utilisés émettent des ultrasons vers 200 kHz . Le message envoyé est un pulse, éventuellement codé.

Ces émetteurs ont besoin d'une tension assez élevée pour fonctionner, 40 Vpp semble convenir.

Les émetteurs sont attaqués par un signal carré à la fréquence voulue.

Réalisation

Génération d'un signal périodique: utilisation d'un timer de l'ATMEGA88 avec les interruptions.

L'ATMEGA88 dispose de plusieurs compteurs; on utilise ici le compteur 16 bits pour générer un créneau de fréquence 200 KHz.
Une fois activé le compteur fonctionne de manière cyclique: il compte de 0 à sa valeur maximale. On peut préciser une valeur de comparaison, ce qui permet de raccourcir la durée du cycle; définir cette valeur est donc un moyen de définir la fréquence du signal.

Le compteur est capable si on le souhaite de prendre le contrôle d'une pin du microcontrôleur: dans ce cas à chaque cycle du compteur la pin bascule de 0 à 1 et inversément. Cela suffit à générer un signal de type créneau sur cette pin.

Si on veut contrôler à l'aide du compteur un dispositif qui n'est pas connecté à la pin réservée au timer, on peut se servir des interruptions (interrupt). Une interruption permet d'effectuer des actions brèves (par exemple modifier un registre quelconque) à chaque cycle du compteur. C'est de cette façon que nous avons procédé.

On commence par sélectionner l'horloge du compteur: on peut utiliser l'horloge interne à la fréquence F0, ou bien des sous-multiples (F0/8, F0/64, F0/256, F0/1024) ou encore une horloge externe. Pour nous F0 convient:

/* CLOCK SELECT : values for TCCR1B[2,1,0] :
*   2 | 1 | 0 | effect
*  -----------------------------------------------------
*   0 | 0 | 0 | no clock signal (timer off)
*   0 | 0 | 1 | internal clock F0        (no prescaling)
*   0 | 1 | 0 | internal clock F0/8      (no prescaling)
*   0 | 0 | 1 | internal clock F0/64     (no prescaling)
*   0 | 1 | 1 | internal clock F0/256    (no prescaling)
*   1 | 0 | 0 | internal clock F0/1024   (no prescaling)
*   1 | 1 | 0 | external clock source on T1 pin
*   1 | 1 | 1 | external clock source on T1 pin             */
    TCCR1B =  1;

Ensuite on initialise le compteur à zéro (facultatif: c'est la valeur au démarrage)

/* Timer initial value 0 */
    TCNT1H = 0x00 ;
    TCNT1L = 0x00 ;

On définit les deux pins du pont en H en sorties dans le registre.

    DDRB |= 1 << PB1 ;    // PB1 -> OC1A
    DDRB |= 1 << PB2 ;    // PB2 -> OC1B


  On définit les valeurs : 1 pour laquelle la comptage de A s'inverse (il monte puis descend après OCR1A)

                                            2 pour laquelle le comptage de B s'inverse (il descend puis remonte après OCR1B)

                                            3 pour laquelle le timer repart a zero.

    OCR1AH = 0;
    OCR1AL = t_base;
    OCR1BH = 0;
    OCR1BL = t_base;
 
    ICR1H = 0;
    ICR1L = 2*t_base ;



On définit le mode de fonctionnement: ici un Fast PWM, avec un timer remis à zero sur comparaison à ICR1,  avec réactualisation de OCR1x en descente.

    TCCR1B |= 1 << WGM13;
    TCCR1B |= 1 << WGM12;
    TCCR1A |= 1 << WGM11;
//    TCCR1A |= 1 << WGM10;



    /* COMPARE OUTPUT MODE : values for TCCR1A[7..4]
    * we set TCCR1A[7,6] to [1,0] to select 'OC1A on Compare match : Clear on Upcounting, Set on Downcounting'
    * we set TCCR1A[5,4] to [1,1] to select 'OC1B on Compare match : Set on Upcounting, Clear on Downcounting'
        */
On met  TCCR1A[7,6] à [1,0] pour selectionner la remise à zero de OC1A en montée, mise à 1 en descente.

On met  TCCR1A[5,4] à [1,1] pour selectionner la remise à zero de OC1B en descente, mise à 1 en montée.

    TCCR1A |= (1 << 7 );
    TCCR1A |= (1 << 4 | 1 << 5);


On authorise les interruptions sur OC1A et OC1B, ici cela ne sert en rien au comptage mais nous a permis de faire clignoter des led lors du fonctionnement.

    TIMSK1 |= 1 << 1 ; // allow interrupts on A
    TIMSK1 |= 1 << 2 ; // allow interrupts on B
 

On désactive la réduction de consommation pour activer le compteur (cf p 109 de la datasheet).

    PRR = 0;

Remarque: TIMER1_COMPA_vect est le registre d'interrupt correspondant au canal A du compteur 1. On peut trouver ces noms en fouillant dans les header files du compilateurs à   /usr/avr/include/avr/iom88.h  .

La fonction toggle_creneau permet de faire basculer un signal de 0 à 1 et inversément. On remarquera que, contrairement à l'utilisation de la pin associée au timer, cette manière de procéder permet de gérer plusieurs signaux, par exemple pour générer deux créneaux de même période.

Carte Receptrice

La carte réceptrice reçoit le signal ultrason, l'amplifie, le filtre, l'échantillone, et détermine son moment de réception.

Réception des ultrasons

On utilise le même composant que pour la carte émettrice. Ce composant génère un signal très faible qu'il faudra amplifier avant de pouvoir l'utiliser.

Amplification

Le but de l'amplification est de relever le niveau du message reçu pour qu'il puisse être utilisable.

Le gain doit être adapté pour que lorsque les balises émettrices et réceptrices sont au plus proche il n'y ait pas de saturation.

L'amplification est réalisée au moyen d'amplificateurs opérationnels.

Echantillonage

Un convertisseur analogique numérique externe ou le convertisseur interne de l'ATMEGA peuvent être utilisés pour l'échantillonage.

Convertisseurs externes proposés: LTC2365 ou LTC2366

Un convertisseur externe est préférable car il a une plus grande dynamique et une fréquence de fonctionnement plus élevée, ce qui permet de compenser la différence de niveau entre les signaux reçus quand le récepteur est proche ou loin de récepteur, et d'améliorer la précision de la mesure du temps de vol.

Détermination du moment de Réception

Le signal en sortie du convertisseur analogique numérique est filtré, redressé. Le temps de vol est déterminé en comparant le signal reçu à un seuil.

Calcul de la position

La distance s'obtient en multipliant le temps de vol par al vitesse du son.

$ distance = T_{vol} * V_{son} $

La vitesse du son dépend de la température selon l'équation:

cair = (331,5 + 0,6·θ) m/s

avec θ = température de l'air en degré celsius.

pour une gamme de température couramment rencontrée à la coupe (0°C à 45°C) ( Il fait froid la nuit sous la tente à la Ferté, et chaud sous les projecteurs), cela donne une vitesse du son variant de 331.5 m/s à 358.5 m/s, soit une vigntaine de centimètres(!!!) pour 3 mètre de table.

Il faut compenser cette variation pour atteindre une précision suffisante. Cela peut soit se faire par une calibration au début du match, soit par une mesure avec un thermomètre, soit par une corrélation des distances aux diverses balises, ou par une combinaison de ces techniques.

Filtre de Kalman étendu (EKF : Extended Kalman Filter)

Le filtre de Kalman est un filtre à réponse impulsionnelle infinie qui estime les états d'un système dynamique à partir d'une série de mesures incomplètes ou bruitées.

Nous cherchons à déterminer la localisation d'une balise le plus précisément possible en nous basant sur 3 mesures de distance entre cette balise et 3 balises fixes placées au tour de la table. Le filtre de Kalman nous permettrait de réduire les erreurs de mesure et donc de gagner en précision.

Resultats expérimentaux

Première video

Nous avons obtenu une video qui se trouve ici. On peut y voir la mise en pratique directe du modèle choisi. Cette video a été réalisée à l'aide d'un GBF branché sur l'émetteur . Le récepteur est chargé sur une résistance de 100kOhms,et est observé avec un oscilloscope.

You are missing some Flash content that should appear here! Perhaps your browser cannot display it, or maybe it did not initialise correctly.