Sommario:

Display LED RGB da 64 pixel - Un altro clone di Arduino: 12 passaggi (con immagini)
Display LED RGB da 64 pixel - Un altro clone di Arduino: 12 passaggi (con immagini)

Video: Display LED RGB da 64 pixel - Un altro clone di Arduino: 12 passaggi (con immagini)

Video: Display LED RGB da 64 pixel - Un altro clone di Arduino: 12 passaggi (con immagini)
Video: PIXEL ANIMATION | ARDUINO | DIY | PIXEL ART | LED MATRIX DISPLAY | WITH TIMESTAMPS | STEP BY STEP 2024, Novembre
Anonim
Display LED RGB da 64 pixel - Un altro clone di Arduino
Display LED RGB da 64 pixel - Un altro clone di Arduino
Display LED RGB da 64 pixel - Un altro clone di Arduino
Display LED RGB da 64 pixel - Un altro clone di Arduino
Display LED RGB da 64 pixel - Un altro clone di Arduino
Display LED RGB da 64 pixel - Un altro clone di Arduino

Questo display è basato su una matrice LED RGB 8x8. A scopo di test è stato collegato a una scheda Arduino standard (Diecimila) utilizzando 4 registri a scorrimento. Dopo averlo fatto funzionare, l'ho permatizzato su un PCB favoloso. I registri a scorrimento sono larghi 8 bit e sono facilmente interfacciabili con il protocollo SPI. La modulazione dell'ampiezza dell'impulso viene utilizzata per mescolare i colori, ne parleremo più avanti. Parte della RAM dell'MCU viene utilizzata come framebuffer per contenere l'immagine. La RAM video viene analizzata da una routine di interruzione in background, quindi l'utente può fare altre cose utili come parlare con un PC, leggere pulsanti e potenziometri. Maggiori informazioni su "Arduino": www.arduino.cc

Passaggio 1: modulazione dell'ampiezza dell'impulso per la miscelazione dei colori

Modulazione dell'ampiezza dell'impulso per la miscelazione dei colori
Modulazione dell'ampiezza dell'impulso per la miscelazione dei colori

Moduli a larghezza di impulso - COSA? La modulazione a larghezza di impulso essenzialmente consiste nell'accendere e spegnere abbastanza rapidamente l'alimentazione fornita a un dispositivo elettrico. La potenza utilizzabile risulta dalla media matematica della funzione d'onda quadra presa nell'intervallo di un periodo. Più a lungo la funzione rimane in posizione ON, maggiore sarà la potenza. Il PWM ha lo stesso effetto sulla luminosità dei LED di un dimmer sulle luci AC. Il compito da svolgere è controllare individualmente la luminosità di 64 LED RGB (= 192 LED singoli!) In modo economico e semplice, in modo da poter ottenere il tutto spettro di colori. Preferibilmente non dovrebbero esserci sfarfallio o altri effetti di disturbo. La percezione non lineare della luminosità mostrata dall'occhio umano non verrà presa in considerazione qui (ad esempio, la differenza tra il 10% e il 20% di luminosità sembra "maggiore" rispetto a tra il 90% e il 100%). L'immagine (1) illustra il principio di funzionamento di l'algoritmo PWM. Supponiamo che al codice venga assegnato un valore di 7 per la luminosità del LED (0, 0). Inoltre sa che c'è un massimo di N step di luminosità. Il codice esegue N loop per tutti i possibili livelli di luminosità e tutti i loop necessari per servire ogni singolo LED in tutte le file. Nel caso in cui il contatore di loop x nel loop di luminosità sia inferiore a 7, il LED si accende. Se è maggiore di 7, il LED è spento. Facendo questo molto rapidamente per tutti i LED, livelli di luminosità e colori di base (RGB), ogni LED può essere regolato individualmente per mostrare il colore desiderato. Le misurazioni con un oscilloscopio hanno mostrato che il codice di aggiornamento del display richiede circa il 50% del tempo della CPU. Il resto può essere utilizzato per effettuare comunicazioni seriali con un PC, leggere pulsanti, parlare con un lettore RFID, inviare I2dati C ad altri moduli…

Passaggio 2: parlare con registri a scorrimento e LED

Parlare con Shift Register e LED
Parlare con Shift Register e LED
Parlare con Shift Register e LED
Parlare con Shift Register e LED

Un registro a scorrimento è un dispositivo che consente di caricare i dati in serie e un'uscita parallela. L'operazione opposta è possibile anche con l'apposito chip. C'è un buon tutorial sui registri a scorrimento sul sito web di arduino. I LED sono pilotati da registri a scorrimento a 8 bit del tipo 74HC595. Ogni porta può generare o assorbire circa 25 mA di corrente. La corrente totale per chip assorbito o prelevato non deve superare i 70 mA. Questi chip sono estremamente economici, quindi non pagare più di circa 40 centesimi per pezzo. Poiché i LED hanno una caratteristica di corrente/tensione esponenziale, devono essere presenti resistori di limitazione della corrente. Usando la legge di Ohm: R = (V - Vf) / IR = resistore di limitazione, V = 5 V, Vf = tensione diretta del LED, I = corrente desiderata LED rossi hanno una tensione diretta di circa 1,8 V, il blu e il verde vanno da 2,5 V a 3,5 V. Usa un semplice multimetro per determinarlo. Per una corretta riproduzione del colore dovresti prendere in considerazione alcune cose: sensibilità spettrale dell'occhio umano (rosso/blu: cattivo, verde: buono), efficienza del LED a una certa lunghezza d'onda e corrente. In pratica basta prendere 3 potenziometri e regolarli fino a quando il LED non mostra la giusta luce bianca. Ovviamente la corrente massima del LED non deve essere superata. Ciò che è importante anche qui è che il registro a scorrimento che guida le righe deve fornire corrente a 3x8 LED, quindi è meglio non aumentare la corrente troppo in alto. Ho avuto successo con resistori di limitazione di 270Ohm per tutti i LED, ma questo dipende ovviamente dalla marca della matrice LED. I registri a scorrimento sono interfacciati con la seriale SPI. SPI = Interfaccia periferica seriale (Immagine (1)). Al contrario delle porte seriali sui PC (asincrona, nessun segnale di clock), SPI necessita di una linea di clock (SRCLK). Poi c'è una linea di segnale che dice al dispositivo quando i dati sono validi (chip select / latch / RCLK). Infine ci sono due linee dati, una si chiama MOSI (master out slave in), l'altra si chiama MISO (master in slave out). SPI viene utilizzato per interfacciare circuiti integrati, proprio come I2C. Questo progetto necessita di MOSI, SRCLK e RCLK. Inoltre viene utilizzata anche la linea di abilitazione (G). Un ciclo SPI viene avviato tirando la linea RCLK su LOW (Immagine (2)). L'MCU invia i suoi dati sulla linea MOSI. Il suo stato logico è campionato dal registro a scorrimento sul fronte di salita della linea SRCLK. Il ciclo viene terminato riportando la linea RCLK su HIGH. Ora i dati sono disponibili alle uscite.

Passaggio 3: schematico

Schema
Schema
Schema
Schema

L'immagine (1) mostra come sono cablati i registri a scorrimento. Sono collegati a margherita, quindi i dati possono essere spostati in questa catena e anche attraverso di essa. Quindi aggiungere più registri a scorrimento è facile.

L'immagine (2) mostra il resto dello schema con MCU, connettori, quarzo… Il file PDF allegato contiene l'intero lavoro, ideale per la stampa.

Passaggio 4: codice sorgente C++

Codice sorgente C++
Codice sorgente C++
Codice sorgente C++
Codice sorgente C++
Codice sorgente C++
Codice sorgente C++

In C/C++ di solito si devono prototipare le funzioni prima di codificarle.#include int main(void);void fai_qualcosa(void);int main(void) { fai_qualcosa();}void fai_qualcosa(void) { /* commento */ }L'IDE di Arduino non richiede questo passaggio, poiché i prototipi di funzioni vengono generati automaticamente. Pertanto i prototipi di funzione non verranno visualizzati nel codice mostrato qui. Immagine (1): setup() functionImmagine (2): funzione spi_transfer() che utilizza l'SPI hardware del chip ATmega168 (gira più velocemente)Immagine (3): codice framebuffer che utilizza un'interruzione di overflow del timer1. Pezzi di codice che hanno un aspetto leggermente criptico per i principianti, ad es while(!(SPSR & (1<<SPIF))) {} usa direttamente i registri dell'MCU. Questo esempio a parole: "mentre il bit SPIF nel registro SPSR non è impostato non fa nulla". Voglio solo sottolineare che per i progetti standard non è davvero necessario occuparsi di queste cose così strettamente legate all'hardware. I principianti non dovrebbero essere spaventati da questo.

Passaggio 5: gadget finito

Gadget finito
Gadget finito
Gadget finito
Gadget finito
Gadget finito
Gadget finito

Dopo aver risolto tutti i problemi e aver eseguito il codice, ho dovuto creare un layout PCB e inviarlo a una casa favolosa. Sembra molto più pulito:-)Immagine (1): scheda controller completamente popolataImmagine (2): lato anteriore del PCB nudoImmagine (2): lato posterioreCi sono connettori che interrompono PORTC e PORTD del chip ATmega168/328 e 5V/GND. Queste porte contengono le linee seriali RX, TX, I2Linee C, linee I/O digitali e 7 linee ADC. Questo è inteso per impilare gli scudi sul retro della scheda. La spaziatura è adatta per l'utilizzo di perfboard (0.1in). Il bootloader può essere flashato utilizzando l'intestazione ICSP (funziona con USBtinyISP di adafruit). Non appena fatto, usa semplicemente un adattatore seriale FTDI USB/TTL standard o simile. Ho anche aggiunto un jumper per la disattivazione del ripristino automatico. Ho anche preparato un piccolo script Perl (vedi il mio blog), che abilita l'auto-reset con cavi FTDI che di solito non funziona immediatamente (RTS vs. linea DTR). Funziona su Linux, forse su MAC. I circuiti stampati e alcuni KIT fai da te sono disponibili sul mio blog. È necessaria la saldatura SMD! Vedere i file PDF per le istruzioni di costruzione e le sorgenti per le matrici LED.

Passaggio 6: applicazione: monitoraggio del carico della CPU per Linux utilizzando Perl

Questo è un monitor di carico molto semplice con un grafico della cronologia. Si basa su uno script Perl che raccoglie la "media di carico" del sistema ogni 1 secondo utilizzando iostat. I dati sono memorizzati in un array che viene spostato ad ogni aggiornamento. I nuovi dati vengono aggiunti in cima all'elenco, la voce più vecchia viene eliminata. Informazioni più dettagliate e download (codice…) sono disponibili sul mio blog.

Passaggio 7: applicazione: conversazione con altri moduli utilizzando I²C

Applicazione: parlare con altri moduli utilizzando I²C
Applicazione: parlare con altri moduli utilizzando I²C

Questa è solo una prova di principio e di gran lunga non è la soluzione più semplice per questo lavoro. Usando I2C permette di indirizzare direttamente fino a 127 schede "slave". Qui la scheda a destra nel video è il "master" (che avvia tutti i trasferimenti), la scheda a sinistra è lo slave (in attesa di dati). io2C necessita di 2 linee di segnale e delle solite linee di alimentazione (+, -, SDA, SCL). Trattandosi di un bus, tutti i dispositivi sono collegati ad esso in parallelo.

Passaggio 8: Applicazione: "Game Cube":-)

Applicazione
Applicazione

Solo un pensiero bizzarro. Questo si adatta anche alla custodia in legno mostrata nella pagina introduttiva. Ha 5 pulsanti sul retro che potrebbero essere usati per giocare a un semplice gioco. FINE ?

Passaggio 9: visualizzazione di immagini / animazioni su Matrix - Quick Hack

Visualizzazione di immagini / animazioni su Matrix - Quick Hack
Visualizzazione di immagini / animazioni su Matrix - Quick Hack
Visualizzazione di immagini / animazioni su Matrix - Quick Hack
Visualizzazione di immagini / animazioni su Matrix - Quick Hack
Visualizzazione di immagini / animazioni su Matrix - Quick Hack
Visualizzazione di immagini / animazioni su Matrix - Quick Hack
Visualizzazione di immagini / animazioni su Matrix - Quick Hack
Visualizzazione di immagini / animazioni su Matrix - Quick Hack

Quindi ha solo 8x8 pixel e pochi colori disponibili. Per prima cosa usa qualcosa come Gimp per ridimensionare la tua immagine preferita esattamente a 8x8 pixel e salvala come formato raw ".ppm" (non ASCII). PPM è facile da leggere ed elaborare in uno script Perl. L'utilizzo di ImageMagick e lo strumento da riga di comando "convert" non funzionerà correttamente. Carica il nuovo codice arduino, quindi utilizza lo script Perl per caricarlo sul controller. Lo sfarfallio è solo una mancata corrispondenza tra l'aggiornamento del LED e il frame rate della mia fotocamera. Dopo aver aggiornato un po' il codice, funziona abbastanza velocemente. Tutte le immagini vengono trasferite in tempo reale su seriale come le vedi. Le animazioni più lunghe potrebbero essere memorizzate in una EEPROM esterna come avviene in varie schede spoke-pov.

Passaggio 10: controllo interattivo delle animazioni archiviate

Perché lasciare che il microcontrollore si diverta tutto? Il culto di Arduino riguarda il calcolo fisico e l'interazione, quindi aggiungi un potenziometro e prendi il controllo! L'utilizzo di uno degli 8 ingressi del convertitore da analogico a digitale lo rende molto semplice.

Passaggio 11: visualizzazione di video in diretta

L'uso di uno script Perl e di alcuni moduli rende abbastanza facile mostrare video quasi dal vivo su sistemi X11. È stato codificato su Linux e potrebbe funzionare anche su MAC. Funziona così: - ottenere la posizione del cursore del mouse - acquisire una casella di NxN pixel centrata sul cursore - ridimensionare l'immagine a 8x8 pixel - inviarla alla scheda LED- ripetere

Passaggio 12: più luce quasi gratis

Più luce quasi gratis
Più luce quasi gratis

Con solo due passaggi la luminosità può essere aumentata un po'. Sostituire i resistori da 270Ω con quelli da 169Ω e trasportare un altro registro a scorrimento 74HC595 su IC5.

Consigliato: