1 meter POV z omogočeno funkcijo IOT: 3 koraki (s slikami)
1 meter POV z omogočeno funkcijo IOT: 3 koraki (s slikami)
Anonim
Image
Image
1 meter POV z omogočeno funkcijo IOT
1 meter POV z omogočeno funkcijo IOT
1 meter POV z omogočeno funkcijo IOT
1 meter POV z omogočeno funkcijo IOT
1 meter POV z omogočeno funkcijo IOT
1 meter POV z omogočeno funkcijo IOT

Preden se lotim razlage o tem projektu, bi se rad opravičil za nizko kakovost slike in videoposnetkov, vendar iskreno povedano, res je težko vzeti ostro in jasno podobo pri zagonu POV z običajno kamero, kot je moja mobilna kamera. Za zajem pravega gibanja potrebuje zelo hitro optično lečo z membrano, vendar bom boljši video naložil, ko bom končno lahko kupil fotoaparat CANON

Kaj je POV

POV pomeni Persistence Of Vision Globe, ki je povezan s pojavom človeškega vida. Svetlobni dražljaj ostane kot postranski učinek na mrežnici približno 1/10 sekunde. Ko se svetlobni dražljaji zaporedoma hitro zaporedoma združijo v eno neprekinjeno sliko. Pravzaprav je to osnova za filmske in televizijske naprave. POV naredi takšno iluzijo (nas zavede) in ustvari sliko z vrtenjem niza LED luči okoli ene točke ali osi

Kaj je projektna inovacija

Seveda POV ni nova ideja in veliko projektov že obstaja v Instructables ali na drugih spletnih mestih, vendar ti projekti večinoma uporabljajo prednastavljeno statično tempelj ali sliko, ki se večinoma bere iz pomnilnika MCU ali kartice SD, vendar v tem projektu uporabljamo lepe funkcije v zvezi s čipom, ki podpira IOT, kot je ESP8266.

S temi funkcijami IOT smo

  1. lahko enostavno brezžično naloži nove slike v pomnilnik
  2. ustvarite želeni scenarij prikaza slike s katerim koli zaporedjem ali trajanjem
  3. ni treba ponovno programirati čipa ali odklopiti pomnilniške kartice in jo znova priključiti za novo animacijo
  4. uporabniku prijazen IOT webhost vsakomur olajša upravljanje POV z mobilno napravo ali tabličnim računalnikom, tudi na daljavo
  5. zelo nizka cena strojne izvedbe z zmogljivostjo več kot 30 različnih slik

Kako deluje POV

POV zasloni, linearna (1-dimenzionalna) vrsta LED luči se vrti okoli ene točke, kot kolo za kolo. Z merjenjem njihove hitrosti vrtenja in nadzorovanjem njihovih bliskov z milisekundno natančnostjo lahko ustvarimo iluzijo 2 ali 3-dimenzionalne slike, ki se zadržuje v zraku. Razmislimo o posameznem okvirju katerega koli učinka (slika, besedilo,…), vsak okvir je sestavljen iz številnih slikovnih pik in s tem veliko vrstic v ravninskem ali sferičnem območju, POV prikaže to sliko z eno vrstico slike, ki se položaj spremeni skupaj z vrtenjem za zapolnitev To sliko, zato je problem, kako natančno nadzirati barvo slikovnih pik LED glede na čas in prostor, tako da lahko ustvari celotno sliko.

Z različno osjo vrtenja lahko ustvari ravninski, cilindrični in sferični zaslon POV

veliko projektov POV uporablja enostavne enobarvne LED ali pametne slikovne pike visoke hitrosti, kot sta WS2812 ali APA104, pri tem projektu pa uporabljamo hiter osveževalec LED čipov APA102 s hitrostjo osveževanja približno 16 MHz. ta LED čip ima 2 liniji za nadzor (ozemljitev, podatki, ura, +5V)

1. korak: Kako zgraditi POV

Kako zgraditi POV
Kako zgraditi POV
Kako zgraditi POV
Kako zgraditi POV
Kako zgraditi POV
Kako zgraditi POV

