Turinys:

1 metro POV su įjungta IOT: 3 žingsniai (su nuotraukomis)
1 metro POV su įjungta IOT: 3 žingsniai (su nuotraukomis)

Video: 1 metro POV su įjungta IOT: 3 žingsniai (su nuotraukomis)

Video: 1 metro POV su įjungta IOT: 3 žingsniai (su nuotraukomis)
Video: САМАЯ ДЕШЕВАЯ мини wifi камера со СЛЕЖЕНИЕМ. 2024, Lapkritis
Anonim
Image
Image
1 metro POV su įjungta IOT
1 metro POV su įjungta IOT
1 metro POV su įjungta IOT
1 metro POV su įjungta IOT
1 metro POV su įjungta IOT
1 metro POV su įjungta IOT

Prieš pradėdamas aiškinti apie šį projektą, norėčiau atsiprašyti už prastos kokybės vaizdą ir vaizdo įrašą, tačiau, tiesą sakant, tikrai sunku padaryti ryškų ir aiškų vaizdą, naudojant įprastą fotoaparatą, kaip mano mobilusis fotoaparatas. Tikram judesiui fiksuoti reikia labai greito diafragminio optinio lęšio, bet įkelsiu geresnį vaizdo įrašą, kai pagaliau galėsiu nusipirkti savo CANON fotoaparatą

Kas yra POV

POV reiškia „Persistence Of Vision Globe“, kuris yra susijęs su žmogaus regėjimo reiškiniu. Šviesos stimulas kaip papildomas poveikis tinklainei trunka apie 1/10 sekundės. Greitai sekant šviesos stimulus, jie susilieja į vieną ištisinį vaizdą. Tiesą sakant, tai yra kino ir televizijos prietaisų pagrindas. POV sukuria tokią iliuziją (apgaudinėja mus) ir sukuria vaizdą sukdami LED žibintų masyvą aplink vieną tašką ar ašį

Kas yra projekto naujovė

Žinoma, POV nėra nauja idėja, o „Instructables“ar kitose svetainėse jau yra daug projektų, tačiau šiuose projektuose dažniausiai naudojama iš anksto nustatyta statinė šventykla ar vaizdas, kuris dažniausiai skaitomas iš MCU atminties arba SD kortelės, tačiau šiame projekte mes naudojame dideles funkcijas iš IOT įgalinto lusto, pvz., ESP8266, šiuo klausimu.

Su šia IOT funkcija mes

  1. gali lengvai įkelti naujus vaizdus į atmintį belaidžiu būdu
  2. sukurkite norimą vaizdo rodymo scenarijų su bet kokia seka ar bet kokia trukme
  3. nebūtina perprogramuoti lusto arba atjungti atminties kortelės ir vėl įjungti, kad būtų rodoma nauja animacija
  4. patogus vartotojui „IOT“žiniatinklio prieglobos elementas leidžia visiems nuotoliniu būdu valdyti POV naudojant mobilųjį ar planšetinį kompiuterį
  5. labai nebrangios aparatūros diegimas, talpinantis daugiau nei 30 skirtingų vaizdų

Kaip veikia POV

POV ekranai, linijinis (1 matmenų) LED žibintų rinkinys sukasi aplink vieną tašką, kaip dviračio ratas. Išmatuodami jų sukimosi greitį ir valdydami blykstes milisekundžių tikslumu, galime sukurti iliuziją, kad ore tvyro 2 ar 3 matmenų vaizdas. Apsvarstykite vieną bet kokio efekto kadrą (paveikslėlį, tekstą, …), kiekvienas kadras susideda iš daugelio pikselių, taigi ir daug eilučių plokštumoje ar sferinėje srityje, POV parodo šį vaizdą su viena vaizdo eilute, kuri pakeičiama padėtimi kartu su jo sukimu kad vaizdas, todėl problema yra tai, kaip tiksliai valdyti LED pikselių spalvą pagal laiką ir erdvę, kad būtų galima sukurti visą vaizdą. POV yra suskirstytos pagal sukimosi ašį, efekto tipą ir rodomą spalvą.

