La détection de chocs avec des accéléromètres

FIXME Recherche des images en cours..

FIXME Liens cassés

La détection des chocs est un élément vital pour un système mobile autonome. La solution détaillée ici est élaborée à base de deux accéléromètres 1 axe MMA2260D de Freescale et d’un microcontrôleur PIC (dans cet article, 16F877A ou 18F2680). Thèmes développés : utilisation d'un accéléromètre, utilisation des entrées analogiques d'un PIC.

Introduction

Après avoir simplement détaillé le problème de la détection des accélérations, l’article expliquera la solution mise en place pour détecter les chocs sur le robot 2007. Le fonctionnement de l’accéléromètre sera détaillé ainsi que son interfaçage avec le microcontrôleur au niveau électronique et informatique.

L'article est structuré selon le plan suivant :

  • Détecter une accélération
  • Les accéléromètres utilisés
  • Montage du composant
  • Principe de la conversion Analogique/Numérique
  • Configuration du PIC
  • Mise en pratique
  • Exemple de carte
  • La détection des chocs

Détecter une accélération

Mesurer l’accélération, c’est étudier les variations de vitesse d’un élément mobile. Pour mesurer les accélérations, il existe principalement deux solutions technologiques :

Les accéléromètres
Les accéléromètres mesurent le déplacement dû à une accélération linéaire d’un élément placé dans un milieu élastique (ex : modification de capacité entre 2 éléments métalliques…). Ils sont précis pour de fortes accélérations (à l'échelle du déplacement d'un robot).

Les gyroscopes
Les gyroscopes mesurent des vitesses angulaires pouvant être utiles pour mesurer des rotations.

Pour obtenir un bon système de détection de l’accélération, il faut combiner les deux technologies en créant ce que l’on appelle une centrale inertielle. Cependant, un tel système est complexe à développer et l’achat d’un module industriel coûte cher.

L’idée de départ pour le Robot 2007 était d’intégrer le déplacement à partir de l’accélération (déduire des accélérations subies par le robot sa position sur le terrain). Cette idée a vite été abandonnée par manque d’intérêt et par complexité de la tache. Cependant, la carte de tests s’est révélée efficace pour la détection de chocs (pics importants d’accélération).

Les accéléromètres utilisés

modèle accéléromètres

Le composant utilisé est l’accéléromètre 1 axe MMA2260D de Freescale.

Son fonctionnement est assez simple : entre deux plans métalliques fixes, une languette métallique se déplace dans un milieu élastique en fonction de l’accélération. Les capacités ainsi mesurées aux bornes de ces éléments varient en fonction de l’accélération.

Le signal est ensuite conditionné de façon à donner un signal proportionnel à l’accélération, centré sur 2,5V (pour une tension d’alimentation de 5V) c'est-à-dire que lorsque l’accélération détectée est 0g, la tension de sortie est 2,5V. Ce signal tendra vers 5V ou 0V en fonction de la direction de l’accélération subie.

Image provenant de la datasheet du composant

Montage du composant

montage type accéléromètres PIC

La sortie de chaque accéléromètre est reliée à une entrée analogique du PIC au travers d'un filtre RC qui aura pour rôle d'atténuer les valeurs parasites. Les alimentations et les composants nécessaires au fonctionnement du PIC ne sont pas représentés ici. De même, les pattes de test des accéléromètres ne sont pas câblées car elles sont peu utiles.

Schéma simplifié du montage

Principe de la conversion Analogique/Numérique

Le principe de la conversion Analogique/Numérique peut être résumée simplement de la façon suivante :

conversion analogique numérique charge

  • Dans un premier temps, un condensateur à l'intérieur du composant se charge à travers la résistance interne du composant et de la résistance externe, celle du montage effectué. Pour que la valeur de la conversion soit bonne, il est nécessaire de laisser le temps à ce condensateur de se charger complètement. Nous appellerons ce temps de charge Tc .
  • Dans un deuxième temps, le condensateur est déconnecté du circuit par lequel il s'est chargé et se décharge à courant constant dans le système qui va effectuer la conversion en elle même. C'est le temps de décharge du condensateur qui va donner la valeur numérique de la tension d'entrée. Pour une conversion 10bits, il faut compter pour l'acquisition un temps de 11 à 12 fois TAD (qui est le temps de conversion par bit).

conversion analogique numérique décharge

Il faut ajouter à cela un petit temps pendant lequel le condensateur va être vidé de ses charges résiduelles.

Configuration du PIC

