• STATISTIQUES
  • Il y a eu un total de 4 membres et 5367 visiteurs sur le site dans les dernières 24h pour un total de 5 371 personnes!


    2 membres se sont inscrits dans les dernières 24h!


    Membres: 2 608
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] PHPFreaks
    PHPFreaks est un site dédié à l'apprentissage et l'enseignement du PHP. Ici vous trouver...
    Programmation
    [FR] Secuser
    Actualité de la sécurité informatique, fiches virus et hoax, alertes par email, antivirus gratui...
    Hacking
    [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges
    [EN] xda-developers
    Très bon site pour les gros bidouilleurs de smartphone de windows à androïd et de Apple jusqu'...
    Phreaking
    [EN] Hack This Site
    Hack This Site est considéré comme un réel terrain d'entraînement légal pour le...
    Hacking
    [EN] Astalavista
    JavaScript: 1, Exploit: 2, Crypto: 34, CrackIt: 15, Stegano: 8, Programming: 12, Logic: 36, Special: 6, Science: 4, Info...
    Challenges
    [EN] Bright Shadows
    JavaScript: 13, Exploit: 27, Crypto: 69, CrackIt: 52, Stegano: 67, Flash: 3, Programming: 16, Java-Applet: 10, Logic: 20...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino : Faites briller des LEDs
08-12-2012, 19h46 (Modification du message : 14-12-2012, 17h39 par Dobry.)
Message : #1
Dobry Hors ligne
Tueur de lamouz
*



Messages : 206
Sujets : 25
Points: 73
Inscription : Aug 2011
Arduino : Faites briller des LEDs
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
Aestuārium Erudītiōnis

There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
+1 (6) -1 (0) Répondre
10-12-2012, 22h23
Message : #2
CyberSee Hors ligne
Admin fondateur de N-PN
*******



Messages : 1,721
Sujets : 287
Points: 157
Inscription : Jan 2012
RE: Arduino : Faites briller des LEDs
Rep +1 Très beau tuto bien expliqué
Code PHP :
<?php
$pape 
"pape"; echo $pape
// Le $pape en string!
?>
+1 (0) -1 (0) Répondre
12-12-2012, 01h15
Message : #3
evolax Hors ligne
Open Hackware
*



Messages : 10
Sujets : 1
Points: 0
Inscription : Nov 2012
RE: Arduino : Faites briller des LEDs
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
+1 (0) -1 (0) Répondre
14-12-2012, 17h39
Message : #4
Dobry Hors ligne
Tueur de lamouz
*



Messages : 206
Sujets : 25
Points: 73
Inscription : Aug 2011
RE: Arduino : Faites briller des LEDs
Rajouté !
Merci pour vos réponses !
Aestuārium Erudītiōnis

There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
+1 (0) -1 (0) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  Domotique en Arduino/Raspberry badTasTe 16 658 10-01-2014, 01h19
Dernier message: badTasTe
  [Arduino] Les bases Swissky 24 1,080 29-10-2013, 20h35
Dernier message: Loup
  ARDUINO/Raspberry : les inventions notfound 3 256 26-03-2013, 22h13
Dernier message: -Mat-
  Arduino : buzzer et photorésistances! Dobry 1 151 12-03-2013, 17h14
Dernier message: Swissky
  Arduino : cartes électroniques Open Source artis 5 247 24-08-2011, 03h13
Dernier message: datareaver

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut