analogRead(A0) me donne toujours une valeur !!!

Bonsoir,

Je cherche lire le voltage de chaque cellulke d'une batterie liPo, hors je me trouve devant un Pb analogRead (A0 à A6) me donne toujours une valeur tel que:

0 = 0.00
Valeur analogRead(A0) = 438
1 = 0.00
Valeur analogRead(A0) = 432
2 = 0.00
Valeur analogRead(A0) = 428
3 = 0.00
Valeur analogRead(A0) = 425
4 = 0.00
Valeur analogRead(A0) = 422
5 = 0.00
Valeur analogRead(A0) = 419

et ceci même si aucune cellule de la lipo n'est relié a cette PIN ananlogique de l'ARDUINO.
Ceci ets génant pour moi car je cherche à détecter la pésence d'une cellule.

Est-il possible d'avoir des valeur à 0 lorsqu'aucune cellule est raccordée à l'une des PIN A0 à A5 ?

Merci pour votre aide.

Bonsoir,

nicephore:
0 = 0.00
Valeur analogRead(A0) = 438
1 = 0.00
Valeur analogRead(A0) = 432
2 = 0.00
Valeur analogRead(A0) = 428
3 = 0.00
Valeur analogRead(A0) = 425
4 = 0.00
Valeur analogRead(A0) = 422
5 = 0.00
Valeur analogRead(A0) = 419

Cela correspond à quoi ?
Donne nous ton programme
@+

Si je comprend bien tu t'étonnes que tu ne sois pas à zéro si tu ne branche rien : c'est normal ton pin n'est justement relié à rien, il est dit "flottant" et va et vient au grès de l’environnement. Il faut mettre une résistance de pull down

Bonsoir,

donc voici mon prog:

int lipoPins[6] = {0, 1, 2, 3, 4 ,5};
float lipoCells[6];

void setup(){
Serial.begin(9600);
analogReference(DEFAULT); // VREF at default value (5 volts)
for( int i = 0; i < 6; i++ ){
pinMode(i, INPUT); // init des PINs
digitalWrite(i, LOW);
lipoCells *= 0.00; // init dui tableau avec 0.00v *

  • }*
    }
    void loop(){
  • for( int i = 0; i < 6; i++ ){*
    _ analogRead(lipoPins*);_
    _
    Serial.print("Valeur ananlogRead(");_
    _ Serial.print(lipoPins);
    Serial.print(") = ");
    Serial.println(analogRead(lipoPins));
    delay(1000);
    }
    }[/quote]
    ce qui me donne sans aucune cellule les valeurs suivantes (ici sur 3 passage de la boucle loop() )
    > Valeur ananlogRead(0) = 388*

    > Valeur ananlogRead(1) = 356
    > Valeur ananlogRead(2) = 376
    > Valeur ananlogRead(3) = 418
    > Valeur ananlogRead(4) = 447
    > Valeur ananlogRead(5) = 478
    > Valeur ananlogRead(0) = 418
    > Valeur ananlogRead(1) = 365
    > Valeur ananlogRead(2) = 381
    > Valeur ananlogRead(3) = 421
    > Valeur ananlogRead(4) = 449
    > Valeur ananlogRead(5) = 480
    > Valeur ananlogRead(0) = 436
    > Valeur ananlogRead(1) = 379
    > Valeur ananlogRead(2) = 382
    > Valeur ananlogRead(3) = 418
    > Valeur ananlogRead(4) = 446
    > Valeur ananlogRead(5) = 477
    Elle semble donc jamais de la même valeur.
    Une idée ? Merci_

nicephore:
Une idée ? Merci

Je viens de te l'expliquer

Houla, il y a quelques erreurs dans ce code.
Il faudrait les corriger avant de toucher au hard

int lipoPins[6] = {0, 1, 2, 3, 4 ,5};
float lipoCells[6];

