1 metrin POV ja IOT käytössä: 3 vaihetta (kuvien kanssa)
1 metrin POV ja IOT käytössä: 3 vaihetta (kuvien kanssa)
Anonim
Image
Image
1 metrin POV ja IOT käytössä
1 metrin POV ja IOT käytössä
1 metrin POV ja IOT käytössä
1 metrin POV ja IOT käytössä
1 metrin POV ja IOT käytössä
1 metrin POV ja IOT käytössä

Ennen kuin aloitan selityksen tästä projektista, haluaisin pyytää anteeksi huonolaatuista kuvaa ja videota, mutta rehellisesti sanottuna on todella vaikeaa ottaa terävää ja selkeää kuvaa POV: n käyttämisestä normaalilla kameralla, kuten matkapuhelimellani. Se tarvitsee erittäin nopeaa kalvo -optista linssiä todellisen liikkeen sieppaamiseen, mutta lähetän paremman videon, kun voin vihdoin ostaa CANON -kamerani

Mikä on POV

POV on lyhenne sanoista Persistence Of Vision Globe, joka liittyy ihmisen näön ilmiöön. Kevyt ärsyke viipyy jälkivaikutuksena verkkokalvoon noin 1/10 sekunnista. Kun valon ärsykkeet sekvensoidaan nopeasti peräkkäin, ne sulautuvat yhdeksi jatkuvaksi kuvaksi. Itse asiassa se on elokuva- ja televisiolaitteiden perusta. POV luo tällaisen harhan (pettää meidät) ja luo kuvan kiertämällä LED -valojärjestelmää yhden pisteen tai akselin ympäri

Mikä on projektiinnovaatio

Tietysti POV ei ole uusi idea, ja Instructablesissa tai muilla sivustoilla on jo paljon projekteja, mutta nämä projektit käyttävät enimmäkseen esiasetettua staattista temppeliä tai kuvaa, joka luetaan enimmäkseen MCU -muistista tai SD -kortilta, mutta tässä projektissa käytämme kauniita ominaisuuksia IOT -yhteensopivasta sirusta, kuten ESP8266, tässä asiassa.

Tämän IOT -ominaisuuden avulla me

  1. voi helposti ladata uusia kuvia muistiin langattomasti
  2. luo haluamasi skenaario kuvaesityksestä missä tahansa järjestyksessä tai kestolla
  3. sirua ei tarvitse ohjelmoida uudelleen tai irrottaa muistikorttia ja kytkeä se uudelleen animaatiota varten
  4. käyttäjäystävällinen IOT -web -isäntä helpottaa jokaisen hallitsemaan POV -toimintoa matkapuhelimella tai tabletilla jopa etänä
  5. erittäin edullinen laitteistototeutus, jonka kapasiteetti on yli 30 erilaista kuvaa

Kuinka POV toimii

POV-näytöt, lineaarinen (1-ulotteinen) LED-valojärjestelmä pyörii yhden pisteen ympäri, kuten pyörän pyörä. Mittaamalla niiden pyörimisnopeutta ja ohjaamalla niiden välähdyksiä millisekunnin tarkkuudella voimme luoda illuusion 2 tai 3-ulotteisesta kuvasta, joka viipyy ilmassa. Tarkastellaan minkä tahansa tehosteen yksittäistä kehystä (kuva, teksti,…), jokainen kehys koostuu monista pikseleistä ja siten monista taso- tai pallomaisista alueista, POV näyttää tämän kuvan yhdellä kuvan rivillä, joka muuttuu sijainnin ja sen kiertymisen mukaan ongelmana on, miten LED -pikselien väriä voidaan hallita tarkasti ajassa ja tilassa, jotta se voisi luoda koko kuvan.

Eri pyörimisakseleilla voi tuottaa tasomaisen, lieriömäisen ja pallomaisen POV -näytön

monet POV-projektit käyttävät yksinkertaisia yksivärisiä LED-valoja tai nopeita älykkäitä pikseleitä, kuten WS2812 tai APA104, ja tässä projektissa käytämme nopeaa LED-sirun päivitystä APA102, jonka virkistystaajuus on käytännössä noin 16 MHz. Tässä LED -sirussa on 2 linjaa ohjattavaksi (maa, data, kello, +5v)

Vaihe 1: Kuinka rakentaa POV

Kuinka rakentaa POV
Kuinka rakentaa POV
Kuinka rakentaa POV
Kuinka rakentaa POV
Kuinka rakentaa POV
Kuinka rakentaa POV

Aluksi tarvitsen rakenteen POV -navan asentamiseen, joten metalli- tai ei -metallirakenteen tekeminen riippuu siitä, mitä sinulla on käsissäsi. Voit tehdä sen mistä tahansa saatavilla olevasta materiaalista asentaaksesi sen seinälle tai lisätä jalkoja seisomaan. Ystäväni tekee yksinkertaisen kolmijalan ja kiinnittää jakohihnamekanismin pienentääkseen tasavirtamoottorin kierroslukua noin 500. Pieni matematiikka Jotta saamme selkeän ja yhtenäisen kuvan, tarvitsemme kehyksen virkistämistä noin 20 kuvaa sekunnissa, tarkoitetaan selkeää kuvaa, joka on toistettava noin 20 kertaa kertaa sekunnissa, Koska POV -laitteeni koostuu 1 diagonaalisesta LED -nauhasta, joten jokainen kehys on puoliksi tai pyörivä, toisin sanoen tarvitsemme ihanteellisen navan kierrosluvun noin 600 ja tällä kierroksella jokainen kierros kesti noin 100 ms. seuraava yhtälö osoittaa, että käsite RPM = (fps/Nb)*60, joka Nb vastaa haaran lukumäärää, ja tässä tapauksessa meillä on RPM = (20/2)*60 = 600my POV pyörii noin 430 rpm, joten fps on noin 15 fsp joka on melko hyvä tässä asiassa. Mekaanisen osan rakentaminen

Seuraavassa vaiheessa käytin palaa PVC -sylinteriä Jyrsitty pitämään LED -palkin. Navan liittämiseksi hihnapyörän akseliin yksi M10 -pultti on ruuvattu PCV -osan taakse Kaksi kuparirengasta, joka on asennettu hihnapyörän akselille, siirtämään 5 voltin tasavirta levylle ja LED -nauhalle, sitten seuraavien kuvien mukaisesti tämä osa on asennettu yksinkertaiseen hihnapyörään Ajansiirtojärjestelmä, joka on kytketty 12 V DC -moottoriin

Vaihe 2: Ohjelmiston käyttöönotto Osa 1

Ohjelmistototeutus Osa 1
Ohjelmistototeutus Osa 1

Annetun kuvan osoittamiseksi LED -nauhana jokainen kuva on pikseloitava ja ladattava sitten MCU -muistiin ja syötettävä sitten LED -nauhalle rivi riviltä, jotta tein sen ohjelmistolle kahdelle eri alustalle, joista toinen perustuu Java -ajonaikaiseen käsittelyyn ja muut C ++: ssa MCUP: lle Pikseloidun ohjelman käsittelyssä tämä ohjelma kirjoitti IDE -käsittelyssä ja se yksinkertaisesti avaa kuvatiedoston ja kierrä sitä vaiheittain poimiakseen pikselöityjä kuvajonoja. Valitsen 200 rivin minkä tahansa kuvan näyttämiseksi, joten käännän kuvaa (360 /200=1,8 astetta) 200 kertaa 200 rivin poimimiseksi. Koska LED -nauhani koostuu 144 LED: stä, joissa on upotettu APA102 -siru, koko kuva on 200*144 = 28800 pikseliä. Koska jokainen väri APA102 -sirunäytössä, jossa on 4 tavua (W, RGB), kukin kuvakoko on täsmälleen 200*144*4 = 115200 tai 112,5 KB seuraava käsittelykoodi osoittaa kuvan pikselöinnin ja tuloksena on bin -laajennustiedosto, joka voi ladataan MCU -muistiin

PImage img, black_b, image_load; PrintWriter -lähtö; int SQL; kellua led_t; tavu pov_data; int rivin_numero = 200; Merkkijono _OUTPUT = "";

mitätön asetukset ()

{selectInput ("Valitse kuva", "imageChosen"); noLoop (); odota(); }

mitätön asennus ()

{output = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); for (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} tausta (musta_b); pushMatrix (); imageMode (KESKUS); kääntää (SQL/2, SQL/2); kiertää (radiaanit (l*360/line_num)); kuva (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) punainen (c)+""+(char) vihreä (c)+""+(char) sininen (c)); // tulosta ((char) punainen (c)+""+(char) vihreä (c)+""+(char) sininen (c)+";"); täytä (c); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // viive (500); l ++; }

tyhjä avainPainettu ()

{output.flush (); // Kirjoittaa loput tiedot tiedostoon output.close (); // Viimeistelee tiedoston exit (); // Pysäyttää ohjelman}

tyhjä kuvaValittu (tiedosto f)

{if (f == null) {println ("Ikkuna suljettiin tai käyttäjä osui peruuta."); exit (); } else {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); Merkkijono s = f.getAbsolutePath (); Jono lista = jaettu (s, '\'); int n = lista.pituus; Jono fle = split (lista [n-1], '.'); println ("Avaa tiedosto:"+fle [0]); _LÄHTÖ = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img.leveys; int h = img.height; SQL = max (w, h); koko (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"koko led ="+led_t); }} tyhjä hiiriPainettu () {silmukka ();}

mitätön mydata ()

{tavu b = loadBytes ("jotain.dat"); // Tulosta jokainen arvo (0–255) (int i = 0; i <b.length; i ++) {// Joka kymmenes numero, aloita uusi rivi, jos ((i % 10) == 0) println (); // tavua on -128 -127, tämä muuntuu 0: sta 255: een int a = b & 0xff; tulosta (a + ""); } println (); // Tulosta tyhjä rivi saveBytes ("numbers.dat", b); } mitätön odotus () {while (img == null) {delay (200); } silmukka (); }

Vaihe 3: Ohjelmiston käyttöönotto Osa 2

Image
Image
Ohjelmistototeutus Osa 2
Ohjelmistototeutus Osa 2
Ohjelmistototeutus Osa 2
Ohjelmistototeutus Osa 2

MCU -näyttöohjelma

Suorituskykyinen ESP8266-siru on valittu useista syistä. Ensinnäkin se on kehittänyt avoimet SDK-työkalut hyödyntämään WiFi-ominaisuuksia rinnallaan muisti ja ylläpitää verkkopalvelinta käyttäjälle. Tämän ominaisuuden ansiosta käyttäjäystävällinen verkkopalvelin on suunniteltu lataamaan pikseloitu kuva MCU-muistiin ja luomaan käyttäjän määrittämä skenaario esitystä varten. 4 Mb ESP-12E -sarjan avulla voimme käyttää 1 Mb ohjelmalle ja 3 Mb kuville, joiden koko on 112,5 KB pikselöidylle kuvalle voisimme laittaa noin 25 kuvaa MCU: lle ja tehdä minkä tahansa sekvenssin tai minkä tahansa näyttöjakson käyttämääni ladattua kuvaa varten Arduino -koodipohjainen toteutus verkkopalvelimen luomiseksi. koodilla on kolme päätoimintoa silmukassaan seuraavasti

void loop () {if (! SHOW &&! TEST) server.handleClient (); jos (NÄYTÄ) {jos ((millis ()- OpenlastTime)> KESTO [image_index]*1000) {if (image_index> = IMAGE_NUM) image_index = 0; _muistin_osoitin = alkuosoite_kuvakuvatiedoston [kuva_indeksi]; Serial.printf ("Tiedoston numero =%u nimi:%s osoite:%u kesto:%u / n", image_index, IMAGES [image_index].c_str (), start_address_of_imagefile [image_index], DURATION [image_index]); Current_imageLine = 0; kuva_indeksi ++; OpenlastTime = millis (); } if ((micros ()-lastLineShow)> lineInterval) {lastLineShow = micros (); ESP.flashRead (_muistin_osoitin, (uint32_t *) ledit, NUM_LEDS *3); FastLED.show (); _muistin_osoitin+= (NUM_LEDS*3); Current_imageLine ++; viive (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _muistin_osoitin = alkuosoite_kuvakuvatiedoston [kuva_indeksi-1]; }} optimistinen_tuotto (1000); }

Palvelinkäsittelijä server.handleClient (); tämä sivusto voi olla suunniteltu mielivaltaisesti lataamaan tietoja, muuttamaan minkä tahansa tilaraportin esitysasetuksia. Web -isäntäni koostuu kolmesta välilehdestä, kuten seuraavasta kuvasta ensimmäisessä välilehdessä.

Lataa kuva -välilehdessä voimme ladata pikselitetyn kuvan MCU -muistiin tai poistaa tietyn kuvan

Verkko -välilehdessä voimme muuttaa verkkoasetuksia, kuten wifi -tila, staattinen ip, verkon nimi ja salasana,..

Kuvan latausohjelma

Tämä Ajaxin palvelinpalvelinasiakaspyyntö lähettää pikselöity kuva MCU -muistiin ja kirjoittaa sitten tiedoston muistiin raakamuodossa, jotta tiedoston lukeminen sujuu mahdollisimman nopeasti. Muistin alku- ja loppukohdat tallennetaan taulukkoon LED -nauhoina näytettäväksi

Näyttötoiminto

Käytin FastLED libiä pikselin näyttämiseen LED -nauhassa, tämä kirjasto on yksi menestyneimmistä ja hyvin kehitettyjä LED -esityksille AVR- ja ESP -alustalla. Se tarvitsee vain lähettää FastLED -toiminnon, tallennetun LED -pikselin sijainnin. luemme rivi riviltä pikseliä muistista ja näytämme sen LED -nauhassa ja odotamme uuden kiertolipun toteutumista. toistimme tätä järjestystä, kunnes 200 riviä jokaisesta kuvasta on luettu

koko koodi, joka sijaitsee git -arkistossani täällä

seuraava on video POV -toiminnasta, joka on tallennettu mobiilikameralla, ja kuten selitin, videon laatu ei ole hyvä epäammattimaisen kameran hitaan kalvonopeuden vuoksi