Guirlande
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.
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.
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.
En fouillant un peu dans une boîte d'électronique que j'ai à la maison, je trouve tout le nécessaire, à savoir
- Une carte diduino
- Un L293DN
- Une alimentation 24VDC
En plus des LEDs de la guirlande originale...
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.
- Vcc correspond au 5V de la carte Diduino
- VERTES/BLEUES/ORANGES/ROUGES sont les sorties sur les rangées de LED de la guirlande originale
- 24Vcc correspond au bloc d'alimentation externe de 24VDC
- 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 */
if(millis() > (time + delta)) {
#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() {
time = millis();
if(effect > 3) effect = 0;
effect++;
}
while(millis() < (dt + 1000)) {
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();
dw(ROUGE, LOW);
while(millis() < (dt + 1000)) {
delay(100);
dw(ROUGE, HIGH);
delay(100);
}
dt = millis();
dw(BLEU, LOW);
while(millis() < (dt + 1000)) {
delay(100);
dw(BLEU, HIGH);
delay(100);
}
dt = millis();
dw(VERT, LOW);
while(millis() < (dt + 1000)) {
delay(100);
dw(VERT, HIGH);
delay(100);
}
dt = millis();
dw(ORANGE, LOW);
delay(100);
dw(ORANGE, HIGH);
delay(100);
}
break;
default:break;
}
}
Vidéo youtube That's all folks
Voilà la vidéo montrant le résultat
Tags: Diduino Noël