Pagal skirtingą sukimosi ašį gali būti sukurtas plokščias, cilindrinis ir sferinis POV ekranas

daugelyje POV projektų naudojami paprasti vienspalviai šviesos diodai arba didelės spartos išmanieji pikseliai, tokie kaip WS2812 arba APA104, o šiame projekte mes naudojame greitą LED mikroschemų atnaujinimą APA102, kurio atnaujinimo dažnis yra beveik 16 MHz. šis LED lustas turi 2 linijas valdyti (įžeminimas, duomenys, laikrodis, +5v)

1 žingsnis: kaip sukurti POV

Kaip sukurti POV
Kaip sukurti POV
Kaip sukurti POV
Kaip sukurti POV
Kaip sukurti POV
Kaip sukurti POV

Iš pradžių man reikia konstrukcijos POV stebulės montavimui, todėl metalinė ar nemetalinė konstrukcija priklauso nuo to, ką turite rankose. Galite pagaminti iš bet kokios turimos medžiagos, kad galėtumėte ją sumontuoti ant sienos, arba pridėti kojų, kad galėtumėte stovėti. Mano draugas pagamina paprastą trikojį ir pritvirtina paskirstymo diržo mechanizmą, kad sumažintų nuolatinės srovės variklio apsisukimų dažnį maždaug 500. Maža matematika Norint turėti aiškų ir nuoseklų vaizdą, mums reikia maždaug 20 kadrų per sekundę atnaujinimo, tai reiškia, kad turime aiškų vaizdą, kurį turime pakartotinai rodyti apie 20 kartų per sekundę, kadangi mano POV susideda iš 1 įstrižainės šviesos diodų juostos, taigi kiekvienas rėmas užbaigtas per pusę arba pasukamas, kitaip tariant, mums reikia idealaus stebulės apsisukimų apie 600, o su šiuo apsisukimu kiekvienas apsisukimas užtruko apie 100 ms. Ši lygtis parodo, kad sąvoka RPM = (fps/Nb)*60, kuri Nb yra lygi šakų skaičiui, ir šiuo atveju turime RPM = (20/2)*60 = 600 my POV sukasi apie 430 aps./min., taigi mano fps yra apie 15 fsp kuris yra gana geras šiuo klausimu. Mechaninės dalies statymas

Kitame žingsnyje LED juostelės laikymui naudojau frezuoto PVC cilindro gabalėlį. Norėdami sujungti stebulę su skriemulio velenu, vienas M10 varžtas buvo prisukamas prie PCV dalies antrojo taško žiedo, sumontuoto ant skriemulio veleno, kad būtų perduota 5 voltų nuolatinė srovė prie plokštės ir LED juostos, tada, kaip nurodyta toliau esančiose nuotraukose, ši dalis sumontuota ant paprasto skriemulio. laiko perdavimo sistema, prijungta prie 12 V nuolatinės srovės variklio, kiekviena dalis turi savo maitinimo šaltinį ir yra uždėta baltoje dėžutėje, pritvirtintoje prie kojų

2 žingsnis: Programinės įrangos diegimas 1 dalis

Programinės įrangos diegimas 1 dalis
Programinės įrangos diegimas 1 dalis

Norint parodyti pateiktą vaizdą LED juostelėje, kiekvienas vaizdas turėtų būti pikselizuotas, tada įkeliamas į MCU atmintį ir po to eina į LED juostą eilutėmis, kad tai padaryčiau programinei įrangai, skirtai dviem skirtingoms platformoms, viena yra „Java runtime Processing“ir kitos C ++ programos, skirtos MCUP apdoroti pikselizuotą programą, ši programa parašė apdorojant IDE ir ji tiesiog atidaro vaizdo failą, tada pasuka jį žingsniais, kad išgautų pikselių vaizdo eilutes. Aš pasirenku 200 eilučių bet kokiam vaizdui rodyti, todėl aš pasuku vaizdą (360 /200=1,8 laipsnio) 200 kartų, kad išgautumėte 200 eilučių. Kadangi mano LED juostelę sudaro 144 šviesos diodai su įterptu APA102 lustu, taigi visas vaizdas turi 200*144 = 28800 pikselių. Kadangi kiekviena spalva APA102 lusto ekrane su 4 baitais (W, RGB), taigi kiekvienas vaizdo dydis yra lygiai 200*144*4 = 115200 arba 112,5 KB, po to apdorojimo kodas parodo vaizdo pikselių seką, o rezultatas bus dėžės plėtinio failas, kuris gali įkelti į MCU atmintį

PImage img, black_b, image_load; „PrintWriter“išvestis; int SQL; plūdė led_t; baitas pov_data; int eilutės_num = 200; Styga _OUTPUT = "";

negaliojantys nustatymai ()

{selectInput ("Pasirinkite vaizdą", "imageChosen"); noLoop (); laukti(); }

negaliojanti sąranka ()

{output = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPikseliai (); for (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} background (black_b); pushMatrix (); „ImageMode“(CENTRAS); versti (SQL/2, SQL/2); pasukti (radianai (l*360/line_num)); vaizdas (img, 0, 0); popMatrix (); pushMatrix (); už (int i = 0; i <144; i ++) {spalva c = gauti (int (i*led_t+led_t/2), int (SQL/2)); output.print ((char) raudona (c)+""+(char) žalia (c)+""+(char) mėlyna (c)); // spausdinti ((char) raudona (c)+""+(char) žalia (c)+""+(char) mėlyna (c)+";"); užpildyti (c); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // uždelsimas (500); l ++; }

tuščias raktas Paspaustas ()

{output.flush (); // Įrašo likusius duomenis į failą output.close (); // Baigia failą exit (); // Sustabdo programą}

void imageChosen (failas)

{if (f == null) {println ("Langas buvo uždarytas arba naudotojo paspaudimas atšaukti"); exit (); } else {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); Eilutė s = f.getAbsolutePath (); Styga sąrašas = padalintas (s, '\'); int n = sąrašas.ilgis; Styga fle = padalinta (sąrašas [n-1], '.'); println ("Atidaryti failą:"+fle [0]); _OUTPUT = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img.pločio; int h = img. aukštis; SQL = max (w, h); dydis (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"dydis led ="+led_t); }} void mousePaspaustas () {kilpa ();}

anuliuoti mano duomenis ()

{baitas b = loadBytes ("kažkas.dat"); // Spausdinkite kiekvieną reikšmę nuo 0 iki 255 (int i = 0; i <b.length; i ++) {// Kas dešimtas skaičius pradėkite naują eilutę, jei ((i % 10) == 0) println (); // baitai yra nuo -128 iki 127, tai konvertuojama į 0 iki 255 int a = b & 0xff; spausdinti (a + ""); } println (); // Išspausdinkite tuščią eilutę pabaigoje saveBytes ("skaičiai.dat", b); } void wait () {while (img == null) {delay (200); } kilpa (); }

3 žingsnis: Programinės įrangos diegimas 2 dalis

Image
Image
Programinės įrangos diegimas 2 dalis
Programinės įrangos diegimas 2 dalis
Programinės įrangos diegimas 2 dalis
Programinės įrangos diegimas 2 dalis

MCU rodymo programa

didelio našumo ESP8266 lustas buvo pasirinktas dėl kelių priežasčių, pirmiausia jis gerai sukūrė atvirus SDK įrankius, kad galėtų pasinaudoti „WiFi“funkcijomis kartu su atmintimi ir talpinti žiniatinklio serverį vartotojui. Turėdamas šias galimybes, patogus žiniatinklio serveris, skirtas įkelti pikseliuotą vaizdą į MCU atmintį ir sukurti vartotojo apibrėžtą rodymo scenarijų. Turėdami 4 Mb ESP-12E seriją, programai galime naudoti 1 Mb, o vaizdams-3 Mb, kurių pikselizuoto vaizdo dydis yra 112,5 KB, į MCU galėtume įkelti maždaug 25 vaizdus ir galėčiau sukurti bet kokią seką ar bet kokį rodomo laikotarpio vaizdą, kurį naudoju „Arduino“kodo bazės diegimas žiniatinklio serveriui sukurti. kodas savo cikle turi tris pagrindines funkcijas, kaip nurodyta toliau

void loop () {if (! SHOW &&! TEST) server.handleClient (); if (SHOW) {if ((millis ()- OpenlastTime)> DURATION [image_index]*1000) {if (image_index> = IMAGE_NUM) image_index = 0; _memory_pointer = pradžios_adresas_ paveikslėlio_failas [vaizdo_indeksas]; Serial.printf ("Failo numeris =%u pavadinimas:%s adresas:%u trukmė:%u / n", vaizdo_indeksas, IMAGES [vaizdo_indeksas].c_str (), pradžios_adresas_failas [vaizdo_indeksas], DURATION [vaizdo_indeksas]); Current_imageLine = 0; image_index ++; OpenlastTime = milis (); } if ((micros ()-lastLineShow)> lineInterval) {lastLineShow = micros (); ESP.flashRead (_memory_pointer, (uint32_t *) LED, NUM_LEDS *3); FastLED.show (); _memory_pointer+= (NUM_LEDS*3); Current_imageLine ++; uždelsimas (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [vaizdo_indeksas-1]; }} optimistinis_vaisas (1000); }

Serverio tvarkytojas server.handleClient (); Ši svetainė gali būti savavališkai suprojektuota įkelti duomenis, pakeisti bet kurios būsenos ataskaitos rodymo nustatymus. Mano žiniatinklio priegloba susideda iš trijų skirtukų, kaip pirmame skirtuke esantys toliau pateikti vaizdai, galėtume patikrinti dabartinį parodymo scenarijų su kiekvieno vaizdo seka ir trukme, taip pat tinklo informaciją ir rodomą POV aps / min

skirtuke „Įkelti vaizdą“galėtume įkelti pikselių vaizdą į MCU atmintį arba ištrinti konkretų vaizdą

Tinklo skirtuke galime pakeisti tinklo nustatymus, tokius kaip „Wi -Fi“režimas, statinis IP, tinklo pavadinimas ir leidimas,..

Vaizdo įkėlimo programa

ši „Ajax“funkcijų serverio kliento užklausa įkelti pikseliuotą vaizdą į MCU atmintį, tada įrašyti failą į atmintį neapdorotu formatu, kad būtų galima kuo greičiau perskaityti failą. Atminties pradžios ir pabaigos vietos išsaugojimas lentelėje, kad būtų rodomas LED juostelėje

Rodymo funkcija

Aš naudojau „FastLED lib“, kad pikselius rodytų LED juostelėse, ši biblioteka yra viena sėkmingiausių ir gerai išvystyta LED šou AVR ir ESP platformoje. Jums tereikia išsiųsti „FastLED“funkciją, saugomų LED pikselių vietą. skaitome eilutes po eilutės iš atminties ir rodome LED juostelėje ir laukiame, kol išsipildys nauja sukimosi vėliava. kartojome šią seką, kol buvo perskaityta 200 kiekvieno vaizdo eilučių

visas kodas yra mano „git“saugykloje

Toliau pateikiamas POV vaizdo įrašas, kurį įrašo mobilioji kamera, ir, kaip paaiškinau, vaizdo kokybė nėra gera dėl lėto neprofesionalios kameros diafragmos greičio

Rekomenduojamas: