Guirlande

 druide

Bon, c'est bientôt Noël. Je décide de remettre en route le sapin de Noël avec sa guirlande lumineuse.
Mes enfants font la déco du sapin, je place la guirlande, je branche et... et... hé ben rien. Pas la moindre petite lumière.

Diagnostic

J'ouvre la boîte plastique contenant l'électronique de la guirlande...

Quelques jurons plus tard, j'examine le contenu. Alimentation 24V, puce noyée sous une goutte noire, 4 "tyristors" ???.
Si on ponte le canal des tyristors (Anode-Cathode), les LEDs s'allument. Le circuit est bien alimenté mais aucun signal de commande sur les Gates. Visiblement, le circuit de commande est mort.

Décision

Je vais remplacer le circuit d'origine par un microcontrôleur et mettre en place un étage de puissance pour commander les 4 rangées de LEDs.

Ingrédiants

En fouillant un peu dans une boîte d'électronique que j'ai à la maison, je trouve tout le nécessaire, à savoir

  1. Une carte diduino
  2. Un L293DN
  3. Une alimentation 24VDC


En plus des LEDs de la guirlande originale...

Un schéma

Je trouve le datasheet du L293DN. 4 étages de puissance commandés en entrée par des niveaux logiques, séparation des deux alimentations en interne (24VDC et le 5VDC), protection contre les surchauffes.

Parfait! Reste plus qu'à câbler.

  1. Vcc correspond au 5V de la carte Diduino
  2. VERTES/BLEUES/ORANGES/ROUGES sont les sorties sur les rangées de LED de la guirlande originale
  3. 24Vcc correspond au bloc d'alimentation externe de 24VDC
  4. ATTENTION A NE PAS OUBLIER DE CONNECTER LES DEUX GND ENSEMBLES, A SAVOIR LE GND DE LA CARTE DIDUINO ET LE GND DE L'ALIMENTATION EXTERNE





    Le code

    Reste plus qu'à coder les effets souhaités. Maintenant, l'avantage c'est qu'on est maître des effets! Voici un code fait rapidement (10') donc pas forcément top mais fonctionnel :)

    /* Définition des ports */
    #define EN12 12
    #define EN34 13
    #define ENRB EN12
    #define ENBJ EN34
    #define BLEU 11 // Entrée 2A
    #define ROUGE 10 // Entrée 1A
    #define VERT 9 // Entrée 3A
    #define ORANGE 8 // Entrée 4A

    unsigned long time;
    unsigned long delta = 60000;
    int effect = 0;
    unsigned long dt = 0;

    void dw(int io, int v) {
    digitalWrite(io, v);
    }

    // the setup routine runs once when you press reset:
    void setup() {
    // initialize the digital pin as an output.
    pinMode(EN12, OUTPUT);
    pinMode(EN34, OUTPUT);
    pinMode(BLEU, OUTPUT);
    pinMode(ROUGE, OUTPUT);
    pinMode(VERT, OUTPUT);
    pinMode(ORANGE, OUTPUT);

    dw(EN12, HIGH);
    dw(EN34, HIGH);
    dw(BLEU, HIGH);
    dw(ROUGE, HIGH);
    dw(VERT, HIGH);
    dw(ORANGE, HIGH);
    dw(ENRB, HIGH);
    dw(ENBJ, HIGH);

    time = millis();
    }

    void loop() {

    if(millis() > (time + delta)) {

    time = millis();
    effect++;

    if(effect > 3) effect = 0;

    }

    switch(effect) {
    case 0:
    delta = 6000;
    dw(ROUGE, LOW);
    delay(1000);
    dw(ROUGE, HIGH);
    dw(BLEU, LOW);
    delay(1000);
    dw(BLEU, HIGH);
    dw(VERT, LOW);
    delay(1000);
    dw(VERT, HIGH);
    dw(ORANGE, LOW);
    delay(1000);
    dw(ORANGE, HIGH);
    break;
    case 1:
    delta = 6000;
    dw(ROUGE, LOW);
    delay(100);
    dw(ROUGE, HIGH);
    dw(BLEU, LOW);
    delay(100);
    dw(BLEU, HIGH);
    dw(VERT, LOW);
    delay(100);
    dw(VERT, HIGH);
    dw(ORANGE, LOW);
    delay(100);
    dw(ORANGE, HIGH);
    break;
    case 2:
    delta = 3000;
    dw(ROUGE, HIGH);
    delay(500);
    dw(ROUGE, LOW);
    dw(BLEU, HIGH);
    delay(500);
    dw(BLEU, LOW);
    dw(VERT, HIGH);
    delay(500);
    dw(VERT, LOW);
    dw(ORANGE, HIGH);
    delay(500);
    dw(ORANGE, LOW);
    break;
    case 3:
    delta = 3000;
    dt = millis();

    while(millis() < (dt + 1000)) {

    dw(ROUGE, LOW);
    delay(100);
    dw(ROUGE, HIGH);
    delay(100);
    }
    dt = millis();

    while(millis() < (dt + 1000)) {

    dw(BLEU, LOW);
    delay(100);
    dw(BLEU, HIGH);
    delay(100);
    }
    dt = millis();

    while(millis() < (dt + 1000)) {

    dw(VERT, LOW);
    delay(100);
    dw(VERT, HIGH);
    delay(100);
    }
    dt = millis();

    while(millis() < (dt + 1000)) {

    dw(ORANGE, LOW);
    delay(100);
    dw(ORANGE, HIGH);
    delay(100);
    }
    break;
    default:break;
    }
    }


    Voilà la vidéo montrant le résultat

    Vidéo youtube That's all folks

    Tags: Diduino Noël

    • 8 years 1 month before
    • |