Pour utiliser les entrées analogiques du PIC, il faut :

  • Définir les pattes qui vont être utilisées en mode analogique
  • Activer le convertisseur analogique/numérique
  • Sélectionner les pattes à lire avant chaque lecture

Registres à initialiser :

PIC 16F877A (datasheet) PIC 18F2680 (datasheet)
Dans les registres de paramétrage ADCON0 , ADCON1 (et ADCON2 pour le 18F):
ADON : mise en route du convertisseur
ADFM : la conversion s'effectuant sur 10bits (⇒ résultat sur 2 octets ADRESH et ADRESL), cette configuration permet de justifier le résultat à gauche ou a droite: (les X sont les valeurs qui nous intéressent)
###### ADRESH ADRESL
ADFM=1 0000 00XX XXXX XXXX
ADFM=0 XXXX XXXX XX00 0000
ADCS0,ADCS1,ADCS2 : permettent de choisir la fréquence de fonctionnement du convertisseur en fonction de la fréquence d'horloge du PIC. Ce choix est détaillé plus bas.
PCFG0,PCFG1,PCFG2,PCFG3 permettent de configurer quelles pattes ANX seront configurées en analogique ou en digital (pour le 16F, ce choix inclut aussi le choix de l'utilisation de potentiels de référence pour la conversion). Cette configuration est propre à chaque type te PIC et est disponible sur leur datasheet (p128 pour le 16F877A et p248 pour le 18F2680).
CHS0,CHS1,CHS2 (et CHS3 pour le 18F) : Ce sont les bits qui permettent de choisir quelle patte ANX va être traitée à l'instant présent. Par exemple, je veux lire la valeur analogique sur la patte AN1, je vais placer les valeurs CHS3,CHS2,CHS1=0 et CHS0=1 puis lancer la conversion et récupérer la valeur.
GO_/DONE : mettre ce bit a 1 équivaut à lancer la conversion. Une fois la conversion terminée, ca bit revient automatiquement à zéro.
VCFG0,VCFG1: servent à sélectionner les potentiels de référence (VREF- ou VSS/AVSS, VREF+ ou VDD/AVDD)
ACQT0,ACQT1,ACQT2 : Règle le temps d'acquisition de la valeur numérique. Ce choix est détaillé plus bas

Détails sur ADCS0,ADCS1,ADCS2 : ces paramètres permettent de mesurer le TAD (défini précédemment) en fonction de la période d'oscillation de l'horloge du PIC appelée TOSC. Le TAD minimum est d'environ 2 us. Par exemple pour une fréquence d'oscillation de 20MHz, le TOSC est de 0,005 us. Pour un réglage ADCS0=0, ADCS1=1, ADCS2=1, configuration qui correspond à TAD=64*TOSC, on a un TAD de 3,2 us.

Détails sur ACQT0,ACQT1,ACQT2 : ces paramètres permettent de régler le temps d'acquisition de la valeur analogique (indépendant de la conversion) que l'on appelle TACQ. Ce temps comprend le temps de charge du condensateur Tc (défini précédemment) ainsi que d'autres temps relatifs au design du système d'acquisition (aux alentours de 7 us). Ce temps sera défini en fonction de TAD par ces bits de configuration. Il peut aussi être géré par le programme s'ils sont tous réglés à 0. Par exemple, un calcul donne un temps TACQ de 13 us. On a TACQ = 4*TAD. Cela correspond à la configuration : ACQT0=0, ACQT1=1, ACQT2=0.

Mise en pratique

Reprenons le montage précédent : les deux informations analogiques venant des capteurs entrent dans les pattes annotées AN0 et AN1. Nous considérerons dans cet exemple qu'une grande précision n'est pas nécessaire et donc qu'un résultat sur 8bits nous suffit amplement. La fréquence d'horloge des PIC est de 20MHz

Configuration à effectuer

PIC 16F877A PIC 18F2680
ADFM = 0 ; on ne lira que la valeur ADRESH qui sera le résultat de la conversion
ADCS0 = 0 ; TAD réglé à 64*TOSC = 3,2us
ADCS1 = 1 ;
ADCS2 = 1 ;
PCFG0 = 0 ; choix des pattes à configurer en analogique PCFG0 = 1 ; choix des pattes à configurer en analogique
PCFG1 = 0 ; ce choix est fait en fonction des tableaux PCFG1 = 0 ; ce choix est fait en fonction des tableaux
PCFG2 = 1 ; PCFG2 = 1 ;
PCFG3 = 0 ; PCFG3 = 1 ;
VCFG0 = 0 ; on choisit Vref+=VDD et Vref-=VSS
VCFG1 = 0 ;
ACQT0 = 0; temps d'acquisition réglé à 4TAD=13us
ACQT1 = 1;
ACQT2 = 0;
ADON = 1; mise en route du convertisseur

Le convertisseur est maintenant configuré et est prêt à être utilisé.

Pour chaque conversion, il faudra respecter les étapes suivantes :

PIC 16F877A PIC 18F2680
Sélectionner la patte d'entrée avec les configurations CHS0,CHS1,CHS2 (pour AN0 : CHS0=0,CHS1=0,CHS2=0 et pour AN1 : CHS0=1,CHS1=0,CHS2=0) Sélectionner la patte d'entrée avec les configurations CHS0,CHS1,CHS2,CHS3 (pour AN0 : CHS0=0,CHS1=0,CHS2=0,CHS3=0 et pour AN1 : CHS0=1,CHS1=0,CHS2=0,CHS3=0)
Attendre le temps TAD avant de lancer la conversion L'attente TAD sera effectuée lorsque la conversion sera lancée.
Lancer la conversion : GO=1 ;
Attendre que ce bit revienne à zéro indiquant la fin de la conversion
Lire la valeur ADRESH qui sera le résultat de la conversion sur 8bits
Attendre un temps d'environ 2*TAD avant la prochaine conversion

Exemple de carte

La carte ci-dessous est un exemple de carte très simple permettant d'utiliser des accéléromètres. Elle est réalisée à partir d'un PIC16F877A et de 2 accéléromètres MMA2260D.

carte accéléromètres Schema carte accéléromètres liste des composants

                                              Schéma de la carte
     carte accéléromètres Typon	       carte accéléromètres Pacement
                        Typon
        Placement des composants
              Liste des composants
              

Cette carte (ci-dessus) est le prototype qui a permis de faire des tests afin de développer la carte finale (ci-dessous) présente sur le robot 2007. Les typons et le schéma de la carte finale ne sont pas donnés puisque sur le principe ils sont identiques aux précédents à la différence près qu'ils contiennent de nombreux éléments pour l'intégration au robot ainsi que des LED témoins des chocs, qu'elle est gravée en 6 couches et que le PIC utilisé est un 18F2680.

carte_acceleros.jpg carte_acceleros_dessous.jpg

La carte accéléromètres présente sur le robot 2007

La détection des chocs

Voici un exemple de programme implémentable dans la carte dont les schémas sont donnés ci dessus qui permettra de détecter des chocs en fonction des informations provenant des accélérations.

Principe

Le graphe ci-contre présente les valeurs relevées avec la carte à la suite d’un gros choc. Il a été centré sur la valeur 128 puisque en pratique, les valeurs varient entre 0 et 255. Le premier pic en violet a atteint la saturation de l’accéléromètre puis on remarque une oscillation qui suit le choc. La direction principale du choc est selon l’accéléromètre représenté en violet. Cependant, on remarque aussi une réaction sur le deuxième accéléromètre.

La méthode proposée pour détecter la direction et le sens du choc est la suivante :

  • détecter un seuil au delà duquel, la perturbation sera considérée comme un choc.
  • stopper la détection pendant le temps des oscillations pour éviter de les détecter.

Dans le robot, de bonnes valeurs trouvées on été : seuil 60 (seuil bas : 0+60=60 et seuil haut : 255-60=195 correspondant environ à un choc de 1g) et un temps d’attente de 200 ms. (survoler l’image)

D’autre part, il est intéressant d’appliquer des corrections pour corriger l’inclinaison de la carte (accélération non nulle au repos)

Graphique valeurs accéléromètres choc

Structure du programme

  Initialisations
  Boucle
      Acquérir valeur accéléromètre1
      Acquérir valeur accéléromètre2
      Appliquer les corrections inclinaison
      Tester seuil haut accéléromètre1 => Notifier le choc
      Tester seuil bas accéléromètre1 => Notifier le choc
      Tester seuil haut accéléromètre2 => Notifier le choc
      Tester seuil bas accéléromètre2 => Notifier le choc
  Fin boucle

Vous trouverez ici un code source fonctionnant pour cette carte avec le PIC 16F877A.

Dans ce programme, la notification des chocs se fait par le port série. Il est facile de la remplacer en utilisant par exemple les quelques sorties disponibles sur le carte ( pour allumer des LED ou autre…)

Article écrit par AUQUE Martin

7 avril 2007