Valeur AN0 qui change en fonction de la source d'alimentation

Bonjour à tous,

J’ai réalisé un montage avec les matériels suivants:

  • Arduino NANO
  • Ecran LCD 2x16 sur port I2C
  • 1 piezo sur AN0 (Résistance de 1M en parrallèle)
  • 1 potentiomètre 10k sur AN2
  • 1 relais sur D13

Le potentiomètre règle le seuil de détection du piezo.

L’écran affiche la dernière valeur du piezo, la valeur du potentiomètre, le max et la moyenne des 10 derniers chocs.

Quand le choc dépasse le seuil, le relais est déclenché 1 seconde.

C’est plutôt simple et cela fonctionne bien quand le nano est alimenté par USB.
Par contre, quand j’alimente le montage par une batterie de 12V, le port analogique AN0 sort une valeur de fond (entre 70 et 140).

J’ai le même problème en alimentant en 5V.

Auriez-vous une idée de ce qui cause ce comportement étrange?

Cordialement.

Le code:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

const int relais = 13;          // Port de connexion relais
const int knockSensor = A0;     // Port de connexion capteur PIEZZO
const int potentiometre = A2;   // Port de connexion du potentiomètre
const int threshold = 200;      //  Seuil de détection du capteur

int potValue=0, lastpotValue=0;
int sensorReading = 0, sensorMax = 0, somme = 0, sensorAverage = 0;      // Valeur du capteur
byte i=0;
boolean flagAVG = false;
int tabSensor[10];


void setup()
{
   // Configuration I/O 
   pinMode(relais, OUTPUT);         // Sortie relais
   digitalWrite(relais, LOW); 
   
   // LCD
   lcd.init();                      
   lcd.backlight();
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("READY!");
}


void loop()
{
  // Lecture du capteur
  sensorReading = analogRead(knockSensor);

  // Lecture du potentiomètre
  potValue = analogRead(potentiometre);

  // Traitement valeur du potentiomètre
  if( potValue < (lastpotValue-10) || potValue > (lastpotValue+10))
  {
    lastpotValue=potValue;
    lcd.clear();
    lcd.setCursor(8,0);
    lcd.print("POT:");
    lcd.print(potValue);
    delay(500);
  }


  // Si la valeur est supérieure au seuil de détection 
  if (sensorReading >= lastpotValue)
  {
    // Valeur max
    if( sensorReading > sensorMax )
    {
      sensorMax = sensorReading;     
    }

    // Valeur moyenne
    tabSensor[i] = sensorReading;
    i++;
    if( i == 10 )
    {
      if( flagAVG == false ) flagAVG=true;
      i=0;
    }
       
    if( flagAVG == true )
    {
      for(int j=0 ; j<=9 ; j++)
      {
        somme = somme + tabSensor[j];
      }
      sensorAverage = somme/10;
      somme=0;
    }

    // LCD
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("HIT:");
    lcd.print(sensorReading);
    lcd.setCursor(8,0);
    lcd.print("POT:");
    lcd.print(potValue);    
    lcd.setCursor(0,1);
    lcd.print("MAX:");
    lcd.print(sensorMax);   
    lcd.setCursor(8,1);
    lcd.print("AVG:");
    lcd.print(sensorAverage);  

    // Relais
    digitalWrite(relais,HIGH);
    delay(1000);
    digitalWrite(relais,LOW);
  }
 
}

Il faut déjà bien comprendre le fonctionnement du convertisseur analogique/numérique et les particularités de la carte nano qui n'est pas une copie intégrale de la carte Uno en ce qui concerne le schéma d'alimentation.

Que fait le convertisseur analogique numérique ? Il prend la tension de référence et la découpe en 1024 échantillons. Un échantillon vaut Vref/1024.

Comment est définie la tension Vref ? Il existe 3 possibilités : 1) A l'alumage du micro la tension Vcc est automatiquement sélectionnée. 2) Par programmation il est possible de choisir : - soit une tension extérieure qui sera appliquée sur Aref comprise entre Vcc et 1,2V , - soit la référence interne au micro Vref = 1,1 V.

La précision et la stabilité de mesures ne dépendent que de la précision et la stabilité de la tension de référence. Si Vref provient de l'USB elle sera égale à 5V ± 5%, c'est la norme USB Si Vref provient de l'intérieur du micro elle fera 1,1 V ± 0,1 V soit ± 10 % Si Vref provient d'une source extérieure tout dépendra de la source choisie. Il existe des référence de tension très précise de différentes valeurs.

Avec la référence par défaut au Vcc on voit qu'avec la même carte il y aura des différences selon qu'elle sera alimentée par l'USB ou par son régulateur 5V interne.

Cas particulier de la nano

Le schéma d'alimentation de la nano est plus rudimentaire que celui de la UNO et cela se manifeste pour la mesure analogique. Quand la carte est alimentée par l'entrée raw (ou Vin) entre 7 et 12V, pour protéger le module USB du PC une diode est placée en série sur l'alim provenant de l'USB. Cette diode même avec le choix d'une Shottky provoque un décalage de tension d'environ 0,4V. Je dis "environ" car il y a de la dispersion dans les diodes et cette chute de tension dépendra du courant qui passe dans la diode .

Pour faire des mesures analogiques sérieuses avec une nano il faut : - soit passer par son régulateur interne en l'alimentant sur l'accès raw (ou Vin) avec du 9V (c'est mieux que 12 V) - soit si l'alim est USB utiliser une référence de tension externe.

Nota : une solution "moyenne" consiste à passer en référence externe et à relier la sortie du régulateur 3,3V sur la pin Aref.

Merci beaucoup pour cette explication qui est vraiment détaillé et compréhensible.

J'ai tenté de relié la sortie 3.3V à AREF mais le problème persiste...

J'apporte tout de même une correction à mon 1er post, je rencontre le problème de valeur de fond présente sur AN0 lorsque j'alimente en 12V avec une alimentation d'ordinateur et pas une batterie (Pour les tests).

J'ai testé avec une pile de 9V et là plus de problème...

Pas de batterie de 12V sous la main pour tester mais ce projet pilotera un moteur 12V, j'ai donc besoin de cette alimentation en 12V.

Si je ne trouve pas la cause du problème, je pourrais toujours prévoir deux alimentations séparées.

je rencontre le problème de valeur de fond présente sur AN0 lorsque j'alimente en 12V avec une alimentation d'ordinateur

C'est peut-être que cette alim est en défaut. Probablement bruyante. Toutes les masses sont bien connectées ?

J'ai tenté de relié la sortie 3.3V à AREF mais le problème persiste...

Je suppose que as ajouté la ligne : analogReference (EXTERNAL) ; pour passer la référence de Vcc vers Aref.