Come posso controllare molti LED con pochi pin sul mio micro?


10

Sto usando un Atmel ATtiny13 che ha un I / O a 6 pin. Vorrei controllare circa 15 LED ma non sono sicuro di come collegare tutto. Senza il multiplexing di alcun tipo, sembra che sarei in grado di controllare solo 6 LED alla volta. Sono limitato a soli 6 LED a causa delle dimensioni del microcontrollore?



3
Non dimenticare di confrontare le tue opzioni con il costo di acquisto di un microcontrollore leggermente più economico. Prestare inoltre attenzione ai limiti per porta e alla corrente totale.
Joeforker

Quando ho iniziato a lavorare con i micro, qualche tempo fa, questa è una domanda che avrei voluto fosse facile da trovare con risposte chiare. Sono riuscito a conoscere il charlieplexing e ad implementarlo con successo, ma volevo ricreare la domanda qui con l'eccellente qualità delle risposte della comunità SE.
JYelton

1
@joeforker Hai ragione, il costo per un micro con più pin era piuttosto minimo, considerando che il mio progetto era unico. A un certo punto ho pensato di utilizzare un micro con circa 20 pin IO per realizzare il lavoro, ma uno dei miei obiettivi era un ingombro ridotto del circuito. Inoltre, fantastico aggettivo pinnier !
JYelton

Risposte:


18

Esistono diversi metodi che possono essere utilizzati per pilotare un numero elevato di LED da pochi pin IO.

Il più semplice è il multiplexing standard di visualizzazione riga / colonna. Con questa tecnica, è possibile pilotare LED con n pin IO. Matematicamente, il ciclo di lavoro è:(n/2)2n

1mioniomum(modelli di riga unici, modelli di colonna unici)

Ciò significa che questa tecnica ha un duty cycle del 100% quando tutti i LED sono accesi (o tutte le righe o tutte le colonne sono identiche) e un duty cycle di quando deve essere illuminata una linea diagonale (o tutte le righe sono diverse ). Il ciclo di lavoro è garantito al 100% solo quando si accendono tutti i LED o un LED (o zero LED, ma ciò non conta molto).1/n

Leggermente più complesso è Charlieplexing . Con questa tecnica, è possibile pilotare LED con n pin IO. Solo n - 1 LED possono essere accesi contemporaneamente con questa tecnica. Matematicamente, il ciclo di lavoro è:n2-nnn-1

1set simultanei minimi

dove un insieme simultaneo è un gruppo unico di LED che ha un anodo comune o un catodo comune. (Questo non è stato dimostrato, è proprio quello a cui sono arrivato dopo aver riflettuto sul problema per un minuto. Se il ciclo di lavoro è importante per te, ti consigliamo di approfondire ulteriormente.) Questo è un calcolo molto più complesso sia intellettualmente e computazionalmente rispetto al calcolo equivalente per il multiplexing standard. In effetti, si ottiene un duty cycle di quando tutti i LED sono accesi ma alcuni (solo alcuni) modelli di n-1 o meno LED possono avere un duty cycle del 100%. Il ciclo di lavoro è garantito al 100% solo quando si accende 1 LED.1/n

L'ultimo metodo che menzionerò è l'uso di un registro a scorrimento o di un IO expander. Con due pin (interfaccia dati / clock non elaborati, I2C o SPI unidirezionale), è possibile controllare un numero arbitrariamente elevato di LED. Il ciclo di lavoro per qualsiasi modello è del 100%, ma la velocità di aggiornamento è inversamente proporzionale al numero di LED. Questo è il metodo più costoso. Per 15 LED, sarà probabilmente più economico passare a un micro con tanti pin IO.


+1 per spiegare un po 'l'aspetto del duty cycle. Nella seconda frase su Charlieplexing, intendevi "guidare n ^ 2-n LED con n pin IO?
JYelton

Il charlieplexing può essere fatto in modo molto simile al multiplexing, se si omette semplicemente una luce per ogni riga. In realtà, potrebbe essere possibile "riguadagnare" quella luce aggiungendo un diodo, anche se a meno che i driver di colonna non siano uscite a corrente costante, renderlo corrispondente alla luminosità degli altri potrebbe essere difficile.
supercat

11

n×(n-1)n

Esempio:

Sei LED su 3 pin:

PINS        LEDS
0 1 2   1 2 3 4 5 6
0 0 0   0 0 0 0 0 0
0 1 Z   1 0 0 0 0 0
1 0 Z   0 1 0 0 0 0
Z 0 1   0 0 1 0 0 0
Z 1 0   0 0 0 1 0 0
0 Z 1   0 0 0 0 1 0
1 Z 0   0 0 0 0 0 1
0 0 1   0 0 1 0 1 0
0 1 0   1 0 0 1 0 0
0 1 1   1 0 0 0 1 0
1 0 0   0 1 0 0 0 1
1 0 1   0 1 1 0 0 0
1 1 0   0 0 0 1 0 1
1 1 1   0 0 0 0 0 0

Schema di Charlieplexing con 3 pin di uscita


Grazie per il set di dati dei pin di output e per uno schema utile.
JYelton,

1
Un altro modo di disegnare lo schema è come una griglia NxN, ma guidare solo le colonne e sostituire la diagonale primaria con i corti della riga-colonna.
supercat

significa che non posso accenderli tutti in una volta? Vuol dire che se voglio accenderli tutti in una volta, devo fare abbastanza tempo per ingannare gli occhi?
MaNyYaCk,

@MaNyYaCk Sì. Hai ragione.
Daniel Grillo,

8

Senza multiplexing (direct drive) sei limitato a 6 LED.

Con il charlieplexing puoi guidare n * (n-1) LED da n pin.

Con gli espansori I / O o i registri a scorrimento è possibile pilotare un numero praticamente illimitato di LED.
Esempio: MCP23008 Expander I / O I2C a 8 bit


Puoi approfondire quali sarebbero gli espansori I / O?
JYelton

3
Un expander I / O è un chip esterno che contiene pin e registri I / O. È possibile utilizzare un bus di comunicazione standard come I2C o SPI per comunicare con loro.
mjh2007,

+1 Puoi guidare molti LED con TLC594 di TI ( focus.ti.com/lit/ds/symlink/tlc5940.pdf ), ma potrebbe essere eccessivo per molti lavori. search.digikey.com/scripts/DkSearch/…
kenny

Grazie - Dovrei progettare un progetto che utilizza espansori I / O per forzare il mio apprendimento del loro utilizzo.
JYelton


2

Ecco un esempio di charlieplexing che ho creato.

È un simulatore di fascio di faro e utilizza una serie di 12 LED charlieplexed a 4 GPIO per spazzare un raggio di luce attorno a un disco. C'è un video qui .

Il progetto è basato su PIC, io uso un PIC12f683 che è anche un 8 pin uP e potrebbe essere considerato paragonabile agli AVR 8 pin.

L'intensità del LED è guidata da un interruzione che fornisce un PWM a 32 step a circa 60Hz. È consentito accendere solo due LED alla volta, con un dazio del 50% per ciascun LED, poiché era tutto ciò di cui avevo bisogno. Offre inoltre un buon compromesso tra la frequenza di aggiornamento PWM e la risoluzione.

La codifica per l'utilizzo del charlieplexing in realtà è piuttosto semplice se ti attieni al metodo "classico" di illuminare un singolo LED in qualsiasi punto nel tempo con una frequenza di aggiornamento molto veloce. Elaborerò prima il PORT e il TRIS richiesti (registri specifici per foto) su carta, quindi memorizzerò i risultati in un array statico. Per accendere il LED x il PIC non resta che cercare il valore nell'indice dell'array [x] e scriverlo direttamente sul PORT (con un po 'di mascheramento per preservare lo stato degli altri pin non utilizzati nel charliplex)

Il mio progetto ha solo 12 LED non 15 o il massimo di 20 consentiti dai 5 GPIO poiché volevo mantenere un GPIO di riserva per lo sviluppo futuro.

Comunque ... ho pensato che potesse essere utile avere un esempio funzionante simile alla tua richiesta.

Il codice sorgente completo e gli schemi sono disponibili sul mio blog.


0

Un'altra opzione sarebbe quella di utilizzare i LED Neopixel. Hanno un IC di controllo integrato e hai solo bisogno di un pin per controllare tutti i LED che desideri. Ovviamente avrai bisogno di una fonte di alimentazione a LED separata adeguata quindi.

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.