Përmbajtje:
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-13 06:58
Para fillimit të shpjegimit për këtë projekt do të doja të kërkoja falje për imazhin dhe videon me cilësi të ulët, por sinqerisht është vërtet e vështirë të marrësh një imazh të mprehtë dhe të qartë nga drejtimi i POV me kamerë normale si aparati im celular. Ajo ka nevojë për lente optike diafragmë shumë të shpejtë për të kapur lëvizjen e vërtetë, por unë do të ngarkoj videon më të mirë kur më në fund të blej kamerën time CANON
Çfarë është POV
POV qëndron për Persistence Of Vision Globe e cila lidhet me fenomenin e shikimit njerëzor. Stimulimi i dritës qëndron si pasojë në retinë për rreth 1/10 e sekondës. Kur stimujt e dritës renditen me radhë, ato bashkohen në një imazh të vazhdueshëm. Në fakt është baza për pajisjet e filmit dhe televizionit,. POV bën një iluzion të tillë (na mashtroni) dhe krijoni imazhin me rrotullim grupin e dritave LED rreth një pike ose boshti të vetëm
Çfarë është inovacioni i projektit
Sigurisht që POV nuk është një ide e re dhe shumë projekte tashmë ekzistojnë në Instructables ose në vende të tjera, megjithatë ato projekte përdorin kryesisht tempull statik ose imazh të paracaktuar i cili lexohet kryesisht nga memorja MCU ose karta SD, por në këtë projekt ne përdorim vendosjen e veçorive të bukura i çipit të aktivizuar nga IOT si ESP8266 në këtë çështje.
Me këto karakteristika IOT ne
- lehtë mund të ngarkojë imazhe të reja në kujtesë pa tel
- krijoni skenarin e dëshiruar të shfaqjes së imazhit me çdo sekuencë ose çdo kohëzgjatje
- nuk ka nevojë të riprogramoni çipin ose të shkëputni kartën e kujtesës dhe ta lidhni përsëri për animacion të ri
- webhost IOT miqësor për përdoruesit e bën të lehtë për këdo që të kontrollojë POV me celular ose tabletë edhe nga distanca
- zbatim harduerësh me kosto shumë të ulët me kapacitet prej më shumë se 30 imazhe të ndryshme
Si funksionon POV
Ekranet POV, një grup linear (1-dimensional) i dritave LED rrotullohet rreth një pike të vetme, si një rrotë biçikletë. Duke matur shkallën e rrotullimit të tyre dhe duke kontrolluar ndezjet e tyre me saktësi milisekondëshe, ne mund të krijojmë iluzionin e një imazhi 2 ose 3-dimensional që qëndron në ajër të hollë. Le të Konsiderojmë kornizën e vetme të çdo efekti (imazhi, teksti,…), secila kornizë përbëhet nga shumë piksele dhe kështu shumë rreshta në rrafshin ose zonën sferike, POV shfaq këtë imazh me një rresht të vetëm të imazhit i cili ndryshon pozicionin së bashku me rrotullimin e tij për të mbushur atë imazh, kështu që problemi është se si të kontrollojmë saktësisht ngjyrën e pikselit LED në mënyrën e kohës dhe hapësirës në mënyrë që të krijojë imazh të tërë POV kategorizohen në bazë të boshtit të rrotullimit, llojit të efektit që mund të shfaqë dhe sa ngjyra mund të krijojë.
Nga akset e ndryshme të rrotullimit, mund të prodhojë një ekran POV planar, cilindrik dhe sferik
shumë projekte POV përdorin LED të thjeshtë me një ngjyrë të vetme ose piksele të mençura me shpejtësi të lartë si WS2812 ose APA104 dhe në këtë projekt ne përdorim freskuesin e shpejtë të çipave LED APA102 me një shpejtësi praktikisht rreth 16 MHz. ky çip LED ka 2 rreshta për tu kontrolluar (Ground, Data, Clock, +5v)
Hapi 1: Si të ndërtoni POV
Në fillim më duhet struktura për të montuar shpërndarësin POV, duke e bërë strukturën metalike ose jo metalike varet nga ajo që keni në duar. Ju mund ta bëni atë me çdo material të disponueshëm për ta instaluar në një mur ose të shtoni këmbë për të qëndruar. Miku im bën trekëmbëshin e thjeshtë dhe monton mekanizmin e rripit të kohës për të zvogëluar RPM -në e motorit DC rreth 500. Matematikë e vogël Për të pasur imazh të qartë dhe koherent, kemi nevojë për freskim të kornizës rreth 20 fps, do të thotë që të kemi imazh të qartë, duhet ta shfaqim në mënyrë të përsëritur rreth 20 herë në sekondë, Meqë POV -ja ime përbëhet nga 1 shirit LED diagonale, pra secila kornizë e përfunduar me gjysmë ose rrotullim, me një fjalë tjetër ne kemi nevojë për RPM të shpërndarësit ideal rreth 600 dhe me këtë RPM çdo revolucion zgjati rreth 100 ms. ekuacioni i mëposhtëm demonstron se koncepti RPM = (fps/Nb)*60 i cili Nb është i barabartë me numrin e degës, dhe në këtë rast kemiRPM = (20/2)*60 = 600my POV rrotullohen rreth 430 rpm kështu që fps im është rreth 15 fsp e cila është mjaft e mirë për këtë çështje. Ndërtimi i pjesës mekanike
Në hapin tjetër, unë përdor copën e cilindrit PVC të Mulluar për të mbajtur shiritin LED. Për të lidhur shpërndarësin me boshtin e rrotullës, një bulon M10 është fiksuar në pjesën e pasme të pjesës PCV Dy unaza Cupper të instaluara në boshtin e rrotullës për të transmetuar 5 volt DC në tabelë dhe shirit LED, pastaj sipas fotografive të mëposhtme, kjo pjesë e montuar në rrotullën e thjeshtë sistemi i transmetimit të kohës i cili është i lidhur me motorin DC 12v secila pjesë ka furnizimin e vet me energji elektrike dhe të mbyllur në kuti të bardhë të bashkangjitur në këmbë
Hapi 2: Zbatimi i Softuerit Pjesa 1
Për të demonstruar imazhin e dhënë në shiritin LED, çdo imazh duhet të pixelized pastaj ngarkuar në kujtesën MCU dhe pastaj të ushqyer në shirit LED rresht pas rreshti, për të bërë atë që kam bërë në softuer për dy platforma të ndryshme, njëra është e bazuar në përpunimin e kohës së java dhe të tjera në C ++ për MCUPërpunimi i programit të pikseluar ky program shkroi në Processing IDE dhe thjesht hap skedarin e imazhit, pastaj rrotullojeni atë në hapa për të nxjerrë linja të pikseluara të imazhit. Unë zgjedh 200 rreshta për shfaqjen e çdo imazhi, kështu që unë rrotulloj imazhin (360 /200=1.8 shkallë) 200 herë për të nxjerrë 200 rreshta. Meqenëse shiriti im LED përbëhet nga 144 LED me çip të integruar APA102, kështu një imazh i tërë ka 200*144 = 28800 pixel. Meqenëse çdo ngjyrë në ekranin e çipave APA102 me 4 bajt (W, RGB) prandaj secila madhësi e imazhit është saktësisht 200*144*4 = 115200 ose 112.5KB pas kodit të përpunimit demonstroni sekuencën e pikselizimit të figurës, dhe rezultati do të jetë një skedar zgjerimi kosh i cili mund ngarkohen në kujtesën MCU
PImage img, black_b, image_load; dalja e PrintWriter; int SQL; noton led_t; byte të dhëna pov_; numri i linjës int = 200; Vargu _OUTPUT = "";
cilësimet e pavlefshme ()
{selectInput ("Zgjidh një imazh", "imageChosen"); noLoop (); prit (); }
void setup ()
{output = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); për (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} sfond (black_b); pushMatrix (); imageMode (CENTER); përkthe (SQL/2, SQL/2); rrotullohen (radianët (l*360/line_num)); imazh (img, 0, 0); popMatrix (); pushMatrix (); për (int i = 0; i <144; i ++) {ngjyra c = merr (int (i*led_t+led_t/2), int (SQL/2)); output.print ((char) e kuqe (c)+""+(char) jeshile (c)+""+(char) blu (c)); // print ((char) e kuqe (c)+""+(char) jeshile (c)+""+(char) blu (c)+";"); mbush (c); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // vonesë (500); l ++; }
çelësi i pavlefshëm i shtypur ()
{output.flush (); // Shkruan të dhënat e mbetura në skedarin output.close (); // Përfundon daljen e skedarit (); // Ndalon programin}
i pavlefshëm imageChosen (File f)
{if (f == null) {println ("Dritarja u mbyll ose përdoruesi goditi anulo."); exit (); } else {if (f.ekziston ()) img = loadImage (f.getAbsolutePath ()); Vargu s = f.getAbsolutePath (); String list = split (s, '\'); int n = lista.gjatësia; String fle = split (lista [n-1], '.'); println ("Hap skedarin:"+fle [0]); _OUTPUT = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img. gjerësi; int h = img. lartësia; SQL = max (w, h); madhësia (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"madhësia led ="+led_t); }} void mousePressed () {loop ();}
mydata të pavlefshme ()
{byte b = loadBytes ("diçka.dat"); // Shtypni secilën vlerë, nga 0 në 255 për (int i = 0; i <b.length; i ++) {// Çdo numër të dhjetë, filloni një rresht të ri nëse ((i % 10) == 0) println (); // bajt janë nga -128 në 127, kjo shndërrohet në 0 në 255 int a = b & 0xff; print (a + ""); } println (); // Shtypni një rresht bosh në fund të saveBytes ("numbers.dat", b); } void prisni () {ndërsa (img == null) {vonesë (200); } lak (); }
Hapi 3: Zbatimi i Softuerit Pjesa 2
Programi i shfaqjes MCU
Çipi ESP8266 me performancë të lartë është zgjedhur për disa arsye, së pari ai ka zhvilluar mirë mjete të hapura SDK për të përfituar nga veçoritë WiFi së bashku me kujtesën për të pritur një server në internet për përdoruesit. Me këto aftësi, web-server miqësor për përdoruesit i krijuar për të ngarkuar imazhin e pikseluar në kujtesën MCU dhe për të krijuar skenarin e përcaktuar nga përdoruesi për shfaqje. Me serinë 4 Mb ESP-12E ne mund të përdorim 1 Mb për program dhe 3 Mb për imazhe të cilat me madhësi 112.5KB për imazh të pikseluar mund të afrojmë afërsisht 25 imazhe të ngarkuara në MCU dhe mund të bëjmë çdo sekuencë ose ndonjë periudhë shfaqjeje për imazhin e ngarkuar që përdor Zbatimi i bazës së kodit Arduino për krijimin e serverit në internet. kodi ka tre funksione kryesore në lakun e tij si më poshtë
void loop () {if (! SHOW &&! TEST) server.handleClient (); if (SHOW) {if ((millis ()- OpenlastTime)> KOHZGJATJA [image_index]*1000) {if (image_index> = IMAGE_NUM) image_index = 0; _memory_pointer = fillo_adresa_of_imagefile [image_index]; Serial.printf ("Numri i skedarit =%u emri: adresa e%s:%u kohëzgjatja:%u / n", image_index, IMAGES [image_index].c_str (), start_address_of_imagefile [image_index], DURATION [image_index]); Current_imageLine = 0; indeksi i imazhit ++; OpenlastTime = millis (); } if ((micros ()-lastLineShow)> lineInterval) {lastLineShow = micros (); ESP.flashRead (_memory_pointer, (uint32_t *) leds, NUM_LEDS *3); FastLED.shfaq (); _memory_pointer+= (NUM_LEDS*3); Current_imageLine ++; vonesë (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = fillo_adresa_of_imagefile [image_index-1]; }} rendimenti optimist (1000); }
Serveri i serverit server.handleClient (); përgjegjës për të përpunuar çdo kërkesë të klientit në webhost, kjo faqe në internet mund të jetë një dizajn arbitrar për të ngarkuar të dhëna, për të ndryshuar cilësimin e shfaqjes së çdo raporti shtetëror. Webhosti im përbëhet nga tre skeda pasi imazhet e mëposhtme në skedën e parë mund të kontrollojmë skenarin aktual të shfaqjes me sekuencë dhe kohëzgjatje për secilën imazh, gjithashtu informacionin e rrjetit, si dhe rropullimet POV të treguara
në skedën e ngarkimit të figurës mund të ngarkojmë një imazh të pikseluar në kujtesën MCU ose të fshijmë një imazh të veçantë
në skedën e rrjetit ne mund të ndryshojmë cilësimet e rrjetit si mënyra wifi, ip statike, emri dhe kalimi i rrjetit,..
Ngarkuesi i imazhit
kjo kërkesë e klientit të serverit të serverit nga Ajax për të ngarkuar imazhin e pikseluar në kujtesën MCU, pastaj shkruani skedarin në memorie në format të papërpunuar, kështu që leximi i skedarit të jetë sa më i shpejtë. Vendndodhja e fillimit dhe mbarimit të kujtesës ruhet në tabelë për t'u shfaqur në shirit LED
Funksioni i shfaqjes
Kam përdorur librin FastLED për të treguar pixel në shirit LED, kjo bibliotekë është një nga më të suksesshmet dhe më të zhvilluarat për shfaqjen LED në platformën AVR dhe ESP. Thjesht duhet të dërgoni funksionin FastLED, vendndodhjen e pikselit LED të ruajtur. ne lexojmë piksela rresht pas rreshti nga kujtesa dhe e tregojmë në shiritin LED dhe presim që flamuri i ri i rrotullimit të bëhet i vërtetë. ne e përsërisim këtë sekuencë derisa të lexohen 200 rreshta të çdo imazhi
i gjithë kodi i vendosur në depon time git këtu
në vijim është video e POV në veprim e cila është regjistruar me aparat celular dhe siç e shpjegova, cilësia e videos nuk është e mirë për shkak të shpejtësisë së ngadaltë të diafragmës së kamerës joprofesionale