1 metr POV s povoleným IOT: 3 kroky (s obrázky)
1 metr POV s povoleným IOT: 3 kroky (s obrázky)
Anonim
Image
Image
1 metr POV s povoleným IOT
1 metr POV s povoleným IOT
1 metr POV s povoleným IOT
1 metr POV s povoleným IOT
1 metr POV s povoleným IOT
1 metr POV s povoleným IOT

Před zahájením vysvětlování tohoto projektu bych se chtěl omluvit za nekvalitní obraz a video, ale upřímně je opravdu těžké pořídit ostrý a jasný obraz z běžícího POV běžným fotoaparátem, jako je můj mobilní fotoaparát. K zachycení skutečného pohybu je potřeba velmi rychlý optický objektiv s membránou, ale lepší video nahraji, až si konečně budu moci koupit fotoaparát CANON

Co je POV

POV znamená Persistence Of Vision Globe, který souvisí s fenoménem lidského vidění. Světelný podnět přetrvává jako následný účinek na sítnici asi 1/10 sekundy. Když jsou světelné podněty sekvenovány v rychlém sledu, sloučí se do jednoho souvislého obrazu. Ve skutečnosti je to základ pro filmová a televizní zařízení. POV vytváří takovou iluzi (klame nás) a vytváří obraz otáčením řady LED světel kolem jednoho bodu nebo osy

Co je to inovace projektu

Off course POV není nový nápad a spousta projektů již existuje v Instructables nebo na jiných webech, nicméně tyto projekty většinou používají přednastavený statický chrám nebo obraz, který je většinou načten z paměti MCU nebo SD karty, ale v tomto projektu používáme nasazení krásných funkcí čipu s povolenou IOT jako ESP8266 v této záležitosti.

S touto funkcí IOT my

  1. lze snadno bezdrátově nahrávat nové obrázky do paměti
  2. vytvořte požadovaný scénář přehlídky obrázků s libovolnou sekvencí nebo libovolným trváním
  3. pro novou animaci není třeba přeprogramovat čip ani odpojit paměťovou kartu a znovu ji zapojit
  4. uživatelsky přívětivý webhosting IOT usnadňuje každému správu POV pomocí mobilního telefonu nebo tabletu i na dálku
  5. velmi levná hardwarová implementace s kapacitou více než 30 různých obrázků

Jak funguje POV

Displeje POV, lineární (1-rozměrná) řada LED světel se otáčí kolem jednoho bodu, jako kolo kola. Měřením rychlosti jejich otáčení a ovládáním jejich záblesků s milisekundovou přesností můžeme vytvořit iluzi 2 nebo 3-dimenzionálního obrazu, který přetrvává ve vzduchu. Uvažujme jeden snímek jakéhokoli efektu (obrázek, text, …), každý snímek se skládá z mnoha pixelů, a proto z mnoha řádků v rovině nebo sférické oblasti, POV zobrazí tento obrázek s jedním řádkem obrazu, jehož poloha se mění spolu s jeho otáčením k vyplnění ten obrázek, takže problém je, jak přesně řídit barvu pixelu LED způsobem času a prostoru, aby mohl vytvořit celý obraz, POV jsou kategorizovány podle osy otáčení, typu efektu, který lze zobrazit, a kolik barvy lze vytvořit.

Různou osou otáčení lze produkovat planární, válcový a sférický POV displej

mnoho projektů POV používá jednoduché jednobarevné LED nebo vysokorychlostní inteligentní pixely jako WS2812 nebo APA104 a v tomto projektu používáme rychlý obnovovač LED čipů APA102 s prakticky kolem 16 MHz obnovovací frekvence. tento LED čip má 2 řádky pro ovládání (uzemnění, data, hodiny, +5v)

Krok 1: Jak vybudovat POV

Jak vybudovat POV
Jak vybudovat POV
Jak vybudovat POV
Jak vybudovat POV
Jak vybudovat POV
Jak vybudovat POV

