1 metr POV z włączonym IOT: 3 kroki (ze zdjęciami)
1 metr POV z włączonym IOT: 3 kroki (ze zdjęciami)
Anonim
Image
Image
1 metr POV z włączonym IOT
1 metr POV z włączonym IOT
1 metr POV z włączonym IOT
1 metr POV z włączonym IOT
1 metr POV z włączonym IOT
1 metr POV z włączonym IOT

Przed rozpoczęciem wyjaśniania tego projektu chciałbym przeprosić za niską jakość obrazu i wideo, ale szczerze mówiąc, naprawdę trudno jest uzyskać ostry i wyraźny obraz z uruchomionego POV z normalną kamerą, taką jak moja kamera mobilna. Potrzebuje bardzo szybkiego obiektywu optycznego z przesłoną, aby uchwycić prawdziwy ruch, ale prześlę lepsze wideo, gdy w końcu będę mógł kupić mój aparat CANON

Co to jest POV

POV to skrót od Persistence Of Vision Globe, który jest związany z fenomenem ludzkiego wzroku. Bodziec świetlny utrzymuje się na siatkówce przez około 1/10 sekundy. Gdy bodźce świetlne są sekwencjonowane szybko po sobie, łączą się w jeden ciągły obraz. W rzeczywistości jest podstawą urządzeń filmowych i telewizyjnych. POV tworzy taką iluzję (oszukuj nas) i tworzy obraz, obracając tablicę diod LED wokół jednego punktu lub osi

Czym jest innowacja projektu

Oczywiście POV nie jest nowym pomysłem i wiele projektów już istnieje w Instructables lub w innych witrynach, jednak te projekty najczęściej wykorzystują wstępnie ustawioną statyczną świątynię lub obraz, który jest w większości odczytywany z pamięci MCU lub karty SD, ale w tym projekcie używamy pięknych funkcji chipa obsługującego IOT, takiego jak ESP8266 w tej kwestii.

Dzięki tym funkcjom IOT my

  1. może z łatwością przesyłać nowe obrazy do pamięci bezprzewodowo
  2. stwórz pożądany scenariusz pokazu obrazów z dowolną sekwencją lub dowolnym czasem trwania
  3. nie ma potrzeby przeprogramowywania chipa ani odłączania karty pamięci i ponownego podłączania jej w celu uzyskania nowej animacji;
  4. przyjazny dla użytkownika webhost IOT ułatwia każdemu zarządzanie POV za pomocą telefonu komórkowego lub tabletu, nawet zdalnie
  5. bardzo tania implementacja sprzętowa o pojemności ponad 30 różnych obrazów

Jak działa POV

Wyświetlacze POV, liniowy (1-wymiarowy) układ świateł LED obraca się wokół jednego punktu, jak koło rowerowe. Mierząc ich prędkość obrotową i kontrolując ich błyski z milisekundową precyzją, możemy stworzyć iluzję dwu- lub trójwymiarowego obrazu unoszącego się w powietrzu. Rozważmy pojedynczą klatkę dowolnego efektu (obraz, tekst, …), każda ramka składa się z wielu pikseli, a zatem wielu linii w obszarze płaskim lub sferycznym, POV wyświetla ten obraz z pojedynczą linią obrazu, której położenie zmienia się wraz z jego obrotem w celu wypełnienia ten obraz, więc problem polega na tym, jak precyzyjnie kontrolować kolor piksela LED w czasie i przestrzeni, aby mógł stworzyć cały obraz. POV są podzielone na kategorie na podstawie osi obrotu, rodzaju efektu, jaki można wyświetlić i ile kolorów można stworzyć.

Dzięki innej osi obrotu może wytwarzać płaski, cylindryczny i sferyczny wyświetlacz POV

wiele projektów POV używa prostych jednokolorowych diod LED lub szybkich inteligentnych pikseli, takich jak WS2812 lub APA104, aw tym projekcie używamy szybkiego odświeżacza diod LED APA102 z częstotliwością odświeżania praktycznie około 16 MHz. Ten układ LED ma 2 linie do sterowania (ziemia, dane, zegar, + 5 v)

Krok 1: Jak zbudować POV

Jak zbudować POV
Jak zbudować POV
Jak zbudować POV
Jak zbudować POV
Jak zbudować POV
Jak zbudować POV

