multiples potar sur 4 entrées analog (Metro Mini)

Bonjour,

Je cherche à comprendre le comportement erratique des analogread sur plusieurs pins. (de A0 à A3).

Je veux lire 4 potars 10k pour agir sur différentes variables (rien que de très simple a priori). sortie +5V sur chaque patte droite des potars, gnd sur celle de gauche et Ax sur la centrale.

Sauf que: Les valeurs lues sont - la plupart du temps - toujours à 1023 Faire varier les potars ne donnent 9 fois sur 10 aucun changements de valeur.

J'ai lu que c'est un pb récurrent dès qu'on utilise 2 ports Analogiques et qu'il faudrait faire 2 lectures séparées de qq ms pour laisser le temps à l'Arduino.

Soit, j'ai fais ca sans plus de succès (j'ai pensé que mes potars étaient morts, mais non). d'ailleurs meme avec seulement A0 branché c'est pareil..

Merci

Trace en moniteur série:

================**
valPotaVm A0
1023
mapPotaVm
31
================
valPotaDcycle A1
1023
mapPotaDcycle
601174
================**
valPotaDt2 A2
1023
mapPotaDt2
1004
================**
valPotaDt1 A3
778
mapPotaDt1
1962
================**

et extrait du code:

..

void loop() {

  valPotaVm = analogRead(A0);  valPotaVm = analogRead(A0);delay(50);
   
  Serial.println("valPotaVm A0"); delay(30);Serial.println(valPotaVm);
  mapPotaVm = map(valPotaVm, 1, 1024, 400, 30);
  Serial.println("mapPotaVm"); Serial.println(mapPotaVm);
  delay(1000);
  Serial.println("================");
  
valPotaDcycle = analogRead(A1); delay(30); valPotaDcycle = analogRead(A1); delay(50);

  Serial.println("valPotaDcycle A1"); Serial.println(valPotaDcycle);
  mapPotaDcycle = map(valPotaDcycle, 1, 1024, 1800000, 600000);
  Serial.println("mapPotaDcycle"); Serial.println(mapPotaDcycle);
  delay(1000);
  Serial.println("================**");

valPotaDt2 = analogRead(A2); delay(30);valPotaDt2 = analogRead(A2);delay(50);

  Serial.println("valPotaDt2 A2"); Serial.println(valPotaDt2);
  mapPotaDt2 = map(valPotaDt2, 1, 1024, 5000, 1000);
  Serial.println("mapPotaDt2"); Serial.println(mapPotaDt2);
  delay(1000);
  Serial.println("================**");

valPotaDt1 = analogRead(A3); delay(30); valPotaDt1 = analogRead(A3);delay(50);
  Serial.println("valPotaDt1 A3"); Serial.println(valPotaDt1);
  mapPotaDt1 = map(valPotaDt1, 1, 1024, 5000, 1000);
  Serial.println("mapPotaDt1"); Serial.println(mapPotaDt1);
  delay(1000);
  Serial.println("================**");
}

avez vous connecté le GND des potards au GND de votre carte ? avez vous testé vos potards au Ohm-mètre ?

êtes vous bien sur les pin Analogiques?

il y a une pin Aref - l'avez vous connecté quelque part?

il y a la possibilité de basculer la carte en 3.3V au lieu de 5V en coupant la petite piste et soudant de l'autre côté --> êtes vous bien en 5V ?

J'ai lu que c'est un pb récurrent dès qu'on utilise 2 ports Analogiques et qu'il faudrait faire 2 lectures séparées de qq ms pour laisser le temps à l'Arduino.

Avec des potentiomètres de 10K : inutile. Avec des potentiomètres de 100K, je ne dis pas non.

J'aurais bien aimé voir la fonction setup().

bonnes pins revérifiées. 5V confirmé.

setup():

void setup() {
  //start serial connection
  Serial.begin(9600);
  pinMode (A0, INPUT_PULLUP);pinMode (A1, INPUT_PULLUP);pinMode (A2, INPUT_PULLUP);pinMode (A3, INPUT_PULLUP);
  pinMode(cmdPin, INPUT);             // recevra le signal GO/STOP

  pinMode(timeLed, OUTPUT);           // à faire clignoter quand fin de cycle timer ou Stop
  // pinMode(Out5VPin, OUTPUT);       // sortie permanente 5V  HIGH pour test
  // digitalWrite(Out5VPin, HIGH);
  pinMode(DIRControl, OUTPUT);        // DIR du driver moteur
  pinMode(PWM_drive, OUTPUT);         // PWM du driver moteur

  // init tout est stoppé
  /*digitalWrite(timeLed, LOW);

  digitalWrite(timeLed, timeLedState); // led verte éteinte
  analogWrite(PWM_drive, PWM_Value);*/
  ThiscmdPin = digitalRead(cmdPin);
  prevGo = ThiscmdPin;                // en principe à LOW au démarrage
  Serial.println("cmdPin ");
  Serial.println(digitalRead(cmdPin));
  Serial.println("------------");

}
  pinMode (A0, INPUT_PULLUP);pinMode (A1, INPUT_PULLUP);pinMode (A2, INPUT_PULLUP);pinMode (A3, INPUT_PULLUP);

Pas vraiment une bonne idée (surtout la pullup) Vire cette ligne. Pas de pinMode en analogique.

hbachetti:   pinMode (A0, INPUT_PULLUP);pinMode (A1, INPUT_PULLUP);pinMode (A2, INPUT_PULLUP);pinMode (A3, INPUT_PULLUP);

Pas vraiment une bonne idée (surtout la pullup) Vire cette ligne. Pas de pinMode en analogique.

oui non mais ca je venais juste de le tenter. (suite https://forum.arduino.cc/index.php?topic=468511.0 )

Encore et toujours le problème de lecture analogique.

Pourtant la documentation est claire quand on prend la peine de lire la seule qui soit sérieuse : la datasheet du microcontroleur qui n'est ni un arduino ni un Adafruit qui ne font que vendre des cartes, mais un Atmega 328p conçu et fabriqué par Microchip/Atmel.

Que dit la datasheet ? La datasheet dis que dès que l'on modifie quoique ce soit dans l[u]a chaîne de mesure[/u] [u]analogique[/u] il faut rejeter la première mesure qui suit.

La chaîne analogique c'est quoi ? C'est un seul et unique convertisseur analogique digital qui est précédé par un multiplexeur analogique.

Modifier quoi ? - soit changer d'entrée analogique - soit changer la référence de tension - soit le réglage du convertisseur

Pourquoi il faut rejeter ? Parce qu'au moment du changement une acquisition était probablement en train de se faire et que si, par exemple elle a commencé sur une entrée et qu'elle se termine sur une autre le résultat sera obligatoirement faux.

Le convertisseur analogique digital fonctionne sur le principe de charges de condensateur. Le réglage fait par l'IDE du convertisseur est ultra conservateur et prudent, c'est ceinture plus bretelles. En particulier la vitesse d’échantillonnage qui est la plus basse que permet le microcontrôleur. Par conséquence la valeur du potentiomètre importe peu dans une grande plage de valeur.

Les résultats aléatoires présentés ne peuvent être que la conséquence d'un mauvais câblage style grands fils formant de grandes boucles pour faire des perchoirs à mouche ou d'un non respect de la consigne de rejet de la première mesure après modification de la chaîne de mesure analogique.

Conseils : pour connecter un potentiomètre il faut 3 fils : masse, alim, curseur. S'ils sont longs Il faut les torsader ensemble pour éviter de former des boucles qui sont des antennes de réception de tous les bruits ambians.

Mon montage.

c’est si sensible que ca ?? du coup on peut rien fair en Analogique …

votre image: |375x500

c'est quoi le fil rouge planté dans Aref qui va dans le Vin du composant en haut ? (on dirait)

suffit de lire 2 fois chaque potard. c'est pas compliqué

pas aref...Vin arrivée du +12V .

pour les tests des potars je l'ai fait uniquement sur le port usb de mon pc sans cette alim générale qui sera utilisée en vrai ensuite (j'ai déja un même autre montage opérationnel avec UN seul potar)

c'est si sensible que ca ?? du coup on peut rien fair en Analogique ..

On peut parfaitement lire plusieurs entrées analogiques en tout cas.

Ta photo aide peu. Un schéma serait plus lisible.

Si le problème était dû à la capacité d'entrée, les mesures seraient légèrement fausses, mais pas 1023, certainement pas. J'ai déjà testé ici avec différentes impédances la mesure sur deux entrées analogiques : arduino-les-performances-de-ladc

Paragraphe 2.2. Impédance source faible

Avec un ponts diviseur 10K + 4.7K la double mesure n'apporte rien, ce qui est normal étant donné que la constante RC formée par l'impédance de la source + capacité d'entrée est faible.

As-tu vérifié la tension réelle sur les pins A0 à A3 ?

Vous êtes bien sûr ? sur la photo on a vraiment l’impression que le “trou” sur la breadboard en face de Vin est vide et que vous êtes sur le trou de Aref… peut-être un effet d’optique

Parallaxe ?

Résultats avec mesure simple :

Voltage A0: 2.26
Voltage A1: 1.04
Voltage A0: 2.26
Voltage A1: 1.05
Voltage A0: 2.26
Voltage A1: 1.04 

Résultats avec double mesure :

Voltage A0: 2.26
Voltage A1: 1.04
Voltage A0: 2.26
Voltage A1: 1.05
Voltage A0: 2.26
Voltage A1: 1.04

Je suis pratiquement certain que la masse de tes potards n'est pas reliée au GND de la carte.

Si je remplace 10K et 4.7K par 1MΩ et 470K :

Résultats avec mesure simple :

Voltage A0: 2.27
Voltage A1: 1.19
Voltage A0: 2.16
Voltage A1: 1.17
Voltage A0: 2.09
Voltage A1: 1.19

Résultats avec double mesure :

Voltage A0: 2.27
Voltage A1: 1.03
Voltage A0: 2.27
Voltage A1: 1.03
Voltage A0: 2.26
Voltage A1: 1.03

La différence est faible, mais elle existe. Le problème est ailleurs ...

Je suis pratiquement certain que la masse de tes potards n'est pas reliée au GND de la carte.

Sur la photo en tous cas, c'est ce que je vois. Le fil de masse des potards arrive sur une barrette de 5 contacts de la breadboard, et c'est tout !

hbachetti:
Parallaxe ?

Oui

c’est bien correct.

Et le vainqueur est :

hbachetti: Je suis pratiquement certain que la masse de tes potards n'est pas reliée au GND de la carte.

Foutue breadboard! Voilà ca marche nickel.

Merci à tous pour vos rapides aides!!

Foutue breadboard!

Je dirais plutôt que tu as confondu les rangées verticales et les rangées horizontales.

Donc foutu câbleur :D

Pour info (datasheet AtMega328) : The ADC is optimized for analog signals with an output impedance of approximately 10k or less. If such a source is used, the sampling time will be negligible.

If a source with higher impedance is used, the sampling time will depend on how long time the source needs to charge the S/H capacitor, with can vary widely. The user is recommended to only use low impedance sources with slowly varying signals, since this minimizes the required charge transfer to the S/H capacitor.

Donc pour des potards de 10K, une seule mesure suffit. Mais je dirais que si on veut simplement mesurer des potards, deux mesures et même douze mesures ne vont pas déranger.