Offline
Newbie
Karma: 0
Posts: 42
|
 |
« on: October 25, 2011, 07:17:53 am » |
Bonjour, j'ai un Arduino Uno et pour l'alimenter j'utilise l'alimentation externe branché sur une pile 9V. J'aimerais savoir comment récuperer la tension aux bornes de l'alimentation pour pouvoir afficher un message si elle est inférieure a un certain nombre ...
Merci de votre aide.
|
|
|
|
« Last Edit: October 26, 2011, 10:35:10 am by pierreyves258 »
|
Logged
|
|
|
|
|
Ales
Offline
Edison Member
Karma: 7
Posts: 1657
Do or DIY
|
 |
« Reply #1 on: October 25, 2011, 07:56:44 am » |
Utiliser un pont diviseur de tension et le rentrer sur un analogIn, ou bien utiliser un circuit intégré spécifique à cette fonction (on en a parlé il y a pas très longtemps dans un topic) ou bien encore faire un comparateur avec un ampli-op et brancher la sortie sur un port digital.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #2 on: October 25, 2011, 09:45:26 am » |
Je n'ais pas tout compris mais si je relie le pin Voltage Input a un Analog je pourrais récupérer sa tension ? et ça ne va pas abimer l'arduino d'entrer du 9V dans un analog ? Quel est le code pour récupérer la tension aux bornes d'un Analog ?
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 12
Posts: 1800
There is an Arduino for that
|
 |
« Reply #3 on: October 25, 2011, 10:06:21 am » |
et ça ne va pas abimer l'arduino d'entrer du 9V dans un analog ? Si justement et c'est pour cela que B@tto préconise l'utilisation d'un pont diviseur pour abaisser les 9V à une tension compatible avec l'arduino. Pour faire simple un diviseur de tension avec 2 résistances identiques (qq kilohms) donnera une division par 2. La tension sur Vin passera donc de 9V à 4,5V compatible avec les entrées analogiques de ta carte arduino. Comme je sens que tu vas demander ce qu'est un pont diviseur je te propose d'aller voir là: http://arduino.cc/playground/Main/InterfacingWithHardware#adcdac le "Tutorial on rolling your own voltage dividers"
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #4 on: October 25, 2011, 10:29:32 am » |
Eu... en gros d'après ce que j'ais a peut près compris, il faut faire comme ça:
Un coté d'une résistance de 1K sur GND Un coté d'une résistance de 1K sur Vin(+9V) Le deuxième coté des 2 résistances sur Analog0
Et ça enverra la moitié de Vin sur Analog0 ???
Si c'est ça comment récupérer une tension a partir de la valeur renvoyée par analogRead ?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 4
Posts: 824
|
 |
« Reply #5 on: October 25, 2011, 12:46:45 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #6 on: October 25, 2011, 01:32:09 pm » |
Non ça ne marche pas ce qu'il y a marqué sur cette page, dans la fenêtre Serial ça me met un nombre négatif
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #8 on: October 25, 2011, 02:55:50 pm » |
Si non ce que j'ai mis la:
Un coté d'une résistance de 1K sur GND Un coté d'une résistance de 1K sur Vin(+9V) Le deuxième coté des 2 résistances sur Analog0
Me renvoie bien (la moitié je sais pas il faudrait que je revérifie) Un plus bas voltage (testé avec un voltmètre). Mais aussi Vin ne me donne pas la tension sur la batterie ! donc il faut que je branche direct sur le + de la pile... Mais si non la valeur de analogRead divisée par 100 avec cette façon m'a l'air bien... (exemples: broche sur le +5 ---> Valeur (brute): ~489 Vin (Avec alim USB): ~511 +3.3V: ~340) ...
|
|
|
|
« Last Edit: October 25, 2011, 02:57:28 pm by pierreyves258 »
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 4
Posts: 824
|
 |
« Reply #9 on: October 25, 2011, 02:57:28 pm » |
si tu mets les bonnes résistances ca doit fonctionner, mon script qui fonctionne sur mon webserver remis en serial pour toi R1 3.3K R2 1K ////------test batterie int batMonPin = 0; // input pin for the divider int val = 0; // variable for the A/D value float pinVoltage = 0; // variable to hold the calculated voltage float batteryVoltage = 0; float ratio = 3.94; // Change this to match the MEASURED ration of the circuit
void setup(){ Serial.begin(115000); }
void loop(){ val = analogRead(batMonPin); // read the voltage on the divider pinVoltage = val * 0.00488; // Calculate the voltage on the A/D pin batteryVoltage = pinVoltage * ratio; Serial.print(batteryVoltage); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 88
|
 |
« Reply #10 on: October 25, 2011, 03:07:03 pm » |
Avec 2 résistances identiques la tension est divisée par 2. Il faut donc transformer une valeur reçut entre 0 et 1023 en une valeur entre 0 et 10. Comme ça par exemple: const int batteryPin = 0; // +V from battery is connected to analog pin 0
void setup() { Serial.begin(9600); }
void loop() { float val = analogRead(batteryPin); map (val,0,1023,0,10); Serial.println(val); } (non testé) Ciao, Jacques.
|
|
|
|
« Last Edit: October 25, 2011, 03:11:37 pm by bouault »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #11 on: October 25, 2011, 03:10:52 pm » |
Oui ça marche c'est a peut près comme val/100 (mais plus précis) ..
Il y a quand même 0.20V de différence entre ça et mon multimètre
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 88
|
 |
« Reply #12 on: October 25, 2011, 03:25:47 pm » |
Ou plutôt val/102.3! Tu est sur de la précision de ton voltmètre?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #13 on: October 26, 2011, 04:30:37 am » |
Ok, mais pourquoi entre 0 et 10 ??? eu ... non je ne suis pas sur de la précision de mon voltmètre ... c'est un multimètre a 5€ ^^ EDIT: Ah mais c'est parce que j'avais pas récupérer la valeur du map... et en la récuperant ça me met pas un float Donc en divisant par 102.3 ça me donne la meme valeur que sur le multimètre ! 
|
|
|
|
« Last Edit: October 26, 2011, 04:48:04 am by pierreyves258 »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 88
|
 |
« Reply #14 on: October 26, 2011, 05:48:04 am » |
Ok, mais pourquoi entre 0 et 10 ??? Parce que tu doit mesurer la tension d'une pile 9 V; une échelle entre 0 et 10V me parait approprié. c'est un multimètre a 5€ Moins cher qu'un atmega... A ton avis qui est le plus précis? en la récuperant ça me met pas un float En effet c'est une erreur de ma part : la commande map renvoie un nombre entier. Mais tu peux alors renvoyer une valeur en miliVolts : map (val,0,1023,0,10000); Ou diviser par 102.3, il y a plein de solutions en fait...
|
|
|
|
|
Logged
|
|
|
|
|
|