Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
Før jeg starter forklaringen om dette prosjektet, vil jeg be om unnskyldning for lav kvalitet på bilde og video, men ærlig talt er det veldig vanskelig å ta et skarpt og klart bilde fra å kjøre POV med normalt kamera som mobilkameraet mitt. Det trenger veldig raskt membranoptisk linse for å fange ekte bevegelse, men jeg vil laste opp den bedre videoen når jeg endelig kunne kjøpe CANON -kameraet mitt
Hva er POV
POV står for Persistence Of Vision Globe som er relatert til fenomenet menneskesyn. Lys stimulus henger som en ettervirkning på netthinnen i omtrent 1/10 sekund. Når lysstimuleringer sekvenseres raskt etter hverandre, smelter de sammen til ett kontinuerlig bilde. Faktisk er det grunnlaget for film- og TV -enheter,. POV gjør en slik illusjon (bedrag oss) og lager bildet ved å rotere en rekke LED -lys rundt et enkelt punkt eller en akse
Hva er prosjektinnovasjon
Selvfølgelig er POV ikke en ny idé, og mange prosjekter eksisterer allerede i Instructables eller på andre nettsteder, men prosjektet bruker for det meste forhåndsinnstilt statisk tempel eller bilde som for det meste leses fra MCU -minne eller SD -kort, men i dette prosjektet bruker vi flotte funksjoner av IOT -aktivert brikke som ESP8266 i denne saken.
Med denne IOT funksjonene vi
- kan enkelt laste opp nye bilder trådløst til minnet
- lag det ønskede scenariet for bildeshow med hvilken som helst sekvens eller hvilken som helst varighet
- det er ikke nødvendig å omprogrammere brikken eller koble fra minnekortet og koble den til for ny animasjon
- brukervennlig IOT webhost gjør det enkelt for alle å skaffe POV med mobil eller nettbrett, selv eksternt
- veldig billig maskinvareimplementering med kapasitet på mer enn 30 forskjellige bilder
Hvordan POV fungerer
POV-skjermer, et lineært (1-dimensjonalt) utvalg av LED-lys roterer rundt et enkelt punkt, som et sykkelhjul. Ved å måle rotasjonshastigheten og kontrollere blitsene med presisjon på millisekunder, kan vi skape en illusjon av et 2 eller 3-dimensjonalt bilde som henger i tynn luft. La oss vurdere den enkelte rammen med hvilken som helst effekt (bilde, tekst, …), hver ramme består av mange piksler og dermed mange linjer i plan eller sfærisk område, POV viser dette bildet med en enkelt bildelinje som endres i posisjon sammen med rotasjonen for å fylle det bildet, så problemet er hvordan du nøyaktig kontrollerer LED -pikselfarger på tid og plass, slik at det kan lage hele bildet POV er kategorisert basert på rotasjonsakse, type effekt kan vises og hvor mye farge kan skape.
Ved forskjellige rotasjonsakser kan den produsere plan, sylindrisk og sfærisk POV -skjerm
mange POV-prosjekter bruker enkle ensfargede LED- eller høyhastighets smarte piksler som WS2812 eller APA104, og i dette prosjektet bruker vi den raske LED-chip-oppdateringen APA102 med praktisk talt rundt 16 MHz oppdateringsfrekvens. denne LED -brikken har 2 linjer å kontrollere (bakken, data, klokke, +5v)
Trinn 1: Hvordan bygge POV
Først trenger jeg strukturen for å montere POV -hub, noe som gjør at metall eller ikke -metallstruktur er avhengig av hva du har i hendene. Du kan lage den med alt tilgjengelig materiale for å installere den på en vegg eller legge til ben for å få stativ. Vennen min lager det enkle stativet og monterer tannremmekanismen for å redusere likestrømsmotorens turtall rundt 500. Liten matematikk For å ha et klart og sammenhengende bilde trenger vi en forfriskning av rammen rundt 20 fps. ganger i sekundet, Siden min POV består av en diagonal LED -stripe, derav hver ramme fullført med halv eller rotasjon, trenger vi med et annet ord den ideelle hub -turtallet rundt 600, og med denne o / min tok hver omdreining omtrent 100 ms. følgende ligning viser at konseptet RPM = (fps/Nb)*60 som Nb er lik Antall gren, og i dette tilfellet har vi RPM = (20/2)*60 = 600my POV rotere rundt 430 o/min, så min fps er rundt 15 fsp som er ganske bra i denne saken. Å bygge den mekaniske delen
I neste trinn brukte jeg et stykke PVC -sylinder Milled for å holde LED -stangen. For å koble navet med remskiveaksel, er en M10 -bolt boltet på baksiden av PCV -delen To kobberring installert på remskiven til overføringen 5 volt DC til brettet og LED -stripen, deretter som på følgende bilder, er denne delen montert på den enkle remskiven tidsoverføringssystem som er koblet til 12v likestrømsmotor hver del har sin egen strømforsyning og innelukket i en hvit boks festet til bena
Trinn 2: Programvareimplementering Del 1
For å demonstrere det gitte bildet i LED -stripe, bør hvert bilde pixeliseres og deretter lastes opp til MCU -minne og deretter mates til LED -stripe linje for linje, for å gjøre det jeg laget til programvare for to forskjellige plattformer, en er basert på java runtime Processing og andre i C ++ for MCUProsessering av pixelisert program dette programmet skrev i Processing IDE, og det åpnet bare bildefil, roter den deretter i trinn for å trekke ut pixeliserte bildelinjer. Jeg velger 200 linjer for å vise et hvilket som helst bilde, så jeg roterer bildet mot (360 /200=1.8 grad) 200 ganger for å trekke ut 200 linje. Siden min LED -stripe består av 144 LED med innebygd APA102 -brikke, har et helt bilde 200*144 = 28800 piksler. Siden hver farge i APA102 -brikkedisplayet med 4 byte (W, RGB) er derfor hver bildestørrelse nøyaktig 200*144*4 = 115200 eller 112,5 KB etter behandlingskoden, viser sekvensen for bildepikselisering, og resultatet vil være en bin -utvidelsesfil som kan lastes opp til MCU -minne
PImage img, black_b, image_load; PrintWriter output; int SQL; float led_t; byte pov_data; int line_num = 200; String _OUTPUT = "";
ugyldige innstillinger ()
{selectInput ("Velg et bilde", "imageChosen"); noLoop (); vente(); }
ugyldig oppsett ()
{output = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); for (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} bakgrunn (black_b); pushMatrix (); imageMode (SENTRUM); translate (SQL/2, SQL/2); rotere (radianer (l*360/line_num)); bilde (img, 0, 0); popMatrix (); pushMatrix (); for (int i = 0; i <144; i ++) {color c = get (int (i*led_t+led_t/2), int (SQL/2)); output.print ((røyke) rød (c)+""+(røyke) grønn (c)+""+(røyke) blå (c)); // print ((røyke) rød (c)+""+(røyke) grønn (c)+""+(røyke) blå (c)+";"); fyll (c); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // forsinkelse (500); l ++; }
void keyPressed ()
{output.flush (); // Skriver de gjenværende dataene til filen output.close (); // Fullfører filavslutningen (); // Stopper programmet}
ugyldig bildeValg (fil f)
{if (f == null) {println ("Vinduet ble lukket eller brukeren treffer avbryt."); exit (); } annet {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); String s = f.getAbsolutePath (); String list = split (s, '\'); int n = liste.lengde; String fle = delt (liste [n-1], '.'); println ("Åpen fil:"+fle [0]); _OUTPUT = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img.width; int h = img.høyde; SQL = maks (w, h); størrelse (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"størrelse led ="+led_t); }} void mousePressed () {loop ();}
ugyldig mydata ()
{byte b = loadBytes ("something.dat"); // Skriv ut hver verdi, fra 0 til 255 for (int i = 0; i <b.length; i ++) {// Hvert tiende tall, start en ny linje hvis ((i % 10) == 0) println (); // byte er fra -128 til 127, dette konverteres til 0 til 255 int a = b & 0xff; print (a + ""); } println (); // Skriv ut en tom linje på slutten saveBytes ("numbers.dat", b); } ugyldig vent () {while (img == null) {forsinkelse (200); } Løkke(); }
Trinn 3: Programvareimplementering Del 2
MCU visningsprogram
ESP8266-brikke med høy ytelse har blitt valgt av to grunner, først har den godt utviklet åpne SDK-verktøy for å dra nytte av WiFi-funksjoner ved siden av minnet for å være vert for en webserver for brukeren. Med disse mulighetene, brukervennlig webserver designet for å laste opp det pixeliserte bildet til MCU-minnet og lage et brukerdefinert scenario for show. Med 4 Mb ESP-12E-serien kan vi bruke 1 Mb for program og 3 Mb for bilder, som med størrelsen 112,5 KB for pixelisert bilde kunne omtrent 25 bilder lastet opp på MCU og kunne lage en hvilken som helst sekvens eller en visningsperiode for opplastet bilde jeg bruker Arduino kodebaserte implementering for å lage webserveren. koden har tre hovedfunksjoner i løkken i henhold til følgende
void loop () {if (! SHOW &&! TEST) server.handleClient (); hvis (VIS) {if ((millis ()- OpenlastTime)> DURATION [image_index]*1000) {if (image_index> = IMAGE_NUM) image_index = 0; _memory_pointer = start_address_of_imagefile [image_index]; Serial.printf ("Filnummer =%u navn:%s adresse:%u varighet:%u / n", image_index, IMAGES [image_index].c_str (), start_address_of_imagefile [image_index], DURATION [image_index]); Current_imageLine = 0; image_index ++; OpenlastTime = millis (); } if ((micros ()-lastLineShow)> lineInterval) {lastLineShow = micros (); ESP.flashRead (_memory_pointer, (uint32_t *) leds, NUM_LEDS *3); FastLED.show (); _memory_pointer+= (NUM_LEDS*3); Current_imageLine ++; forsinkelse (LineIntervalDelay); } hvis (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [image_index-1]; }} optimistisk_avkastning (1000); }
Serverhåndterer server.handleClient (); ansvarlig for å behandle enhver klientforespørsel på webhost, kan dette nettstedet være utformet vilkårlig for å laste opp data, endre visningsinnstillingen for en hvilken som helst statlig rapport. Min webhost består av tre kategorier som følgende bilder i den første kategorien vi kunne sjekke gjeldende scenario med show med sekvens og varighet for hvert bilde, også nettverksinformasjon samt POV rpm vist
i kategorien for opplasting av bilder kan vi laste opp et pixelisert bilde til MCU -minnet eller slette et bestemt bilde
i nettverksfanen kan vi endre nettverksinnstillinger som wifi -modus, statisk ip, nettverksnavn og pass,..
Bilde opplaster
denne funksjonsserverklientforespørselen fra Ajax om å laste opp pixelisert bilde til MCU -minnet, og deretter skrive filen i minnet i råformat, slik at du kan lese filen så raskt som mulig. Lagringsplass for minne start og slutt i tabellen for visning i LED -stripe
Displayfunksjon
Jeg brukte FastLED lib til å vise piksel i LED -stripe, dette biblioteket er et av de mest vellykkede og godt utviklede for LED -show på AVR- og ESP -plattformen. Det er bare å sende FastLED -funksjonen, plasseringen av lagret LED -piksel. vi leser linje for linje -piksler fra minnet og viser det i LED -stripe og venter på at nytt rotasjonsflagg skal gå i oppfyllelse. vi gjentok denne sekvensen til 200 linjer av hvert bilde ble lest
hele koden som ligger i git -depotet mitt her
Følgende er videoen av POV i aksjon som er spilt inn med mobilkamera, og som jeg forklarte, er videokvaliteten ikke god på grunn av lav membranhastighet på uprofesjonelt kamera