Controllo di 500 LED con PWM


26

Sto pensando di intraprendere un progetto che implicherebbe l'indirizzamento individuale di 500 LED, in modo ottimale con il supporto PWM per ciascuno.

Sto pensando di utilizzare un Arduino poiché ne ho già uno, ma sono aperto a suggerimenti se qualcuno pensa che una piattaforma diversa sarebbe una partita migliore.

I registri a turni dovrebbero essere impiegati. Qual è un buon registro a turni da utilizzare in questa situazione? Se PWM rende questo progetto molto più costoso, posso farne a meno. Voglio provare a spendere meno di $ 100. Comprerei alla rinfusa 500 LED su ebay.

Qual è la tua opinione sul modo migliore per controllare un numero così elevato di LED? Inoltre, come potrei fare per fornire il potere? Gradirei qualsiasi aiuto. Ho una discreta esperienza con l'elettronica, non ho mai fatto nulla su così vasta scala.

Risposte:


14

Sono l'autore della libreria ShiftPWM e ho appena aggiornato la documentazione per includere schemi e informazioni molto più generali per normali LED, strisce LED e LED ad alta potenza.

Probabilmente hai già avviato il tuo progetto, ma poiché questa pagina ha molti visitatori, vorrei comunque fornire una risposta dettagliata.

Se si desidera controllare 500 LED con ShiftPWM, è possibile ottenere circa 64 livelli di luminosità per LED a 60 Hz. Dovresti usare 64 registri a scorrimento. I driver PWM hardware dedicati ti offriranno più livelli di luminosità, ma saranno un po 'più costosi. Penso che il vantaggio principale della mia libreria sia la facilità d'uso, perché include funzioni RGB e HSV e molti esempi.

Personalmente sceglierei il TLC5916 di TLC5917 invece dei normali registri a scorrimento, perché hanno un driver LED a corrente costante incorporato. Questo ti farà risparmiare un sacco di saldature, perché non hai bisogno di resistori.

Sul mio sito Web ( http://www.elcojacobs.com/shiftpwm ) ho ulteriori informazioni su come collegare i LED e su come gestire i cavi di segnale lunghi con Arduino ad alta velocità.

Se hai altre domande, chiedi.


Hai visto la mia risposta qui sotto? Sebbene la tecnica che descrivo utilizzi hardware aggiuntivo, lo stesso approccio potrebbe probabilmente essere usato per migliorare notevolmente la velocità della tua libreria. Non ho programmato Arduino, quindi non ho familiarità con i suoi tempi di istruzione, ma nella forma più semplice potresti ridurre il carico della CPU a tutto ciò che sarebbe necessario per semplicemente mandare in pezzi l'SPI (se attualmente sei a 5 cicli per bit e il tuo SPI richiede 16 cicli per byte, che sarebbe un aumento di velocità 2,5x). Potresti anche essere in grado di fare alcune cose più sofisticate mentre corri ancora a quella velocità.
supercat

Ad esempio, supponiamo di voler avere otto livelli di luminosità che rappresentano full-on, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 e 1/128. Se Arduino è in grado di eseguire un'operazione "AND" o "OR" su un valore recuperato da un puntatore e incrementare tale puntatore in meno di quattro cicli, è possibile che sia possibile utilizzare tre bit per pixel per memorizzare le informazioni sulla luminosità e ottenere comunque una velocità di trasferimento di 16 cicli per 8 LED.
supercat

Il calcolo dei valori PWM si sovrappone all'output SPI nella mia libreria. Corro l'SPI a 4MHz e i calcoli richiedono solo un po 'più di tempo dell'uscita SPI. Sono necessari 43 cicli di clock per byte, quindi per 8 uscite. Questo è abbastanza veloce per la maggior parte delle configurazioni. Puoi ottenere una maggiore velocità usando la modulazione del codice bit, in cui hai 8 periodi di aggiornamento, ogni periodo successivo è la metà della durata del precedente. Ho scritto una versione BCM, ma è più sensibile al momento in cui aggiorni le impostazioni di luminosità. Può causare sfarfallio quando non è allineato. Probabilmente lo userò nella versione a matrice però.
ElcoJacobs l'

BCM ha il vantaggio del tuo approccio di poter utilizzare la temporizzazione 1 / 2,1 / 4 ..., ma richiede comunque solo un pin per LED. Se hai un background di informatica, potresti trovare interessante il modo in cui vengono calcolati i byte SPI. Ricevo il duty cycle dalla memoria (2 clock) e faccio un confronto (1 clock). Il risultato del confronto è memorizzato nel carry, quindi posso spostarlo nel byte con un carry over di rotazione (1 clock). Farlo 8 volte mette tutti i risultati del confronto in un byte che è pronto per essere inviato all'SPI.
ElcoJacobs l'

13

Basta copiare :-)

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

Oggi stiamo rilasciando un aggiornamento al nostro progetto Pegboard LED open source "Peggy". Peggy versione 2 è stata riprogettata da zero. E sembra ... quasi esattamente lo stesso. I cambiamenti sotto il cofano sono sostanziali, tuttavia, e pensiamo che sia un grande miglioramento sotto molti aspetti.

Innanzitutto, Peggy 2.0 fa ancora la stessa cosa maledetta: fornisce energia efficiente a una gamma di 25 x 25 posizioni di LED. Peggy è progettato per eliminare un po 'della puntura, della complessità e del caos del gioco con i LED. È una pedana versatile e potente che emette luce che ti consente di guidare in modo efficiente centinaia di LED in qualsiasi configurazione ti piaccia, senza nemmeno calcolare un singolo resistore di carico. Puoi installare ovunque da uno a 625 LED e Peggy li illuminerà per te.


Peggy 2.0 è ora compatibile anche con Arduino: supporta la programmazione tramite un cavo USB-TTL, utilizzando il popolare ambiente software Arduino.


Link meraviglioso! Segnalibro. Non avevo intenzione di lavorare su un progetto come questo, ma devo farlo ora ho visto quel piccolo video :-)
Wouter Simons,

@NicolaeSurdu Non rotto. L'ho aperto proprio ora.
Axeman,

3
Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.

6

In quale layout vuoi inserire i LED? È possibile salvare un sacco di lavoro, se si acquista alcune matrici di LED, è possibile ottenere 8x8 LED matrici monocolore (64 LED) per un dollaro o due .

Non otterrai un vero PWM con un AVR e registri a scorrimento su questi molti LED, ma potresti essere in grado di spremere 2-4 livelli di luminosità. Dovresti eseguire i numeri e vedere cosa è possibile.

Allegro crea alcuni pratici registri a spostamento costante del dissipatore di corrente progettati specificamente per il controllo di array di LED, in modo che non siano necessarie resistenze extra, il che renderà anche le cose più semplici. Potresti non essere in grado di pilotare i LED direttamente dall'uscita AVR se non è in grado di fornire energia sufficiente, quindi dovrai utilizzare i transistor. Puoi metterli in array in un singolo IC , risparmiando anche un po 'di lavoro.


tutti i punti molto buoni!
Jason S,

5

Non ho idea della gamma di PWM di cui hai bisogno per un LED, ma ho lavorato su un controller PWM a 64 canali per un'applicazione di servocontrollo che può darmi impulsi tra 600us e 2,4ms. Questo utilizza CD74HCT238E (demultiplexor a 3-8 linee) per generare 64 canali da 8 pin I / O su un ATMega168 ed è controllabile tramite semplici comandi seriali. Suppongo che potresti collegare più versioni di una versione modificata di questo controller insieme su una linea seriale e indirizzare tutti i 500 LED ... Probabilmente potresti usare la versione ATTiny2313 del controller poiché i requisiti del tuo firmware sarebbero più semplici.

Il mio blog contiene l'origine dell'assemblaggio, gli schemi e i dettagli del processo di progettazione.


5

Dai un'occhiata ai circuiti integrati "driver LED" su mouser / digikey. TI, ad esempio, crea un sacco di driver con una varietà di interfacce (I2C, SPI) che sicuramente soddisferebbero le tue esigenze. La maggior parte di questi driver è progettata per essere concatenata in modo che l'uscita seriale da uno venga inserita nel seriale in un altro.

Ad esempio, qualcosa come il TLC5940 offre un controllo PWM a 16 canali. Quindi, fondamentalmente è un registro a scorrimento a 16 bit a corrente costante con controllo PWM in scala di grigi a 12 bit. Posso consigliare quel particolare IC poiché ho contribuito a progettare un display 80x16 con esso.


4

Mondomatrix crea alcune schede driver LED indirizzabili seriali (rs-485) ed è basato sulla piattaforma Arduino: http://www.displayduino.com/ Potresti essere in grado di mettere insieme un sistema usando quell'hardware abbastanza facilmente


4

Se non vuoi troppi bit di controllo PWM per ogni LED e vuoi evitare di avere un fumble di processore con 500 LED ogni ciclo PWM, puoi controllare 8 LED con N bit di luminosità usando N 74HC595 o chip equivalenti . Collegare le uscite di tutti i chip N insieme e collegare le abilitazioni ad alcuni circuiti che abiliteranno solo uno alla volta con tempismo adeguato. Disporre in modo che il primo chip sia abilitato per metà del tempo, il secondo sarà abilitato per metà del resto, ecc.

Qualsiasi ricarica dei registri a scorrimento deve essere sincronizzata con la frequenza PWM, in modo da ridurre al minimo gli effetti di aliasing (ad esempio se un livello di luminosità cambiava rapidamente tra 0111 e 1000, il punto nel ciclo PWM in cui si è verificato l'interruttore potrebbe modificare momentaneamente la luminosità apparente ).

Sebbene dover utilizzare più uscite 74HC595 per ciascun LED possa essere fastidioso, questo approccio è probabilmente il più semplice che potrebbe mantenere livelli di luminosità diversi senza un intervento continuo della CPU.


3

Questo non risponde direttamente alla domanda, ma un altro aspetto che potresti dover considerare è la possibile variabilità della luminosità tra i LED nel tuo lotto 500. Ciò è particolarmente importante se questi LED sono montati uno accanto all'altro, come in una matrice o in display a 7 segmenti. Vedi questa risposta per maggiori dettagli su come affrontare questo problema, in particolare, usando la correzione del punto per compensare le variazioni della luminosità del LED.

Ho riscontrato questo problema quando ho ottenuto 200 LED rossi da 1 mm per un set di grandi display a 7 segmenti che stavo costruendo. La mia soluzione economica per risolvere il problema comportava quanto segue:

  1. Ho costruito un tester LED in una breadboard per classificare gruppi di led in varie categorie di luminosità
  2. Ho montato ciascun segmento utilizzando LED della stessa categoria (nel mio progetto, ogni segmento consisteva di 5 LED montati in serie)
  3. Ho compensato la differenza nella luminosità di ciascun segmento usando resistori di limitazione della corrente diversi. Ad esempio, per un segmento con LED più luminosi, utilizzerei un resistore da 100 ohm, mentre, per un altro segmento con LED dimmer, utilizzerei resistori da 120 ohm.

1
Punto valido, ma non risponde alla domanda.
Matt Young,

1
@MattYoung Concordato. La domanda è ampiamente risposta da tutte le altre risposte. Volevo solo integrare quelle risposte, affrontando un problema secondario che potrebbe influire sulla progettazione del PO.
Ricardo,


1

XMOS utilizza Macroblock MBI5026 con i loro kit di piastrelle a LED. Penso che siano utilizzati nella maggior parte degli altri sistemi professionali.

Leon


1

I chip driver dedicati con interfacce seriali saranno probabilmente la strada migliore. Avere a che fare con registri a turni individuali significherà probabilmente un circuito molto complesso. Almeno Maxim e TI ne fanno un po '. Non ricordo se uno dei due ha un modello particolarmente adatto a questo.

Ci vorrà ancora molto hardware.

Per quanto riguarda potenza, programmazione e bus, la scheda tecnica di ciascun driver avrà probabilmente la maggior parte delle informazioni necessarie.


1

Nel regno del software, se il numero di impostazioni di luminosità distinte di cui si ha bisogno non è troppo grande, può essere utile archiviare i dati in formato "bit-planare" (come descritto nella mia altra risposta basata su hardware) e quindi avere il le routine di output utilizzano operatori booleani per agire su 8 pixel contemporaneamente. Per la massima efficienza, ciò richiederà di avere più routine di output separate, utilizzate per diverse parti del ciclo PWM; ad esempio, se si desidera utilizzare valori di luminosità a 4 bit, si utilizzerebbero otto routine del modulo:

  movf bit0Comp, w; Dovrebbe essere 00 o FF a seconda del bit 0 del confronto (FF se chiaro)
  iorwf POSTINCF, w; Bit 0 di dati; usa sempre IORWF
  andwf POSTINCF, w; Bit 1 di dati; usare IORWF se è impostato il bit 1 di comparand; ANDWF se chiaro
  andwf POSTINCF, w; Bit 2 di dati; Utilizzare IORWF se è impostato il bit 1 di comparand; ANDWF se chiaro
  andwf POSTINCF, w; Bit 2 di dati; Utilizzare IORWF se è impostato il bit 1 di comparand; ANDWF se chiaro
  movwf SPIREG; Memorizza il byte risultante (bit impostati se> = comparando)

Si utilizzerebbero diverse combinazioni di IORWF e ANDWF, a seconda del valore del confronto. Si noti che utilizzando questo approccio come illustrato, è possibile aggiornare i valori di luminosità dei pixel in qualsiasi punto del ciclo PWM senza sfarfallio, a condizione che tutti e quattro i bit vengano scritti tra le chiamate alla routine di spostamento del display o facendo in modo che la routine di aggiornamento dei pixel determini se il il prossimo turno produrrà un "1" o uno "0" per il pixel, e impostando o cancellando tutti i bit del pixel (qualunque operazione lo farebbe fare comunque quello che avrebbe fatto) e quindi scrivere qualsiasi bit il cui valore dovrebbe essere opposto. Si noti inoltre che è possibile ottenere scale di luminosità arbitrarie non lineari variando i tempi degli aggiornamenti del display o utilizzando alcuni valori di confronto e più di una volta in un ciclo PWM.


1

FPGA o CPLD possono essere utili per tali attività poiché offrono molti pin I / O. Scegli il più semplice ed economico. Se uno non è abbastanza, usa un paio.


Puoi darci qualche dettaglio in più sul perché questa è una buona opzione, in questo momento lo so, ma so quali sono le opzioni e quali sono le tecnologie suggerite che elenchi, il poster originale (OP) probabilmente non ha tale un sottofondo.
Kortuk,

Non sono sicuro che sia l'opzione migliore, ma ho voluto che fosse menzionato per completezza. Se si controllano 500 LED con PWM, in un modo o nell'altro, alla fine sono necessari 500 fili controllabili singolarmente. È difficile trovare un microcontrollore con così tanti pin di uscita. Ci sono molti modi per aggirare questo usando ancora microcontrollori, ma uno o un paio di CPLD / FPGA economici potrebbero facilmente fornire quei pin di uscita.
Carl,

1

Puoi quasi certamente farlo facilmente usando un PSoC3 o PSoC5 .

I chip PSoC sono microcontrollori che contengono hardware digitale riconfigurabile, un po 'come un FPGA o un CPLD. Ciò significa che puoi creare circuiti complessi per fare cose insolite come guidare 500 LED con PWM. Inoltre, puoi probabilmente implementare il tutto usando i blocchi digitali riconfigurabili, il che significa che la parte CPU del chip deve solo scrivere le luminosità LED desiderate in un array.

504 LED si inseriscono in un rettangolo 21 x 24. Se avessi 24 canali PWM e 21 GPIO, allora potresti farlo funzionare. Indovina un po? Il PSoC ha molto di più.

È possibile impostare facilmente 24 canali PWM su un PSoC e configurare altri 21 pin per far parte di un registro a scorrimento. Quindi, configura alcuni canali DMA per pompare byte dalla memoria nelle uscite PWM e ridi. Tutto ciò che la CPU deve fare ora è generare la grafica. La PSoC3 ha un core 8051 a 8 bit, mentre la PSoC5 ha un ARM a 32 bit. Fai la tua scelta. Gli unici circuiti integrati esterni necessari sono alcuni ULN2803 per fornire la corrente di azionamento elevata per le file. Le uscite PWM dovrebbero avere abbastanza unità di corrente per singoli LED.


Questo è eccessivo per la guida di LED. Esistono driver LED dedicati, economici e pre-progettati realizzati per concatenare grandi quantità come questa, che vengono sempre utilizzati per schermi giganteschi. Non è necessario reinventare tutto ciò e per costi maggiori.
nemik,

@nemik - In realtà, il costo totale dei chip (dal costoso Farnell) è di soli £ 6,80.
Rocketmagnet

0

Sfruttare le economie di scala. Siti cinesi come Aliexpress vendono fili LED basati su WS2811 per ~ $ 15 per 50 LED. Sono indirizzabili individualmente, brillanti, generalmente impermeabili e hanno PWM per la luminosità. Nessuno dei registri di saldatura o di turno per cui scherzare. Fare tutto questo da solo, scommetto, ti costerà di più, richiederà molto più tempo ed è molto frustrante. Inoltre sei a Oz, quindi la spedizione dalla Cina non sarà troppo costosa.

Questi sono realizzati per realizzare display a LED giganti, quindi tendono ad essere piuttosto economici. Assicurati di reiniettare la potenza ogni 50 LED circa per ottenere le migliori prestazioni.

Ci sono anche librerie Arduino per renderle facili da usare.


1
$ 15 per 50 LED? Quindi per 500 LED, questo costa $ 150? E hai il coraggio di dirmi che la mia soluzione è costosa? -1
Rocketmagnet

Inoltre, puoi fornire un link a questo. WS801 non funziona bene su Google, né si presenta alla ricerca di Aliexpress
Rocketmagnet

Scusate, intendevo WS2811, come questi aliexpress.com/store/product/… o, senza oscuramento PWM, questi aliexpress.com/store/product/…
nemik

Un segnale seriale per pilotare 50 LED con dimmer PWM. Grazie, questo è esattamente quello che sto cercando. Ma un registro a scorrimento standard fornisce un pin "latch" per copiare i dati bufferizzati nelle uscite dopo la trasmissione dell'intero frame. Non ci sono chiavistelli qui, quindi mi aspetto un rumore evidente ad alte frequenze di aggiornamento. I chip supportano dati a 400 Kbps con 15 bit per pixel, quindi lo schermo visualizzerà senza senso per 1,9 millisecondi mentre il frame si aggiorna.
nialsh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.