Introduction :
Récemment, j’ai eu l’idée de faire un genre de cube lumineux basé sur des LEDs. Je venais de découvrir les matrices de LEDs qui permettent d’afficher des formes simples et qui sont en réalités présentes un peu partout. J’ai aussi vu passer un certain nombre de sculptures avec des LEDs un peu partout, ce qui m’a donnée envie de faire ma propre.
C’est la première fois que je me lance dans un projet de ce type donc j’ai choisi de partir sur un cube de petite taille, c’est-à-dire 3*3*3.
Présentation générale
Composants/matériel
- 27 LEDs
- des résistances de 220 Ω
- des transistors
- des câbles
- un Arduino
- un fer à souder avec de l’étain
Schéma de câblage
Tous les schémas sont disponibles librement ici. Pour les ouvrir il faut télécharger le logiciel Fritzing.
Conception
Le cube
Avant de faire le câblage ou le code, il faut commencer par faire la « sculpture », le cube. Pour cela, pas le choix, il faut souder !
Je n’ai jamais imaginé à quel point c’était difficile de souder sans platine et en 3D. Pour m’aider j’ai choisi de me préparer un genre de moule en carton pour mieux disposer les LEDs. Il permet également d’égaliser la distance entre toutes les LEDs et sur tous les étages du cube.
Les étages
Pour le faire j’ai dessiné un tableau sur un bout de carton et j’ai percé des trous que j’ai agrandis au diamètre des LEDs.
Ensuite on peut disposer les LEDs, mais ajoutez en qu’une à la fois, vous verrez que c’est moins encombrant pour souder.
Pour chaque LED il faudra replier la cathode, la broche négative, la plus courte avec une pince à 90° environ et vers une autre LED.
Ensuite vous pouvez ajouter la LED d’à côté et souder leur cathode entre elles. Il faut qu’à la fin, les cathodes de toutes les LEDs soient reliées entre elles. Vous pouvez répéter ce procédé jusqu’à remplir tout l’étage.
Quand vous les souder veillez bien que l’étain se relie pas les anodes aux cathodes.
Vous pouvez ensuite retirer les LEDs du carton. Les soudures permettent de tenir les LEDs entre elles, mais la structure n’est pas si solide. Vous devriez obtenir quelque chose comme ça
Ensuite vous pouvez répéter le processus 3 fois pour les 3 étages du cube de LEDs.
L’assemblage des étages
Maintenant qu’on a nos trois parties, essayons de les empiler. Je pensais cette action plutôt simple, mais ce n’est pas le cas.. Essayer de caler un bout de bois entre les deux étages. Puis essayer de souder les deux parties qui sont verticales entre elles (le +) et veillez toujours à ne pas relier au -.
La partie la plus délicate est d’assembler ces trois étages pour former le véritable cube de LEDs. Pour cela je n’ai malheureusement trouvé de solution miracle, si ce n’est d’utiliser des cales en bois et des pinces pour tenir les étages le temps de la soudure.
Répétez cette action une deuxième fois pour assembler le dernier étage. Ensuite, il faut souder entre elles toutes les anodes en colonne.
L’électronique
Branchement des colonnes
Maintenant le cube LEDs réalisé, il faut trouver un moyen de le connecter à l’Arduino. Pour cela nous pouvons commencer par le souder à une platine. J’ai récupéré une vieille platine avec un espacement de 17 trous au total.
Après ça il faut ajouter des résistances de 220 Ω pour chaque colonne. Reliez chaque colonne d’anodes à une résistance.
Après ça j’ai essayé de tous les relier à une broche qui pourra facilement se fixer à un Arduino, pour former directement un cluster qui se fixe sur l’Arduino.
Une fois le tout soudé et attaché vous pouvez essayer de le brancher à une breadboard ou un Arduino pour vérifier l’écartement.
Maintenant, avant de finir le cube, il est important de tester si tout est bien branché/soudé. Pour cela vous pouvez brancher une alimentation comme une pile avec la broche négative sur les cathodes d’un étage et l’anode sur une des broches du bas. Vous pourrez ainsi allumer individuellement les 27 LEDs.
Branchement des étages
Avec l’exemple précédent, vous comprenez qu’il faut relier les étages de cathodes à l’Arduino. Mais si on les relie tous entre eux et qu’on met au port GND de l’Arduino on ne pourra plus allumer individuellement chaque LED, seulement les colonnes.
Pour cela j’ai opté pour des transistors. Au nombre de 3, ils s’occupent chacun d’un étage. Ils sont tous reliés au GND et vont laisser passer le courant quand l’Arduino leur donnera une impulsion. Ils jouent en quelque sorte le rôle d’interrupteurs contrôlés non pas par un homme, mais par l’Arduino.
Voici le schéma électrique des transistors :
De la même façon que précédemment, vous pouvez ajouter des broches pour les relier à l’Arduino.
Branchement général
Voici le schéma complet de câblage, bien entendu les étages correspondent aux cathodes des LEDs des différents étages.
Pour un confort de lecture et une meilleure compréhension des schémas électroniques, téléchargez Fritzing puis les schémas. Et faites ouvrir avec Fritzing.
Code
Il reste la partie théorique, le code en C++ de l’Arduino. Comme vous avez pu le voir, nous jouons sur une petite astuce pour éviter d’utiliser plus de 27 ports sur l’Arduino. En réalité on a 12 ports :
- 3 ports reliés aux transistors qui s’occupent des cathodes
- 9 ports reliés aux résistances qui s’occupent des anodes
Donc pour allumer une LED il faut qu’elle forme localement un circuit fermé, qu’à la fois la colonne soit activée par un des 9 ports et qu’à la fois l’étage soit activée par un des 3 ports.
En réalité on ne va pas allumer les LEDs, on va les faire clignoter. Mais elles vont clignoter tellement vite qu’on aura l’impression qu’elles sont allumés (principe de beaucoup de lampes en utilisant un courant alternatif). J’ai fait des tests et l’Arduino peut faire clignoter une LED jusqu’à 5000 fois en une seconde.
Je vous propose donc un code d’exemple qui utilise ce principe et les ports utilisés dans le schéma de cablage précédent.
//Cube LED 3*3 //valentin cassayre boolean leds[3][3][3]; long i = 0; long lastMillis = 0; int rnd = 0; void setup() { for(int k = 0; k < 12; k++) { pinMode(k + 2, OUTPUT); } } void loop() { long m = millis() / 50; if(m != lastMillis) { lastMillis = m; rnd = micros() % 27; int t = t+1; } leds[rnd % 3][(rnd / 3) % 3][rnd / 9] = true; for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) for(int k = 0; k < 3; k++) leds[i][j][k] = true; // ============= i = (i + 1) % 27; const long x = i % 3; const long y = (i / 3) % 3; const long z = i / 9; boolean is_on = leds[x][y][z]; write_leds(is_on, x, y, z); } void write_leds(boolean on, int x, int y, int z) { for(int k = 0; k < 12; k++) { digitalWrite(k + 2, LOW); } const int k = x + y * 3; digitalWrite(13 - z, on ? HIGH : LOW); digitalWrite(2 + k, on ? HIGH : LOW); }