Télécommande pour ruban de LEDs

J’ai placé deux rubans de LEDs  au dessus de mon espace de travail, un qui émet une lumière froide, l’autre chaude. Je cherchais un moyen de commander individuellement ces rubans. J’avais également à disposition une télécommande infrarouge avec deux boutons (ON/OFF) que j’avais eu avec une bougie à LED, exactement ce qu’il me fallait pour commander mes rubans!

C’est partit!

Collecte des données existantes

Les deux rubans sont alimentés en 12v par un transformateur 230VAC/12VDC qui peut fournir un courant de 5A max.

J’ai mesuré le courant consommé par chacun des rubans: 1.02A pour le ruban de LEDs froide, 0.91A pour celui avec les LEDs chaude, soit un total de 1,92A.

Après quelques recherches sur le net, il apparaît que la télécommande dont je dispose émet à une fréquence de 38KHz, fréquence on ne peut plus commune.

telecommande

Schéma électrique

shema_telecommande_ruban_led

Choix des composants

Le microcontrôleur

Comme à mon habitude, je travaille avec les microcontrôleurs AVR d’Atmel (récemment acquis par Microchip, fabriquant des célèbres PICs). Ils sont facile à appréhender pour les débutants comme moi et surtout, ils se programment facilement avec l’environnement Arduino.

Mon choix s’est porté sur l’Attiny 85, un microcontrôleur 8-bits  à 8 pattes que l’on trouve sur le net pour environ 1€. Malgré sa petite taille, il est doté de caractéristiques intéressantes:

  • Tension d’alimentation de 2,7 à 5,5 V
  • Courant max par broche: 40 mA, courant total max de 200 mA
  • Fréquence de 1 à 16 Mhz avec l’oscillateur interne, jusqu’à 20 MHz avec un externe.
  • 8 Kb de mémoire Flash, 512 bytes de RAM, 512 bytes d’EEPROM.
  • 6 entrées/sorties digitales, 2 supportent la PWM.
  • 4 entrées analogiques avec un ADC de 10 bits (3 utilisables avec Arduino).
52713d5b757b7fc0658b4567
Pinout de l’Attiny85

Je ne décrirai par contre pas comment les utiliser avec l’IDE Arduino, ni la manière de les programmer. Il existe d’excellents articles à ce niveau là et je vous renvoie donc vers eux:

Retenez par contre que les libraires qui fonctionnent pour l’Arduino UNO ne sont pas toutes supportées par l’Attiny85 (Ex: la librairie Serial) mais des versions adaptées existent. Votre moteur de recherche préféré sera votre meilleur allié.

Le récepteur infrarouge

tsop48

Concernant le choix du récepteur infrarouge, j’ai utilisé un TSOP4838 de chez Vishay qui est prévu pour fonctionner avec une fréquence de modulation de 38 KHz. Toutes les télécommandes infrarouges ne fonctionne pas à cette fréquence, il est donc nécessaire de choisir le récepteur adéquat.

Retenez également qu’il existe une multitude de protocoles infrarouges:

  • NEC
  • Sony
  • RC5/RC6
  • Samsung
  • ….

Leur fonctionnement est plutôt simple mais un peu fastidieux à mettre en place, d’autant plus que je n’ai pas d’oscilloscope numérique (plus pour longtemps). Heureusement, il existe de bonnes librairies qui se chargeront de le faire pour vous 😉

Pour en savoir plus sur le fonctionnement de la télécommande infrarouge et son utilisation avec l’Arduino:

Les MOSFETs

irf7304-pinout

J’ai pris des IRF7304 de chez International Rectifier (racheté par Infineon). Ce sont deux MOSFETs à canal P dans un boîtier SOIC8, bien pratique car prennent peu de place sur un PCB. Il supporte une tension Vdsmax de -20V, un  Idss max de -2.5 A et un Rds(on) de 0,09Ω avec Vgs =-4.5V .

J’étais un peu inquiet par rapport à la puissance dissipée par ce si petit boiter. Le fabriquant dit que le boitier supporte facilement des puissance de plus de 0.8W. J’ai donc pris ma calculette. Pour calculer la puissance dissipée par un MOSFET, on applique la formule suivante: Pd = Rds * Id², en n’oubliant pas qu’il y en a deux par boiter.

Cela donne donc:

Pd1 = 0,09 * 1.02 = 0.094W
Pd2 = 0.09 * 0.92² = 0,075W

Pdt = 0.094 + 0.075 = 0.169W

On est on ne peut plus dans la tranche garantie par le fabriquant, mes craintes se sont dissipées si je puis dire :-D.

Une simple résistance de pull-down de 10KΩ entre la ligne  commande et la masse suffit à piloter le MOSFET.

Les diodes de roue libre

Diodes S1A de chez Vishay. Bien qu’elles ne soient pas nécessaire dans ce projet, j’ai réservé leurs emplacements sur le PCB pour une éventuelle utilisation de la carte avec des bobines (moteurs, relais,…).

Le reste des composants

Rien de bien spécial. Des borniers pour raccorder l’alimentation et la sortie des LEDs, un régulateur de tension L78M05 et ses condensateurs de découplage de 330nF et 100nF, un condensateur de découplage de 100nF pour le microcontrôleur et des résistances de pull-down de 10KΩ.

Principe de fonctionnement

diagramme_commande_ruban_led

Le principe de fonctionnement est plutôt simple. Le récepteur infrarouge reçoit le signal de la télécommande, le microcontrôleur le décode et commande les MOSFETs à l’aide de transistors qui se chargeront d’allumer ou éteindre le ou les rubans correspondants.

Le bouton ON de la télécommande sélectionne la source à activer. Lorsqu’on alimente le circuit, les deux sorties sont à OFF.

OUT1 OUT2
 1er appui ON OFF
 2ème appui OFF ON
 3ème appui ON ON
 4ème appui OFF OFF

Ce cycle se répète à l’infini.

Le bouton OFF gère l’intensité grâce à la PWM. Le nombre de pas  est défini dans le code source. Chaque appui diminue d’un pas. Arrivé au minimum, l’intensité est à nouveaux maximale et le cycle recommence.

Le code source

Voici le code source, libre à vous de le modifier:

/* 
  Télécommande pour rubans de leds V 1.0
  https://roysone.wordpress.com

  Permet de gérer deux rubans de LEDs à l'aide d'une télécommande infrarouge
  !! ATTENTION !! Ce code ne fonctionne qu'avec un Attiny85.

  Voici les codes des boutons de la télécommande. 
  Pour les récupérer, j'ai suivi le tuto suivant:
  https://learn.adafruit.com/using-an-infrared-library/hardware-needed

   IR Code ON: 1FE58A7
   IR Code OFF: 1FEA05F
*/
// Inclustion des libraires
#include 
#include 

// Définition des constantes
#define BTN_ON 0x1FE58A7
#define BTN_OFF 0x1FEA05F

#define PIN_OUT_1 0
#define PIN_OUT_2 1
#define ON 0
#define OFF 255
#define NB_PWM_STEPS 11

// Définition des variables
byte ct_out = 0;
byte ct_pwm =0;
byte etat_out_1 =OFF;
byte etat_out_2 =OFF;

// Création des objets nécessaire 
// pour le décodage des signaux infrarouge
IRrecv RecepteurIR(2);
decode_results DecodeurIR;

/****** Setup ******/
void setup() 
  {
  // On définit les pins en mode sortie
  pinMode(PIN_OUT_1, OUTPUT);
  pinMode(PIN_OUT_2, OUTPUT);
  
  // On définit les sorties à 0
  analogWrite(PIN_OUT_1, OFF);
  analogWrite(PIN_OUT_2, OFF);
  
  //On active le récepteur IR
  RecepteurIR.enableIRIn();
  }


/****** Loop ******/
void loop()
{
// On détecte un signal infrarouge
if (RecepteurIR.decode(&DecodeurIR))
    {
      // Si on a appuyé sur le bouton ON, 
      // on sélectionne la ou les sorties à activer
      if (DecodeurIR.value == BTN_ON)
          {
            
          // On incrémente le compteur et en fonction 
          // de sa valeur, on sélectionne la ou les sortie(s) à activer
          ct_out++;
          ct_pwm =0;
          
          if (ct_out==1)
            {
            etat_out_1 =ON;
            etat_out_2 =OFF;
            }

          if (ct_out==2)
            {
            etat_out_1 =OFF;
            etat_out_2 =ON;
            }
          if (ct_out==3)
            {
            etat_out_1 =ON;
            etat_out_2 =ON;
            }
          if (ct_out==4)
            {
            etat_out_1 =OFF;
            etat_out_2 =OFF;
            ct_out =0;
            }
          }

      // Si on appuyé sur le bouton OFF, on gère la PWM
      if (DecodeurIR.value == BTN_OFF)
        {
        ct_pwm++;
        
        if(ct_pwm == NB_PWM_STEPS)
          {
            ct_pwm =0;
            if(etat_out_1 > 0)etat_out_1 =ON;
            if(etat_out_2 > 0)etat_out_2 =ON; 
          }

        else
          {
          if (etat_out_1 > 0)etat_out_1-=(256/NB_PWM_STEPS);
          if (etat_out_2 > 0)etat_out_2-=(256/NB_PWM_STEPS);
          }   
       }

    // On applique aux sorties les valeurs choisies ci-dessus
    analogWrite(PIN_OUT_1, etat_out_1);
    analogWrite(PIN_OUT_2, etat_out_2);

    // On rend la main au récepteur infrarouge
    RecepteurIR.resume();
    }
}

Le PCB

J’ai désigné un PCB à l’aide d’Eagle que je fais fabriquer par l’excellent site dirtypcbs.com. Pour 25$, livraison incluse, on peut se faire faire 10 PCBs de qualité professionnelle: 2 couches, couleur au choix, 10cmx10cm max. Pas mal!

Voici à quoi cela devrait ressembler:

top

Vous noterez que le capteur n’est pas sur la plaque et qu’il y a 4 sorties. Vu qu’il est impossible d’en recevoir moins de 10, autant les rendre les plus universels possible afin de les réutiliser pour un max de projets.

Dès que je les reçoit, je vous ferai une démo du montage.

Si vous avez des questions, n’hésitez-pas à me contacter.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s