void setup(){
  Serial.begin(9600);
  analogReference(DEFAULT); // VREF at default value (5 volts)
  for( int i = 0; i < 6; i++ ){
    pinMode(i, INPUT);      // init des PINs                            <--------- cette ligne initialise une entrée digitale. est-ce voulu?
    digitalWrite(i, LOW);                                                         <--------- cette ligne initialise une entrée digitale. est-ce voulu? 
    lipoCells = 0.00;    // init dui tableau avec 0.00v         <--------- erreur là lipoCells est un tableau remplacer par lipoCells[i]
  }
}

void loop(){
  for( int i = 0; i < 6; i++ ){
   analogRead(lipoPins);
   Serial.print("Valeur ananlogRead(");
   Serial.print(lipoPins);                                                             <--------- erreur là lipoPins est un tableau remplacer par lipoPins[i]
   Serial.print(") = ");
   Serial.println(analogRead(lipoPins));                                  <--------- erreur là lipoPins est un tableau remplacer par lipoPins[i]
   delay(1000);
  }
}

Bonjour,

Merci de vos réponses.

@fdufnews: oui merci pour lipoCells[i] (j'ai ici pas utilisé les balise (code)(/code) :blush:) mais dans mon sketch c'est bien ça.

@B@tto : concernant la résistance de PULL_DOWN. ARDUINO semble avec une instruction d'appel à la résitance de rappel par l'instruction suivante:
pinMode(A0, INPUT_PULLDOWN)
Donc si j'ai bien compris, je dois utiliser cette instruction afin d'activer la résistance de rappel interne du micro-contrôleur car par defaut INPUT la désactive.

Toutefois et afin de me permettre de mieux comprendre encore. Si j'utilise une version ARDUINO inférieur à 1.0.1 cette instruction INPUT_PULLDOWN n'existe pas, aussi dans ce cas comment doit-on faire. Je suppose que cela dois se passe coté électronique. Mais commment ? Comme un pont diviseur (chose dont j'ai par ailleur besoin car l'ARDUINI ne peut supporter plus de 5volts:

S0 ---|
|
R10K
|
S1 ---|----- A0
../.. |
R10K
|
S6 ---|----- R40K----- A5

(ici des résistance de 10k et 40k au hasard)
Encore merci pour vos explications.

Re-bonjour,

En fait je viens de faire le test en compilant avec pinMode(A0, INPUT_PULLDOWN)
c'est pinMode(A0, INPUT_PULLUP); qui active la résistance interne.
Mais ceci ne change pas mon Pb, les valeurs restent "flottant", je dois donc réellement passer par une résitance ... je cherche ...

Pullup ce n'est pas pull down. UP = haut DOWN = Bas PULL = TIRER

Donc pull up tire vers le haut, soit 5V et pull down vers le bas, soit 0V. Et normalement oui il faut une résistance externe, car en interne ça va de 20k à 50k, ce qui est un peu faible pour cette application car un pull up ou down ne doit pas influencer la mesure, juste donner un état stable quand il y a flottement. Hors à 20k si on est pointilleux ça peut perturber, en général on prend 1 ou 10 Mohm. Mais attention ce n'est pas un diviseur à proprement parlé. Si j'active le pull down interne ça donnerait schématiquement :

| Atmega328p
|
A0 --- | ---------- ADC
| |
| R(20/50k)
| |
| GND

Avant l'IDE 1.0, il fallait (fallait mais ça marche toujours après cette version) simplement écrire digitalWrite(tonPin, HIGH ou LOW) sur un pin configuré en INPUT.

B@tto,

Encore merci.
Je ne dispose ici que 10k, j'ai donc fait le test avec cette valeur qui est OK.
Ayant besoin d'un pont diviseur,

O-----------|
|
| R1
| |
U | -----------------O
| | |
| R2 U2
| |
O-----------|-----------------O

U2 = (R2/R1+R2)*U

Si je place R2 à une valuer de 10k, mes valeurs pour R1 sont d'après la formule:
R1 = ( (U/U2)*R2 )-R2
ce qui me donne les valeurs suivantes (pour U2 à 5 volts):
Cells U R1 R2 U2
1 4,2 -1600 10000 5
2 8,4 6800 10000 5
3 12,6 15200 10000 5
4 16,8 23600 10000 5
5 21 32000 10000 5
6 25,2 40400 10000 5

Recourant sera lui à 0,0005 A

Maintenant si je passe à la résistance R2 à 1Mohms j'obtiens un courant de 5A et 0,5 pour une résistance à 10Mohms

J'ai bon ou pas ?

Donc si je comprends bien tous R2 représente ici ma résistance PULLDOWN, donc j'ai tous intéret à y placer 10K afin de baisser au plus le courant qui vas traverser l'ARDUINO.

Là aussi, j'ai bon ?

Cordialement

Bonjour,

nicephore:
Je ne dispose ici que 10k, j'ai donc fait le test avec cette valeur qui est OK.
Ayant besoin d'un pont diviseur,

O-----------|
|
| R1
| |
U | -----------------O
| | |
| R2 U2
| |
O-----------|-----------------O

U2 = (R2/R1+R2)*U

Si je place R2 à une valuer de 10k, mes valeurs pour R1 sont d'après la formule:
R1 = ( (U/U2)*R2 )-R2
ce qui me donne les valeurs suivantes (pour U2 à 5 volts):
Cells U R1 R2 U2
1 4,2 -1600 10000 5
2 8,4 6800 10000 5
3 12,6 15200 10000 5
4 16,8 23600 10000 5
5 21 32000 10000 5
6 25,2 40400 10000 5

Recourant sera lui à 0,0005 A

Maintenant si je passe à la résistance R2 à 1Mohms j'obtiens un courant de 5A et 0,5 pour une résistance à 10Mohms

J'ai bon ou pas ?

Donc si je comprends bien tous R2 représente ici ma résistance PULLDOWN, donc j'ai tous intéret à y placer 10K afin de baisser au plus le courant qui vas traverser l'ARDUINO.

Là aussi, j'ai bon ?

Cordialement

Je ne vois pas bien le principe de ce pont diviseur à géométrie variable mais je n'ai pas suivi le fil de la discussion.
Mais une remarque, Une résistance de 1M avec un courant de 5A donne 5000000V cherchez l'ERREUR. Les gens n'ont plus la notion des autres de grandeurs (principe de base de la physique).
Pour la deuxième question, tu n'es pas maître du courant qui traverse l'Arduino, l'entrée en question prendra de quoi elle a besoin. Par contre, ton raisonnement peut s'appliquer au courant à travers R2.

Attention il ne faut pas confondre pull down et la résistance d'un pont diviseur. Quand on parle à proprement parler de pull down ou pull up on suppose ce que va être raccorder (ou pas d'ailleurs) peut avoir un état flottant qu'il faut gérer.

Exemple typique : un interrupteur

5V
|
R(10M)
|
/ |
GND ---/ *--------- Pin digital

S'il n'y avait pas de pull up, le pin digital serait flottant, donc impossible d'en tirer quelque chose. Avec la R de pull up, il est à 5V quand l'interrupteur est ouvert, et passe au GND quand on le ferme, on peut ainsi détecter l'appui.

Dans ton pont diviseur c'est différent puisqu'en fait c'est R2 qui va jouer le rôle de pull down quand il n'y a pas de cellule de branchée. Donc dans un montage comme le tiens la question de se pose même pas.

Autre fait dont tu n'as visiblement pas connaissance vu tes calculs : en INPUT l'impedance (la résistance quoi) est de 100 Mohm. Donc les 5A nan pas possible :wink: ce qu'il faut regarder dans ton pont diviseur c'est deux choses : d'abord que le micro ne voit pas plus de 5V, donc R1/(R1+R2) < 0.5 donc au minimum R1 doit être supérieur ou égale à R2. Donc plus que les valeurs des résistances, c'est le rapport entre les deux qui prévaut. Second point : la consommation de ton pont : il forme une résistance équivalente R1+R2 qui va évidemment laisser passer du courant. Le but c'est qu'il ne bouffe pas ta batterie.

Pour synthétiser : que tu prennes R1=R2=1k ou R1=R2=1M tu auras les mêmes résultats ici mais pas la même consommation. Alors ici ça n'a aucune incidence parce l’impédance d'entrée et donc le courant nécessaire à l'atmega pour sa mesure est infime (5V/100Mohm!), mais dans d'autre cas, il se peut que ce qui se trouve à la place de l'atmega a besoin de plus de courant. Dans ce cas on calcul R1 pour qu'elle soit capable de laisser passer assez de courant, et ensuite R2 pour obtenir le bon voltage en fonction de R1.

B@tto et icare,

Merci encore une fois.

Donc si je comprends tous ma resistance de pulldown doit être de 100 Mohms, dans mon pont diviseur c'est la résistance R2.

Une lipo 3S me donnera les tensions suivantes:

GND - S1 = 4.2v
S2 - S2 = 8.4v
S2 - S3 = 12.6v

(les valeurs de chaque cellules s'aditionnent 3*4.2=12.6v)

Si je veux une consommation de courrant sur ma batterie la plus minime et ceci sur chacune des cell et conserver 5 volts sur les PINs de l'ARDUINO mes calcules me donne:

Cells U R1 R2 U2 I
1 4,2 0 100 5 0.042
2 8,4 68 100 5 0.049
3 12,6 152 100 5 0.05

Si je monte la valeur R2 à 10k j'obtiens:

Cells U R1 R2 U2 I
1 4,2 0 10000 5 0,0005
2 8,4 6800 10000 5 0,0005
3 12,6 15200 10000 5 0,0005

i = U/R1+R2 (c'est la conso sur les cellules de ma batterie)

Maintenant et c'est ce que je ne comprends pas:

Quel doit être la valeur de la résitance R2 (résistance qui joue aussi lez rôle de pull down) 1 Mohms, 10 Mohms, 10 Kohmd ?

Quel est l'importance de cette valeur pour le microC (car je comprends bien qu'il n'utilisera que ce dont il à besoin) ?

Comment dois-je la calculer ?

Cordialement

Oula oula ... Décidément on va pas y arriver xD

R2 tu viens de le calculer, oublies cette historie de pull down ! Si on devat installer une résistance qui n'aurait que la fonction de pull down ça ferait :

|
R1
|
|--------- A0
R2 |
| R3
GND |
GND

Comme R3>>R2, l'influence de R3 serait donc nulle face à celle de R2 et on voit bien que R2 et R3 sont raccordés aux mêmes points

B@tto,

Attends ...
un pont diviseur c'est bien ça:

R1
|
|--------- A0
R2
|
GND
Toi tu y ajoute R3 c'est la résistan,ce de pull ?

R1
|
|--------- A0
R2 |
| R3
GND |
GND

Donc effectivement dans le cas de résitance de valeur différentes la valeur d'equivalence serait: Req=R1*R2/R1+R2

Mais je ne comprends pas ce que tu eux me faire dire.
Ni pourquoi cette 3eme résistance (R3) R2 ne peut-elle pas remplir 2 rôles ?

Merci de ton commentaire

Je prend le sujet en cours de route et j'ai comme l'impression qu'au fil des discussion on s'est éloigné du sujet de base.

Revenons au départ : faut-il une résistance pour éviter que l'entrée soit en l'air ou faut-il un pont diviseur ?
Si c'est un pont diviseur tout est expliqué là :

Cet américanisme de pull-up, pull-down est mis à tellement de sauce qu'on ne sait plus de quoi on parle.
Dire : une résistance reliée au Vcc ou a la masse, n'est-il pas plus clair ? Surtout avec des débutants,
isn't it. :grin:

PS : j'ai pas bien saisi où devait être placée la résistance de 1 Mohm mais si c'est en parallèle sur une entrée de micro-contrôleur elle ne sert à rien, avec 1 Mohm l'entrée restera à haute impédance..

Bonjour,

nicephore:
B@tto,

Attends ...
un pont diviseur c'est bien ça:

R1
|
|--------- A0
R2
|
GND
Toi tu y ajoute R3 c'est la résistan,ce de pull ?

R1
|
|--------- A0
R2 |
| R3
GND |
GND

On ne va jamais trouver la solution.
Alors tu oublies à jamais R3 qui n'existe pas pour toi (qui a dit R3)
Pour être brutal dans ton cas
Si tu as le pont R1 et R2 alors tu n'as pas R3
pour la suite on verra après

Justement je t'explique qu'ici elle ne sert à rien cette R3, c'est comme si tu colle un chalumeu à côté d'un incendie de forêt que t'essaye de voir s'il fait plus chaud ^^

Mais n'oublie pas ta problématique d'origine : tu t'étonnais que tes analogRead() renvoient quelque chose différent de zéro. Normal si tu n'a absolument rien branché dessus puisqu'il n'y pas de R de pullup ou de pull down. Donc la deux options : sans rien brancher d'autres qu'une résistance à forte valeur au +5V ou au GND te donnera soit 0 soit 1024 si rien n'est branché, et si tu rentres un signal quelconque alors "l'effet pull" sera "gommé" par ton signal car ton signal aura forcément une influence largement supérieure à la R de pull. Maintenant dans ton cas, tu utilises un pont diviseur : par définition il y a une résistance du pont qui va faire office de pull down, donc une résistance uniquement destiné au pull down deviendrait complètement inutile.

Sinon ton calcul de Req est faux, pour des résistances en parallèle 1/Req = 1/R1 + 1/R2 et en série elles s’additionnent ce qui donne pour R2 et R3 :
Req1 = 1/(1/R2+1/R3)
Ensuite la Req de l'ensemble est Req = R2 + Req1 = R2 + 1/(1/R2+1/R3)

Désole ... de paraitre si bête, mais voici seulement 3 jours que je commence l'arduino, pour le moment je n'ai fait que de lire ici et un bouquin ... je dois donc tous apprendre de la bse d'Arduino sans oublié le bas niveau et également la prog du microC.

Et donc oui j'ai bien un pont diviseur R1 R2 et pas de R3. Mon pont sera monté avec les valeurs de résitance que j'ai déjà donné.
Cells U R1 R2 U2 I
1 4,2 0 10000 5 0,0005
2 8,4 6800 10000 5 0,0005
3 12,6 15200 10000 5 0,0005

Ayant pour le moment que des 10K, j'ai déjà régle mon pb de valeur "flotant" j'ai donc bien 0 lorsque rien n'est sur la PIN et une valeur lorsque j'ai mais par exemple une tension < à 5volts (essais fait avec la 1ere Cellule d'une liPo 3S).

Dans tous les cas merci de votre aide, c'est pas toujours simple de bien comprendre vos termes surtout lors d'un total début.

Cordialement
.

nicephore:
mais voici seulement 3 jours que je commence l'arduino, pour le moment je n'ai fait que de lire ici et un bouquin

La difficulté que tu rencontre ne vient du micro-contrôleur mais d'un manque de connaissance de base en électricité/électronique, tout le monde a commencé un jour en partant de zéro.

Un excellent endroit pour acquérir cette connaissance de base (et dans bien d'autres domaines) est le Site du Zéro qui s'appelle maintenant "Openclassrooms".
Son ancien nom montrait bien, que de base, il est conçu pour s'adresser à des débutants.

Pour la partir électronique :
http://fr.openclassrooms.com/sciences/cours/l-electronique-de-zero
Il y a aussi d’excellent cours sur le C/C++.