Contrôle de 500 LED avec PWM

26

J'envisage de prendre un projet qui impliquerait d'adresser individuellement 500 LED, de manière optimale avec un support PWM pour chacune.

Je prévois d'utiliser un Arduino car j'en ai déjà un, mais je suis ouvert aux suggestions si quelqu'un pense qu'une plate-forme différente serait mieux adaptée.

Il faudrait utiliser des registres à décalage. Quel est un bon registre à décalage à utiliser dans cette situation? Si PWM rend ce projet beaucoup plus cher, je peux m'en passer. Je veux essayer de dépenser moins de 100 $. J'achèterais en vrac 500 LEDs sur ebay.

Quelle est votre opinion sur la meilleure façon de contrôler un si grand nombre de LED? De plus, comment pourrais-je fournir de l'électricité? J'apprécierais toute aide. Je suis assez expérimenté avec l'électronique, je n'ai jamais rien fait à si grande échelle.

littlebirdceo
la source

Réponses:

14

Je suis l'auteur de la bibliothèque ShiftPWM et je viens de mettre à jour la documentation pour inclure des schémas et beaucoup plus d'informations générales sur les LED normales, les bandes de LED et les LED haute puissance.

Vous avez probablement déjà commencé votre projet, mais comme cette page reçoit beaucoup de visiteurs, j'aimerais quand même fournir une réponse détaillée.

Si vous souhaitez contrôler 500 LED avec ShiftPWM, vous pouvez obtenir environ 64 niveaux de luminosité par LED à 60 Hz. Vous utiliseriez 64 registres à décalage. Les pilotes matériels PWM dédiés vous donneront plus de niveaux de luminosité, mais seront un peu plus chers. Je pense que le principal avantage de ma bibliothèque est sa facilité d'utilisation, car elle comprend des fonctions RVB et HSV et de nombreux exemples.

Je choisirais personnellement le TLC5916 de TLC5917 au lieu des registres à décalage normaux, car ils ont un pilote LED à courant constant intégré. Cela vous fera économiser beaucoup de soudure, car vous n'avez pas besoin de résistances.

Sur mon site Web ( http://www.elcojacobs.com/shiftpwm ) j'ai plus d'informations sur la façon de connecter les LED et comment gérer les longs fils de signal avec l'Arduino à des vitesses élevées.

Si vous avez d'autres questions, veuillez les poser.

ElcoJacobs
la source
Avez-vous regardé ma réponse ci-dessous? Bien que la technique que je décris utilise du matériel supplémentaire, la même approche pourrait probablement être utilisée pour améliorer considérablement la vitesse de votre bibliothèque. Je n'ai pas programmé l'Arduino, donc je ne suis pas familier avec les horaires de ses instructions, mais dans sa forme la plus simple, vous pouvez réduire la charge de votre processeur à tout ce qui serait nécessaire pour simplement faire exploser des bits du SPI (si vous êtes actuellement à 5 cycles par bit et votre SPI prend 16 cycles par octet, ce qui serait une accélération de 2,5x). Vous pourriez même être en mesure de faire des choses plus sophistiquées tout en continuant à courir à cette vitesse.
supercat
Par exemple, supposons que vous souhaitiez avoir huit niveaux de luminosité représentant plein, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 et 1/128. Si l'Arduino peut effectuer une opération "ET" ou "OU" sur une valeur extraite d'un pointeur et incrémenter ce pointeur en moins de quatre cycles, vous pourriez probablement utiliser trois bits par pixel pour stocker vos informations de luminosité et toujours atteindre une vitesse de transfert de 16 cycles pour 8 LED.
supercat
Le calcul des valeurs PWM chevauche la sortie SPI dans ma bibliothèque. Je lance le SPI à 4 MHz et les calculs prennent un peu plus de temps que la sortie SPI. Il faut 43 cycles d'horloge par octet, donc pour 8 sorties. C'est assez rapide pour la plupart des configurations. Vous pouvez obtenir plus de vitesse en utilisant la modulation de code bit, où vous avez 8 périodes de mise à jour, chaque période suivante la moitié de la durée de la précédente. J'ai écrit une version BCM, mais elle est plus sensible au moment où vous mettez à jour le paramètre de luminosité. Il peut provoquer un scintillement lorsqu'il est mal aligné. Je vais probablement l'utiliser dans la version matricielle.
ElcoJacobs
BCM a l'avantage de votre approche que vous pouvez utiliser le timing 1 / 2,1 / 4 ..., mais ne prend toujours qu'une seule broche par LED. Si vous avez une formation en informatique, vous trouverez peut-être intéressant la façon dont les octets SPI sont calculés. Je reçois le rapport cyclique de la mémoire (2 horloges) et fais une comparaison (1 horloge). Le résultat de la comparaison est stocké dans le report, donc je peux le déplacer dans l'octet avec une rotation sur report (1 horloge). Le faire 8 fois met tous les résultats de comparaison dans un octet prêt à être envoyé au SPI.
ElcoJacobs
13

Il suffit de copier :-)