Na początku potrzebuję konstrukcji do zamontowania piasty POV, wykonanie metalowej lub niemetalowej konstrukcji zależy od tego, co masz w rękach. Możesz wykonać go z dowolnego dostępnego materiału, aby zainstalować go na ścianie lub dodać nogi, aby zrobić stojak. Mój przyjaciel robi prosty statyw i montuje mechanizm paska rozrządu, aby zmniejszyć obroty silnika prądu stałego o około 500. Mała matematyka Aby uzyskać wyraźny i spójny obraz, potrzebujemy odświeżenia kadru około 20 fps, oznacza to, że aby mieć wyraźny obraz, musimy go wielokrotnie wyświetlać około 20 kl/s razy na sekundę, Ponieważ mój POV składa się z 1 ukośnej taśmy LED, stąd każda klatka zakończona o połowę lub obrót, innymi słowy potrzebujemy idealnego koncentratora RPM około 600 i przy tym obrocie każdy obrót trwał około 100 ms. poniższe równanie pokazuje, że pojęcie RPM=(fps/Nb)*60, które Nb jest równe Numerowi gałęzi, a w tym przypadku mamy RPM=(20/2)*60=600mój POV obraca się wokół 430 obr/min, więc mój fps wynosi około 15 fsp co jest dość dobre w tej sprawie. Budowa części mechanicznej

W kolejnym kroku użyłem frezowanego kawałka cylindra PCV do podtrzymywania listwy LED. W celu połączenia piasty z wałem koła pasowego przykręcono jedną śrubę M10 z tyłu części PCV Dwa pierścienie Cupper zainstalowane na wale koła pasowego do transmisji 5 V DC na płytkę i taśmę LED, następnie jak na poniższych zdjęciach ta część zamontowana na prostym kole pasowym system transmisji czasu, który jest podłączony do silnika 12V DC, każda część ma własne zasilanie i jest zamknięta w białym pudełku przymocowanym do nóg

Krok 2: Implementacja oprogramowania, część 1

Implementacja oprogramowania, część 1
Implementacja oprogramowania, część 1

W celu zademonstrowania danego obrazu w taśmie LED, każdy obraz powinien być pikselizowany, następnie wgrany do pamięci MCU, a następnie podawany na taśmę LED linia po linii, w tym celu wykonałem oprogramowanie dla dwóch różnych platform, jeden bazuje na java runtime Processing i inne w C++ dla programu pikselowego MCUProcessing ten program napisał w Processing IDE i po prostu otwiera plik obrazu, a następnie obraca go krokowo, aby wyodrębnić rozpikselowane linie obrazu. Wybieram 200 linii do wyświetlania dowolnego obrazu, więc obracam obraz o 360 /200=1,8 stopnia) 200 razy, aby wyodrębnić 200 linii. Ponieważ moja taśma LED składa się ze 144 diod LED z wbudowanym chipem APA102, cały obraz ma 200*144=28800 pikseli. Ponieważ każdy kolor na wyświetlaczu chipa APA102 z 4 bajtami (W, RGB), dlatego każdy rozmiar obrazu wynosi dokładnie 200*144*4=115200 lub 112,5KB, następujący kod przetwarzania pokazuje sekwencję pikselizacji obrazu, a wynikiem będzie plik rozszerzenia bin, który może być przesłane do pamięci MCU

PImage img, black_b, image_load;Wyjście PrintWriter; int SQL; pływak led_t; bajt pov_data; int numer_linii=200; Ciąg _OUTPUT="";

nieważne ustawienia()

{ selectInput("Wybierz obraz", "imageChosen"); noLoop(); czekać(); }

pusta konfiguracja()

