Gyroscope 4x et Précision ADC - Arduino Ethernet

Bonjour à tous, c’est mon premier message sur ce forum, sois indulgent svp!

Dans le cadre d’un projet personnel, je souhaite lire les retours du Tinkerkit Gyroscope 4x sur un Arduino Ethernet. Dans un futur très proche les capacités réseau de cette carte permettront de mettre ces valeurs sur réseau et de les exploiter à distance.

Après moult tests, je suis parvenu à une observation délicate: les valeurs retournées par analogRead sur les pins du gyroscope varient régulièrement de plus ou moins un pas de quantification. Pensant à une variation de la tension de référence j’ai inclus un bout de code lisant la tension de référence à l’instant (accessible ici: http://hacking.majenko.co.uk/node/57).
Cela n’a pas résolu ces soucis de variation.

Voici le code utilisé pour mettre en évidence ces fluctuations, en lisant la pinX du gyroscope

double Vcc;
double voltage;


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

void loop() {
  int sensorValue = analogRead(A0);
  Vcc = readVcc();
  Serial.print("Ref = "); Serial.print(Vcc);
  Serial.print("\tSensor = ");Serial.println(sensorValue);
  delay(100);
}

long readVcc()
  { 
  long result; // Read 1.1V reference against AVcc 
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert 
  while (bit_is_set(ADCSRA,ADSC)); 
  result = ADCL; 
  result |= ADCH<<8; 
  result = 1125300L / result; // Back-calculate AVcc in mV
  return result;
}

Voici une partie des retours sur bus série:

Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 500
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 498
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499
Ref = 4935.00 Sensor = 499

J’ai vérifié la stabilité de la tension de sortie du gyroscope au voltmètre, elle est stable au mV.
Je pencherai donc pour une mise en évidence de l’Absolute Accuracy de l’ADC de l’ATmega, spécifié à + ou - 2LSB dans la doc.

Qu’en pensez-vous? Y-a-t’il possibilité d’annuler ces variations? Parce que dans ce cas précis un bit de variation => 4.8mV => mouvement reconnu par le code alors que le gyro est parfaitement immobile…

Bonjour,

Et bienvenue dans le monde merveilleux du bruit de mesure ;) Ce que tu observes est normal: n'importe quel capteur ne fournit pas une valeur exacte mais une valeur bruitée, avec en plus un offset et, au moins dans le cas du gyroscope, une dérive en fonction de la température et de l'age du capitaine. Si ton seul problème est un bagottement d'un LSB, tu peux t'estimer comme très chanceux parce que l'offset te causera plus de problème (dans ce cas le capteur te donne une vitesse de rotation alors qu'il est immobile). Ce sont des imperfections que tu dois traiter dans ton code sur l'Arduino pour essayer de vivre avec le mieux possible.

C'est quoi au juste ton application ?

Merci 3Sigma. l'objectif sera de relever les vibrations d'une antenne satellite. L'arduino et les capteurs (gyroscope et accéléromètre) seront donc fixés sur le bras. Les données seront affichées sur une page web et un PC relié au même réseau loggera les valeurs.

Ce que tu observes est normal: n'importe quel capteur ne fournit pas une valeur exacte mais une valeur bruitée

Donc ça serait le capteur et pas l'ADC qui doit être mis en cause?

Bin +- 2LSB ==> c'est exactement ce que tu observes 1024 +- 2

Donc l'ADC est aux limites. Si tu veux être plus précis il te faudra utiliser un ADC plus performant. Perso je suis fan des MCP3424, j'ai fait une lib dessus, 18bits en i2C avec un amplificateur interne jusqu'à x8. Bref je mesure des µV avec :)

L'idéal serait de mesurer la sortie du capteur à l'oscillo pour voir ce que ça donne. Si ton niveau de bruit est faible (inférieur au LSB de ton ADC), tu peux essayer d'avoir un meilleur ADC. Sinon, ça ne servira à rien. C'est peut-être dommage d'avoir choisi un gyro avec une telle plage de mesure (+/- 1500 deg/s si je ne me trompe pas) car ça m'étonnerait que tu aies des vitesses de rotation aussi grandes à mesurer. Du coup, la sensibilité du capteur est plus faible et là encore, avoir un super-ADC ne t'apportera pas grand-chose.

les valeurs retournées par analogRead sur les pins du gyroscope varient régulièrement de plus ou moins un pas de quantification

Tu t'attendais à quoi?

Ar_No: Merci 3Sigma. l'objectif sera de relever les vibrations d'une antenne satellite. L'arduino et les capteurs (gyroscope et accéléromètre) seront donc fixés sur le bras. Les données seront affichées sur une page web et un PC relié au même réseau loggera les valeurs.

Ce que tu observes est normal: n'importe quel capteur ne fournit pas une valeur exacte mais une valeur bruitée

Donc ça serait le capteur et pas l'ADC qui doit être mis en cause?

C'est pas le capteur plus que le gyro c'est la chaîne de mesure dans son ensemble. Le gyro a du bruit L'ADC a du bruit Le câblage peut amener du bruit L'alimentation aussi

1 LSB de bruit dans une chaîne de mesure c'est très bien.

Ce qui est surprenant c'est que cela t'étonne. N'avais-tu pas regardé la documentation des composants que tu utilises avant de commencer?

Merci pour vos retours.

Je vais donc partir sur un meilleur ADC (le tien B@tto par ex ;) ) et vous dis ce que cela change ensuite.