Différences entre versions de « ADX335-326-Calibrer-Programmer »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 42 : Ligne 42 :
 
== Sortie du programme de calibration ==
 
== Sortie du programme de calibration ==
  
Once calibrated, the output will show the calibrated raw range for each axis, followed by the measured "G" forces. The raw ranges can be used as constants in sketches.
+
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.
  
 
  <nowiki>Raw Ranges: X: 408-616, Y: 398-610, Z: 422-625
 
  <nowiki>Raw Ranges: X: 408-616, Y: 398-610, Z: 422-625

Version du 10 juin 2013 à 14:33


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.

ADX335-326-Calibr-01.jpg

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

ADX335-326-Calibr-02.png

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

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

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;

// Raw Ranges:
// initialize to mid-range and allow calibration to
// find the minimum and maximum for each axis
int xRawMin = 512;
int xRawMax = 512;

int yRawMin = 512;
int yRawMax = 512;

int zRawMin = 512;
int zRawMax = 512;

// Take multiple samples to reduce noise
const int sampleSize = 10;

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

void loop() 
{
  int xRaw = ReadAxis(xInput);
  int yRaw = ReadAxis(yInput);
  int zRaw = ReadAxis(zInput);
  
  if (digitalRead(buttonPin) == LOW)
  {
    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);
    
    // Convert raw values to 'milli-Gs"
    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-scale to fractional Gs
    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);
  }
}

//
// Read "sampleSize" samples and report the average
//
int ReadAxis(int axisPin)
{
  long reading = 0;
  analogRead(axisPin);
  delay(1);
  for (int i = 0; i < sampleSize; i++)
  {
    reading += analogRead(axisPin);
  }
  return reading/sampleSize;
}

//
// Find the extreme raw readings from each axis
//
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.