Sprva potrebujem konstrukcijo za namestitev POV pesto, pri čemer je kovinska ali nekovinska konstrukcija odvisna od tega, kaj imate v rokah. Lahko ga naredite iz katerega koli razpoložljivega materiala, da ga namestite na steno ali dodate noge za stojalo. Moj prijatelj naredi preprost stativ in namesti mehanizem zobatega jermena za zmanjšanje vrtljajev enosmernega motorja okoli 500. Majhna matematika Za jasno in usklajeno sliko potrebujemo osvežitev okvirja okoli 20 sličic na sekundo, to pomeni, da moramo imeti jasno sliko, ki jo moramo večkrat prikazati približno 20 krat na sekundo, ker je moj POV sestavljen iz 1 diagonalnega LED traku, zato je vsak okvir dopolnjen s polovico ali rotacijo, z eno besedo potrebujemo idealno število vrtljajev vozlišča okoli 600 in s tem vrtljajem je vsak vrtljaj trajal približno 100 ms. Naslednja enačba dokazuje, da se koncept RPM = (fps/Nb)*60, ki je Nb enak številki veje, v tem primeru pa imamo RPM = (20/2)*60 = 600my POV, ki se vrti okoli 430 vrt/min, zato je moja fps okoli 15 fsp kar je glede tega precej dobro. Gradnja mehanskega dela

V naslednjem koraku sem za rezanje LED palice uporabil kos PVC valja. Za povezovanje pesto z gredjo jermenice je bil pritrjen en vijak M10 na zadnji del PCV -ja. Dva zadrževalna obroča, nameščena na gredi škripca, za prenos 5 voltov enosmernega toka na ploščo in LED trak, nato pa je na naslednjih slikah ta del pritrjen na preprost jermen sistem za prenos časa, ki je priključen na 12V enosmerni motor, ima vsak svoj vir napajanja in je zaprt v beli škatli, pritrjeni na noge

2. korak: 1. implementacija programske opreme

1. implementacija programske opreme
1. implementacija programske opreme

Da bi prikazali dano sliko v LED traku, je treba vsako sliko pikselizirati, nato naložiti v pomnilnik MCU in nato vnesti v LED trak po vrsticah, da to naredim v programski opremi za dve različni platformi, ena je osnova za obdelavo časa izvajanja Java in drugo v C ++ za MCUPProcessing pixelized program, ki ga je ta program napisal v Processing IDE in je preprosto odprl slikovno datoteko, nato pa jo zavrtil v korakih, da izvleče pikselizirane vrstice slike. Za prikaz katere koli slike izberem 200 vrstico, zato zavrtim sliko (360 /200=1,8 stopinje) 200 -krat, da izvlečete 200 vrstic. Ker je moj LED trak sestavljen iz 144 LED z vgrajenim čipom APA102, ima torej celotna slika 200*144 = 28800 slikovnih pik. Ker je vsaka barva v čipu APA102 prikazana s 4 bajti (W, RGB), je zato vsaka velikost slike točno 200*144*4 = 115200 ali 112,5 KB po obdelavi Koda za obdelavo prikazuje zaporedje pikselizacije slike, rezultat pa bo datoteka razširitve koša, ki lahko naložite v pomnilnik MCU

PImage img, black_b, image_load; PrintWriter izhod; int SQL; float led_t; byte pov_data; int vrstica_številka = 200; Niz _OUTPUT = "";

nastavitve void ()

{selectInput ("Izberite sliko", "imageChosen"); noLoop (); počakaj (); }

void setup ()

{output = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); for (int i = 0; i = vrstica_številka) {noLoop (); output.flush (); output.close ();} ozadje (black_b); pushMatrix (); imageMode (CENTER); prevajanje (SQL/2, SQL/2); vrtenje (radiani (l*360/vrstica_številka)); slika (img, 0, 0); popMatrix (); pushMatrix (); za (int i = 0; i <144; i ++) {barva c = get (int (i*led_t+led_t/2), int (SQL/2)); output.print ((char) rdeča (c)+""+(char) zelena (c)+""+(char) modra (c)); // print ((char) rdeča (c)+""+(char) zelena (c)+""+(char) modra (c)+";"); izpolni (c); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // zakasnitev (500); l ++; }

void keyPressed ()

{output.flush (); // Zapiše preostale podatke v datoteko output.close (); // Dokonča izhod datoteke (); // ustavi program}

void imageChosen (datoteka f)

{if (f == null) {println ("Okno je bilo zaprto ali je uporabnik pritisnil preklic."); exit (); } else {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); Niz s = f.getAbsolutePath (); String list = split (s, '\'); int n = list.length; String fle = split (seznam [n-1], '.'); println ("Odpri datoteko:"+fle [0]); _OUTPUT = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img.širina; int h = img.height; SQL = max (w, h); velikost (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"velikost led ="+led_t); }} void mousePressed () {loop ();}

void mydata ()

{byte b = loadBytes ("something.dat"); // Natisni vsako vrednost, od 0 do 255 za (int i = 0; i <b.length; i ++) {// Vsako deseto število začni novo vrstico if ((i % 10) == 0) println (); // bajti so od -128 do 127, to se pretvori v 0 do 255 int a = b & 0xff; tiskanje (a + ""); } println (); // Natisni prazno vrstico na koncu saveBytes ("numbers.dat", b); } void wait () {while (img == null) {delay (200); } zanka (); }

3. korak: 2. implementacija programske opreme

Image
Image
2. implementacija programske opreme
2. implementacija programske opreme
2. implementacija programske opreme
2. implementacija programske opreme

MCU prikazovalni program

visokozmogljiv čip ESP8266 je bil izbran iz več razlogov, najprej je dobro razvil odprta orodja SDK za izkoriščanje funkcij WiFi skupaj s pomnilnikom za gostovanje spletnega strežnika za uporabnike. S temi zmožnostmi uporabniku prijazen spletni strežnik, namenjen nalaganju pikselizirane slike v pomnilnik MCU in ustvarjanju uporabniško določenega scenarija za prikaz. S serijo 4 Mb ESP-12E lahko uporabimo 1 Mb za program in 3 Mb za slike, ki bi jih lahko v velikosti 112,5 KB za pikselizirano sliko približali približno 25 slik, naloženih na MCU in bi lahko naredile katero koli zaporedje ali katero koli obdobje prikaza za naloženo sliko, ki jo uporabljam. Izvedba kode Arduino za izdelavo spletnega strežnika. code ima tri glavne funkcije v zanki, kot sledi

void loop () {if (! SHOW &&! TEST) server.handleClient (); if (SHOW) {if ((millis ()- OpenlastTime)> DURATION [image_index]*1000) {if (image_index> = IMAGE_NUM) image_index = 0; _spominski_ kazalec = začetni_naslov_slikovne datoteke [slika_indeks]; Serial.printf ("Številka datoteke =%u ime:%s naslov:%u trajanje:%u / n", image_index, IMAGES [image_index].c_str (), start_address_of_imagefile [image_index], DURATION [image_index]); Trenutna_slikovna vrstica = 0; image_index ++; OpenlastTime = millis (); } if ((micros ()-lastLineShow)> lineInterval) {lastLineShow = micros (); ESP.flashRead (_memory_pointer, (uint32_t *) LED, NUM_LEDS *3); FastLED.show (); _pomenik_pomnilnika+= (NUM_LEDS*3); Trenutna_slikovna vrstica ++; zamuda (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [image_index-1]; }} optimistic_yield (1000); }

Server Handler server.handleClient (); odgovoren za obdelavo vseh zahtev strank na spletnem gostitelju, lahko je to spletno mesto zasnovano poljubno za nalaganje podatkov, spremembo nastavitve prikaza katerega koli poročila o stanju. Moj spletni gostitelj je sestavljen iz treh zavihkov, na naslednjih slikah na prvem zavihku bi lahko preverili trenutni scenarij oddaje z zaporedjem in trajanjem za vsako sliko, prikazane so tudi informacije o omrežju in število vrtljajev POV

na zavihku za nalaganje slik lahko naložimo slikovno sliko v pomnilnik MCU ali izbrišemo določeno sliko

na zavihku omrežje lahko spremenimo omrežne nastavitve, kot so način wifi, statični ip, ime omrežja in izkaznica,..

Image Up-loader

to zahtevo odjemalca strežnika funkcij s strani Ajaxa za nalaganje pikselizirane slike v pomnilnik MCU, nato datoteko zapišite v pomnilnik v surovi obliki, da bo datoteka čim hitrejša. Začetna in končna lokacija pomnilnika je shranjena v tabeli za prikaz v LED traku

Funkcija prikaza

Za prikaz pikslov v LED traku sem uporabil FastLED lib, ta knjižnica je ena najuspešnejših in najbolje razvitih za LED oddaje na platformah AVR in ESP. Potrebno je samo poslati funkcijo FastLED, lokacijo shranjene LED piksle. iz pomnilnika beremo pike za vrstico in jih prikažemo v LED traku ter počakamo, da se uresniči nova zastava rotacije. to zaporedje smo ponavljali, dokler ni bilo prebranih 200 vrstic vsake slike

celotna koda, ki se nahaja v mojem skladišču git tukaj

spodaj je video posnetek POV v akciji, posnet z mobilno kamero, in kot sem pojasnil, kakovost videa ni dobra zaradi počasne hitrosti diafragme pri neprofesionalni kameri