N-PN White-Hat Project
Arduino : Faites briller des LEDs - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Informatique (https://dev.n-pn.fr/forum/forumdisplay.php?fid=12)
+--- Forum : Hardware/Électronique (https://dev.n-pn.fr/forum/forumdisplay.php?fid=34)
+---- Forum : Bidouillage électronique (https://dev.n-pn.fr/forum/forumdisplay.php?fid=75)
+---- Sujet : Arduino : Faites briller des LEDs (/showthread.php?tid=2482)



Arduino : Faites briller des LEDs - Dobry - 08-12-2012

Bonjour à tous !
Cet article s'adresse principalement (uniquement ?) aux débutants qui ont une Arduino, quelques LED qui ne savent pas trop quoi en faire.
J'aborderai différents exercices, et techniques de programmation pour faire des petits chennilards assez simples avec Arduino.
Si vous voyez des fautes (d'orthographe, dans le code, les termes ou autres) SIGNALEZ-les
Excusez-moi pour l'article peu avenant, mais je suis relativement nul pour la mise en page, si, cependant, vous désirez améliorer quelque chose, contactez-moi !
Dans la suite de cet article le materiel que nous utiliserons est le suivant :
  1. Un potentiomètre (résistance variable)
  2. Quelques LED (au minimum 3-4)
  3. Des résistances, 500ohm environ
  4. Une platine Labdec (plus communément appellée BreadBoard ou table de prototypage)
  5. Des fils (...)
La transmission d'informations (Serial)
Premièrement, il faut savoir que vous pouvez faire transiter des informations entre Arduino et l'IDE grâce au "Serial Monitor" pour cela, rien de plus facile :
Code C :

void setup(){
    Serial.begin(9600);
    Serial.println("Hello World");
    /*
     println pour un retour à la ligne automatique
     print   simplement pour afficher une information
    */

}

void loop(){ // On a pas besoin de la boucle
}
 

Rien de très complexe, on initialise la communication à 9600 baud ( bits par seconde ), arbitrairement, puis on écrit envoi la chaine "Hello World".
Sur l'IDE, envoyez ca sur l'Arduino puis dans l'onglet "Tools" activez le "Serial Monitor", vous devriez, devant vos yeux ébahis, voir apparaitre "Hello World".
Maintenant on s'attaque au potentiomètre.

Fonctionnement d'un potentiomètre et lecture analogique
Avant de pouvoir faire quoi que ce soit, il faut comprendre le fonctionnement du potentiomètre et ce qu'il nous retourne, vous l'aurez deviné, on va utiliser la fonction Serial pour analyser tout ça.
Mon potentiomètre a 3 branches, une pour l'alimentation, une autre pour la valeur de sortie (celle du milieu) et enfin, la troisième que l'on branche à la sortie (ground), ce qui nous
donne le schéma suivant :
[Image: AP1_1.png]
Remarque importante : Pour lire une valeur sur un PIN, il faut utiliser la fonction analogRead(int pin) c'est pour cela que la branche du milieu est connectée à un PIN de type "Analog In" (qui commence avec avec la lettre A).

Le code :
Code C :

void setup(){
    Serial.begin(9600);
}

void loop(){
    Serial.println(analogRead(0)); // On lit la valeur sur le pin analogique 0 (A0) puis on l'affiche
    delay(1000); // On attend une seconde
}
 


En jouant un peu avec le potentiomètre, on se rend compte que la valeur lue sur A0 varie entre 1023 et 0, nous allons donc pouvoir jouer avec ça Smile

Make the LEDs rock
En utilisant ce que nous avons vu au dessus, nous allons nous amuser à allumer 4 LEDs dans un ordre... incertain...
En effet, le but est de lire sur une entrée analogique la valeur envoyée par le potentiomètre puis d'affiche les LEDs branchées sur les PINs 6 à 10 de l'Arduino, un bout de code valant mieux que 10 phrases (surtout les mienne), voici le code :
Code C :

int ancien = 0;
void setup(){
    for(int i = 6; i < 10; i++) // Pour les LEDs branchées sur les PIN 6 à 10 de l'arduino (6 inclu 10 exclu)
    pinMode(i, OUTPUT);
}

void loop(){
    int value = analogRead(1);
    value %= 4;
    digitalWrite(ancien+6, LOW);
    digitalWrite(value+6, HIGH);
    ancien  = value;
    delay(500);
}
 

Ce code bien que très simple, peut paraitre obscure à quelqu'un n'ayant presque jamais programmé, voici quelques explications:
value %= 4 : équivalent à la ligne l'instruction value = value%4; elle permet d'obtenir le reste de la division par 4, cette astuce est fort utile pour ramener de très grandes valeurs à l'intérieur d'un interval plus petit,en effet, le reste de la division par un nombre est toujours inférieur à ce nombre, dans notre cas, value prend donc une valeurs située entre 0 et 4 (la borne inférieure est toujours inclue, l'extérieur exclue).
value+6 : Nos LEDs sont branchées sur les PIN 6 à 10, il suffit donc d'ajouter 6 à la valeur pour allumer une de ces quatre led.
ancien = value cette ligne permet de se souvenir quelle LED a été allumé à la boucle précédente, pour ainsi la laisser allumé jusqu'à ce que l'on modifie le potentiomètre afin d'allumer une autre LED.
digitalWrite(ancien+6, LOW); Sans cette ligne, les LEDS s'allumerai une part une sans jamais s'éteindre.

En somme, rien de très complexe, l'ordre dépend du reste de la division et est donc "completement" aléatoire. Mais nous allons maintenant nous intéresser à la manipulation de LED les unes à la suite des autres dans un ordre choisi, afin de manipuler un peu tout ce monde la à l'aide des fameuses BOUCLES dont je vous parle depuis le début.

Chenillards à gogo !
Premier projet : allumer 4-5 LEDs les une la suite des autres, en faisant varier la vitesse. Le materiel necessaire est le même que la liste énoncée ci dessus, voici le schema du montage :
[Image: AP1_2.png]
Pour ceux qui ne l'auraient pas deviné, les résistances permettent d'éviter aux leds de griller sous la tension/intensité fournies par l'Arduino !
4 résistances, 4 leds, un potentiomètre, nous voilà pret pour la grande aventure, enfin il manque tout de même un élément relativement important : le code que voici :
Code C :

void setup(){
 for(int i = 6; i < 10 ; i++)
  pinMode(i, OUTPUT);
}

void loop(){
 int wait = analogRead(0);
 for(int i = 6; i < 10 ; i++){
  digitalWrite(i, HIGH);
  delay(wait);
  digitalWrite(i, LOW);
 }
}
 

Je ne pense pas qu'il y ai besoin d'expliciter plus que cela, mais dans un élan de bonté je vais tout de même m'étendre un peu :
On récupère la valeur sur l'entrée Analogique 0 (celle branchée au potentiomètre) cette valeur sera utilisée dans le delay, plus la résistance est grande, plus la valeur est petite, plus le delai sera long et donc plus l'animation semblera lente.
On allume, on attend puis on éteint sans attendre de nouveau, et cela car nous voulons que l'enchainement du chenillard soit fluide en rajoutant un delai, il y aurait une période pendant laquelle aucune LED n'est allumée : MOCHE !
Après plusieurs tests vous vous êtes peu-être rendu compte que la variation de la vitesse est loin d'être précise, cela s'explique par le fait que nous lisons la valeur du courant transmis à travers le potentiomètre une seule fois pour les quatres LEDs, si vous modifiez cette valeur entre la 2ième et 3ième LED, elle ne sera prise en compte qu'au tour suivant, pour combler cela transformez votre loop() comme suit :
Code C :

void loop(){
 for(int i = 6; i < 10 ; i++){
  int wait = analogRead(0);
  digitalWrite(i, HIGH);
  delay(wait);
  digitalWrite(i, LOW);
 }
}
 

Vous devriez sentir une nette différence entre les deux codes, comme quoi, parfois cela ne tient qu'a une ligne Smile
La fonction map
Avec le code précendent, la valeur du delay peut varier entre 0 et 1023 c'est à dire en 0ms et 1,23s ce que certains peuvent trouver très restrictif, pour contourner cette contrainte, il faut
utiliser la fonction map qui s'utilise comme suit si nous voulons convertir une valeur située entre 0 et 1023 en une valeur dans l'interval 0, 200
Code C :

wait = map(wait, 0, 1023, 0, 200);
 

Mais, grâce à cette fonction nous pouvons également attendre des delais largements supérieur à 1,23 secondes, par exemple :
Code C :

wait = map(wait, 0, 1023, 1500, 2500);
 

Dans ce cas, le delai minimal sera de 1,5 seconde et le maximal de 2,5 secondes, ce qui peut s'avérer utile dans certains cas voici le code complet dans lequel le delai minimal est de 0,5 seconde et le maximal de 3 secondes!
Code C :

void loop(){
    for(int i = 6; i < 10 ; i++){
        int wait = analogRead(0);
        wait = map(wait, 0, 1023, 500, 3000);
        digitalWrite(i, HIGH);
        delay(wait);
        digitalWrite(i, LOW);
   }
}
 


A partir de là, nous avons tout les outils nécessaire pour nous amuser simplement avec des LEDs, et faire toute sorte de chenillard, par exemple (je n'écrirai maintenant que le void loop() le void setup() ne change pas !
Code C :

void loop(){
    for(int i = 6; i < 10 ; i++){
        int wait = analogRead(0);
        digitalWrite(i, HIGH);
        delay(wait);

   }
   for(int i = 6; i < 10; i++)
             digitalWrite(i, LOW);
             
   delay(200);
}
 

Dans ce cas, les LED vont s'allumer les unes après les autres, puis s'éteindront simultanément pour recommencer (une sorte "barre de progression")
Petit détail que j'ai omis, mais que certain d'entre vous ne savent peut-être pas : quand la boucle ne comprend qu'une instruction (une ligne), on peut omettre les "{ }" !
Autres "astuces"
Imaginons que les LEDs ne soient pas situées sur des PINs qui se suivent, mais sur les PIN 3, 8 et 10, dans ce cas, la boucle précédente ne fonctionnerai pas, pour pallier à ce problème, nous allons utiliser un type de variable très utile : le tableau.
Code C :

int led ={3, 8, 10};
 

Dans ce code, on déclare un tableau avec trois valeurs : 3;8 et 10 qui correspondent au PIN des LEDs, maintenant, il faut modifier la boucle :
Code C :

void loop(){
    for(int i = 0; i < 3 ; i++){ // Nous avons trois LED
        int wait = analogRead(0);
        wait = map(wait, 0, 1023, 500, 3000);
        digitalWrite(led[i], HIGH); // Le PIN situé à la case "i" du tableau
        delay(wait);
        digitalWrite(led[i], LOW);
   }
}
 

Voilà, on accède au différentes valeurs du tableau grâce à des crochets ("[]").
Attention : comme dans beaucoup de langage, les tableaux sont numérotés à partir de 0, donc si votre tableau contient 3 éléments, le troisième élément se trouve à l'indice 2.
Faites attention de bien vérifier que l'indice du tableau auquel vous voulez acceder existe, dans le cas contraire, c'est un crash assuré !

J'espère que cette petite introduction vous a fait voir quelques "astuces" et/ou exercices pour débuter avec Arduino, tout en prenant de bonnes habitudes !

http://ex0ns.me


RE: Arduino : Faites briller des LEDs - CyberSee - 10-12-2012

Rep +1 Très beau tuto bien expliqué


RE: Arduino : Faites briller des LEDs - evolax - 12-12-2012

Manque juste une ligne pour expliquer pourquoi tu mets des résistances entre les leds et les pins, pour éviter de griller l'arduino.
Super tuto Smile


RE: Arduino : Faites briller des LEDs - Dobry - 14-12-2012

Rajouté !
Merci pour vos réponses !