http://www.evilmadscientist.com/article.php/peggy2

Aujourd'hui, nous publions une mise à jour de notre projet Pegboard LED open source «Peggy». La version 2 de Peggy a été entièrement repensée. Et ça a l'air… presque exactement pareil. Les changements sous le capot sont cependant importants et nous pensons que c'est une grande amélioration à bien des égards.

D'abord et avant tout, Peggy 2.0 fait toujours la même chose: il fournit une alimentation efficace à un réseau de 25 x 25 emplacements LED. Peggy est conçu pour éliminer une partie de la piqûre, de la complexité et du gâchis du jeu avec les LED. C'est un panneau perforé électroluminescent polyvalent et puissant qui vous permet de piloter efficacement des centaines de LED dans la configuration que vous souhaitez, sans même calculer une seule résistance de charge. Vous pouvez installer de 1 à 625 LED, et Peggy les éclairera pour vous.


Peggy 2.0 est désormais également compatible Arduino: il prend en charge la programmation via un câble USB-TTL, en utilisant l'environnement logiciel Arduino populaire.

Axeman
la source
Lien merveilleux! Signet. Je n'avais pas l'intention de travailler sur un projet comme celui-ci, mais je dois le faire maintenant, j'ai vu cette petite vidéo :-)
Wouter Simons
@NicolaeSurdu Pas cassé. Je l'ai ouvert tout à l'heure.
Axeman
3
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
6

Dans quelle disposition voulez-vous les LED? Vous pouvez économiser beaucoup de travail si vous achetez des matrices LED, vous pouvez obtenir des matrices 8x8 LED monochromes (64 LED) pour un dollar ou deux .

Vous n'obtiendrez pas de véritable PWM avec un AVR et des registres à décalage sur ces nombreuses LED, mais vous pourrez peut-être réduire de 2 à 4 niveaux de luminosité. Vous devez exécuter les chiffres et voir ce qui est possible.

Allegro fabrique des registres à décalage à courant constant pratiques spécialement conçus pour contrôler les réseaux de LED, de sorte que vous n'avez pas besoin de résistances supplémentaires, ce qui simplifiera également les choses. Vous ne pourrez peut-être pas piloter les LED directement à partir de la sortie AVR si elle ne peut pas fournir suffisamment de puissance, vous devrez donc utiliser des transistors. Vous pouvez les obtenir dans des tableaux dans un seul circuit intégré , ce qui économise également du travail.

davr
la source
tous de très bons points!
Jason S
5

Je n'ai aucune idée de la gamme de PWM dont vous avez besoin pour une LED, mais j'ai travaillé sur un contrôleur PWM à 64 canaux pour une application de servocommande qui peut me donner des impulsions comprises entre 600us et 2,4 ms. Celui-ci utilise les CD74HCT238E (démultiplexeurs 3-8 lignes) pour générer 64 canaux à partir de 8 broches d'E / S sur un ATMega168 et est contrôlable via de simples commandes série. Je suppose que vous pouvez enchaîner plusieurs versions d'une version modifiée de ce contrôleur sur une ligne série et adresser les 500 LED ... Vous pourriez probablement utiliser la version ATTiny2313 du contrôleur car vos exigences de micrologiciel seraient plus simples.

Mon blog contient la source de l'assemblage et les schémas et les détails du processus de conception.

Len Holgate
la source
5

Consultez les circuits intégrés du "pilote LED" sur le mouser / digikey. TI, par exemple, fabrique un tas de pilotes avec une variété d'interfaces (I2C, SPI) qui répondraient certainement à vos besoins. La plupart de ces pilotes sont conçus pour être connectés en guirlande, de sorte que la sortie série de l'un est introduite dans la série de l'autre.

Par exemple, quelque chose comme le TLC5940 offre un contrôle PWM à 16 canaux. Donc, fondamentalement, c'est un registre à décalage à 16 bits à courant constant avec un contrôle PWM en niveaux de gris à 12 bits. Je peux recommander cet IC particulier car j'ai aidé à concevoir un écran 80x16 avec.

David Brenner
la source
4

Mondomatrix fabrique des cartes de pilotes LED adressables série (rs-485) et est basée sur la plate-forme Arduino: http://www.displayduino.com/ Vous pourrez peut-être assembler un système utilisant ce matériel assez facilement


la source
4

Si vous ne voulez pas trop de bits de contrôle PWM pour chaque LED, et que vous voulez éviter d'avoir un processeur échappé avec 500 LED à chaque cycle PWM, vous pouvez contrôler 8 LED avec N bits de luminosité en utilisant N 74HC595 ou des puces équivalentes . Câblez les sorties de toutes les puces N ensemble, et câblez l'activation à certains circuits qui ne permettront qu'une seule à la fois avec un timing approprié. Arrangez-vous pour que la première puce soit activée la moitié du temps, la seconde soit activée pour la moitié du reste, etc.

