Offline
Newbie
Karma: 0
Posts: 38
|
 |
« on: May 22, 2012, 05:51:15 am » |
Bonjour, je fait ce sujet à part pour que peut être il soit facile d’accès pour les personne se posant la même question que moi..
Ma question est la suivante :
Est-ce possible de faire varier la tension sur une sortie d'une carte arduino ?
Exemple :
mon projet est un detecteur d'obstacle, et j'aimerai (pourquoi pas hein :p) faire varier l'intensité de la LED que j'utilise en fonction de la valeur envoyé par mon sonar. sur la carte on a en sortie 5V donc voila j'aimerai faire des clignotement de LED avec un intensité qui fluctue
Merci
Cordialement
Benoit
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 14
Posts: 1841
There is an Arduino for that
|
 |
« Reply #1 on: May 22, 2012, 06:01:40 am » |
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 57
|
 |
« Reply #2 on: May 22, 2012, 06:13:47 am » |
Salut,
Pour cela tu as des sorties spéciales sur l'arduino, ce sont les sorties PWM (Pulse Width Modulation) Ce sont des sorties numériques 0-5V. En faisant varier la fréquence d'impulsion (passage rapidement de 5 à 5V) elles simulent une tension variable entre 0 et 5V (analogique).
Elles peuvent donc être utilisées soit en sortie numérique état 0V ou 5V en utilisant la fonction digitalWrite(). Soit être utilisées en sortie analogique générant une tension variable de 0 à 5V en utilisant la fonction analogWrite().
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 38
|
 |
« Reply #3 on: May 22, 2012, 06:20:57 am » |
Merci à vous deux, j'ai fait un test avec la fonction analogWrite() et ça fonctionne. En fait j’étais tombé sur une explication de cette fonction mais il parlait en fonction des largeurs d'impulsion du signal donc ça modifier le temps où la LED est allumé et le temps où la LED est éteinte. Encore merci  Benoit
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 38
|
 |
« Reply #4 on: May 22, 2012, 06:45:14 am » |
Petite et derniere question ^^ voici un programme simple qui fait varier l'intensité de la LED : int ledPin = 11; // LED connected to digital pin 9 int analogPin = 3; // potentiometer connected to analog pin 3 int val = 0; // variable to store the read value
void setup() { pinMode(ledPin, OUTPUT); // sets the pin as output }
void loop() { val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val / 3 ); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255 } Plus la valeur de val est grande, plus la LED elcair fort. Ce qui m'interresse c'est l'inverse. Or un truc me bloque  "analogWrite(ledPin, val / 3 ); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255" c'est assez clair, plus la valeur est elevée, plus la led eclair. je ne vois pas comment inverser cela. j'ai essayé quelques petite modif mais sans succes, avez vous une idée? Merci 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 57
|
 |
« Reply #5 on: May 22, 2012, 06:49:15 am » |
"il parlait en fonction des largeurs d'impulsion du signal"
C'est justement cela : PWM = Pulse Width Modulation = Modulation de Largeur d'Impulsion C'est cette astuc qui permet de simuler un signal analogique sur une sortie numériuque
Concernant ta dernière question je ne comprend pas bien : tu veux que plus ta val envoyée à la fonction analogWrite() est petite plus la LED éclaire ?
essaie la fonction map() qui te permet de modifier tes plages de valeurs
|
|
|
|
|
Logged
|
|
|
|
|
Rennes
Offline
Full Member
Karma: 0
Posts: 210
|
 |
« Reply #6 on: May 22, 2012, 07:05:16 am » |
Plus la valeur de val est grande, plus la LED elcair fort. Ce qui m'interresse c'est l'inverse. Or un truc me bloque  "analogWrite(ledPin, val / 3 ); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255" c'est assez clair, plus la valeur est elevée, plus la led eclair. je ne vois pas comment inverser cela. j'ai essayé quelques petite modif mais sans succes, avez vous une idée? Merci  Essaie un truc du genre: analogWrite(ledPin, 255 - (1023/val)) Attention ça va planter si val==0. un truc satisfaisant pour toi serait: analogWrite(ledPin, 255 - (1024/(val+1))) Par contre je ne sais pas comment se comporte analogWrite() avec des arguments négatifs, ce qui peut se produire avec le code ci-dessus. Si ça pose problème, tu peux stocker 255 - (1024/(val+1)) dans une variable et par un if() t'assurer que sa valeur mini ne descend pas au-dessous de 0.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 57
|
 |
« Reply #7 on: May 22, 2012, 07:20:36 am » |
cela devrait fonctionner et être plus simple avec map() :
Ta valeur reçue est comprise entre 0 et 1023 -> tu la convertis en valeur entre 255 et 0 :
val = analogRead(analogPin); val = map(val, 0, 1023, 255, 0); analogWrite(ledPin, val);
|
|
|
|
« Last Edit: May 22, 2012, 07:24:17 am by SMarty »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 38
|
 |
« Reply #8 on: May 22, 2012, 07:48:07 am » |
Merci à vous deux, je suis en train d'essayer vos astuces.
@smarty : Oui c'est ca que je désire ^^
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 14
Posts: 1841
There is an Arduino for that
|
 |
« Reply #9 on: May 22, 2012, 08:04:48 am » |
analogWrite(ledPin, 255 - (1024/(val+1))) Pourquoi pas tout simplement analogWrite(ledPin, 255 - val/4)
|
|
|
|
|
Logged
|
|
|
|
|
Rennes
Offline
Full Member
Karma: 0
Posts: 210
|
 |
« Reply #10 on: May 22, 2012, 08:47:38 am » |
analogWrite(ledPin, 255 - (1024/(val+1))) Pourquoi pas tout simplement analogWrite(ledPin, 255 - val/4) Très juste, et en ce qui me concerne très faux  (ça fait une belle hyperbole qui en plus n'est pas dans le bon sens, shame on me).
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 38
|
 |
« Reply #11 on: May 22, 2012, 08:56:01 am » |
Bon et bien, ca ne résoud pas le soucis que j'ai ^^ je n'arrive pas à avoir l'intensité de la LED qui augmente quand ''val" diminue ^^ j'ai essayé toute vos astuces  Benoit
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 14
Posts: 1841
There is an Arduino for that
|
 |
« Reply #12 on: May 22, 2012, 09:14:36 am » |
je n'arrive pas à avoir l'intensité de la LED qui augmente quand ''val" diminue ^^ Comment ta LED est-elle câblée? vers la masse ou vers le plus 5V? analogWrite(ledPin, 255 - val/4) Si val diminue l'argument augmente et donc le rapport cyclique augmente Si val augmente l'argument diminue et donc le rapport cyclique diminue Cette ligne de code est bonne si la LED est câblée entre une sortie PWM et la masse Si la LED est câblée entre une sortie PWM et le +5V il faut utiliser analogWrite(ledPin, val/4)
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 57
|
 |
« Reply #13 on: May 22, 2012, 09:21:10 am » |
hello,
étrange...
dans la solution avec map() tu as bien : - quand tu lis une valeur de 0 sur ton capteur, val=255 donc ta led est plein feux - quand tu lis une valeur de 1023 sur ton capteur, val=0 donc ta led éteinte
donc à priori c'est valide.
vérifie effectivement ton montage. on est bien d'accord que tu as connecté ton capteur sur une entrée analogique (pin A0 -> A5 sur une Uno) ? ta sorte est bien sur une sorte PWM (marquée ~ sur la plaquette) ?
que dit le capteur ? est-ce que tu sais quelles valeurs il renvoie ? (utilise la liaison série pour afficher la valeur sur ton ordi)
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 38
|
 |
« Reply #14 on: May 22, 2012, 09:54:03 am » |
Je possede une carte duemilanove. La LED est branchée de cette facons : sortie 11 de ma carte sur le + de la LED et la masse à la masse.
et oui mon sonar est branché sur l'entree analogique 3 de ma carte.
mon capteur me donne comme valeurs : 100 pour 1m 200 pour 2m (a 003 pres..) Donc avec le programme basic que j'ai mis plus haut, plus la valeur est grande plus la LED eclair.
j'ai essayé vos exemple et soit la LED reste allumé non stop fortement ou alors pas du tout ..
(il est possible que ce soit une erreur de ma part)
|
|
|
|
|
Logged
|
|
|
|
|
|