[Conseil] LED CUBE et démultiplexage

Bonjour, bonjour, tout le monde !

Alors tout d'abord, une petite présentation rapide : je suis élève en Terminale SI et pour ce qui est de l'électricité et l'électronique, je n'ai que la base qui m'a été donné par la SI (ce qui est assez limité mais bon...)
L'électronique me passionne depuis assez longtemps et je me suis dit qu'il fallait que je me lance sur quelque chose de concret, qui pourrait m'être utile pour la suite de mes études (peut-être ingénieur informaticien, si je suis pris dans le cursus Polytech' XD). Alors après un petit tour sur le net, et un tour d'horizon de tout ce qui se faisait, les projets concernant des LED CUBE m'ont paru être assez sympa pour un commencement, cependant cette idée est très vite devenu un peu plus qu'un commencement. Et après avoir regardé deux trois tutoriels, l'apparition récurrente du mot "ARDUINO" m'a agressé l’œil ! Et grâce à cela j'ai pu découvrir ces belles plateformes que sont les cartes Arduino, et a pu agrandir mon champs de vision anciennement limité au microcontrôleur "ECIO40" et les PIC utilisés en cours (aussi les automates programmable, mais ça on n'en parle pas, surtout quand un seul m'a fais perdre 4h de mon temps de projet personnel encadré, juste parce qu'il été foutu....(TSX17 - RIP =()).

Alors mon projet, comme beaucoup d'entre vous je pense l'ont déjà réalisé, est de faire un LED CUBE de 888.
Je sais bien sur qu'avec mes connaissances actuelles, beaucoup de choses m'échappent, et je peux dire que ce projet est plus un objectif qu'un projet à proprement parler.
Alors j'ai pu voir comment fonctionnait le système avec la séparation en lignes et en colonnes de LED, ainsi que l'impossibilité de mettre 64 sorties sur un Arduino (Uno, que vais commander ce week-end) et donc que pour assurer la commande des 64 colonnes, je devait faire un système de démultiplexage, et là commencent mes questions.

Après avoir vu le nom de démultiplexeur et mon inconnaissance royal, je me suis rué vers internet et j'ai commencé à trifouiller. Après une petite heure, le principe de fonctionnement du démultiplexeur est dans ma tête, deux trois schéma grattés sur une feuille après, j'en suis venu à la conclusion qu'il me fallait trois démultiplexeur (type 3 entrées pour 8 sorties), pour ensuite les séparer chacun en 8 démultiplexeur de même type, ce qui me permettait d'avoir mes 64 sorties, comme sur le schéma suivant (excusez-moi de la piètre qualité de mon schéma :roll_eyes: et par soucis de place, j'ai pas fait les 8 autres démultiplexeur).

A partir de là, ça semble être sympa, mais après une petite table de vérité pour comprendre qu'elles sorties de l'Arduino doivent être actives pour qu'une colonne soit allumée, je me retrouve obligatoirement avec 8 colonnes qui à un moment sont actives en même temps (j'ai oublié les entrées G0, G1 barre et G2 barre qui quand G0 = 0 ou G1 barre = 1 ou G2 barre = 1, mettent toutes les sorties à 0, nécessaire à au moins l'activation d'une sortie, mais ce qui cause en contrepartie l'activation des 8 colonnes en même temps).

Alors voila, après tout ce blabla, ma question simple est de savoir comment faire pour arriver, peut-être en passant par le démultiplexage, à commander mes 64 colonnes et ne pas avoir ces 8 colonnes allumé en même temps ? Savoir aussi si le démultiplexage est la meilleur solution pour réaliser ce que je veux faire ou s'il y a une autre manière, je suis près à apprendre de nouvelles choses XD Et puis, si j'ai faux sur toute la ligne je suis ouvert à toute aide. Comme je l'ai dit ce projet est plus un objectif qu'autre chose, donc pour le moment je ne pense pas m'attaquer à quelque chose que je suis incapable de faire mais plutôt essayer de comprendre son mécanisme.

Merci beaucoup pour votre aide, Arduinonien (si ça se dit comme ça ?) XD

Salut,

humm, alors si je comprend bien il te faut alimenter indépendement 8x8=64 colonnes de 8 leds ?
Il te faut donc également commander 8 couches de leds ce qui rajoute 8 sorties à ton microcontroleur.

évidement comme tu le signales, tu peux passer par du multiplexage pour les 64 colonnes cependant il faudra pouvoir piloter 8x8 sorties soit 64 sorties. J'imagine que tu passes par des registres à décalage (avec latch c'est mieux) qui te permettent de piloter 8 sorties avec seulement 3 broches de ton arduino. L'idéal dans ce cas est de passer par des registres chainables (daisychain). Ils ont en plus des 8 sorties une sortie série par laquelle tu peux envoyer le signal à un autre registre, qui lui même enverra au suivant etc...

dans ton cas il te faudra donc 8 registres (8 registres de 8 sorties = 64 sorties)
par contre pour ton arduino il ne te faudra pas 8x3 broches mais que 3 puisque la sortie DATA enverra les données uniquement sur le premier registre, le reste etant propagé de ton premier vers les autres en daisychain. Et évidement les registres sont synchronisés donc 2 autres sorties sont utilisées pour le CLOCK et LATCH. Ceux ci sont connectés ensemble sur tous les registres pour que les signaux arrivent en même temps sur tous les registres.

(Tu peux aussi réserver une broche de l'arduino par registre pour l'envoi des data, à toi de voir. Il te faut alors 2 sorties pour CLOCK et LATCH et une sortie par registre pour les DATA, soit 10 sorties au total.)

Par contre il te faut aussi 8 autres sorties pour piloter les 8 couches du cube. Donc soit réserver 3 autres sorties de l'arduino pour piloter un registre de plus dédié à cette fonction, soit réserver un port complet de l'arduino (8 broches) pour le faire en direct

Ouah rapide réponse, j'ai à peu près compris ce que tu m'as dit, mais j'ai encore quelques questions.

Le système à bascule du registre chainable (aussi registre à décalage non ?) peut être assuré par quel type précis de composant ? (je vais passer ma commande cette après-midi, alors si ta réponse est assez rapide j'en commanderai quelques uns pour comprendre un peu leur système)

A part ça, je vais potasser ce que tu m'as dit, et puis je vais attendre l'arrivée de mon Arduino et des composants, faire deux trois circuits et deux trois coups de programmation pour m'entraîner un peu et puis je pense que je reviendrai pour avoir un plus d'informations quant à la programmation de ces registres.

Peut-être une dernière question, est-ce que quelqu'un connait un site qui vend des LED en masse à un prix plutôt raisonnable (bleu de préférence) ?

Et merci encore de votre aide ! XD

Salut,

Concernant le chainage des registres c'est en fait intégré au composant. Le composant est en lui même un registre à décalage : tu envoies un octet bit à bit par l'entrée série, et à chaque "top" (clock) la donnée envoyée est décalée d'un bit. Sur un registre "simple" tu as une entrée DATA et une entrée CLOCK. tu envoie un premier bit de donnée, puis une impulsion sur CLOCK : ton bit se retrouve sur la broche 1. tu envoies le deuxieme bit puis CLOCK : ton premier bit se retrouve sur la broche 2 et celui que tu viens d'envoyer sur la broche 1 ainsi de suite.

Sur un registre avec LATCH c'est la même chose, sauf que tes sorties sont bloquées à un état. tu envoie ton octet entier sans modifier les sorties. Une fois les états des sorties définies, tu donne une impulsion sur le LATCH et les 8 bits de données sont libérés simultanément sur les 8 sorties.

Enfin sur certains registres, tu as en plus des 8 sorties parallèles, une sortie série en plus qui te permet de cascader plusieurs registres. Tu relies la sortie série du premier registre à l'entrée série du deuxieme. imagine ensuite que tu envoies 8 bits sur le premier registre. Si tu envoies un 9ieme bit de donnée, les 8 bits vont être décalés : le dernier bit envoyé (celui que tu viens d'envoyer) se retrouvera en broche 1 du premier registre et le premier bit envoyé (celui actuellement en broche 8 ) passera sur la sortie série, et se retrouvera donc sur la broche 1 dur 2eme registre. etc... donc typiquement, si tu envoie 16 bits : les 8 bits de poids faible se retrouveront en sortie du registres 2 et les 8 bits de poids fort sur les 8 sorties du 1er registre.

Pour les leds je me fournis chez planeteleds.fr, ca paie pas de mine mais c'est plutot bon marché. sinon il y a de bonnes occasions sur eBay mais je n'aime pas acheter sur ce site.

bon courage

Tu peux passer par des registres type 74HC595 qui on les fonctions décrites ci-dessus.

Ah ça y'est, j'ai enfin compris la totalité !

Alors pour les registres j'ai essayé sur Conrad, mais au vu des frais de ports de malades (8€ pour 15€ d'achats....) je me suis rétracté et je vais attendre de passer un de ces jours sur Grenoble pour en acheter en boutique même. Pour ce qui est des LED, ton site est maintenant dans ma barre personnelle de marque-pages, et dès que j'aurai bien compris tout les ressorts du LED CUBE, j'irai faire mes achats dessus. XD

