Bien sûr, il ne faut pas que ça coute trop cher, que ce soit ludique et pédagogique, donc DIY à fond.
J'ai commandé :
- un bandeau de LED WS2812 (sur AliExpress) en non-étanche (normalement c'est fini les bêtises avec les poissons à pêcher) avec une densité de 30 LED/m sur fond noir
- Un Arduino Uno (enfin l'équivalent sinisé)
- une planche de bois format A3 (environ)
- une capa 100 uF- une alimentation stable 5V 4A
Et mes outils préférés :
- un fer à souder + étain
- crayon gomme équerre
- fil monobrin
Je suis parti d'un tuto en ligne assez bien fait, même s'il est dans la langue de Goethe : https://www.youtube.com/watch?v=UVISnxXh_VY
Et d'un autre qui m'a donné l'idée des gros chiffres : https://www.youtube.com/watch?v=LojGHyBFE8Q
Ouverture du colis |
Premier test rapide du bandeau de LED, sans utiliser la protection de la capa. J'ai pour ça découpé mon bandeau pour ne garder que 4 LED.
Sur l'IDE Arduino, il suffit de télécharger la librairie NeoPixel d'Adafruit et de tester le programme de base "sample". Le bandeau de LED sera branché comme suit :
- le fil rouge sur le bouton rouge... euh.. sur le 5V
- le fil blanc sur la masse
- le fil vert sur D6
La prise en main est super rapide, il y a deux paramètres à régler dans le programme, la pin utilisée (j'ai gardé la D6) et le nombre de LED, que j'ai changé pour mettre 4
// Which pin on the Arduino is connected to the NeoPixels?#define PIN 6// How many NeoPixels are attached to the Arduino?#define NUMPIXELS 4
Ensuite, l'allumage d'une LED se fait en utilisant la méthode setPixelColor(numéro de LED, couleur), puis la méthode show() de la classe AdaFruit_NeoPixel
pixels.setPixelColor(num, pixels.Color(0,150,0));pixels.show();
La méthode Color() prend 3 paramètres, la valeur de rouge (0->255), de vert (0->255) et de bleu (0->255). Pour éteindre la LED, il faudra donc lui imposer Color(0,0,0) et faire un show()
Je me suis même amusé à faire un programme de couleur aléatoire sur les 4 LED avec un délai de 200ms entre chaque... Un peu psychédélique, mais ça le fait :-)
Revenons donc au minuteur.
Le principe électronique sera le suivant (excusez l'utilisation de powerpoint comme logiciel de conception électronique, mais chez nous on fait plutôt du Lego)
On part sur deux chiffres car le décompte sera de 90s.
Chaque chiffre en vert correspond à un digit (une bande de 4 LED) dans l'ordre vu par l'arduino, chaque chiffre en noir correspond au numéro de la LED à allumer.
Le GO sera le lanceur du minuteur, donc un simple bouton poussoir
On voit qu'on a 56 LED qui consomme chacune jusqu'à 60mA (allumage à fond), donc il faut une alimentation pouvant générer 56x60 = 3360 mA + conso de l'Arduino, donc 4A pour être large.
Ceci étant défini, il faut tracer le schéma sur la planche en bois. Chaque chiffre fera environ 15x30cm, ce qui devrait être suffisant pour être vu d'assez loin
Dessin sur la planche |
Le même avec l'échelle des distances |
Ensuite, il y a une opération de collage des bandeaux de 4 LED. Il faut juste être vigilent de bien respecter le sens les flèches sur les LED. En effet, le protocole unifilaire est le suivant :
- Une trame contenant toutes les infos est envoyée par l'Arduino sur le fil.
- Chaque LED (enfin c'est pas la LED mais la pupuce WS2812) contient une entrée pour recevoir les data (DIN) et une sortie pour les envoyer (DOUT)
- La première LED reçoit la trame, prend le premier bloc de couleur et renvoie le reste de la trame à la LED suivante.
- On continue jusqu'au bout de la trame.
Chaque bandeau de 4 LED doit ensuite lié au suivant :
La masse sur la masse
Le +5V sur le +5V
Le DOUT de la dernière LED sur le DIN de la sauivante
Pour relier, j'ai opté pour du câble monobrin, ce qui permet d'éviter les petits brins qui causeraient avec le point de soudure à côté... et qui mettrait le brun. En plus c'est bien plus simple à dénuder et découper
Voilà le résultat en vidéo du montage :
Ensuite le programme Arduino
J'ai défini 3 couleurs.
coul_on : du blanc pas trop puissant pour pouvoir garder juste l'Arduino pour alim
coul_red : un rouge pour la fin du compteur
coul_off : pour éteindre les LED
La pin 7 permet de lancer le compteur lorsqu'il est mis à la masse (le bouton du chrono quoi!)
Les chiffres sont allumés en blanc, le 0 en rouge pendant 5 secondes, puis tout est éteint.
La fonction Affiche(num, coul) porte bien son nom... elle allume les LED avec la couleur souhaitée pour former le nombre souhaité.
Chaque chiffre est décrit par sa correspondance binaire (dans l'ordre des digits) dans le tableau chiffres[], cela permet d'optimiser un peu le code. Les bits 1 sont allumés à la couleur voulue et les autres à coul_off (donc éteints)
#include <Adafruit_NeoPixel.h>// Which pin on the Arduino is connected to the NeoPixels?#define PIN_PIXELS 6// How many NeoPixels are attached to the Arduino?#define NUMPIXELS 56// how many pixels per branch of the digits#define NUM_PIX_PER_BRANCH 4// the pin for launching counter#define PIN_LAUNCH 7// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest// example for more information on possible values.Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800);// colors defined for lignhtened (or not) pixelsuint32_t coul_on = pixels.Color(30,30,30);uint32_t coul_red = pixels.Color(30,0,0);uint32_t coul_off = pixels.Color(0,0,0);int chiffres[10] = {0x77,0x44,0x3E,0x6E,0x4D,0x6B,0x7B,0x46,0x7F,0x6F};int go_counter=0;int val_counter = 90; // number of secondsvoid setup() {// put your setup code here, to run once:pixels.begin(); // This initializes the NeoPixel library.pinMode(PIN_LAUNCH,INPUT_PULLUP); // input is set as pullup to avoid having three wiresAffiche(0,coul_off); // turn off the leds}void loop() {// put your main code here, to run repeatedly:if (digitalRead(PIN_LAUNCH)== LOW) // button pressedgo_counter = 1; // used as a RSFlipFlopif (go_counter){if (val_counter > 0)Affiche(val_counter,coul_on); // showing the numberelse if (val_counter > -5)Affiche(0,coul_red); // during funny actionelseAffiche(0,coul_off); // after funny action, everything is offval_counter--; // minus 1sdelay(1000);// if no RTC, the delay must be calibrated to keep real timing}}void Affiche(int number,uint32_t color ){uint32_t col; //color, on or offif (number > 99)return; // no lighting over 99byte n_diz = number/10;byte n_uni = number % 10;for (int i=0;i<7;i++) // each digit{// first dozensif ((1<<i) & chiffres[n_diz])col = color;elsecol = coul_off;for (int j=0;j<NUM_PIX_PER_BRANCH;j++){pixels.setPixelColor(i*NUM_PIX_PER_BRANCH+j,col);}// then unitsif ((1<<i) & chiffres[n_uni])col = color;elsecol = coul_off;for (int j=0;j<NUM_PIX_PER_BRANCH;j++){pixels.setPixelColor(7*NUM_PIX_PER_BRANCH + i*NUM_PIX_PER_BRANCH+j,col);}}pixels.show();}
Le résultat en vidéo (j'ai débuté le compteur à 10s, ça suffit pour la démo)
Les améliorations à apporter :
- Rajouter le condo 100 uF pour pouvoir utiliser une alim externe et protéger les LED quand on allumera à fond
- remplacer l'arduino Uno par un Arduino min pro, plus compact et largement suffisant.
- Couvrir d'une plaque de plastique dépoli pour diffuser les lumières des LED
- peindre le fond en noir pour mieux faire ressortir les lumières
- Calibrer la valeur du Delay pour avoir 90s exactement
- Rajouter un câble long pour lancer le minuteur à distance (comme l'arbitre le fera).
Super !
RépondreSupprimerAutre amelioration: Ajouter a la fin des 90s le decompte de 5s pour la Funny action ??
J'abuse: ajouter un decompte vocal (buzzer) partir de 5s avant la fin
Merci Bernard :-)
SupprimerC'est un premier jet, une fois que le montage est fait, on peut changer le soft pour mettre d'autres couleurs, rajouter le décompte de funny action.
En revanche pour le buzzer, j'ai peur que ça ne serve à rien lors des compétitions à cause de l'environnement bruyant... ou alors il faut brancher une corne de brume :-)