10 Janvier 2013
Arduino leçon 6 : sorties analogiques
ou en français modulation de la largeur des impulsions.
Nous étudierons aussi la fonction millis().

le principe de la PWM
On veut une sortie analogique, c'est-à-dire pouvant prendre des valeurs intermédiaires entre 0 et 5V.
Arduino ne délivre que 0 ou +5, mais peut aussi envoyer des créneaux 0V/5V dont on peut choisir le rapport cyclique
exemple : si le niveau est haut 80% du temps, on aura une moyenne de 4 volts.

Sur ce schéma, la valeur moyenne des créneaux est représentée en orange.
Le programme écrit sur une sortie PWM une valeur comprise entre 0 et 255 (rappel : 255 est le plus grand nombre
qu'on peut écrire dans un octet).
Ce nombre va être transformé par le compilateur Arduino en un rapport cyclique de 0% à 100% .
La commande est analogWrite( pin, valeur);
rappel sur les 2 aspects du programmesCe que vous écrivez, par exemple "analogWrite(2, 150);" va dans le programme source qui
reste dans votre PC.
|
le montage
On met une LED sur la sortie PWM n°2, avec cathode reliée à la masse par une résistance.
Le programme va faire varier progressivement le rapport cyclique de la sortie 2.
On verra encore mieux si on ajoute un voltmètre entre la sortie 2 et la masse.
On fera varier de 0 à 255 la valeur envoyée à la LED, en s'arrêtant 20 ms sur chaque valeur.
Et on variera ensuite en sens inverse.
for ( i=0 ; i < 256 ; i++ ) {
envoyer une valeur sur la sortie analogique;
attendre 20ms;
}
Ça nous donnera une durée voisine de 5 secondes pour chaque boucle, soit environ 10 secondes au total.
le programme
/* fading_PWM.ino
variations de l'intensité d'éclairage d'une led */ int sortie; void setup() { pinMode(2, OUTPUT); } void loop() { for ( sortie = 0 ; sortie < 256 ; sortie++) { analogWrite(2, sortie); delay(20); } delay (500); for ( sortie = 255 ; sortie >= 0 ; sortie--) { analogWrite(2, sortie); delay(20); } delay (500); } |
Vous pouvez l'améliorer en ajoutant des Led sur d'autres sorties PWM.
Essayez de faire varier leur lumière en sens contraire.
La fonction millis()
Dans la leçon 1, nous avions vu le programme "deux_diodes.ino".
Dans ce programme, une diode rouge clignotait lentement et une diode verte devait s'allumer quand on appuyait sur un bouton.
Nous avions constaté que l'appui sur le bouton n'était pris en compte qu'une fois toutes les 10 secondes.
Il nous reste maintenant à modifier le programme pour que l'appui sur le bouton ou son relâchement soient visibles immédiatement.
Pour cela nous devons supprimer les "delay()" et employer "millis()".
millis() est une fonction qui renvoie le nombre de millisecondes écoulées depuis le lancement du programme. Cette valeur ne tient
pas dans un int. On doit déclarer ce nombre comme "long".
le programme
/* deux_diodes_sans_delay.ino
la led rouge clignote comme le 10 octobre. la durée est longue (10 secondes) pour mieux voir l'effet du cycle sur la prise en compte de l'état du bouton. */ // déclarations des variables const int ledRouge = 13; // N° de pin reliée à la les rouge const int ledVerte = 3; // N° de pin reliée à la led verte const int bouton = 4; // N° de pin reliée au bouton boolean etatBouton; // niveau lu sur la pin "bouton" boolean etatRouge=0; // niveau envoyé à la led Rouge long changer; // "heure" de changer l'état de la led void setup() { pinMode(3, OUTPUT); pinMode(13, OUTPUT); changer = millis() + 5000; } void loop() { if (millis()>changer) { etatRouge =1-etatRouge; digitalWrite(ledRouge, etatRouge); changer = millis() + 5000; } // 2ème partie du programme (led verte et bouton) etatBouton = digitalRead(4); digitalWrite(ledVerte, etatBouton); } |
haut de la page