En tout cas, merci pour toutes ces info, ça m'éclaire un peu plus.

je t'en prie ;p

avec 64 colonnes à piloter je ne sais pas ce que ca donnera niveau affichage. L'arduino a une fréquence assez élevée pour piloter ca, mais tu peux avoir des pbs de latence d'affichage à cause du temps de propagation des bits sur les registres et les fonctions de l'arduino pas toujours très optimisées. Dans ce cas peut être que passer par un système ou chaque registre est alimenté en direct en DATA par une sortie de l'arduino sera plus efficace, surtout en utilisant les ports (PORTA, PORTB...) plutot que la fonction digitalWrite() de l'arduino.

Et ne pas oublier les broches et l'éventuel registre supplémentaire pour piloter les 8 couches du cube.

Je te laisse découvrir tout ca.

Les leds pas cher, ca se trouve en Chine.
Il faut la patience d'attendre les 3 semaines mais tu touche tes 256 Leds à moins de 10 Euros.
Exemples :
www.ledsee.com
www.sureelectronics.net

Pour ce qui est des '595, attention a combien de LEDs tu va devoir alimenter en même temps !
Si tu allumes les 8 LEDs d'une colonne çà va faire 8x20mA soit 160 par broche. Un 74HC595 de base ne se supporte pas.
Il faut considérer une version de puissance genre ceux dispo chez TI :
http://www.ti.com/lit/ds/symlink/tpic6a595.pdf : 350mA continu par broche, 1.1A en pulsé (moyenne <= 350mA)
http://www.ti.com/lit/ds/symlink/tpic6595.pdf : 250mA continu par broche, 750mA en pulsé
http://www.ti.com/lit/ds/symlink/tpic6b595.pdf : 150mA continu par broche, pulsé 500mA

Attention aussi à bien placer tes résistances de limitation de courant pour garantir le bon courant dans tous les cas.

Oui effectivement il faut bien faire attention aux caractéristiques des composants en fonction de l'utilisation. Barbudor à raison de le préciser.

Cela dépend aussi surtout de ton utilisation et de la programmation de l'arduino.

@Barbudor : je n'ai jamais fait de cube de leds, mais d'après ce que j'ai compris les LEDs des colonnes ne sont jamais alumés en même temps, chaque couche étant activée une par une consécutivement et exploite la persistance rétinienne pour créer l'illusion de 8 couches alumées simultanément. Si il y a 8 leds alumées en même temps ce serait sur une ligne et pas une colonne non ? et du coup cela tirerait 20mA sur 8 broches séparées donc cela devrait être ok ?

Après, encore une fois, tout est en fonction de la manière dont l'arduino est programmé...

Lignes, Colonnes, Plan ou couche c'est des mots.
Il faut voir comment on câble derrière.

Je considère (mais on peut prendre d'autres hypothèses) :

Base 8 lignes x 8 colonnes à plat => 8 x '595 pour piloter 64 signaux
Sur chaque couche, considérons que toutes les anodes sont reliées ensemble.
En empilant les couches, relions les cathodes verticalement.

Un schema de principe pourrait être en version 2x2x2 :

Avec un demux '138 suivit d'un étage de puissance (a affiner !) on choisit quelle couche on traite.
Avec des '595 on pilote le fond, ce que j'ai appelé Lignes et Colonnes (L1C1, L1C2, L2C1 et L2C2). Chacune des leds d'une couche est pilotée individuellement et éventuellement simultanément.

On va donc faire du balayage suivant les couches. C'est là que la persistance rétinienne va être utilisée. Chaque led allumée sur une couche ne sera allumée qu'un bref instant. Avec 8 couches, seulement un 1/8eme du temps.
Donc il peut y avoir plusieurs LED allumée en même temps mais 1 seule par couche, donc 1 seule par signal LxCy
C'est ici qu'il faut mettre la limitation de courant.

D'ailleurs après réflexion, plutôt que d'utiliser des '595 je propose d'utiliser des drivers de LED a courant constant tels que les MBI5168 ou les STP08CP05
Ce sont des shift-register similaires aux '595 mais avec un circuit de contrôle de courant permettant de limiter proprement le courant.
Une seule résistance suffit pour choisir le courant qui traversa chaque led.

Sinon, les TPIC6B595 de puissance cité plus haut suffiront mais il faudra mettre 1 résistance à ajuster sur chaque sortie soit 64 résistances au total.

EDIT : Schéma mis à jour avec les axes X (Lignes), Y (Colonnes) et Z (Couches)

Désolé pour la réponse tardive, mais merci beaucoup pour toute votre aide !

Alors bon j'ai potassé ce que vous m'avez dit, et je pense avoir plutôt tout bien compris. Pour les 64 résistances, j'avais déjà vu ça dans un tutoriel anglais avec le même système de demux. Par contre juste une petite question sans trop d'importance (histoire de voir si j'ai bien compris), dans ton système demux 138 pour les couches et 595 pour lignes et colonnes, les 595 ne servent à vrai dire que pour les colonnes, non ? (toutes les anodes d'une couche son reliées entre elles)

Je vais essayer de faire deux trois recherches sur les drivers à LEDs (jamais utilisé, comme beaucoup d'autres composants...), d'ici votre prochaine réponse, et puis je devrais pas tarder à recevoir mon Arduino, je pourrai alors m'entraîner et un peu mieux comprendre avec de la pratique (dans la limite de mes compétences actuelles bien sûr).

Tu es en 3D alors il faut définir une terminologie
Puisque tu es en TSI, parlons mathématiquement :

Axe X : Colonnes
Axe Y : Lignes
Axe Z : Couche

Voilà ce que donne le schéma d'une seule couche avec lignes et colonnes :

Certains pourraient utiliser une autre terminologie impliquant que les colonnes sont verticales (comme des colonnes grecques)
Axe Z : Colonnes
Axe X et Y : Lignes et ?

De toute façon a un moment ou un autre, tu change de référentiel et tu ty retrouve ... enfin j'espère XD

EDIT: J'ai modifié le schéma électronique 2 posts au dessus pour faire apparaître les axes X, Y et Z.

Salut,

Oui les 595 servent au pilotage des "colonnes" et le 138 aux "couches". Dans ce cas tu as besoin de 3 sorties Arduino pour les 595 + 3 sorties pour piloter les couches.

Les drivers de leds sont utiles pour cette utilisation, comme le dit dabudor ils fonctionnent comme des registres mais on peut en plus limiter directement le courant en sortie des broches grace à une broche en entrée sur laquelle on place une résistance de limite de courant. Cette limite s'appliquera sur toutes les sorties ce qui permet de se passer des 64 résistances en sortie avec l'utilisation de simples registres.

Attention toutefois aux caractéristiques, selon le driver utilisé il faut concevoir le cube en anodes communes ou cathodes communes.

Donc je vois que SMarty utilise aussi le terme "Colonnes" pour parle de l'axe vertical (colonnes grecque)
Mais dans ce cas, je ne sais pas comment nommer les 2 dimensions X et Y : Lignes et ?

J'ai choisit anodes communes au niveau des couches (pilotable par un réseau de PNP UDN2891 par exemple)
Et cathodes communes suivant l'axe Z.

  • Un driver source de courant fournit du courant vers une anode qui ensuite s'enfuie vers la masse
  • Un driver "sink" (en français ?) de courant absorbe le courant en provenance de la cathode.

On utilise un seul type de driver à la fois. J'ai propose - car c'est le plus courant - un driver "sink" qui se place coté cathode.
Coté Anode de simples transistors, éventuellement intégrés dans un UDN2891 font l'affaire.

Coté courant des LEDs attention : une LED qui l'on souhaite voir allumée en permanence sera en fait allumée 1/8eme du temps quand sa couche sera active (cube à 8 couches)
En théorie, pour obtenir la même luminosité que la même LED allumée en permanence (sans multiplexage) tu devrais fournir un courant 8 fois supérieur au courant max de la LED de façon a ce que le courant moyen soit égal au courant max.

Mais si on regarde une datasheet de LED (il n'est jamais facile de trouver les datasheet de la LED que l'on choisit, mais on peut tirer des généralités et faire des approximation), le courant max instantané admis ne doit pas être plus de 30% à 50% supérieur au courant moyen max.
Dans l'extrait de datasheet ci dessous (LED RGB 5mmm que j'ai acheté chez Lex....c) on lit que le courant max continu est de 20mA et que le courant crête (peak) avec un rapport cyclique (duty cycle) de 1/10 est de 30mA.

Comment faire ?
Don't panic.
La solution est de prendre des LEDs très lumineuses qui auront un bon rendement même a faible courant.
En pratique d'ailleurs la courbe de luminosité n'est pas linéaire et une LED atteint 80% de sa luminosité apparente avec un rapport cyclique de 50%.

Je te suggère de ne pas acheter tes 256512 LEDs d'un coup et de faire quelques essais avec une sortie PWM réglée à 1/8 (analogWrite(32)) et un courant 50% au courant max annoncé pour voir ce que ca donne. Si pas satisfaisant, envisager de changer de LED.

Après si c'est pas suffisant, tu peux monterle courant mais au risque de réduire fortement la durée de vie des LED.
Et changer une LED en plein milieu d'une cube 8x8x8 .... galère :wink:

Ce qui me décourage de suivre cette voie c'est pas l'électronique (facile) ni même le câblage (ch...t).
C'est après, concevoir des animations qui aient de la gueule et le code qui va avec....

@Alien

Je pense qu'un certain temps vas quand même s'écouler avant que j'arrive à des résultats aussi beau que dans tes vidéos ! ^^

Pour la programmation je pense que je vais commencer par un petit 333, histoire de me faire la main et puis après j'attaquerai l'électronique du 888.
Mais je me décourage pas, je sais que je vais avoir des heures à passer dessus pour tout bien comprendre et faire un code potable, alors je pars pas sans connaître la difficulté du projet. C'est déjà ça :slight_smile:

Merci barbudor pour tes schémas ça m'éclaire assez bien, c'est un peu plus concret que des phrases et je m'y retrouve un peu mieux !
J'vais potasser tout vos réponse et puis je vais me faire un dossier de tout ça.
Par contre pour les drivers de LEDs, si du genre j'ai des LEDs 20mA, 3.1 - 3.3V, j'ai donc juste à mettre une résistance de 330? pour une tension d'alim' de 9V en tant que résistance de limitation de courant en broche d'entrée ?

le calcul de la résistance est indiqué dans la doc du driver de LED.
Elle est calculée par rapport à l'électronique interne du driver sans avoir à te préoccuper de la tension externe car c'est un driver de courant.
Toutefois, j'ai peur que 9V soit un peu fort.
Il faudrait lire plus en détail la doc du driver que tu aura choisit.
Si tu as choisit, fait connaitre la référence et je ferait une passe sur la datasheet.

De toute façon, il serait mieux d'avoir la possibilité de mettre un ajustable (en fait une résistance de butée minimale plus un ajustable) de façon a pour ... ajuster :wink:

J'ai un peu cherché sur le net et un STP08DP05 de chez STMicroelectronic (http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00156241.pdf) ferais l'affaire, je pense ?

@alien : Oui pour le 333 il n'y a aucun défi, mais je me lance tout juste dans le monde des Arduino donc j'ai un peu besoin de me familiariser avec l'interface et comme c'est pas bien dur à mettre en place et que j'aurai assez de led, de résistances et de transistor pour me faire un 333, je commencerai par cela ^^

Merci pour ta vidéo, ça va me permettre d'un peu moins chercher si je me casse vraiment trop les fesses sur la programmation :slight_smile:

Bonjour tout le monde, me revoilà avec un peu plus de connaissances en tête et de matériel sur le bureau ! XD

J'ai reçu mon Arduino Uno depuis un petit moment et je me suis donc lancé de façon concrète dans la programmation et le câblage de la bête.
Ces 2 semaines m'ont permis de potasser, et j'ai donc acheté quelque uns et commandé le reste des composants du système proposé par barbudor, c'est-à-dire :

  • 138' pour les couches, qui commande un réseau de transistors PNP (le UDN2891 n'est plus commercialisé, je me suis donc acheté un ULN2803)
  • un driver "sink" (STP08DP05) qui absorbe le courant (donc 8 qui gèrent les 64 colonnes)

Le tout est commandé, mais ce que je me demande toujours c'est comment fonctionne l'ajustement du courant avec une résistance externe sur le STP08DP05.
On a passé 1h avec mon prof d'électricité à essayer de comprendre la datasheet, mais rien n'est sortis de ce bout de papier...

Donc ma question serait de savoir quelle résistance je devrais brancher sur le port R-EXT, pour avoir un courant constant de 20mA dans mes colonnes ?
(en alimentant mon cube en 5V, même si comme l'a dit barbudor, ne semble pas avoir d'avoir influence sur la résistance de limitation)

Pour la datasheet --> http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00156241.pdf

  • 138' pour les couches, qui commande un réseau de transistors PNP (le UDN2891 n'est plus commercialisé, je me suis donc acheté un ULN2803)

Aie Aie Aie
C'est pas du tout la même chose ! =(
Voir dessin ci-dessous

le STP08DP05 est un sink de courant il va devoir être branché coté Cathode des leds
Le UDN2891 est une source de courant à brancher coté Anode
Mais le ULN2803 est aussi un sink.
Donc ca ne marchera pas.
Faut que je réfléchisse a ce que je vais te proposer à la place.
Qu'elle sera ta tension d'alimentation ? 5V ?

Pour le STP08DP05, vous n'êtes pas allé au bout de la F....g Datasheet :slight_smile:
Page 13, table 10 tu as la réponse à ta question XD