İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Bu projeyle ilgili açıklamaya başlamadan önce düşük kaliteli görüntü ve video için özür dilemek istiyorum, ancak açıkçası mobil kameram gibi normal kamera ile POV çalıştırarak keskin ve net bir görüntü almak gerçekten zor. Gerçek hareketi yakalamak için çok hızlı diyaframlı optik merceğe ihtiyacı var, ancak sonunda CANON kameramı satın alabildiğimde daha iyi videoyu yükleyeceğim
bakış açısı nedir
POV, insan görme olgusuyla ilgili Persistence Of Vision Globe'un kısaltmasıdır. Işık uyarısı, saniyenin yaklaşık 1/10'u kadar retina üzerinde bir son etki olarak kalır. Işık uyaranları hızlı bir şekilde art arda sıralandığında, tek bir sürekli görüntüde birleşirler. Aslında film ve televizyon cihazlarının temelidir. POV böyle bir yanılsama yaratır (bizi kandırır) ve LED ışık dizisini tek bir nokta veya eksen etrafında döndürerek görüntüyü oluşturur.
proje yeniliği nedir
Elbette POV yeni bir fikir değil ve Instructables'ta veya diğer sitelerde zaten birçok proje var, ancak bu projeler çoğunlukla önceden ayarlanmış statik tapınak veya çoğunlukla MCU belleğinden veya SD karttan okunan görüntü kullanıyor, ancak bu projede güzel özellikler dağıtıyoruz Bu konuda ESP8266 gibi IOT özellikli çip.
Bu IOT özellikleriyle
- yeni görüntüleri kablosuz olarak belleğe kolayca yükleyebilir
- herhangi bir dizi veya süre ile istenen görüntü gösterisi senaryosunu oluşturun
- çipi yeniden programlamaya veya bellek kartını çıkarıp yeni animasyon için yeniden takmaya gerek yoktur
- kullanıcı dostu IOT webhost, herkesin POV'yi mobil veya tablet ile uzaktan bile yönetmesini kolaylaştırır
- 30'dan fazla farklı görüntü kapasitesi ile çok düşük maliyetli donanım uygulaması
POV nasıl çalışır?
POV ekranları, doğrusal (1 boyutlu) bir dizi LED ışık, bir bisiklet tekerleği gibi tek bir nokta etrafında döner. Dönme hızlarını ölçerek ve flaşlarını milisaniye hassasiyetle kontrol ederek, ince havada kalan 2 veya 3 boyutlu bir görüntü yanılsaması yaratabiliriz. Herhangi bir efektin (resim, metin, …) tek karesini ele alalım, her kare birçok pikselden oluşur ve dolayısıyla düzlem veya küresel alanda birçok çizgiden oluşur, POV bu resmi, konumu değişen tek satırlık bir görüntü ile gösterir. Bu görüntü, bu nedenle sorun, LED piksel renginin zaman ve mekan açısından tam olarak nasıl kontrol edileceğidir, böylece tüm görüntü POV'u dönüş eksenine göre kategorize edilir, efekt türü görüntülenebilir ve ne kadar renk oluşturulabilir.
Farklı dönme ekseni ile düzlemsel, silindirik ve küresel POV görüntüsü üretebilir
Birçok POV projesi, basit tek renkli LED veya WS2812 veya APA104 gibi yüksek hızlı akıllı pikseller kullanır ve bu projede, yaklaşık 16 MHz yenileme hızına sahip hızlı LED çip tazeleyici APA102'yi kullanırız. Bu LED çipinin kontrol edilecek 2 hattı vardır (Toprak, Veri, Saat, +5v)
Adım 1: POV Nasıl Oluşturulur
İlk başta, POV hub'ını monte etmek için yapıya ihtiyacım var, metal veya metal olmayan yapının elinizde ne olduğuna bağlı. Bir duvara monte etmek için mevcut herhangi bir malzeme ile yapabilir veya ayak eklemek için ayak ekleyebilirsiniz. Arkadaşım basit bir tripod yapar ve DC motor devrini 500 civarına düşürmek için triger kayışı mekanizmasını monte eder. Küçük matematik Net ve tutarlı bir görüntüye sahip olmak için kare yenilemeye 20 fps civarında ihtiyacımız var, net bir görüntüye sahip olmak anlamına geliyor bunu tekrar tekrar göstermemiz gerekiyor POV'um 1 diyagonal LED şeritten oluştuğundan, bu nedenle her çerçeve yarım veya dönüşle tamamlandı, başka bir deyişle İdeal hub RPM'ye 600 civarında ihtiyacımız var ve bu RPM ile her devir yaklaşık 100 ms sürdü. aşağıdaki denklem, Nb'nin Dal Sayısına eşit olduğu RPM=(fps/Nb)*60 kavramının olduğunu göstermektedir ve bu durumda RPM=(20/2)*60=600 benim POV'm 430 rpm civarında döner, dolayısıyla fps'm 15 fsp civarındadır. ki bu konuda oldukça iyi. Mekanik parçanın oluşturulması
Bir sonraki adımda, LED çubuğu tutmak için Öğütülmüş PVC silindir parçası kullandım. Göbeği kasnak miline bağlamak için PCV parçasının arkasına bir adet M10 cıvata takılmıştır. 5 volt DC'yi panoya ve LED şeridine iletmek için kasnak miline iki adet Bakır halka takılmıştır, daha sonra aşağıdaki resimlerdeki gibi bu parça basit kasnağa monte edilmiştir. 12v DC motora bağlı zaman iletim sistemi, her parçanın kendi güç kaynağı vardır ve bacaklara bağlı beyaz kutu içine alınır.
2. Adım: Yazılım Uygulaması Bölüm 1
Verilen görüntüyü LED şeritte gösterebilmek için her bir görüntü pikselleştirilip MCU belleğine yüklenip satır satır LED şeridine beslenmeli, bunu yapmak için iki farklı platform için yazılıma yaptım, biri Java runtime tabanlı İşleme ve diğer C++ için MCUProcessing pikselleştirilmiş program için bu program Processing IDE'de yazdı ve sadece görüntü dosyasını açtı, ardından pikselleştirilmiş görüntü satırlarını çıkarmak için onu adım adım döndürdü. Herhangi bir görüntüyü görüntülemek için 200 satır seçiyorum, bu yüzden görüntüyü abut (360) /200=1.8 derece) 200 satır çıkarmak için 200 kez. LED şeridim, gömülü APA102 çipli 144 LED'den oluştuğu için, görüntünün tamamı 200*144=28800 piksele sahiptir. APA102 çipindeki her renk 4 bayt (W, RGB) ile görüntülendiğinden, bu nedenle her bir görüntü boyutu tam olarak 200*144*4=115200 veya 112.5 KB'dir. MCU belleğine yüklenecek
PImage img, black_b, image_load;PrintWriter çıktısı; int SQL; kayan led_t; bayt pov_data; int satır_sayısı=200; Dize _OUTPUT="";
geçersiz ayarlar()
{ selectInput("Bir resim seçin", "imageChosen"); noLoop(); Bekle(); }
geçersiz kurulum()
{ çıktı = createWriter(_OUTPUT); black_b= createImage(SQL, SQL, RGB); black_b.loadPixels(); for (int i = 0; i =çizgi_sayısı) {noLoop();output.flush();output.close();} arkaplan(siyah_b); pushMatrix(); imageMode(MERKEZ); çevir(SQL/2, SQL/2); döndür(radyan(l*360/satır_num)); resim(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)red(c)+""+(char)green(c)+""+(char)blue(c)); // print((char)red(c)+""+(char)green(c)+""+(char)blue(c)+";"); doldur(c); rect(i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println(); popMatrix(); // gecikme(500); l++; }
geçersiz tuşBasılmış()
{ çıktı.flush(); // Kalan verileri çıktı.close() dosyasına yazar; // Dosyayı bitirir exit(); // Programı durdurur }
void imageChosen(Dosya f)
{ if (f == null) { println("Pencere kapatıldı veya kullanıcı iptal düğmesine bastı.");exit(); } else { if(f.exists()) img = loadImage(f.getAbsolutePath()); s=f.getAbsolutePath(); String liste = split(s, '\'); int n=list.uzunluk; String fle=split(list[n-1], '.'); println("Dosyayı aç:"+fle[0]); _OUTPUT=fle[0]+".bin"; // img = loadImage("test.jpg"); int w = img.width; int h = görüntü.yükseklik; SQL=maks(w, h); boyut(SQL, SQL); led_t=SQL/144.0; println("h="+h+" w="+w+" max="+SQL+" boyut led="+led_t); } } void mousePressed(){ loop();}
verilerimi geçersiz kıl()
{ bayt b = loadBytes("bir şey.dat"); // (int i = 0; i < b.length; i++) için 0'dan 255'e kadar her değeri yazdırın { // Her onuncu sayıda yeni bir satır başlat if ((i % 10) == 0) println(); // baytlar -128 ile 127 arasındadır, bu 0 ile 255 arasında değişir int a = b & 0xff; print(a + " "); } println(); // Sonuna boş bir satır yazdır saveBytes("numbers.dat", b); } void wait() { while (img == null) { delay(200); } döngü(); }
3. Adım: Yazılım Uygulaması Bölüm 2
MCU ekran programı
yüksek performanslı ESP8266 yongası birkaç nedenden dolayı seçilmiştir, ilk olarak, kullanıcı için bir web sunucusu barındırmak için belleğin yanı sıra WiFi özelliklerinden yararlanmak için açık SDK araçlarını iyi geliştirmiştir. Bu yeteneklerle, pikselleştirilmiş görüntüyü MCU belleğine yüklemek ve gösterim için kullanıcı tanımlı senaryo oluşturmak için tasarlanmış kullanıcı dostu web sunucusu. 4 Mb ESP-12E serisi ile program için 1 Mb ve pikselleştirilmiş görüntü için 112.5KB boyutundaki görüntüler için 3 Mb kullanabiliriz. Web sunucusu yapmak için Arduino kod tabanı uygulaması. kodun döngüsünde aşağıdaki gibi üç ana işlevi vardır
void loop() { if(!SHOW && !TEST) server.handleClient(); if(SHOW) { if((millis()- OpenlastTime) >SÜRE[image_index]*1000) { if(image_index>=IMAGE_NUM) image_index=0; _memory_pointer=start_address_of_imagefile[image_index]; Serial.printf("Dosya numarası=%u adı:%s adresi:%u süre:%u\n", image_index, IMAGES[image_index].c_str(), start_address_of_imagefile[image_index], SÜRE[image_index]); Current_imageLine=0; image_index++; OpenlastTime=milis(); } if((micros()-lastLineShow)> lineInterval) { lastLineShow=micros(); ESP.flashRead(_memory_pointer, (uint32_t *)led'ler, NUM_LEDS*3); FastLED.show(); _memory_pointer+=(NUM_LEDS*3); Current_imageLine++; gecikme (SatırAralığıGecikmesi); } if(Current_imageLine>=IMAGES_LINES) { Current_imageLine=0; _memory_pointer=start_address_of_imagefile[image_index-1]; } } iyimser_verim(1000); }
Sunucu İşleyicisi server.handleClient(); webhost'taki herhangi bir müşteri talebini işlemekten sorumlu olan bu web sitesi, verileri yüklemek, herhangi bir durum raporunun gösteri ayarını değiştirmek için isteğe bağlı olarak tasarlanabilir. Webhost'um, ilk sekmede aşağıdaki resimler gibi üç sekmeden oluşuyor, her bir resim için sıra ve süre ile mevcut gösteri senaryosunu, ayrıca ağ bilgilerini ve gösterilen POV rpm'yi kontrol edebiliyoruz.
resim yükle sekmesinde MCU belleğine pikselleştirilmiş bir resim yükleyebilir veya belirli bir resmi silebiliriz
ağ sekmesinde wifi modu, statik ip, ağ adı ve geçişi gibi ağ ayarlarını değiştirebiliriz,..
Görüntü Yükleyici
Ajax tarafından bu işlev sunucusu istemcisi, pikselleştirilmiş görüntüyü MCU belleğine yüklemek için istekte bulunur, ardından dosyayı ham formatta belleğe yazar, böylece dosyayı okumak mümkün olduğunca hızlı olur. LED şeritte görüntülemek için tabloda bellek başlangıç ve bitiş konumu deposu
Ekran işlevi
LED şeritte piksel göstermek için FastLED lib'i kullandım, bu kitaplık AVR ve ESP platformunda LED gösterisi için en başarılı ve iyi geliştirilmiş kitaplardan biridir. Sadece, saklanan LED pikselinin konumu olan FastLED işlevini göndermeniz gerekir. bellekten satır satır pikselleri okuyup LED şeritte gösteriyoruz ve yeni rotasyon bayrağının gerçekleşmesini bekliyoruz. bu diziyi her görüntünün 200 satırı okunana kadar tekrarladık
git depomda bulunan kodun tamamı burada
Aşağıda mobil kamera ile kaydedilen POV hareket halindeki video ve açıkladığım gibi, profesyonel olmayan kameranın yavaş diyafram hızı nedeniyle video kalitesi iyi değil