Mündəricat:
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-13 06:56
Bu layihə ilə əlaqədar izahat verməzdən əvvəl keyfiyyətsiz görüntü və video üçün üzr istəmək istərdim, amma vicdanla mobil kameram kimi normal kamera ilə POV işlətməkdən kəskin və aydın bir şəkil çəkmək həqiqətən çətindir. Həqiqi hərəkəti çəkmək üçün çox sürətli bir diyafram optik lensə ehtiyac var, amma nəhayət CANON kameramı ala bildiyim zaman daha yaxşı videonu yükləyəcəyəm.
POV nədir
POV, insan görmə fenomeni ilə əlaqəli Persistence Of Vision Globe deməkdir. İşıq stimulunun təxminən 1/10 saniyə ərzində retinaya təsiri var. İşıq stimulları ardıcıl olaraq ardıcıllıqla sıralananda, onlar davamlı bir görüntüyə birləşirlər. Əslində film və televiziya cihazları üçün əsasdır. POV belə bir xəyal qurur (bizi aldadır) və LED işıqlarının bir nöqtədə və ya ox ətrafında fırlanaraq görüntünü yaradır.
Layihə yeniliyi nədir
Əlbəttə POV yeni bir fikir deyil və bir çox layihələr Instructables -da və ya digər saytlarda artıq mövcuddur, lakin bu layihələr əsasən MCU yaddaşından və ya SD kartdan oxunan əvvəlcədən təyin edilmiş statik məbəddən və ya şəkildən istifadə edir, lakin bu layihədə gözəl xüsusiyyətlərdən istifadə edirik. Bu mövzuda ESP8266 kimi IOT effektiv çip.
Bu IOT xüsusiyyətləri ilə
- asanlıqla yeni şəkilləri yaddaşa kabelsiz yükləyə bilər
- hər hansı bir ardıcıllıqla və ya hər hansı bir müddətlə istədiyiniz görüntü şou ssenarisini yaradın
- çipi yenidən proqramlaşdırmağa və ya yaddaş kartını çıxarmağa və yeni animasiya üçün yenidən bağlamağa ehtiyac yoxdur
- istifadəçi dostu IOT webhost, hər kəsin uzaqdan da olsa mobil və ya planşetlə POV idarə etməsini asanlaşdırır
- 30 -dan çox fərqli görüntü tutumu olan çox aşağı qiymətli aparat tətbiqi
POV necə işləyir
POV displeyləri, xətti (1 ölçülü) LED işıqlar dəsti velosiped təkəri kimi tək bir nöqtədə fırlanır. Onların fırlanma sürətini ölçərək və milisaniyəlik dəqiqliklə yanıb-sönməsini idarə edərək, havada uzanan 2 və ya 3 ölçülü bir görüntü illüziyası yarada bilərik. Hər bir effektin (şəkil, mətn, …) tək çərçivəsini nəzərdən keçirək, hər bir çərçivə bir çox pikseldən və buna görə də düz və ya sferik sahədə bir çox sətirdən ibarətdir, POV bu görüntünü bir şəkil xətti ilə göstərir ki, mövqeyi dəyişdirmək üçün fırlanması ilə birlikdə dəyişdirilir. bu görüntü, buna görə də problem, LED piksel rəngini zaman və məkan baxımından necə dəqiq idarə etməkdir, beləliklə bütün görüntü POV yarada bilər, fırlanma oxuna görə təsnif edilir, təsir növü göstərilə bilər və nə qədər rəng yarada bilər.
Fərqli fırlanma oxu ilə düz, silindrik və sferik POV ekranı istehsal edə bilər
bir çox POV layihəsi WS2812 və APA104 kimi sadə bir rəngli LED və ya yüksək sürətli ağıllı piksellərdən istifadə edir və bu layihədə praktiki olaraq 16 MHz ətrafında yeniləmə dərəcəsi olan sürətli LED çip yeniləyici APA102 istifadə edirik. Bu LED çipində nəzarət etmək üçün 2 xətt var (Yer, Məlumat, Saat, +5v)
Addım 1: POV necə qurulur
Əvvəlcə POV mərkəzini qurmaq üçün quruluşa ehtiyacım var, metal və ya metal olmayan bir quruluş əldə etmək əlinizdə olan şeydən asılıdır. Duvara quraşdırmaq və ya ayaq əlavə etmək üçün ayaqları əlavə etmək üçün hər hansı bir mövcud materialdan hazırlaya bilərsiniz. Dostum sadə bir tripod düzəldir və DC motor RPM -ni 500 ətrafında azaltmaq üçün zamanlama kəməri mexanizmini bağlayır. Kiçik riyazi Aydın və tutarlı bir görüntüyə sahib olmaq üçün 20 kadr / saniyə ətrafında çərçivə yeniləməsinə ehtiyacımız var. Saniyədə bir dəfə, POV 1 diaqonallı LED şeridindən ibarət olduğu üçün hər çərçivə yarı və ya fırlanma ilə tamamlanır, başqa sözlə İdeal mərkəzə 600 ətrafında ehtiyacımız var və bu RPM ilə hər inqilab təxminən 100 ms çəkdi. Aşağıdakı tənlik, Nb -nin filial sayına bərabər olan RPM = (fps/Nb)*60 konsepsiyasını nümayiş etdirir və bu halda bizdə RPM = (20/2)*60 = 600my POV 430 rpm ətrafında fırlanır, beləliklə fpsim 15 fsp civarındadır bu mövzuda kifayət qədər yaxşıdır. Mexanik hissənin qurulması
Növbəti addımda LED çubuğunu tutmaq üçün dəyirmanlanmış PVC silindrindən istifadə etdim. Hubu kasnak şaftı ilə birləşdirmək üçün PCV hissəsinin arxasına bir M10 bolt bərkidilmişdir. Kasnağın şaftına quraşdırılmış iki Cupper halqası 5 volt DC -ni lövhəyə və LED şeridinə ötürür, sonra aşağıdakı şəkillərə görə bu hissə sadə kasnağa quraşdırılmışdır. 12v DC mühərrikə qoşulmuş vaxt ötürmə sistemi hər hissənin öz enerji təchizatı var və ayaqlara bərkidilmiş ağ qutuda
Addım 2: Proqram təminatı 1 -ci hissə
Verilmiş görüntünü LED şeridində nümayiş etdirmək üçün hər bir şəkil pixelize edilməli, sonra MCU yaddaşına yüklənməli və sonra iki fərqli platforma proqram təminatında hazırladığım üçün LED zolaq xəttinə verilməlidir. və digərləri C ++ üçün MCUProcessing pixelized proqramını bu proqram IDE -də yazır və sadəcə görüntü faylını açır, sonra görüntünün pikselli xətlərini çıxarmaq üçün addımlarla döndərin. Hər hansı bir görüntünü göstərmək üçün 200 sətir seçirəm, buna görə də şəkli arxasına çevirirəm (360 /200=1.8 dərəcə) 200 xətt çıxarmaq üçün 200 dəfə. Mənim LED şeridim, quraşdırılmış APA102 çipli 144 LED -dən ibarət olduğu üçün bütün şəkil 200*144 = 28800 pikseldir. APA102 çip ekranındakı hər rəng 4 bayt (W, RGB) ilə göstərildiyindən hər bir görüntü ölçüsü tam olaraq 200*144*4 = 115200 və ya 112.5KB Aşağıdakı Qenerasiya kodu görüntünün pikselləşmə ardıcıllığını nümayiş etdirir və nəticədə MCU yaddaşına yüklənə bilər
PImage img, black_b, image_load; PrintWriter çıxışı; int SQL; float led_t; bayt pov_data; int line_num = 200; String _OUTPUT = "";
boşluq parametrləri ()
{selectInput ("Bir şəkil seçin", "imageChosen"); noLoop (); Gözləmək(); }
boş quraşdırma ()
{çıxış = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); for (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} background (black_b); pushMatrix (); imageMode (MƏRKƏZ); tərcümə (SQL/2, SQL/2); döndür (radianlar (l*360/line_num)); şəkil (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 ((char) qırmızı (c)+""+(char) yaşıl (c)+""+(char) mavi (c)); // çap ((char) qırmızı (c)+""+(char) yaşıl (c)+""+(char) mavi (c)+";"); doldurun (c); düz (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // gecikmə (500); l ++; }
void key Pressed ()
{çıxış.flush (); // Qalan məlumatları output.close () faylına yazır; // faylı bitir (); // Proqramı dayandırır}
void imageChosen (Fayl f)
{if (f == null) {println ("Pəncərə bağlandı və ya istifadəçi ləğv etdi"); exit (); } başqa {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); String s = f.getAbsolutePath (); String list = split (s, '\'); int n = siyahı uzunluğu. String fle = split (siyahı [n-1], '.'); println ("Açıq fayl:"+fle [0]); _OUTPUT = uçdu [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img.width; int h = img.height; SQL = maksimum (w, h); ölçüsü (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"ölçüsü led ="+led_t); }} boş siçan Pressed () {loop ();}
etibarsız məlumat ()
{bayt b = loadBytes ("bir şey.dat"); // (int i = 0; i <b.length; i ++) {0 -dan 255 -ə qədər olan hər bir dəyəri çap edin // Hər onuncu ədəddə, ((i % 10) == 0) println (); // baytlar -128 -dən 127 -ə qədərdir, bu 0 -dan 255 -ə çevrilir int a = b & 0xff; çap (a + ""); } println (); // sonunda boş bir sətir yazın saveBytes ("numbers.dat", b); } void wait () {while (img == null) {delay (200); } döngə (); }
Addım 3: Proqram təminatı 2 -ci hissə
MCU ekran proqramı
yüksək performanslı ESP8266 çipi bir neçə səbəbə görə seçildi, əvvəlcə istifadəçi üçün bir veb serveri yerləşdirmək üçün yaddaşın yanında WiFi xüsusiyyətlərindən istifadə etmək üçün açıq SDK vasitələrini yaxşı inkişaf etdirdi. Bu qabiliyyətlərlə, pikselləşdirilmiş görüntünü MCU yaddaşına yükləmək və istifadə üçün şou üçün ssenari yaratmaq üçün hazırlanmış istifadəçi dostu bir veb server. 4 Mb ESP-12E seriyası ilə proqram üçün 1 Mb və şəkillər üçün 3 Mb istifadə edə bilərik ki, pikselli şəkil üçün 112.5KB ölçüsündə MCU-da təxminən 25 şəkil yükləyə bilərik və istifadə etdiyim yüklənmiş şəkil üçün hər hansı bir ardıcıllıq və ya hər hansı bir göstərmə müddəti edə bilərik. Veb serveri yaratmaq üçün Arduino kod bazası tətbiqi. kodun döngəsində aşağıdakı kimi üç əsas funksiya var
void loop () {if (! SHOW &&! TEST) server.handleClient (); if (SHOW) {if ((millis ()- OpenlastTime)> SURASI [image_index]*1000) {if (image_index> = IMAGE_NUM) image_index = 0; _memory_pointer = image_file faylının başlanğıc ünvanı [image_index]; Serial.printf ("Fayl nömrəsi =%u adı:%s ünvanı:%u müddəti:%u / n", image_index, IMAGES [image_index].c_str (), start_addes_of_imagefile [image_index], SÜRƏ [image_index]); Current_imageLine = 0; image_index ++; OpenlastTime = milis (); } if ((micros ()-lastLineShow)> lineInterval) {lastLineShow = micros (); ESP.flashRead (_memory_pointer, (uint32_t *) ledlər, NUM_LEDS *3); FastLED.show (); _memory_pointer+= (NUM_LEDS*3); Current_imageLine ++; gecikmə (LineIntervalDelay); } əgər (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = image_faylının başlanğıc ünvanı [image_index-1]; }} optimist_ gəlir (1000); }
Server idarəçisi server.handleClient (); webhost -da hər hansı bir müştəri sorğusunu emal etməkdən məsul olan bu veb sayt, məlumat yükləmək, hər hansı bir dövlət hesabatının şou parametrlərini dəyişdirmək üçün özbaşına dizayn ola bilər. Mənim veb aparıcım üç sekmədən ibarətdir, ilk sekmədə aşağıdakı şəkillər var, hər bir görüntü üçün ardıcıllıq və müddəti olan şou ssenarisini, həmçinin şəbəkə məlumatlarını və POV rpm -ni yoxlaya bilərik.
şəkil yükləmə sekmesinde, MCU yaddaşına bir pikselli şəkil yükləyə və ya xüsusi bir şəkil silə bilərik
şəbəkə sekmesinde wifi rejimi, statik ip, şəbəkə adı və keçid kimi şəbəkə parametrlərini dəyişə bilərik.
Şəkil yükləyicisi
Bu funksiya server müştəri Ajax tərəfindən MCU yaddaşına pixelized şəkil yükləmək, sonra faylı xam formatda yaddaşa yazmaq üçün faylın mümkün qədər tez oxunmasını tələb edir. Yaddaşın başlanğıc və bitmə yerini LED şeridində göstərmək üçün cədvəldə saxlayın
Ekran funksiyası
LED şeridində piksel göstərmək üçün FastLED lib istifadə etdim, bu kitabxana AVR və ESP platformasında LED şou üçün ən uğurlu və yaxşı inkişaf etdirilən kitabxanadır. Yalnız FastLED funksiyasını, saxlanılan LED pikselinin yerini göndərmək lazımdır. yaddaşdan sətir -satır piksel oxuyuruq və LED şeridində göstəririk və yeni fırlanma bayrağının gerçəkləşməsini gözləyirik. hər görüntünün 200 sətri oxunana qədər bu ardıcıllığı təkrarladıq
bütün kod mənim git deposumda yerləşir
Aşağıda mobil kamera ilə çəkilmiş POV hərəkəti videosu var və izah etdiyim kimi, qeyri -peşəkar kameranın diafraqma sürətinin yavaş olması səbəbindən video keyfiyyəti yaxşı deyil.