ADX335-326-Calibrer-Programmer

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Calibration statique

Comme pour tous les senseurs, il existe de faibles variations des valeurs de sorties entre différents exemplaires de l'accéléromètre.

Ces variations ne sont pas importantes pour les applications non-critiques comme les manettes de jeux, les détections de mouvement, senseurs tilts.

Pour les applications nécessitant des mesures précises, la calibration est nécessaire pour obtenir une valeur de référence fiable.

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

La gravité comme référence de calibration

L'accélération est mesure en unité de force gravitationnelle (ou en "G"). 1G représente l'attraction gravitationnelle à la surface de la terre. Peu importe ce que vous auriez pu entendre ci où là, la gravité est une force assez stable pouvant servir de référence de calibration fiable et pratique.

Méthode de calibration

Pour calibrer un senseur avec la référence gravitationnelle, vous avez besoin de déterminér la sortie du senseur pour chaque axe lorsque celui est précisément aligné avec l'attraction terrestre (attraction gravitationnelle). Une calibration de laboratoire (de grande qualité) utilisé des gabarits/supports d'une grande précision. La méthode décrite ci-dessous est simple et fournit des résultats d'une étonnante qualité.

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Monter le senseur

Pour commencer, montez/placez le senseur sur un petit breadboard comme celui que vous pouvez voir ci-dessous. La fond et les côtés du breadboard peuvent servir de références planes d'une relativement bonne précision. Cela permettra d'orienter le senseur avec précision suffisamment bonne afin d'effectuer la calibration.

ADX335-326-Calibr-03.jpg
Crédit: AdaFruit Industries www.adafruit.com

Raccorder le senseur

Raccordez le senseur comme présenté ci-dessous. C'est un circuit équivalent à celui présenté dans la page précedente. Il y a un bouton en plus.

ADX335-326-Calibr-04.jpg
Crédit: AdaFruit Industries www.adafruit.com

Exécuter le sketch de calibration

  • Chargez le sketch ci-dessous sur l'Arduino
  • Ouvrez le Moniteur Série.
  • Placer le breaboard avec le senseur sur une surface plane (une table par exemple)
    • Pressez et maintenez le bouton jusqu'à ce que vous voyez apparaitre le mot "Calibrate" sur le moniteur série.
    • Cela calibrera la valeur minimale pour l'axe Z.
  • Placez (mettez debout) le breadboard sur l'arrête avant et pressez encore le boutonpour calibrer +y
  • Répétez encore 3 fois cette opération avec les autres arrêtes du breadboard pour calibrer +x, -y et -x.
  • Retournez le breadboard et pressez le bouton pour calibrer +z. (Truc et astuce: vous pouvez utiliser la surface en dessous du plan de travail... c'est plus facile.)

Sortie du programme de calibration

Une fois calibré, la sortie affiche la plage de mesure brute (raw range) calibrée pour chaque axe, suivit de la force "G" telle que mesurée.

Les plages de mesure brutes (correspondant à analogRead() pour -1G et +1G) peuvent être utilisées comme constant dans les sketchs.

Raw Ranges: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
Raw Ranges: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
Raw Ranges: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
Raw Ranges: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
Raw Ranges: X: 408-616, Y: 398-610, Z: 422-625

Programme de calibration

const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
const int buttonPin = 2;

// Plage brutes (Raw Ranges):
// Initialiser la valeur à mi-échelle et permettre à la calibration de 
// trouver le minimum et le maximum pour chaque axe.
int xRawMin = 512;
int xRawMax = 512;

int yRawMin = 512;
int yRawMax = 512;

int zRawMin = 512;
int zRawMax = 512;

// Capturer plusieurs échantillons (valeurs) pour réduire l'effet du bruit
const int sampleSize = 10;

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

void loop() 
{
  // Lecture de la mesure dans les 3 axes.
  // Selon l'orientation physique , une seule des valeurs xRaw, yRaw, zRaw
  // s'éloigne vraiment de la valeur de mi-échelle (et donc s'écarte vraiment de 512).
  int xRaw = ReadAxis(xInput);
  int yRaw = ReadAxis(yInput);
  int zRaw = ReadAxis(zInput);
  
  if (digitalRead(buttonPin) == LOW)
  {
    // Envoi les 3 valeurs lue vers la calibration.
    // Une seule valeur de xRaw, yRaw, zRaw s'écarte vraiment de 512.
    // Le fait que ce soit xRaw, yRAw, zRaw depend de l'orientation du senseur.
    AutoCalibrate(xRaw, yRaw, zRaw);
  }
  else
  {
    Serial.print("Raw Ranges: X: ");
    Serial.print(xRawMin);
    Serial.print("-");
    Serial.print(xRawMax);
    
    Serial.print(", Y: ");
    Serial.print(yRawMin);
    Serial.print("-");
    Serial.print(yRawMax);
    
    Serial.print(", Z: ");
    Serial.print(zRawMin);
    Serial.print("-");
    Serial.print(zRawMax);
    Serial.println();
    Serial.print(xRaw);
    Serial.print(", ");
    Serial.print(yRaw);
    Serial.print(", ");
    Serial.print(zRaw);
    
    // Convertir les valeurs brutes en 'milli-G'
    // passe de [+0 .. +1024] (analogique) à [-1000 .. +1000] (mili-G)
    long xScaled = map(xRaw, xRawMin, xRawMax, -1000, 1000);
    long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
    long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);
  
    // re-convertir en valeur fractionnelle de G
    float xAccel = xScaled / 1000.0;
    float yAccel = yScaled / 1000.0;
    float zAccel = zScaled / 1000.0;
  
    Serial.print(" :: ");
    Serial.print(xAccel);
    Serial.print("G, ");
    Serial.print(yAccel);
    Serial.print("G, ");
    Serial.print(zAccel);
    Serial.println("G");
  
  delay(500);
  }
}

//
// Lecture de "sampleSize" échantillons et retourner la moyenne
//
int ReadAxis(int axisPin)
{
  long reading = 0;
  analogRead(axisPin);
  delay(1);
  for (int i = 0; i < sampleSize; i++)
  {
    reading += analogRead(axisPin);
  }
  return reading/sampleSize;
}

//
// Trouver la valeurs brute la plus extrême pour chaque axe et la memorise
//
void AutoCalibrate(int xRaw, int yRaw, int zRaw)
{
  Serial.println("Calibrate");
  if (xRaw < xRawMin)
  {
    xRawMin = xRaw;
  }
  if (xRaw > xRawMax)
  {
    xRawMax = xRaw;
  }
  
  if (yRaw < yRawMin)
  {
    yRawMin = yRaw;
  }
  if (yRaw > yRawMax)
  {
    yRawMax = yRaw;
  }

  if (zRaw < zRawMin)
  {
    zRawMin = zRaw;
  }
  if (zRaw > zRawMax)
  {
    zRawMax = zRaw;
  }
}



Réalisé par Bill Earl Pour AdaFruit Insdustries.

Source: [1]

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.