Pages: [1] 2   Go Down
Author Topic: [conseil] faire varier la tension en sortie d'une carte arduino  (Read 2915 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 39
Posts: 3563
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://arduino.cc/en/Reference/AnalogWrite
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

Benoit
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Petite et derniere question ^^

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

Code:
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 smiley-sad
"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 smiley
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"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 Offline
Sr. Member
****
Karma: 1
Posts: 313
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
"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 smiley

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 Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3563
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pourquoi pas tout simplement

Code:
analogWrite(ledPin,  255 - val/4)
Logged

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 313
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pourquoi pas tout simplement

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


Très juste, et en ce qui me concerne très faux  smiley-cry
(ça fait une belle hyperbole qui en plus n'est pas dans le bon sens, shame on me).
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad

Benoit
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3563
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1] 2   Go Up
Jump to: