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

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 2 : Ligne 2 :
  
 
== Calibration statique ==
 
== Calibration statique ==
As with all sensors, there is some variation in output between samples of these accelerometers.  For non-critical applications such as game controllers, or simple motion or tilt sensors, these variations are not important.  But for applications requiring precise measurements, calibration to a reliable reference is required.
+
Comme pour tous les senseurs, il existe de faibles variations des valeurs de sorties entre différents exemplaires de l'accéléromètre.  
  
[[Fichier:ADX335-326-Calibr-01.jpg]]
+
Ces variations ne sont pas importantes pour les applications non-critiques comme les manettes de jeux, les détections de mouvement, senseurs tilts.  
  
=== Gravity as a Calibration Reference ===
+
Pour les applications nécessitant des mesures précises, la calibration est nécessaire pour obtenir une valeur de référence fiable.
Acceleration is measured in units of gravitational force or "G", where 1G represents the gravitational pull at the surface of the earth.  [http://www.youtube.com/watch?v=2ORJ7B1bqEY Despite what you may have heard], gravity is a pretty stable force and makes a convenient and reliable calibration reference if you happen to be a surface-dwelling earthling.  
+
 
 +
{{ADFImage|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.  [http://www.youtube.com/watch?v=2ORJ7B1bqEY 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 ===
 
=== Méthode de calibration ===
To calibrate the sensor to the gravitational reference, you need to determine the sensor output for each axis when it is precisely aligned with the axis of gravitational pull. Laboratory quality calibration uses precision positioning jigs. The method described here is simple and gives surprisingly good results.   
+
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é.   
  
[[Fichier:ADX335-326-Calibr-02.png]]
+
{{ADFImage|ADX335-326-Calibr-02.png}}
  
 
=== Monter le senseur ===
 
=== Monter le senseur ===
First mount the sensor to a small breadboard like the one on the left. The back and squared edges of the breadboard make a reasonably accurate set of reference planes to orient the sensor for calibration.
+
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.
  
[[Fichier:ADX335-326-Calibr-03.jpg|300px]]
+
{{ADFImage|ADX335-326-Calibr-03.jpg|300px}}
  
 
=== Raccorder le senseur ===
 
=== Raccorder le senseur ===
  
Wire the sensor as shown belowThis is equivalent to the circuit shown on the previous page, with the addition of a switch.
+
Raccordez le senseur comme présenté ci-dessousC'est un circuit équivalent à celui présenté dans la page précedente. Il y a un bouton en plus.
  
[[Fichier:ADX335-326-Calibr-04.jpg]]
+
{{ADFImage|ADX335-326-Calibr-04.jpg|640px}}
  
 
=== Exécuter le sketch de calibration ===
 
=== Exécuter le sketch de calibration ===
  
* Load the sketch below onto the Arduino and run
+
* Chargez le sketch ci-dessous sur l'Arduino  
* Open the Serial Monitor.
+
* Ouvrez le Moniteur Série.
* Lay the breadboard with the sensor on a flat surface
+
* Placer le breaboard avec le senseur sur une surface plane (une table par exemple)
** Press and hold the button until you see "Calibrate" in the serial monitor.
+
** Pressez et maintenez le bouton jusqu'à ce que vous voyez apparaitre le mot "Calibrate" sur le moniteur série.
** This will calibrate the minimum value for the z axis.
+
** Cela calibrera la valeur minimale pour l'axe Z.
* Stand the breadboard on the front edge and press the button again. to calibrate +y
+
* Placez (mettez debout) le breadboard sur l'arrête avant et pressez encore le boutonpour calibrer +y
* Repeat this for the three other edges to calibrate +x, -y and -x.
+
* Répétez encore 3 fois cette opération avec les autres arrêtes du breadboard pour calibrer +x, -y et -x.
* Turn the breadboard upside down and press the button again to calibrate +z.  (Hint, the underside of a table works well to steady it.)
+
* 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 ==
 
== 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
Ligne 57 : Ligne 63 :
 
const int buttonPin = 2;
 
const int buttonPin = 2;
  
// Raw Ranges:
+
// Plage brutes (Raw Ranges):
// initialize to mid-range and allow calibration to
+
// Initialiser la valeur à mi-échelle et permettre à la calibration de
// find the minimum and maximum for each axis
+
// trouver le minimum et le maximum pour chaque axe.
 
int xRawMin = 512;
 
int xRawMin = 512;
 
int xRawMax = 512;
 
int xRawMax = 512;
Ligne 69 : Ligne 75 :
 
int zRawMax = 512;
 
int zRawMax = 512;
  
// Take multiple samples to reduce noise
+
// Capturer plusieurs échantillons (valeurs) pour réduire l'effet du bruit
 
const int sampleSize = 10;
 
const int sampleSize = 10;
  
Ligne 80 : Ligne 86 :
 
void loop()  
 
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 xRaw = ReadAxis(xInput);
 
   int yRaw = ReadAxis(yInput);
 
   int yRaw = ReadAxis(yInput);
Ligne 86 : Ligne 95 :
 
   if (digitalRead(buttonPin) == LOW)
 
   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);
 
     AutoCalibrate(xRaw, yRaw, zRaw);
 
   }
 
   }
Ligne 111 : Ligne 123 :
 
     Serial.print(zRaw);
 
     Serial.print(zRaw);
 
      
 
      
     // Convert raw values to 'milli-Gs"
+
     // 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 xScaled = map(xRaw, xRawMin, xRawMax, -1000, 1000);
 
     long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
 
     long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
 
     long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);
 
     long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);
 
    
 
    
     // re-scale to fractional Gs
+
     // re-convertir en valeur fractionnelle de G
 
     float xAccel = xScaled / 1000.0;
 
     float xAccel = xScaled / 1000.0;
 
     float yAccel = yScaled / 1000.0;
 
     float yAccel = yScaled / 1000.0;
Ligne 134 : Ligne 147 :
  
 
//
 
//
// Read "sampleSize" samples and report the average
+
// Lecture de "sampleSize" échantillons et retourner la moyenne
 
//
 
//
 
int ReadAxis(int axisPin)
 
int ReadAxis(int axisPin)
Ligne 149 : Ligne 162 :
  
 
//
 
//
// Find the extreme raw readings from each axis
+
// Trouver la valeurs brute la plus extrême pour chaque axe et la memorise
 
//
 
//
 
void AutoCalibrate(int xRaw, int yRaw, int zRaw)
 
void AutoCalibrate(int xRaw, int yRaw, int zRaw)

Version actuelle datée du 16 janvier 2014 à 20:45


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.