Arduino Pilotage d’une rampe de led

Pilotage d’une rampe de led


Ce tutoriel va être le 1er d’une série à propos de la manipulation de bandeau led.

1. Pré requis

a. Librairies utilisées :

button.h : librairie maison de gestion de boutons poussoirs

b. Connaissance utile :

Voir le tutoriel sur la librairie de boutons

2. Objectif

L’objectif final est d’équiper mon escalier de sous sol d’une rampe de led. Cet installation possédera deux capteurs PIR afin de détecter la présence des personnes, l’installation communiquera avec une centrale domotique pour communiquer les passages et notamment si les personnes montent ou descendent.

Evidemment, avant d’en arriver là, nous allons passer par une série de tutoriaux. 1er d’entre eux, nous allons piloter l’allumage et l’extinction de la rampe de led à l’aide d’un bouton.

Nous en profiterons pour réaliser un petit effet d’allumage et d’extinction.

Allez hop, c’est parti.

a. L’effet d’allumage/extinction

Vous verrez un peu plus bas, qu’il est possible de moduler la luminosité des Leds. Plutôt que de passer d’une extinction à un allumage à 100% (ce qui est assez violent car les leds éclair très bien), nous allons réaliser un allumage avec une monté en luminosité assez rapide. Pour l’extinction, nous réaliserons l’effet inverse ; une descente de luminosité progressive, mais cette fois ci, plus lente (Au cas ou une personne resterai immobile, elle pourra se rendre compte que l’extinction est en cours).

1. Processus de gestion des allumages et extinctions

Il va s’agir ici d’un automate très simple. Si le bandeau est éteint et que je réalise un clic sur le bouton, je lance la procédure l’allumage. Si le bandeau est allumé, et que je réalise un clic, je lance la procédure l’extinction.

Néanmoins, si pendant la procédure d’extinction, je réalise la moindre action sur le bouton (Onpress : Voir le tutoriel sur la librairie gestion des boutons), je rallume immédiatement le bandeau led.

3. Un peu d’algorithmie

Nous voyons que la gestion des procédures d’allumage et d’extinction ne vont pas être similaire. En effet, la procédure d’extinction doit prendre en compte la gestion des boutons pour pouvoir intervenir et interrompre le processus d’extinction.

Donc soit, on gère de nouveau la gestion des boutons dans la procédure d’extinction, soit on essai de rester asynchrone. Nous avons déjà abordé cette logique de programmation dans le Tuto n°3. Je ne vais donc pas revenir sur ce point mais pour la procédure d’extinction, nous ne réaliserons pas une boucle qui change l’intensité puis un delay. Nous miserons sur la boucle loop pour réaliser les itérations.

Cela complexifie la programmation, mais cela apporte une grande souplesse à vos programmes.

4. Matériel utilisé

a. A propos du Tip 120

La rampe de led est alimenté en 12v (on en profitera pour alimenter l’arduino dans l’installation définitive). L’arduino ne peut délivrer que 5V sur une pin, il nous faut donc utiliser l’alimentation du transformateur mais contrôler son interruption. De base, on pense à un relais. Le relais est une action mécanique (tel un interrupteur manuel) qui laisse ou non passer le courant. L’inconvénient, c’est qu’il a une durée de vie (en nombre de commutation). Il est indispensable lorsqu’on manipule le courant alternatif de nos foyers. Mais ici, nous sommes en courant continu et qui plus est de 12v. Hors il existe un dispositif permettant de commander un courant beaucoup plus important, le transistor. Il s’agit ici d’un transistor NPN.

Non seulement ce transistor remplira son office d’interrupteur, mais en plus, nous pourrons réaliser de la modulation de fréquence. Des effets de lumière seront alors possible.

 

b. La modulation de fréquence PWN

Les Arduinos possèdent des ports PWN qui permettent la modulation de fréquence. Sur le Nano, les broches 3, 5, 6, 9, 10 et 11. Il suffit alors d’y réaliser un AnalogWrite avec une intensité allant de 0 à 255. Le courant émis alors par la broche aura cette allure :

La résultante sur le bandeau led est simple, si vous envoyez par exemple 127, les Leds auront 50% de l’intensité de luminosité. Il sera donc possible de réaliser des effets d’allumage progressif et d’extinction progressive, ce que nous allons réaliser :). Pour plus d’info sur le PWN voir ici.

5. Schéma

sur le schéma, le bandeau Led sera matérialisé par une led simple et l’alimentation est en faite le Led Driver branché sur le 220v alternatif.

schéma de montage

6. Programme

Voyons maintenant les différents éléments du programme.

On retrouve en define les pin des différents éléments : Le bouton et le TIP120.

L’objet de gestion des boutons et un ensemble de variables.

[pastacode lang= »cpp » manual= »%23include%20%3CButton.h%3E%09%09%09%2F%2F%20Inclusion%20de%20la%20librairie%20de%20gestion%20des%20boutons.%0A%0A%23define%20BTN%202%09%09%09%09%2F%2F%20Pin%20du%20bouton%0A%23define%20TIP120%205%09%09%09%2F%2F%20Pin%20du%20Tip120%20que%20l’on%20va%20g%C3%A9rer%20en%20PWM%0A%23define%20LIGHTON%202000%09%09%2F%2F%20Dur%C3%A9e%20d’allumage%20de%20la%20rampe%20%C3%A0%20100%25%20en%20millisecondes.%0A%23define%20LIGHTOFF%203500%09%09%2F%2F%20Dur%C3%A9e%20d’extinction%20de%20la%20rampe%20en%20millisecondes.%0A%0AManageButton%20m_btns(BTN)%3B%09%2F%2F%20D%C3%A9claration%20du%20gestionnaire%20de%20bouton%0A%0Abool%20m_isAlight%3B%09%09%09%2F%2F%20Est%20ce%20que%20le%20bandeau%20est%20allum%C3%A9%20ou%20non.%0Along%20m_diffTimeFade%3B%09%09%2F%2F%20Mesure%20du%20temps%20pour%20le%20fadeOut%0Aint%20m_delayToLessIntesity%3B%09%2F%2F%20Temps%20d’attente%20pour%20descendre%20l’intensit%C3%A9d%20du%20bandeau%0Aint%20m_delayToUpIntesity%3B%09%2F%2F%20Temps%20d’attente%20pour%20monter%20l’intensit%C3%A9%20du%20bandeau%0Abyte%20m_fadeOutIntensity%3B%09%2F%2F%20Valeur%20d’intensit%C3%A9%20pour%20le%20fadeout » message= »Partie déclarative » highlight= » » provider= »manual »/]

Le choix du nom de la méthode parle à des informaticiens le fade in fade out est un procédé qui veut dire faire apparaître en fondu et faire disparaître en fondu.

La méthode fadeIn permet de gérer tous les allumages, en effet, il y en a deux. L’allumage complet depuis zéro et l’interruption d’extinction (En effet, lorsque l’on appuie sur le bouton au cours de l’extinction, la rampe se rallume aussitôt. Avec le détecteur de présence, on sera bien heureux que la rampe n’oublie pas de se rallumer si elle nous détecte de nouveau).

Cette procédure possède une boucle, elle ne rend pas la main au loop. Ici, on ne souhaite justement pas que la procédure puisse être interrompu.

[pastacode lang= »cpp » manual= »void%20FadeInLed()%0A%7B%0A%09byte%20v_intensity%3B%09%09%09%09%2F%2F%20L’intensit%C3%A9%20envoy%C3%A9%20en%20PWM%0A%09if%20(!m_isAlight)%0A%09%7B%0A%09%09Serial.println(%22On%20allume%20la%20rampe%20de%20led.%22)%3B%09%09%0A%09%09for%20(v_intensity%20%3D%200%3B%20v_intensity%20%3C%20255%3B%20v_intensity%2B%2B)%0A%09%09%7B%0A%09%09%09analogWrite(TIP120%2C%20v_intensity)%3B%0A%09%09%09delay(m_delayToUpIntesity)%3B%0A%09%09%7D%0A%09%09Serial.println(%22la%20rampe%20est%20allum%C3%A9e.%22)%3B%0A%09%09m_isAlight%20%3D%20true%3B%0A%09%7D%0A%09else%0A%09%7B%0A%09%09if%20(m_fadeOutIntensity%20!%3D%200)%09%2F%2F%20La%20rampe%20%C3%A9tait%20en%20cours%20d’extinction%2C%20on%20rallume.%0A%09%09%7B%09%09%0A%09%09%09Serial.println(%22On%20interrompe%20l’extinction%20de%20la%20rampe%20de%20led.%22)%3B%0A%09%09%09for%20(v_intensity%20%3D%20m_fadeOutIntensity%3B%20v_intensity%20%3C%20255%3B%20v_intensity%2B%2B)%0A%09%09%09%7B%0A%09%09%09%09analogWrite(TIP120%2C%20v_intensity)%3B%0A%09%09%09%09delay(m_delayToUpIntesity)%3B%0A%09%09%09%7D%0A%09%09%09Serial.println(%22la%20rampe%20est%20allum%C3%A9e.%22)%3B%0A%09%09%09m_isAlight%20%3D%20true%3B%0A%09%09%09m_fadeOutIntensity%20%3D%200%3B%09%09%2F%2F%20Important%20pour%20ne%20pas%20rentrer%20en%20conflit%20avec%20le%20fadeOut.%0A%09%09%7D%0A%09%09else%0A%09%09%09Serial.println(%22Elle%20est%20d%C3%A9j%C3%A0%20allum%C3%A9e.%22)%3B%0A%09%7D%0A%09m_btns.Release()%3B%09%09%09%09%09%2F%2F%20Je%20force%20la%20remise%20%C3%A0%20zero%20du%20statut%20ici.%0A%7D » message= »FadeIn » highlight= » » provider= »manual »/]

La procédure fadeOut quand à elle ne possède pas de boucle pour rendre la main au loop et pouvoir gérer d’autres action au cours du processus. Si celui ci n’est pas interrompu, la procédure se déroulement comme si nous avions une boucle.

[pastacode lang= »cpp » manual= »void%20FadeOut()%0A%7B%0A%09int%20v_pourcentage%3B%0A%09if%20(m_isAlight%20%26%26%20m_fadeOutIntensity%20%3E%201)%0A%09%7B%0A%09%09Serial.print(%22Rampe%20%C3%A0%20%22)%3B%0A%09%09v_pourcentage%20%3D%20(m_fadeOutIntensity%20*%20100)%20%2F%20255%3B%0A%09%09Serial.print(v_pourcentage)%3B%20Serial.println(%22%25%22)%3B%0A%09%09analogWrite(TIP120%2C%20m_fadeOutIntensity)%3B%0A%09%09m_fadeOutIntensity–%3B%0A%09%7D%0A%09else%0A%09%7B%0A%09%09m_fadeOutIntensity–%3B%0A%09%09analogWrite(TIP120%2C%20m_fadeOutIntensity)%3B%0A%09%09m_isAlight%20%3D%20false%3B%0A%09%09m_delayToLessIntesity%20%3D%200%3B%0A%09%09Serial.println(%22Extinction%20totale%20de%20la%20rampe%20de%20led.%22)%3B%0A%09%7D%0A%09m_diffTimeFade%20%3D%20millis()%3B%0A%7D » message= »FadeOut » highlight= » » provider= »manual »/]

Je vous passe la méthode setup qui est enfantine.

Intéressons nous plutôt à la boucle loop. Vous verez tout d’abord, l’écoute de l’état du bouton ainsi que le fadeIn.

Puis vient le bloc de gestion du fadeout avec trois cas :

  1. La détection du lancement de la procédure, il faut que l’on soit allumé (complet) et que l’on ai un clic.
  2. Le déroulement lui même. Si le délai de chaque étape est atteint, on lance la procédure pour descendre l’intensité.
  3. La détection d’une pression sur le bouton pour interrompre la procédure. Il faudra vieiller dans le fadeIn à réintialiser les variables de telle sorte que le fadeOut ne désire pas continuer son action. On voit tout de suite que le levier se situe sur la valeur de m_fadeOutIntensity.

[pastacode lang= »cpp » manual= »void%20loop()%0A%7B%0A%09m_btns.listen()%3B%09%09%09%09%09%20%2F%2F%20Permet%20de%20g%C3%A9rer%20et%20d’obtenir%20le%20status%20des%20boutons.%0A%09if%20(m_btns.OnClick()%20%26%26%20!m_isAlight)%20%2F%2F%20Proc%C3%A9dure%20d’allumage%20synchrone%0A%09%09FadeInLed()%3B%0A%09%2F*%20%0A%09Ci%20dessous%20Bloc%20de%20code%20qui%20permet%20la%20gestion%20asynchone%20de%20l’extinction%20de%20la%20rampe.%0A%09Cela%20nous%20permet%20de%20pouvoir%20g%C3%A9rer%20simultan%C3%A9ment%20l’extinction%20et%20la%20d%C3%A9tection%20d’un%0A%09%C3%A9v%C3%A9nement%20sur%20le%20bouton.%20Celui%20%C3%A7i%20interrompant%20le%20processus%20d’arr%C3%AAt%20pour%20rallumer%20la%20rampe.%0A%09*%2F%0A%09if%20(m_btns.OnClick()%20%26%26%20m_isAlight)%20%20%2F%2F%20Proc%C3%A9dure%20pour%20%C3%A9teindre%20la%20rampe%20lancement%0A%09%7B%09%09%0A%09%09Serial.println(%22On%20%C3%A9teind%20la%20rampe%20de%20led.%22)%3B%0A%09%09m_fadeOutIntensity%20%3D%20255%3B%0A%09%09FadeOut()%3B%0A%09%09m_btns.Release()%3B%09%09%09%09%20%2F%2F%20Je%20force%20la%20remise%20%C3%A0%20zero%20du%20statut%20ici.%0A%09%7D%0A%09%2F%2F%20D%C3%A9roulement%20de%20la%20proc%C3%A9dure%20d’extinction.%0A%09if%20(m_fadeOutIntensity%20!%3D%200%20%26%26%20(millis()%20-%20m_diffTimeFade%20%3E%20m_delayToLessIntesity))%0A%09%7B%0A%09%09FadeOut()%3B%0A%09%7D%0A%09%2F%2F%20D%C3%A9tection%20de%20l’%C3%A9v%C3%A9nement%20sur%20le%20bouton.%0A%09if%20(m_btns.OnPress())%0A%09%7B%0A%09%09FadeInLed()%3B%0A%09%7D%0A%7D » message= »loop » highlight= » » provider= »manual »/]

a. Source à télécharger

BandeauLedBouton.ino

7. Résultat

en image

Démo vidéo

8. Conclusion

En conclusion, voilà une bonne petite étape de franchi. Il va falloir maintenant incorporer les capteurs PIR pour le prochain tutoriel et remplacer le bouton.

D’un point de vue algo, c’était intéressant aussi puisque nous avons pu voir dans ce programme les deux cas de gestion synchrone et asynchrone d’une tâche dans le temps. Evidemment la version synchrone avec une boucle est connu de tous, mais la version asynchrone, bien que plus complexe, nous ouvre un champs de possibilité. N’oubliez jamais cette possibilité pour éviter des temps de latence dans vos programmes lorsque ceci gère plusieurs capteurs, paramètres, …

Étiquettes : , , , ,

4 commentaires sur “Pilotage d’une rampe de led”

  1. Bonjour Sébastien,
    Avant toute chose, je vous félicite pour votre Site traitant des possibilités d’Arduino.
    Je suis à la recherche d’un petit programme me permettant de démarrer progressivement le moteur A.C de mon portail coulissant (avec interface, moc et triac), ensuite un palier de pleine vitesse, et pour finir un arrêt progressif ( Ces 3 étapes s’exécutantes, pour chacune d’entre elle dans des délais de 0 à 6 secondes environ )
    Donc à ce sujet, j’ai lu votre article très intéressant ( ci-dessus) traitant de l’allumage et de l’extinction progressifs d’une rampe de Leds.
    Pourriez-vous me dire si ce programme conviendrait à ma recherche ?
    D’ avance, je vous remercie.

    Très cordialement,
    Jean-Clément

    Pour info:
    – Je suis un ancien électricien (en télécom et EnR ) à la retraite, mais novice en programmation Arduino.
    – Je possède une carte Nano et je me connecte ( pour l’instant ! ) juste à l’interface Arduino 1.8.9,  c’est tout ….. Lol

  2. Bonsoir Jean Clément, tout d’abord, je vous remercie et je me suis permis d’éditer votre post pour retirer vos coordonnées.

    En effet, je pense que dans le programme, vous pourriez reprendre la partie fadein fadeout, qui permet cette progressivité dans une durée données.

    Evidemment l’ensemble du programme serait à adapter à votre problématique. Vous pouvez si vous voulez le réaliser et me l’envoyer avec votre cahier des charges afin que je le vérifie d’un point de vue algorithmie.

    Cordialement,
    Sébastien.

  3. bonjour,

    je souhaiterai savoir si avec ce genre d’installation il est possible de programmer un éclairage progressif pour un escalier. Par progressif, j’entends une marche après l’autre.

    Pourriez vous me joindre sur mon adresse mail que j’ai indiqué plus bas ?

     

    merci d’avance,

     

    Cordialement

    1. C’est tout à fait possible mais il faut rendre indépendant chaque section d’alimentation et programmer la séquence.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Related Post