BTS Mesure BTS Mesure
Présentation2014CapteursModulationTyponsArduinoDémodulationApp InventorCourbesVidéos
 
CTNPT1000PressionPhotodiodeAccéléro

Des capteurs mécaniques minuscules : les MEMS

Notre accéléromètre 3 axes est minuscule c'est un MEMS (Microelectromechanical systems).

Aujourd'hui ils sont partout : dans notre smartphone, les manettes de jeu, l'automobile...

Leur mécanisme gravé dans le silicium est microscopique. Sur la photo on peut apercevoir les ressorts , la masse mobile, le condensateur de capacité variable en forme de peigne.

Les lois physiques utilisées sont : 

  • F = ma   (Principe Fondamental de la Dynamique)
  • F = kx     (k : raideur x: allongement du ressort)

Le déplacement de la masse mobile fait varier la capacité du capteur. L'électronique intégrée dans le capteur transforme cette variation en une tension proportionnelle à l'accélération...

Test de notre accéléromètre

Nous avons tester notre accéléromètre adxl335 sur la carte finale.

Cet accéléromètre sort 3 tensions analogiques que  nous allons mesurer avec la carte Arduino :

  // Mesures
  Ax = analogRead(Xout)-336; // offset 0g <-> 336 
  Ay = analogRead(Yout)-336;
  Az = analogRead(Zout)-336;
  // Calcul de la résultante
  A = sqrt(pow(Ax,2) + pow(Ay,2) + pow(Az,2)); 

représente la norme du vecteur accélération résultant. D'après l'étude ci-dessous 409-336 = 73  représente 1g.

Ci-contre l'interface graphique que nous avons développé à l'aide de Labview pour effectuer ce test.
Durant les 4 premières secondes l'accélérométre est posé à plat sans bouger.

Un étalonnage rapide nous montre que posé à plat et sans retirer l'offset, nous mesurons :

Ax = 336    Ay = 336    Az = 409

Rappel : 5V <-> 1024 soit  4,88 mV/LSB

Remarque : pour obtenir les bonnes valeurs il faut ajouter une alimentation externe qui donne 5 V comme tension de référence.
Sans cette alimentation externe l'offset était à 350 car la tension de référence est  légèrement inférieure à 5 V.

Nous en déduisons l'offset :  Offset = 336     soit  Voffset = 1,641 V  (d'après le datasheet environ 1,65 V)

Selon l'axe Z, nous avons 1 g et mesurons 409 soit 1,997 V,  soit une variation de 1,997-1,641 = 0,356 V pour 1 g.

La sensibilité de notre capteur est donc de :   (d'après le datasheet minimum 300 mV/g)

Le datasheet de l'ADXL 335 annonce :

Gamme : ± 3g
linéarité : 0.3 %
Sensibilité (minimum) : 300 mV/g
Sortie (environ) : 1.65 V à 0 g

Alimentation : 3 à 5 V
Consommation faible : 350 µA

Angle d'inclinaison

Afin de vérifier la bonne linéarité de notre accéléromètre, nous allons poser notre capteur sur un plan incliné. Puis nous allons vérifié si l'angle calculé à partir de Ax, Ay et Az correspond à l'angle de notre plan incliné.

Dans le référentiel du ballon sonde, l'accéléromètre nous permet de mesurer 2 angles :

  • le roulis ( roll, angle dans le plan YZ, axe de rotation X)
  • le tangage (pitch, angle dans le plan XZ, axe de rotation Y)

Pour ne transmettre qu'une information nous allons calculer l'angle résultant : l'inclinaison par rapport à l'axe Z.

Pour cela nous calculons la norme du vecteur résultant Axy :

Remarque : avec ce calcul Axy est toujours positif, nous perdons une information sur l'orientation de l'angle.
Mais ceci n'est pas génant pour notre application.

Comme on peut le voir sur le schéma, il est alors facile de calculer l'angle d'inclinaison :

Soit en langage Arduino :

  // Calcul angle
  Axy = sqrt(pow(Ax,2) + pow(Ay,2)); // Résultante plan XY
  angle = 180.0/pi * atan2(Axy,Az)+0.5;

Mesures

Nous avons constaté sur une série de 6 mesures que l'angle du plan incliné et l'angle calculé à l'aide des formules ci-dessus correspondent au degré près.

Conclusion : ce capteur est fiable et linéaire.

 

Le programme test Arduino :

#define pi 3.1416
int Ax, Ay, Az,Axy, A;
int Xout=14,Yout=13,Zout=12;     // Accéléromètre
int angle;

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned long t0=millis();
  mesure();
  Serial.print(A); Serial.print(";1;");  // 1 : mesure 2 : ADXL335
  Serial.print(angle); Serial.print(";");
  Serial.print(Ax); Serial.print(";");
  Serial.print(Ay); Serial.print(";");
  Serial.println(Az);
  while (millis()-t0 < 50);
}

void mesure () {
  // Mesures
  Ax = analogRead(Xout)-336; // offset 0g <-> 336 
  Ay = analogRead(Yout)-336;
  Az = analogRead(Zout)-336;
  // Calcul de la résultante
  A = sqrt(pow(Ax,2) + pow(Ay,2) + pow(Az,2)); 
  // Calcul angle
  Axy = sqrt(pow(Ax,2) + pow(Ay,2)); // Résultante plan XY
  angle = 180.0/pi * atan2(Axy,Az)+0.5;
}