Inhoudsopgave:

Minidot 2 - de Holoclock - Ajarnpa
Minidot 2 - de Holoclock - Ajarnpa

Video: Minidot 2 - de Holoclock - Ajarnpa

Video: Minidot 2 - de Holoclock - Ajarnpa
Video: Видео-обзор коллиматорных прицелов Delta Optical MiniDot HD 24 и HD 26 2024, November
Anonim
Minidot 2 - de Holoclock
Minidot 2 - de Holoclock
Minidot 2 - de Holoclock
Minidot 2 - de Holoclock

Nou, misschien is holoclock een beetje onnauwkeurig … het gebruikt holografische dispersiefilm aan de voorkant om een beetje diepte te geven. Eigenlijk is deze instructable een update van mijn vorige Minidot die hier te vinden is: https://www.instructables.com/id /EEGLXQCSKIEP2876EE/en hergebruik van veel code en circuits van mijn Microdot die zich hier bevindt: https://www.instructables.com/id/EWM2OIT78OERWHR38Z/EagleCAD-bestanden en Sourceboost-code is opgenomen in de bijgevoegde zip-bestanden. Waarom? De vorige Minidot was te complex, van de Microdot leerde ik hoe ik een RTC op een PIC moest doen met alleen een 32.768-kristal en ik hoefde geen speciale RTC-chip te gebruiken. Ook wilde ik de displaychips van de vorige Minidot kwijt. Dus nu is er alleen een power regulator chip en een PIC16F88….slechts twee chips. De andere redenen voor een update waren dat mijn Minidot een beetje onbetrouwbaar werd vanwege het aparte schakelbord en ik wilde een zachte vervaging tussen puntpatronen als evenals een soort omgevingslichtsensor om het scherm 's nachts te dimmen. De andere Minidot had een vaste helderheid en verlichtte 's nachts een kamer. Het apparaat is gebouwd met behulp van het EagleCad-softwarepakket en de Sourceboost-compiler. Je moet enige ervaring hebben met elektronica en het programmeren van PIC-controllers om dit project te starten. Houd er rekening mee dat dit geen instructie is over elektronica of PIC-programmering, dus houd vragen die relevant zijn voor het ontwerp van de Miniclock. Raadpleeg de instructables hierboven of vele andere instructables op deze site voor advies over het gebruik van EagleCad of het programmeren van PIC's. Dus hier is het….. Minidot 2, The Holoclock……of Minidot The Next Generation………….

Stap 1: Het circuit

Het circuit
Het circuit
Het circuit
Het circuit
Het circuit
Het circuit

Deze schakeling lijkt erg op de Microdot. Merk op dat de charlieplex-array vrijwel identiek is … slechts een paar pinnen zijn verplaatst.

Aan het Microdot-circuit is een 20Mhz-kristal toegevoegd om de PIC veel sneller te klokken, hierdoor kan de array sneller worden gescand en kan een dimalgoritme worden geïmplementeerd. Het dimalgoritme was erg belangrijk om een kruispatroonvervaging en omgevingslichtfunctie te laten werken. Dit zou onmogelijk zijn geweest met de Microdot, vanwege de lagere kloksnelheid omdat sommige scancycli nodig waren om te dimmen. Zie het volgende gedeelte voor een beschrijving van de dimfunctie. De andere dingen om op te merken zijn het gebruik van een MCP1252 laadpompregelaar om 5V te leveren, mijn favoriete chip op dit moment. Als je het circuit had aangepast, zou je een gewone oude 7805 kunnen gebruiken … Ik heb gewoon een aantal van deze handige chips rondhangen. Ik heb nu de schakelaars naar voren verplaatst, bespaart gehannes aan de achterkant van de klok na stroomuitval om de tijd opnieuw in te stellen en nu is alles slechts één PCB … geen bekabelingsproblemen. Ook van belang is de opname van een LDR. Dit wordt gebruikt in een spanningsdeler die wordt gedetecteerd door de A/D-pin op de PIC. Wanneer de PIC waarneemt dat het omgevingslichtniveau laag is (dwz 's nachts), houdt het dimalgoritme de charlieplex-array langer donker dan wanneer het lichtniveau hoog is. Ik kon geen LDR-symbool vinden in de Eaglecad-bibliotheek, dus ik heb gewoon een LED-symbool gebruikt … laat je niet misleiden, het is een LDR. Zie de werkelijke afbeelding van de PCB hieronder. Een ding om op te merken bij het gebruik van meerkleurige LED's in een charliplex-array. U moet ervoor zorgen dat de voorwaartse spanning van de LED's min of meer hetzelfde is. Zo niet, dan kunnen er zwerfstroompaden ontstaan en gaan meerdere LED's branden. Het gebruik van 5 mm of meer power-LED's voor deze configuratie zal dus niet werken, aangezien er meestal een behoorlijk verschil is tussen de groen/blauwe LED's en de rood/gele LED's. In dit geval heb ik 1206 SMD-leds gebruikt en met name hoogrenderende groen/blauwe leds. De voorwaartse spanningen waren hier echter geen probleem. Als u een mix van groen/blauwe en rood/gele LED's met een hoger vermogen in een charlieplex-array wilt gebruiken, moet u de verschillende kleuren scheiden in twee charliplex-arrays. Er zijn talloze verklaringen van charlieplexing die kunnen worden gegoogled … Ik zal hier niet in details treden. Ik laat het aan jou over om wat onderzoek te doen. (Druk op het kleine 'i'-pictogram in de hoek van de onderstaande foto om een grotere versie te zien)

Stap 2: Het dimalgoritme - Charliplexed pulsbreedtemodulatie

Het dimalgoritme - Charliplexed pulsbreedtemodulatie
Het dimalgoritme - Charliplexed pulsbreedtemodulatie

Zoals eerder vermeld, wilde ik de verschillende stippatronen voor die tijd soepel laten vervagen in plaats van van het ene patroon naar het andere te rukken. Zie de video voor een demonstratie. In het midden de nieuwe Minidot klok, rechts de oudere Minidot. Merk op hoeveel mooier de nieuwe is. (Ter info, de andere displays op de achtergrond zijn mijn Minicray-supercomputerstatusdisplay en mijn gevangen Nebulon-deeltje dat de Minicray aandrijft in een antimaterie magnetisch opsluitingsveld. Zie hier: https://www.youtube.com/embed/bRupDulR4ME voor een demonstratie van de opsluitingskamer van de nevel) Als u in de code kijkt, opent u het bestand display.c. Merk op dat er vier arrays zijn voor het in kaart brengen van de tris/poort-waarden om een bepaalde array te verlichten en twee arrays (één meer dan de Microdot-code) om te definiëren welke LED's moeten worden verlicht voor een bepaald patroon van LED's. Bijvoorbeeld:

// LED1 LED2 LED3 … niet-ondertekend teken LEDS_PORTA[31] = { 0x10, 0x00, 0x00, … niet-ondertekend teken LEDS_TRISA[31] = { 0xef, 0xff, 0xff, … niet-ondertekend teken LEDS_PORTB[31] = { 0x00, 0x02, 0x04, …unsigned char LEDS_TRISB[31] = { 0xfd, 0xf9, 0xf9, …unsigned char nLedsA[30];unsigned char nLedsB[30];Om bijvoorbeeld LED1 te laten oplichten, moet u de TRIS-registers TRISA:B = 0xef:0xfd en PORT-registers PORTA:B=0x10:0x00 enzovoort instellen. Als u de tris-waarden in binair schrijft, merkt u dat er op elk moment slechts twee uitgangen zijn ingeschakeld. De anderen zijn allemaal ingesteld op Tri-state (vandaar TRIS-register). Dit staat centraal bij Charlieplexing. U zult ook opmerken dat de ene uitgang altijd een logische '1' is en de andere altijd een logische '0'… waarvan de richting aangaat welke LED zich ook tussen deze twee uitgangslijnen bevindt. De laatste waarde in de poort/tris arrays is een nulwaarde om helemaal geen LED in te schakelen. In de Microdot fietste de update_display-functie continu door een andere array (nLeds) om te zien of die specifieke LED moest worden verlicht. Als dit het geval was, werden de bijbehorende tris/poort-waarden ingesteld en brandde de LED een tijdje. Anders werd de nulwaarde naar de TRIS/PORT-registers van de PIC's gestuurd en brandde gedurende een bepaalde tijd geen LED. Als het snel genoeg werd gedaan, kreeg dit een patroon. De rest van het programma las periodiek de RTC-waarden en vormde een mooi willekeurig patroon in die array … en dus veranderde het display. Om een dimfunctie te maken, werd dit iets verlengd zodat nadat de 30 LED's waren verlicht (of niet) dan zouden er extra perioden worden besteed aan het verzenden van nulwaarden als het scherm gedimd zou worden…..voor volledige helderheid, dan zouden er geen extra perioden worden besteed. Bij herhaling als er veel nulperiodes waren voor de verlichte LED's, zou het display gedimd zijn. In feite is dit multiplex pulsbreedtemodulatie… of omdat de hardware is geconfigureerd in een charlieplex-arragement, dan charlieplexed pulsbreedtemodulatie. Het tweede diagram hieronder toont de basisconfiguratie hiervoor. Ik noem dit een scanframe. De eerste 30 perioden naar het frame worden gebruikt om door de LED's te gaan … en een variabel aantal extra perioden bepalen hoe zwak het display zal zijn. Deze cyclus herhaalt zich. Meer nul-perioden betekent minder tijd voor een LED om per frame aan te staan (omdat het aantal perioden toenam). Merk op dat de verticale as niet het spanningsniveau betekent. De werkelijke toestand van de pinnen die naar de LED's gaan, varieert afhankelijk van de positie in de charlieplex-array … in het diagram betekent dit gewoon aan of uit. Dit betekende ook dat de totale lengte van het frame in de tijd ook toenam, waardoor de verversing werd verminderd tarief. Naarmate de LED's zwakker werden, begonnen ze met andere woorden te flikkeren. Deze methode is dus slechts tot op zekere hoogte nuttig. Voor de klok was het OK. Er wordt met tussenpozen een functie aangeroepen die de A/D-converter op de PIC leest en dit helderheidsniveau instelt. Als u de code leest, controleert het ook of de LED die het dichtst bij de LDR ligt aan is, en doet geen niveau-instelling als dat zo is, dit stopt het scherm onverwacht helderder wanneer het patroon verandert. Vervolgens de cross fade-functie.

Stap 3: Dimalgoritme - het Cross Fade-effect en dubbele buffering

Dimalgoritme - het Cross Fade-effect en dubbele buffering
Dimalgoritme - het Cross Fade-effect en dubbele buffering

De overgang tussen het ene patroon en het volgende was voorheen onmiddellijk. Voor deze klok wilde ik een patroon laten zien dat geleidelijk in helderheid afneemt en het volgende patroon dat geleidelijk toeneemt … dwz een kruisvervaging.

Ik hoefde geen individuele LED's te hebben om op afzonderlijke helderheidsniveaus te worden bestuurd om een crossfade te doen. Had alleen het eerste patroon op één helderheid nodig en het tweede op een lage helderheid. Dan zou ik gedurende een korte periode de helderheid van de eerste een beetje verminderen en de tweede verhogen … dit zou doorgaan totdat het tweede patroon volledig was. Dan wachtte de klok tot het volgende patroon zou verschijnen en zou er weer een overgang zijn. Dus moest ik twee patronen opslaan. Het patroon dat momenteel wordt weergegeven en het tweede patroon dat op het punt staat te worden weergegeven. Deze staan in de arrays nLedsA en nLedsB. (let in dit geval niet op poorten). Dit is de dubbele buffer. De functie update_display() is gewijzigd om door acht frames te bladeren en een aantal frames van de ene array en daarna de andere te tonen. Het veranderen van het aantal frames dat gedurende de acht cycli aan elke buffer is toegewezen, definieerde hoe helder elk patroon zou zijn. Toen we klaar waren met het wisselen tussen buffers, hebben we de buffers voor 'display' en 'next display' omgedraaid, zodat de functie voor het genereren van patronen alleen naar de buffer voor 'next display' zou schrijven. Onderstaand schema laat dit hopelijk zien. U zou moeten kunnen zien dat de overgang 64 scanframes zal duren. Op de afbeelding toont de kleine inzet het scanframe-diagram van de vorige pagina, kunstig verkleind. Een woord over de verversingssnelheid. Dit moet allemaal heel snel gebeuren. We hebben nu twee extra rekenniveaus, een voor het dimmen van de omgevingsweergave en een voor de acht framecycli die zijn besteed aan een overgang tussen twee buffers. Deze code zou dus in assembly moeten worden geschreven, maar is goed genoeg in 'C'.

Stap 4: Constructie - de PCB

Constructie - de PCB
Constructie - de PCB
Constructie - de PCB
Constructie - de PCB

Dit is vrij eenvoudig. Gewoon een dubbelzijdige print met wat SMD componenten erop. Sorry als je een doorlopende persoon bent, maar het is een stuk eenvoudiger om SMD-projecten te maken … minder gaten om te boren. Je moet een vaste hand hebben, een soldeerstation met temperatuurregeling en veel licht en vergroting om dingen gemakkelijker te maken.

Het enige dat opvalt bij de constructie van de PCB is de opname van een connector voor het programmeren van de PIC. Deze wordt aangesloten op de ICSP-pinnen op de PIC en je hebt een ICSP-programmeur nodig. Opnieuw gebruikte ik een handige om mijn junkbox-connector. Je kunt dit weglaten en desgewenst gewoon draden aan de pads solderen. Als alternatief, als je alleen een socketed programmeur hebt, kun je een header maken die in je socket wordt gestoken en die vervolgens op de ICSP-pads solderen. Als u dit doet, koppelt u Rx los en sluit u Ry aan, wat slechts links van nul ohm zijn (ik gebruik gewoon een soldeerklodder). Dit zal de rest van de stroom van het circuit loskoppelen van de PIC, zodat het de programmering niet verstoort. Een socketed programmeur gebruikt de ICSP-pinnen gewoon zoals een ICSP-programmeur, er is echt geen magie bij betrokken. U moet dit ook doen als u per ongeluk bent vergeten een vertraging in de code in te voeren voordat de RTC opstart. Voor de 16F88 zijn de ICSP-programmeerpinnen dezelfde als de pinnen die nodig zijn voor het 32.768kHz-kristal dat wordt gebruikt voor de RTC … als de T1 externe oscillator (dwz de RTC) draait voordat de ICSP kan beginnen, werkt het programmeren niet. Normaal gesproken, als er een reset op de MCLR-pin is en er is een vertraging, dan kunnen ICSP-gegevens naar deze pinnen worden verzonden en kan het programmeren correct beginnen. Door echter de stroom naar de PIC te isoleren, kan de ICSP-programmeur (of socketed programmeur met een header) de stroom naar het apparaat regelen en een programma forceren. De andere dingen om op te merken zijn dat de kristalpads op de PCB oorspronkelijk zijn ontworpen voor SMD-kristallen. Ik kon niet wachten tot er een paar werden afgeleverd, dus het 32.768kHz horlogekristal werd aan de bovenkant gesoldeerd zoals afgebeeld, en het 20MHz-kristal werd bevestigd door een paar gaten in de pads te boren, het kristal door de onderkant te steken en op de bovenkant. Je kunt de pinnen net rechts van de PIC16F88 zien.

Stap 5: De holografische film en behuizing

De holografische film en behuizing
De holografische film en behuizing
De holografische film en behuizing
De holografische film en behuizing
De holografische film en behuizing
De holografische film en behuizing

De uiteindelijke constructie is simpelweg de print in de behuizing plaatsen en na het programmeren vastzetten met een dotje hete lijm. Drie gaten bieden toegang tot de microschakelaars vanaf de voorkant.

Het opvallende aan deze klok is het gebruik van een holografische diffusorfilm. Dit is een speciale film die ik had liggen die een mooie diepte aan het apparaat geeft. Je zou gewoon calqueerpapier kunnen gebruiken (waarin ik de PCB dichter naar de voorkant zou verplaatsen), of een andere diffuser zoals die wordt gebruikt in TL-verlichtingsarmaturen. Experimenteer erover, het enige dat u hoeft te doen, is u toestaan om onderscheid te maken tussen het aantal verlichte LED's, anders wordt het tellen van de stippen om de tijd te bepalen moeilijk. Ik gebruikte holografisch dispersiemateriaal van de Physical Optics Coorporation (www.poc.com) met een cirkelvormige dispersie van 30 graden, de statusweergave van de supercomputer die elders in de instructie wordt getoond, gebruikte een film met een elliptische dispersie van 15x60 graden. Je zou wat verduisteringstape kunnen gebruiken om de glimmende ingewanden overdag te verbergen om een meer mysterieuze uitstraling te krijgen. Je zou zelfs het scherm vrij kunnen laten en mensen de binnenkant laten zien zoals ik deed. De standaard bestond uit twee stukjes aluminium 'L'-balk met een stukje uitgesneden aan de onderkant om een bocht mogelijk te maken. Let op op deze foto's is extra verlichting toegevoegd zodat je de display covers etc kunt zien. Bij normale woonkamerverlichting vallen de LED's meer op, ook bij daglicht.

Stap 6: Software en gebruikersinterface

De bediening van het apparaat is heel eenvoudig, geen speciale patroonmodi of flitsende dingen. Het enige wat het doet is de tijd weergeven.

Druk eerst op SW1 om de tijd in te stellen. Het apparaat zal alle LED's een paar keer laten knipperen en vervolgens zal de 10s uur groep LED's SW3 de geselecteerde groep verhogen. SW2 zal naar de volgende groep LED's gaan, waarbij alle LED's in de groep telkens kort knipperen. De code is geschreven voor Sourceboost 'C' compiler versie 6.70. De RTC code staat in de t1rtc.c/h bestanden, en heeft een interrupt functie op de T1 timer van de PIC. De T1-timer is ingesteld om elke seconde te onderbreken. Elke seconde wordt de variabele voor de tijd verhoogd. Ook wordt er elke seconde een tick timer afgeteld, samen met de tijd. Dit wordt gebruikt om te bepalen wanneer de weergave moet worden overgezet. De interruptfunctie gebruikt ook de T0 timer interrupt om het display te verversen, waarbij een functie in display.c wordt aangeroepen.c De bestanden display.h/display.c bevatten de functies om het display bij te werken en de tijd weer te geven. De bestanden control.c/h bevatten de functies om de tijd in te stellen en de schakelaars af te lezen De bestanden holoclock.c/h zijn de hoofdlussen en initialisatie.