Go Down

Topic: [conseil] faire varier la tension en sortie d'une carte arduino (Read 3425 times) previous topic - next topic

Benoit1121

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


SMarty

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().

Benoit1121

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

Benoit1121

Petite et derniere question ^^

voici un programme simple qui fait varier l'intensité de la LED :

Code: [Select]
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 :)

SMarty

"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

patg_


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.

Mes Arduineries: http://breizhmakers.over-blog.com/

SMarty

#7
May 22, 2012, 02:20 pm Last Edit: May 22, 2012, 02:24 pm by SMarty Reason: 1
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);


Benoit1121

Merci à vous deux, je suis en train d'essayer vos astuces.

@smarty : Oui c'est ca que je désire ^^

fdufnews

Quote
analogWrite(ledPin,  255 - (1024/(val+1)))


Pourquoi pas tout simplement

Code: [Select]
analogWrite(ledPin,  255 - val/4)

patg_


Quote
analogWrite(ledPin,  255 - (1024/(val+1)))


Pourquoi pas tout simplement

Code: [Select]
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).
Mes Arduineries: http://breizhmakers.over-blog.com/

Benoit1121

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

fdufnews

Quote
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)

SMarty

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)

Benoit1121

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)

Go Up