Nejprve potřebuji konstrukci pro montáž náboje POV, takže kovová nebo nekovová konstrukce závisí na tom, co máte v rukou. Můžete jej vyrobit z jakéhokoli dostupného materiálu a nainstalovat jej na zeď nebo přidat nohy do stojanu. Můj přítel vyrobil jednoduchý stativ a namontoval mechanismus rozvodového řemene, aby snížil otáčky stejnosměrného motoru kolem 500. Malá matematika Abychom získali jasný a souvislý obraz, potřebujeme osvěžení obrazu kolem 20 snímků za sekundu, znamená to, že máme jasný obraz, musíme jej opakovaně zobrazovat kolem 20 krát za sekundu, protože můj POV se skládá z 1 diagonálního LED pásku, proto je každý snímek doplněn polovinou nebo rotací, jinými slovy potřebujeme otáčky ideálního rozbočovače kolem 600 a při těchto otáčkách každá otáčka trvala asi 100 ms. následující rovnice ukazuje, že koncept RPM = (fps/Nb)*60, který Nb se rovná počtu větví, a v tomto případě máme RPM = (20/2)*60 = 600 my POV točí kolem 430 ot/min, takže moje fps je kolem 15 fsp což je v této záležitosti docela dobré. Stavba mechanické části

V dalším kroku jsem použil kus PVC válce Frézovaný k držení lišty LED. Pro připojení náboje k hřídeli kladky byl k zadní části dílu PCV přišroubován jeden šroub M10 Dva kroužky mědi nainstalované na hřídeli kladky pro přenos 5 V stejnosměrného proudu na desku a LED pásek, poté podle následujících obrázků byla tato část namontována na jednoduchou kladku systém přenosu času, který je připojen k 12 V stejnosměrnému motoru, každá část má vlastní napájecí zdroj a je uzavřena v bílém boxu připevněném k nohám

Krok 2: Implementace softwaru Část 1

Implementace softwaru Část 1
Implementace softwaru Část 1

Aby bylo možné prokázat daný obrázek v LED pásku, každý obraz by měl být pixelizován, poté nahrán do paměti MCU a poté veden do LED pásu řádek po řádku, abych to udělal pro software pro dvě různé platformy, jedna je založena na zpracování Java runtime a další v C ++ pro MCU Zpracování pixelizovaného programu, tento program napsal do Processing IDE a jednoduše otevřel soubor s obrázkem, poté jej otočil v krocích k extrahování pixelizovaných řádků obrázku. Pro zobrazení libovolného obrázku zvolím 200 řádků, takže obrázek otočím na doraz (360 /200=1,8 stupně) 200krát extrahujte 200 řádků. Protože se můj LED pás skládá ze 144 LED s integrovaným čipem APA102, má celý obrázek 200*144 = 28 800 pixelů. Protože každá barva na čipu APA102 zobrazuje 4 bajty (W, RGB), každá velikost obrázku je tedy přesně 200*144*4 = 115200 nebo 112,5 kB podle následujícího kódu zpracování ukazuje sekvenci pixelizace obrazu a výsledkem bude soubor s příponou bin, který může nahrát do paměti MCU

PImage img, black_b, image_load; PrintWriter výstup; int SQL; float led_t; byte pov_data; int line_num = 200; Řetězec _OUTPUT = "";

neplatné nastavení ()

{selectInput ("Vyberte obrázek", "imageChosen"); noLoop (); Počkejte(); }

neplatné nastavení ()

{output = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); for (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} pozadí (black_b); pushMatrix (); imageMode (CENTRUM); translate (SQL/2, SQL/2); rotate (radiány (l*360/line_num)); obrázek (obrázek, 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)+";"); výplň (c); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // zpoždění (500); l ++; }

zrušit stisknutí klávesy ()

{output.flush (); // Zapíše zbývající data do souboru output.close (); // Dokončí soubor exit (); // Zastaví program}

neplatný imageChosen (soubor f)

{if (f == null) {println ("Okno bylo zavřeno nebo uživatel stiskl zrušení."); exit (); } else {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); Řetězec s = f.getAbsolutePath (); Řetězec seznam = rozdělení (s, '\'); int n = list.length; Řetězec fle = rozdělení (seznam [n-1], '.'); println ("Otevřít soubor:"+fle [0]); _OUTPUT = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = šířka obrázku; int h = obr. výška; SQL = max (š, v); velikost (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"velikost led ="+led_t); }} neplatné mousePressed () {loop ();}

neplatné mydata ()

{byte b = loadBytes ("something.dat"); // Vytiskněte každou hodnotu, od 0 do 255 pro (int i = 0; i <b.length; i ++) {// Každé desáté číslo, začněte nový řádek if ((i % 10) == 0) println (); // bajty jsou od -128 do 127, toto se převede na 0 až 255 int a = b & 0xff; tisk (a + ""); } println (); // Vytiskněte prázdný řádek na konec saveBytes ("numbers.dat", b); } void wait () {while (img == null) {delay (200); } loop (); }

Krok 3: Implementace softwaru Část 2

Image
Image
Implementace softwaru Část 2
Implementace softwaru Část 2
Implementace softwaru Část 2
Implementace softwaru Část 2

Program zobrazení MCU

Vysoce výkonný čip ESP8266 byl vybrán z několika důvodů, nejprve má dobře vyvinuté otevřené nástroje SDK pro využití funkcí WiFi vedle paměti pro hostování webového serveru pro uživatele. Díky těmto možnostem je uživatelsky přívětivý webový server navržen tak, aby odeslal pixelizovaný obrázek do paměti MCU a vytvořil uživatelem definovaný scénář pro show. S řadou 4 Mb ESP-12E můžeme použít 1 Mb pro program a 3 Mb pro obrázky, které o velikosti 112,5 kB pro pixelizovaný obrázek dokážou nahrát zhruba 25 obrázků na MCU a pro nahraný obrázek mohu použít libovolnou sekvenci nebo libovolnou dobu zobrazení Implementace základny kódu Arduino pro vytvoření webového serveru. kód má ve své smyčce tři hlavní funkce podle následujícího

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 = start_address_of_imagefile [image_index]; Serial.printf ("Číslo souboru =%u název:%s adresa:%u doba trvání:%u / n", image_index, IMAGES [image_index].c_str (), start_address_of_imagefile [image_index], DURATION [image_index]); Current_imageLine = 0; image_index ++; OpenlastTime = millis (); } 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 ++; zpoždění (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [image_index-1]; }} optimistic_yield (1000); }

Obsluha serveru server.handleClient (); zodpovědný za zpracování jakéhokoli požadavku klienta na webhostingu, tato webová stránka může být libovolně navržena pro odesílání dat, změnit nastavení zobrazení jakékoli zprávy o stavu. Můj webhost se skládá ze tří karet, protože na následujících obrázcích na první kartě jsme mohli zkontrolovat aktuální scénář show se sekvencí a trváním pro každý obrázek, také informace o síti a zobrazené otáčky POV

na kartě Odeslat obrázek můžeme nahrát pixelizovaný obrázek do paměti MCU nebo odstranit konkrétní obrázek

na kartě síť můžeme změnit nastavení sítě, jako je režim wifi, statické IP, název sítě a heslo,..

Nahrávač obrázků

tato funkce klienta serveru požadavek Ajax nahrát pixelizovaný obraz do paměti MCU, poté zapsat soubor do paměti v nezpracovaném formátu, aby bylo čtení souboru co nejrychlejší. Místo začátku a konce paměti je uloženo v tabulce pro zobrazení v LED pásku

Funkce displeje

Použil jsem FastLED lib k zobrazení pixelu v LED pásku, tato knihovna je jednou z nejúspěšnějších a nejlépe vyvinutých pro LED show na platformě AVR a ESP. Stačí odeslat funkci FastLED, umístění uloženého LED pixelu. čteme pixely po řádcích z paměti a zobrazujeme je v LED pásku a čekáme na splnění nového příznaku otáčení. tuto sekvenci jsme opakovali, dokud nebylo načteno 200 řádků z každého obrázku

celý kód umístěný v mém úložišti git zde

Následuje video POV v akci, které je zaznamenáno mobilní kamerou a jak jsem vysvětlil, kvalita videa není dobrá kvůli pomalé rychlosti membrány neprofesionální kamery