Tout rechargement des registres à décalage doit être synchronisé avec le taux PWM, afin de minimiser les effets de repliement (par exemple, si un niveau de luminosité commutait rapidement entre 0111 et 1000, le point dans le cycle PWM lorsque le commutateur s'est produit pourrait changer momentanément la luminosité apparente ).

Bien que devoir utiliser plusieurs sorties 74HC595 pour chaque LED puisse être gênant, cette approche est probablement la plus simple qui pourrait maintenir différents niveaux de luminosité sans intervention continue du CPU.

supercat
la source
3

Cela ne répond pas directement à la question, mais un autre aspect que vous devrez peut-être prendre en compte est la variabilité possible de l' intensité lumineuse entre les LED de votre lot de 500. Cela est particulièrement important si ces LED sont montées les unes à côté des autres, comme dans une matrice ou dans des écrans à 7 segments. Consultez cette réponse pour plus de détails sur la façon de résoudre ce problème, en particulier, en utilisant la correction de points pour compenser les variations de luminosité des LED.

J'ai rencontré ce problème lorsque j'ai reçu 200 LED rouges de 1 mm pour un ensemble de grands écrans à 7 segments que je construisais. Ma solution bon marché pour résoudre le problème impliquait les éléments suivants:

  1. J'ai construit un testeur LED dans une planche à pain pour classer les jeux de LED dans différentes catégories de luminosité
  2. J'ai monté chaque segment en utilisant des LED de la même catégorie (dans ma conception, chaque segment était composé de 5 LED montées en série)
  3. J'ai compensé la différence de luminosité de chaque segment en utilisant différentes résistances de limitation de courant. Par exemple, pour un segment avec des LED plus lumineuses, j'utiliserais une résistance de 100 ohms, tandis que, pour un autre segment avec des LED de gradateur, j'utiliserais des résistances de 120 ohms.
Ricardo
la source
1
Point valide, mais ne répond pas à la question.
Matt Young
1
@MattYoung D'accord. La question est largement répondue par toutes les autres réponses. Je voulais juste compléter ces réponses, en abordant un problème secondaire qui pourrait affecter la conception du PO.
Ricardo
1

XMOS utilise le Macroblock MBI5026 avec ses kits de tuiles LED. Je pense qu'ils sont utilisés dans la plupart des autres systèmes professionnels.

Léon

Leon Heller
la source
1

Les puces de pilotes dédiées avec des interfaces série seront en effet probablement la meilleure voie. Traiter des registres à décalage individuels signifiera probablement un circuit très complexe. Au moins Maxim et TI en font. Je ne me souviens pas si l'un ou l'autre a un modèle particulièrement adapté à cela.

Cela prendra encore beaucoup de matériel.

En ce qui concerne l'alimentation, la programmation et les bus, la fiche technique de chaque pilote contiendra probablement la plupart des informations dont vous aurez besoin.

XTL
la source
1

Dans le domaine logiciel, si le nombre de paramètres de luminosité distincts dont vous avez besoin n'est pas trop grand, il peut être utile de stocker les données au format "bit-planar" (comme décrit dans mon autre réponse matérielle), puis d'avoir les routines de sortie utilisent des opérateurs booléens pour agir sur 8 pixels à la fois. Pour une efficacité maximale, cela nécessitera d'avoir plusieurs routines de sortie distinctes, utilisées pour différentes parties du cycle PWM; par exemple, si l'on souhaite utiliser des valeurs de luminosité 4 bits, on utilisera huit routines de la forme:

  movf bit0Comp, w; Doit être 00 ou FF selon le bit 0 du comparatif (FF si clair)
  iorwf POSTINCF, w; Bit 0 de données; utilisez toujours IORWF
  etwf POSTINCF, w; Bit 1 de données; utilisez IORWF si le bit 1 du comparateur est défini; ANDWF si clair
  etwf POSTINCF, w; Bit 2 de données; Utilisez IORWF si le bit 1 du comparateur est défini; ANDWF si clair
  etwf POSTINCF, w; Bit 2 de données; Utilisez IORWF si le bit 1 du comparateur est défini; ANDWF si clair
  movwf SPIREG; Stocker l'octet résultant (bits définis si> = comparand)

On utiliserait différentes combinaisons de IORWF et ANDWF, selon la valeur du comparateur. Notez qu'en utilisant cette approche comme illustré, on peut mettre à jour les valeurs de luminosité des pixels à tout moment dans le cycle PWM sans scintillement à condition que les quatre bits soient écrits entre les appels à la routine de décalage d'affichage, ou en faisant en sorte que la routine de mise à jour des pixels détermine si le le décalage suivant produira un "1" ou un "0" pour le pixel, et soit en définissant ou en effaçant tous les bits du pixel (quelle que soit l'opération qui le fera faire quoi qu'il allait faire de toute façon), puis en écrivant tous les bits dont la valeur devrait être en face. Notez également que l'on peut obtenir des échelles de luminosité non linéaires arbitraires en faisant varier le moment des mises à jour de l'affichage ou en utilisant plusieurs valeurs de comparaison plus d'une fois dans un cycle PWM.

supercat
la source
1

Les FPGA ou CPLD peuvent être utiles pour de telles tâches car ils offrent de nombreuses broches d'E / S. Optez pour le plus simple et le moins cher. Si l'un ne suffit pas, utilisez un couple.

Carl
la source
Pouvez-vous nous donner quelques détails supplémentaires sur la raison pour laquelle c'est une bonne option, en ce moment je le sais, mais je sais quelles sont les options et quelles sont les technologies suggérées que vous listez, l'Origial Poster (OP) n'a probablement pas une telle un arrière-plan.
Kortuk
Je ne suis pas sûr que ce soit la meilleure option, mais je voulais qu'il soit mentionné pour être complet. Si vous contrôlez 500 LED avec PWM, d'une manière ou d'une autre, à la fin, 500 fils contrôlables individuellement sont nécessaires. Il est difficile de trouver un microcontrôleur avec autant de broches de sortie. Il existe de nombreuses façons de contourner cela en utilisant toujours des microcontrôleurs, mais un ou quelques CPLD / FPGA bon marché pourraient facilement donner ces broches de sortie.
Carl
1

Vous pouvez presque certainement le faire facilement en utilisant un PSoC3 ou PSoC5 .

Les puces PSoC sont des microcontrôleurs qui contiennent du matériel numérique reconfigurable, un peu comme un FPGA ou CPLD. Cela signifie que vous pouvez créer des circuits complexes pour faire des choses inhabituelles comme piloter 500 LED avec PWM. De plus, vous pouvez probablement implémenter le tout à l'aide des blocs numériques reconfigurables, ce qui signifie que la partie CPU de la puce n'a besoin que d'écrire les luminosités LED souhaitées dans un tableau.

504 LED tiennent dans un rectangle 21 x 24. Si vous aviez 24 canaux PWM et 21 GPIO, alors vous pourriez faire fonctionner cela. Devine quoi? Le PSoC a plus que cela.

Vous pouvez facilement configurer 24 canaux PWM sur un PSoC et configurer 21 autres broches pour faire partie d'un registre à décalage. Ensuite, configurez certains canaux DMA pour pomper des octets de la mémoire dans les sorties PWM, et vous riez. Tout ce que le CPU doit faire maintenant est de générer les graphiques. Le PSoC3 a un cœur 8051 8 bits, tandis que le PSoC5 a un ARM 32 bits. Faites votre choix. Les seuls circuits intégrés externes dont vous aurez besoin sont certains ULN2803 pour fournir le courant de commande élevé pour les lignes. Les sorties PWM doivent avoir suffisamment de courant pour les LED simples.

Rocketmagnet
la source
C'est une surpuissance totale pour conduire des LED. Il existe des pilotes LED dédiés, bon marché et préconçus, conçus pour enchaîner de grandes quantités comme celle-ci, qui sont constamment utilisés pour des écrans gigantesques. Pas besoin de réinventer tout cela et pour un coût plus élevé.
nemik
@nemik - En fait, le coût total des puces (de Farnell cher) n'est que de 6,80 £.
Rocketmagnet
0

Profitez des économies d'échelle. Des sites chinois comme Aliexpress vendent des brins de LED basés sur WS2811 pour environ 15 $ par 50 LED. Ils sont adressables individuellement, lumineux, généralement étanches et disposent d'un PWM pour la luminosité. Pas de soudure ou de registres à décalage pour jouer avec. Faire tout cela vous-même, je parie, vous coûtera plus cher, prendra beaucoup plus de temps et sera très frustrant. De plus, vous êtes à Oz, donc l'expédition depuis la Chine ne sera pas trop chère.

Ceux-ci sont faits pour faire des écrans LED géants, donc ils ont tendance à être assez bon marché. Assurez-vous simplement de réinjecter de la puissance toutes les 50 LED environ pour des performances optimales.

Il existe également des bibliothèques Arduino pour les rendre faciles à utiliser.

nemik
la source
1
15 $ pour 50 LED? Donc, pour 500 LED, cela revient à 150 $? Et vous avez le culot de me dire que ma solution coûte cher? -1
Rocketmagnet
Veuillez également fournir un lien vers ce lien. WS801 ne fonctionne pas bien sur Google, et il ne se révèle pas non plus à la recherche d' aliexpress
Rocketmagnet
Désolé, je voulais dire WS2811, comme ces aliexpress.com/store/product/… ou, sans gradation PWM, ces aliexpress.com/store/product/…
nemik
Un signal série pour piloter 50 LED avec gradation PWM. Merci, c'est exactement ce que je recherche. Mais un registre à décalage standard fournit une broche de "verrouillage" pour copier les données tamponnées vers les sorties après la transmission de la trame complète. Il n'y a pas de verrou ici, donc je m'attends à un bruit perceptible à des taux de rafraîchissement élevés. Les puces prennent en charge des données à 400 Kbps avec 15 bits par pixel, de sorte que l'écran affiche un non-sens pendant 1,9 millisecondes pendant la mise à jour de la trame.
nialsh