Pages: [1] 2   Go Down
Author Topic: [Conseil] LED CUBE et démultiplexage  (Read 5353 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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'  smiley-lol). 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 smiley-cry)).

Alors mon projet, comme beaucoup d'entre vous je pense l'ont déjà réalisé, est de faire un LED CUBE de 8*8*8.
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 smiley-roll 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 smiley-lol 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 ?) smiley-lol
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !  smiley-lol
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 05, 2012, 06:54:37 am by SMarty » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


* IMG_8234.JPG (44.17 KB, 738x282 - viewed 74 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-lol

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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é...
« Last Edit: May 05, 2012, 09:48:05 am by SMarty » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
« Last Edit: May 07, 2012, 03:42:00 pm by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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).

Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-lol

EDIT: J'ai modifié le schéma électronique 2 posts au dessus pour faire apparaître les axes X, Y et Z.
« Last Edit: May 07, 2012, 03:43:34 pm by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: May 07, 2012, 03:42:28 pm by SMarty » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink


* datasheet-led.png (16.03 KB, 720x101 - viewed 28 times.)
« Last Edit: May 07, 2012, 04:18:02 pm by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
God Member
*****
Karma: 5
Posts: 687
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Mitte
Content de voir que le 3D LED CUBE fascine toujours autant  smiley-wink le super-gadget  smiley-wink

Le cablage d'un 3*3*3 est pas mal , mais un 8*8*8 (bonjour) et qui plus est en RGB (au secour)  smiley-grin

En tout cas ,je suis impatient de voir ta réalisation ,très bon projet  smiley-wink
Bon courage
@+
Will

P.S: pour le fun ,j'épère que tu vas nous faire un truc comme ça  smiley-wink

ou



Logged

The truth is elsewhere !!

Pages: [1] 2   Go Up
Jump to: