Sommario:

Minidot 2 - l'Holoclock: 6 passaggi
Minidot 2 - l'Holoclock: 6 passaggi

Video: Minidot 2 - l'Holoclock: 6 passaggi

Video: Minidot 2 - l'Holoclock: 6 passaggi
Video: MahJong EASE Picking a Hand Live 2023 2-15 STATS ilovemahj E2 from PA #travel #mahjong #pennsylvania 2024, Dicembre
Anonim
Minidot 2 - l'Holoclock
Minidot 2 - l'Holoclock
Minidot 2 - l'Holoclock
Minidot 2 - l'Holoclock

Beh, forse holoclock è un po' impreciso… usa una pellicola a dispersione olografica sul davanti per dare un po' di profondità. /EEGLXQCSKIEP2876EE/e riutilizzare molto codice e circuiti dal mio Microdot che si trova qui: https://www.instructables.com/id/EWM2OIT78OERWHR38Z/EagleCAD e il codice Sourceboost è incluso nei file zip allegati. Perché? Il precedente Minidot era eccessivamente complesso, dal Microdot ho imparato a fare un RTC su un PIC usando solo un 32.768 crystal e non avevo bisogno di usare uno speciale chip RTC. Inoltre volevo eliminare i chip di visualizzazione del precedente Minidot. Quindi ora c'è solo un chip regolatore di potenza e un PIC16F88 …. solo due chip. Gli altri motivi per un aggiornamento erano che il mio Minidot stava diventando un po' inaffidabile a causa della scheda di commutazione separata e volevo una dissolvenza morbida tra i modelli di punti come oltre a una sorta di sensore di luce ambientale per oscurare il display di notte. L'altro Minidot era a luminosità fissa e illuminava una stanza di notte. Il dispositivo è stato costruito con l'ausilio del pacchetto software EagleCad e del compilatore Sourceboost. Avrai bisogno di avere una certa esperienza con l'elettronica e la programmazione di controller PIC per iniziare questo progetto. Si prega di notare che questo non è un'istruzione né sull'elettronica né sulla programmazione PIC, quindi si prega di mantenere le domande relative al design del Miniclock. Fare riferimento alle istruzioni sopra oa molte altre istruzioni su questo sito per consigli sull'utilizzo di EagleCad o sulla programmazione dei PIC. Quindi eccolo qui….. Minidot 2, The Holoclock……o Minidot The Next Generation………….

Passaggio 1: il circuito

Il circuito
Il circuito
Il circuito
Il circuito
Il circuito
Il circuito

Questo circuito è molto simile al Microdot. Nota che l'array charlieplex è praticamente identico … solo alcuni pin sono stati spostati.

Un cristallo da 20 Mhz è stato aggiunto al circuito Microdot per eseguire il clock del PIC molto più velocemente, questo consente una scansione più rapida dell'array e consente l'implementazione di un algoritmo di regolazione della luminosità. L'algoritmo di attenuazione era molto importante per far funzionare una dissolvenza incrociata e la funzione di luce ambientale. Questo sarebbe stato impossibile con il Microdot, a causa della velocità di clock più lenta poiché alcuni cicli di scansione dovevano essere spesi per l'attenuazione. Vedere la sezione successiva per una descrizione della funzionalità Dimming. Le altre cose da notare sono l'uso di un regolatore della pompa di carica MCP1252 per fornire 5V, il mio chip preferito al momento. Se modificassi il circuito potresti usare un semplice vecchio 7805 …… ho solo un certo numero di questi pratici chip in giro. Ora ho spostato gli interruttori in avanti, risparmiando il giocherellare sul retro dell'orologio dopo le interruzioni di corrente per ripristinare l'ora e ora tutto è solo un PCB … nessun problema di cablaggio. Degna di nota è anche l'inclusione di un LDR. Questo viene utilizzato in un partitore di tensione che viene rilevato dal pin A/D sul PIC. Quando il PIC rileva che il livello di luce ambientale è basso (ovvero di notte) l'algoritmo di regolazione della luminosità mantiene l'array charlieplex scuro per più cicli rispetto a quando il livello di luce è alto. Non sono riuscito a trovare un simbolo LDR nella libreria Eaglecad, quindi ho usato solo un simbolo LED…..non lasciarti ingannare, è un LDR. Vedere l'immagine reale del PCB di seguito. Una cosa da notare quando si utilizzano LED multicolori in un array charliplex. È necessario assicurarsi che la tensione diretta dei LED sia più o meno la stessa. In caso contrario, potrebbero verificarsi percorsi di corrente vagante e più LED si accenderanno. Pertanto, l'utilizzo di LED di potenza da 5 mm o superiore per questa configurazione non funzionerà poiché di solito c'è una certa differenza tra i LED verde/blu e i LED rosso/giallo. In questo caso ho utilizzato 1206 led SMD e in particolare led verde/blu ad alta efficienza. Le tensioni in avanti non erano un problema qui però. Se si desidera utilizzare un mix di LED ad alta potenza verde/blu e rosso/giallo in un array charlieplex, è necessario separare i diversi colori in due array charliplex. Ci sono numerose spiegazioni di charlieplexing che possono essere cercate su Google……non entrerò nei dettagli qui. Lascio a te il compito di fare qualche ricerca. (Premi la piccola icona 'i' nell'angolo della foto qui sotto per vedere una versione più grande)

Passaggio 2: l'algoritmo di regolazione della luminosità - Modulazione dell'ampiezza dell'impulso Charliplexed

L'algoritmo di regolazione della luminosità - Modulazione dell'ampiezza dell'impulso Charliplexed
L'algoritmo di regolazione della luminosità - Modulazione dell'ampiezza dell'impulso Charliplexed

Come accennato in precedenza, volevo che i diversi schemi di punti per il tempo si sbiadissero dolcemente piuttosto che passare da uno schema all'altro. Guarda il video per una dimostrazione. Al centro c'è il nuovo orologio Minidot, a destra il vecchio Minidot. Nota quanto è più bello quello nuovo. (Cordiali saluti, gli altri display sullo sfondo sono il display dello stato del mio supercomputer Minicray e la mia particella Nebulon catturata che alimenta il Minicray in un campo di confinamento magnetico di antimateria. Vedi qui: https://www.youtube.com/embed/bRupDulR4ME per una dimostrazione della camera di confinamento del nebulone) Se si cerca nel codice, aprire il file display.c. Nota che ci sono quattro array per mappare i valori tris/port per illuminare qualsiasi array particolare e due array (uno in più rispetto al codice Microdot) per definire quali LED dovrebbero essere illuminati per ogni particolare schema di LED.es:

// LED1 LED2 LED3 …unsigned char LEDS_PORTA[31] = { 0x10, 0x00, 0x00, …unsigned char LEDS_TRISA[31] = { 0xef, 0xff, 0xff, …unsigned char LEDS_PORTB[31] = { 0x00, 0x02, 0x04, …unsigned char LEDS_TRISB[31] = { 0xfd, 0xf9, 0xf9, …unsigned char nLedsA[30];unsigned char nLedsB[30];Per accendere ad esempio il LED1 è necessario impostare i registri TRIS TRISA:B = 0xef:0xfd e i registri PORT PORTA:B=0x10:0x00 e così via. Se scrivi i valori tris in binario noterai che in qualsiasi momento ci sono solo due uscite abilitate. Gli altri sono tutti impostati su Tri-state (quindi registro TRIS). Questo è fondamentale per Charlieplexing. Noterai anche che un'uscita è sempre un '1' logico e l'altro è sempre uno '0' logico… la cui direzione accende qualunque LED si trovi tra queste due linee di uscita. L'ultimo valore nella porta/tris arrays è un valore nullo per non accendere alcun LED. Nel Microdot, la funzione update_display ha fatto scorrere continuamente un altro array (nLeds) per vedere se quel particolare LED doveva essere illuminato. In caso affermativo, sono stati impostati i valori tris/port corrispondenti e il LED si è acceso per un periodo di tempo. In caso contrario, il valore nullo è stato inviato ai registri TRIS/PORT del PIC e nessun LED è stato acceso per un periodo di tempo. Quando è stato fatto abbastanza velocemente, questo ha dato uno schema. Il resto del programma leggeva periodicamente i valori RTC e formava un bel modello casuale in quell'array… e così il display cambiava. Per creare una funzione di attenuazione, questa è stata leggermente estesa in modo che dopo che i 30 LED si fossero illuminati (o no) allora sarebbero stati spesi periodi extra per l'invio di valori nulli se il display fosse stato oscurato…..per la massima luminosità non sarebbero stati spesi periodi extra. Se ripetuto se ci fossero molti periodi nulli sui LED illuminati, il display sarebbe fioco. In effetti si tratta di modulazione di larghezza di impulso multiplex…..o perché l'hardware è configurato in una disposizione charlieplex, quindi modulazione di larghezza di impulso charlieplexed. Il secondo diagramma seguente mostra la configurazione di base per questo. Lo chiamo frame di scansione. I primi 30 periodi della cornice vengono utilizzati per passare attraverso i LED…..e un numero variabile di periodi aggiuntivi definisce l'oscuramento del display. Questo ciclo si ripete. Più periodi nulli significano meno tempo di accensione di un LED per frame (perché il numero di periodi è aumentato). Nota che l'asse verticale non significa livello di tensione. Lo stato effettivo dei pin che vanno ai LED varia a seconda della sua posizione nell'array charlieplex…..nel diagramma significa solo acceso o spento. Ciò significava anche che la lunghezza totale del frame nel tempo aumentava, diminuendo così il refresh Vota. Man mano che i LED si attenuavano, iniziavano a lampeggiare, in altre parole. Quindi questo metodo è utile solo in una certa misura. Per l'orologio, era OK. Viene chiamata una funzione intermittente che legge il convertitore A/D sul PIC e imposta questo livello di luminosità. Se leggi il codice, controlla anche se il LED più vicino all'LDR è acceso e non esegue alcuna impostazione del livello in tal caso, questo interrompe l'illuminazione inaspettata del display quando il modello è cambiato. Successivamente la funzione di dissolvenza incrociata.

Passaggio 3: Algoritmo di attenuazione: l'effetto di dissolvenza incrociata e il doppio buffer

Algoritmo di attenuazione: l'effetto di dissolvenza incrociata e il doppio buffer
Algoritmo di attenuazione: l'effetto di dissolvenza incrociata e il doppio buffer

Il passaggio tra un pattern e il successivo era in precedenza immediato. Per questo orologio ho voluto mostrare un pattern che diminuisce gradualmente di luminosità e il pattern successivo che aumenta gradualmente… cioè una dissolvenza incrociata.

Non avevo bisogno di LED individuali da controllare a livelli di luminosità separati per fare una dissolvenza incrociata. Avevo solo bisogno del primo modello con una luminosità e il secondo con una luminosità bassa. Quindi, per un breve periodo, diminuirei leggermente la luminosità del primo e aumenterei il secondo… questo andrebbe avanti fino al secondo schema completamente. Quindi l'orologio avrebbe aspettato fino a quando il modello successivo sarebbe stato mostrato e ci sarebbe stata un'altra transizione. Quindi avevo bisogno di memorizzare due modelli. Quello attualmente visualizzato e il secondo motivo che stava per essere visualizzato. Questi sono negli array nLedsA e nLedsB. (nota nulla a che fare con le porte in questo caso). Questo è il doppio tampone. La funzione update_display() è stata modificata per scorrere otto frame e mostrare un numero di frame prima da un array, poi dall'altro. La modifica del numero di frame assegnati a ciascun buffer durante gli otto cicli ha definito la luminosità di ciascun pattern. Quando abbiamo finito di passare da un buffer all'altro, abbiamo scambiato i buffer "display" e "next display", in modo che la funzione di generazione del pattern scrivesse solo nel buffer "next display". Il diagramma qui sotto mostra questo si spera. Dovresti essere in grado di vedere che la transizione richiederà 64 frame di scansione. Nella foto, il piccolo riquadro mostra il diagramma di scansione della pagina precedente ridimensionato ad arte. Una parola sulla frequenza di aggiornamento. Tutto questo deve essere fatto molto rapidamente. Ora abbiamo due livelli di calcolo extra, uno per l'oscurità del display ambientale e uno per gli otto cicli di fotogrammi spesi per eseguire una transizione tra due buffer. Quindi questo codice dovrebbe essere scritto in assembly, ma è abbastanza buono in 'C'.

Fase 4: Costruzione - il PCB

Costruzione - il PCB
Costruzione - il PCB
Costruzione - il PCB
Costruzione - il PCB

Questo è piuttosto semplice. Solo un PCB a doppia faccia con alcuni componenti SMD sulla parte superiore. Scusa se sei una persona a foro passante, ma è molto più facile realizzare progetti SMD… meno fori da praticare. Dovresti avere una mano ferma, una stazione di saldatura a temperatura controllata e molta luce e ingrandimento per rendere le cose più facili.

L'unica cosa da notare nella costruzione del PCB è l'inclusione di un connettore per la programmazione del PIC. Questo si collega ai pin ICSP sul PIC e avrai bisogno di un programmatore ICSP. Ancora una volta ho usato un pratico connettore per il mio junkbox. Puoi ometterlo e saldare solo i fili ai pad, se lo desideri. In alternativa, se si dispone solo di un programmatore con socket, è possibile creare un'intestazione che si collega alla presa e quindi saldarla ai pad ICSP. Se lo fai, scollega Rx e collega Ry che sono solo collegamenti a zero ohm (io uso solo un blob di saldatura). Questo disconnetterà il resto dell'alimentazione del circuito dal PIC in modo che non interferisca con la programmazione. Un programmatore socketed usa semplicemente i pin ICSP come un programmatore ICSP, non c'è davvero nessuna magia coinvolta. È necessario eseguire questa operazione anche se per errore si è dimenticato di inserire un ritardo nel codice prima dell'avvio dell'RTC. Per il 16F88 i pin di programmazione ICSP sono gli stessi dei pin necessari per il cristallo 32.768kHz utilizzato per l'RTC……se l'oscillatore esterno T1 (cioè l'RTC) è in funzione prima che l'ICSP possa iniziare il suo lavoro, allora la programmazione fallirà. Normalmente se c'è un reset sul pin MCLR e c'è un ritardo, i dati ICSP possono essere inviati a questi pin e la programmazione può iniziare correttamente. Tuttavia, isolando l'alimentazione al PIC, il programmatore ICSP (o il programmatore socketed con un'intestazione) può controllare l'alimentazione al dispositivo e forzare un programma. Le altre cose da notare sono che i cuscinetti di cristallo sul PCB sono stati originariamente progettati per i cristalli SMD. Non vedevo l'ora che venissero consegnati alcuni, quindi il cristallo dell'orologio da 32,768 kHz è stato saldato alla parte superiore come mostrato, e il cristallo da 20 MHz è stato attaccato praticando un paio di fori nei pad, inserendo il cristallo attraverso il fondo e saldando sul superiore. Puoi vedere i pin appena a destra del PIC16F88.

Passaggio 5: il film olografico e l'alloggiamento

Il film olografico e l'alloggiamento
Il film olografico e l'alloggiamento
Il film olografico e l'alloggiamento
Il film olografico e l'alloggiamento
Il film olografico e l'alloggiamento
Il film olografico e l'alloggiamento

La costruzione finale consiste semplicemente nell'inserire il PCB nella custodia e, dopo la programmazione, fissarlo con un po' di colla a caldo. Tre fori consentono l'accesso frontale ai microinterruttori.

La parte notevole di questo orologio è l'uso di un film diffusore olografico. Questo è un film speciale che avevo in giro che fornisce una bella profondità al dispositivo. Potresti usare carta da lucido normale (in cui sposterei il PCB più vicino alla parte anteriore) o qualsiasi altro diffusore come quelli usati nelle lampade fluorescenti. Sperimentando, l'unica cosa che deve fare è permettere di differenziare il numero di LED accesi, altrimenti contare i punti per dire l'ora sarà difficile. Ho usato materiale a dispersione olografica della Physical Optics Coorporation (www.poc.com) con una dispersione circolare di 30 gradi, il display di stato del supercomputer mostrato altrove nell'istruibile utilizzava un film con una dispersione ellittica di 15x60 gradi. Potresti usare del nastro oscurante per nascondere le interiora lucide durante il giorno per ottenere un aspetto più misterioso. Potresti anche lasciare il display chiaro e lasciare che le persone vedano le interiora come ho fatto io. Il supporto era costituito da due pezzi di barra a "L" in alluminio con un pezzo tagliato nella parte inferiore per consentire una piegatura. Nota che in queste immagini è stata aggiunta un'illuminazione extra in modo da poter vedere le coperture del display ecc. Nella normale illuminazione del soggiorno, i LED sono più prominenti, anche alla luce del giorno.

Passaggio 6: software e interfaccia utente

Il funzionamento del dispositivo è molto semplice, nessuna modalità di pattern speciale o cose appariscenti. L'unica cosa che fa è visualizzare l'ora.

Per impostare l'ora premere prima SW1. Il dispositivo effettuerà un lampeggio di tutti i LED alcune volte e poi il gruppo di LED SW3 di 10s incrementerà il gruppo selezionato SW2 si sposterà al gruppo di LED successivo, ogni volta lampeggerà brevemente tutti i LED del gruppo. Il codice è scritto per il compilatore Sourceboost 'C' versione 6.70. Il codice RTC si trova nei file t1rtc.c/h e ha una funzione di interruzione sul timer T1 del PIC. Il timer T1 è impostato per interrompersi ogni 1 secondo. Ad ogni secondo, la variabile per l'ora viene incrementata. Inoltre un timer tick viene contato alla rovescia ogni secondo insieme al tempo. Viene utilizzato per determinare quando passare alla visualizzazione. La funzione di interrupt utilizza anche l'interrupt del timer T0 per aggiornare il display, richiamando una funzione in display.c I file display.h/display.c contengono le funzioni per aggiornare il display e visualizzare l'ora I file control.c/h contengono le funzioni per impostare l'ora e leggere gli interruttori I file holoclock.c/h sono i loop principali e di inizializzazione.

Consigliato: