10 Janvier 2013

Arduino leçon 6 : sorties analogiques

Nous allons étudier le mode de sortie analogique PWM = Pulse Width Modulation,
ou en français modulation de la largeur des impulsions.
Nous étudierons aussi la fonction millis().
pas FB

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.

principe de la PWM

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 programmes

Ce que vous écrivez, par exemple "analogWrite(2, 150);" va dans le programme source qui reste dans votre PC.
La compilation crée un programme objet qui est chargé dans la plaquette Arduino.
Dans ce programme objet la valeur "150" aura été transformée en "59%" par le compilateur et la sortie sera à l'état haut 59% du temps.

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
flèche gauche Page Précédente : entrée analogique           Page Suivante : les notes de musique flèche droite

Valid XHTML 1.0 Transitional