Turinys:
- 1 žingsnis: kaip sukurti POV
- 2 žingsnis: Programinės įrangos diegimas 1 dalis
- 3 žingsnis: Programinės įrangos diegimas 2 dalis
Video: 1 metro POV su įjungta IOT: 3 žingsniai (su nuotraukomis)
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:48
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
- gali lengvai įkelti naujus vaizdus į atmintį belaidžiu būdu
- sukurkite norimą vaizdo rodymo scenarijų su bet kokia seka ar bet kokia trukme
- nebūtina perprogramuoti lusto arba atjungti atminties kortelės ir vėl įjungti, kad būtų rodoma nauja animacija
- patogus vartotojui „IOT“žiniatinklio prieglobos elementas leidžia visiems nuotoliniu būdu valdyti POV naudojant mobilųjį ar planšetinį kompiuterį
- 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
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
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
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:
„Wi -Fi“įjungta matricos lempa: 6 žingsniai (su nuotraukomis)
„WiFi“įjungta matricos lempa: kas nenori turėti stulbinančios lempos, kuri galėtų rodyti animaciją ir sinchronizuoti su kitomis namų lempomis? Teisingai, niekas. Štai kodėl aš sukūriau pasirinktinę RGB lempą. Lempa susideda iš 256 individualiai adresuojamų šviesos diodų ir visi šviesos diodai gali būti valdomi
Įjungta išjungimo skląstis su UC. Vienas mygtukas. Vienas smeigtukas. Diskretusis komponentas: 5 žingsniai
Įjungta išjungimo skląstis su UC. Vienas mygtukas. Vienas smeigtukas. Diskretusis komponentas: Sveiki visi, internete ieškojo įjungimo/išjungimo grandinės. Viskas, ką radau, buvo ne tai, ko ieškojau. Aš kalbėjau su savimi, tam būtinai yra kelias. To man ir reikėjo.-Tik vienas mygtukas, kurį reikia įjungti ir išjungti.-Turi naudoti tik
Visada ĮJUNGTA Raspberry Pi DLNA serveris ir „Torrent“klientas su būsenos šviesos diodais: 6 žingsniai
Visada ĮJUNGTA „Raspberry Pi DLNA“serveris ir „Torrent“klientas su būsenos šviesos diodais: bandžiau pasigaminti sau ir jis puikiai veikia. Jis gali transliuoti HD vaizdo įrašus be jokio atsilikimo, o būsenos šviesos diodai suteikia man greitą jo būseną. Žemiau pridėjau veiksmus, kurių ėmiausi, kad jį sujungčiau. Prašome perskaityti, jei esate įdomus
Įjungta stalinė lempa: 4 žingsniai (su nuotraukomis)
Įjungiama stalinė lempa: čia aš parodysiu, kaip naudojant paprastą, mažai įjungiamą stalinę lempą, naudojant arduino ir servo variklius, parodoma. Taip pat pasakysiu, kaip galite pakeisti variklius, kad galėtumėte įrašyti manipuliacijas ir todėl atlikti judesius su lempute, kurią
„Alexa“įjungta mirties žvaigždės lempa: 17 žingsnių (su nuotraukomis)
„Alexa“įjungta mirties žvaigždės lempa: atsineškite tamsiosios pusės fragmentą į savo kambarį su šia unikalia balsu suaktyvinta lempa. Funkcionalus meno kūrinys, į kurį žiūrėti ir naudinga, ir malonu. Įjungti ar išjungti? Visos lempos tai daro! Keisti ryškumą? Labai dažnas! Bet ar gali tavo