{ wyjście = 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(); Tryb obrazu(ŚRODEK); przetłumacz(SQL/2, SQL/2); obróć(radiany(l*360/liczba_linii)); obraz(obraz, 0, 0); popMatrix(); pushMatrix(); for(int i=0;i<144;i++) { kolor c = get(int(i*led_t+led_t/2), int(SQL/2); output.print((znak)czerwony(c)+""+(znak)zielony(c)+""+(znak)niebieski(c)); // drukuj((znak)czerwony(c)+""+(znak)zielony(c)+""+(znak)niebieski(c)+";"); wypełnienie(c); rect(i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println(); popMatrix(); // opóźnienie(500); l++; }

nieważny klawiszNaciśnięty()

{ wyjście.flush(); // Zapisuje pozostałe dane do pliku output.close(); // kończy plik exit(); // Zatrzymuje program }

void imageWybrany(Plik f)

{ if (f == null) { println("Okno zostało zamknięte lub użytkownik nacisnął Cancel.");exit(); } else { if(f.exists()) img = loadImage(f.getAbsolutePath()); Ciąg s=f.getAbsolutePath(); String list = split(s, '\'); int n=lista.długość; String fle=split(list[n-1], '.'); println("Otwórz plik:"+fle[0]); _OUTPUT=fle[0]+".bin"; // img = loadImage("test.jpg"); int w = szerokość obrazu; int h = img.wysokość; SQL=maks(sz, godz); rozmiar (SQL, SQL); led_t=SQL/144.0; println("h="+h+" w="+w+" max="+SQL+" rozmiar led="+led_t); } } void mousePressed(){ loop();}

nieważne mojedane()

{ byte b = loadBytes("coś.dat"); // Wydrukuj każdą wartość, od 0 do 255 for (int i = 0; i < b.length; i++) { // Co dziesiątą liczbę, rozpocznij nową linię if ((i % 10) == 0) println(); // bajty są od -128 do 127, to zamienia się na 0 do 255 int a = b & 0xff; drukuj(a + " "); } println(); // Wydrukuj pustą linię na końcu saveBytes("numbers.dat", b); } void wait() { while (img == null) { delay(200); } pętla(); }

Krok 3: Implementacja oprogramowania, część 2

Image
Image
Implementacja oprogramowania, część 2
Implementacja oprogramowania, część 2
Implementacja oprogramowania, część 2
Implementacja oprogramowania, część 2

Program wyświetlania MCU

Wysokowydajny układ ESP8266 został wybrany z kilku powodów, po pierwsze dobrze opracował otwarte narzędzia SDK, aby korzystać z funkcji Wi-Fi wraz z pamięcią do hostowania serwera WWW dla użytkownika. Dzięki tym możliwościom przyjazny dla użytkownika serwer sieciowy przeznaczony do przesyłania pikselowanego obrazu do pamięci MCU i tworzenia scenariusza zdefiniowanego przez użytkownika. W przypadku serii 4 Mb ESP-12E możemy użyć 1 Mb na program i 3 Mb na obrazy, które przy rozmiarze 112,5 KB dla obrazu w pikselach moglibyśmy z grubsza przesłać 25 obrazów na MCU i moglibyśmy wykonać dowolną sekwencję lub dowolny okres wyświetlania dla przesłanego obrazu, którego używam Implementacja bazy kodu Arduino do tworzenia serwera WWW. kod ma trzy główne funkcje w swojej pętli zgodnie z poniższym

void loop() { if(!POKAŻ && !TEST) server.handleClient(); if(SHOW) { if((millis()- OpenlastTime) >CZAS TRWANIA[indeks_obrazu]*1000) { if(indeks_obrazu>=NUMER_OBRAZU) indeks_obrazu=0; _memory_pointer=adres_początkowy_pliku_obrazu[indeks_obrazu]; Serial.printf("Numer pliku=%u nazwa:%s adres:%u czas trwania:%u\n", image_index, OBRAZY[image_index].c_str(), start_address_of_imagefile[image_index], CZAS TRWANIA[image_index]); Bieżący_obraz_linia=0; indeks_obrazu++; OpenlastTime=millis(); } if((micros()-lastLineShow)> lineInterval) { lastLineShow=micros(); ESP.flashRead(_memory_pointer, (uint32_t *)ledy, NUM_LEDS*3); FastLED.show(); _memory_pointer+=(NUM_LEDS*3); Bieżący_obraz_linia++; opóźnienie(LineIntervalDelay); } if(Current_imageLine>=IMAGES_LINES) { Current_imageLine=0; _memory_pointer=adres_początkowy_pliku_obrazu[indeks_obrazu-1]; } } optymistyczny_yield(1000); }

Obsługa serwera server.handleClient(); odpowiedzialny za przetwarzanie wszelkich żądań klienta na hoście internetowym, ta strona internetowa może być projektowana arbitralnie w celu przesyłania danych, zmiany ustawień wyświetlania dowolnego raportu stanu. Mój webhost składa się z trzech zakładek, ponieważ następujące obrazy w pierwszej zakładce możemy sprawdzić aktualny scenariusz pokazu z sekwencją i czasem trwania dla każdego obrazu, a także informacje o sieci oraz pokazane obroty POV

w zakładce upload image możemy wgrać pikselowany obraz do pamięci MCU lub usunąć określony obraz

w zakładce sieci możemy zmienić ustawienia sieci, takie jak tryb wifi, statyczny adres IP, nazwa sieci i hasło,..

Program do ładowania obrazów

ta funkcja klienta serwera żąda od Ajax, aby przesłać pikselowany obraz do pamięci MCU, a następnie zapisać plik w pamięci w formacie raw, aby odczytanie pliku było jak najszybsze. Pamięć startowa i końcowa miejsce przechowywania w tabeli do wyświetlania na pasku LED

Funkcja wyświetlania

Użyłem biblioteki FastLED lib do pokazania pikseli w taśmie LED, ta biblioteka jest jedną z najbardziej udanych i dobrze opracowanych do pokazów LED na platformie AVR i ESP. Wystarczy wysłać funkcję FastLED, czyli lokalizację zapisanego piksela LED. odczytujemy piksele linia po linii z pamięci i pokazujemy to na pasku LED i czekamy na spełnienie nowej flagi obrotu. powtarzaliśmy tę sekwencję aż do odczytania 200 linijek każdego obrazu

cały kod znajduje się w moim repozytorium git tutaj

Poniżej znajduje się wideo POV w akcji, które jest rejestrowane przez kamerę mobilną i jak wyjaśniłem, jakość wideo nie jest dobra ze względu na niską prędkość membrany nieprofesjonalnej kamery

Zalecana: