Sisällysluettelo:

Tee oma kamera: 8 vaihetta
Tee oma kamera: 8 vaihetta

Video: Tee oma kamera: 8 vaihetta

Video: Tee oma kamera: 8 vaihetta
Video: Бесплатное Видеонаблюдение.Будет ли работать камера без ОБЛАКА? 2024, Marraskuu
Anonim
Image
Image
Tee oma kamera
Tee oma kamera

Tässä ohjeessa selitetään, kuinka tehdä yksivärinen kamera Omnivision OV7670 -kuva -anturin, Arduino -mikrokontrollerin, muutaman hyppyjohdon ja Processing 3 -ohjelmiston avulla.

Esillä on myös kokeellinen ohjelmisto värikuvan saamiseksi.

Ota 640*480 pikselin kuva painamalla c -näppäintä… tallenna kuva tiedostoon painamalla s -näppäintä. Peräkkäiset kuvat numeroidaan järjestyksessä, jos haluat luoda lyhyen intervallivideon.

Kamera ei ole nopea (jokainen skannaus kestää 6,4 sekuntia) ja sopii käytettäväksi vain kiinteässä valaistuksessa.

Kustannukset, lukuun ottamatta Arduinoa ja tietokonettasi, ovat alle kupin kahvia.

Kuvat

Osat, ilman hyppyjohdotusta, näkyvät avauskuvassa.

Toinen kuva on kuvakaappaus, jossa näkyy Arduino-kameraohjelmisto ja Processing 3 -kehyksentekijä. Sisäosa osoittaa, miten kamera on kytketty.

Video osoittaa kameran toiminnassa. Kun”c” -näppäintä painetaan, kuva vilkkuu lyhyen välähdyksen jälkeen ja aktiviteetin jälkeen. Kuva tulee automaattisesti näyttöikkunaan, kun skannaus on valmis. Kuvat näkyvät sitten Processing -kansiossa jokaisen "s" -näppäimen painalluksen jälkeen. Videon päätteeksi selataan nopeasti läpi kaikki kolme tallennettua kuvaa.

Vaihe 1: Piirikaavio

Piirikaavio
Piirikaavio
Piirikaavio
Piirikaavio
Piirikaavio
Piirikaavio

Tämän kameran kaikkien versioiden kytkentäkaavio on esitetty kuvassa 1.

Valokuvat 2, 3 osoittavat, kuinka hyppyjohdot ja komponentit on kytketty.

Ilman alumiinikannatinta kuvat makaavat kyljellään.

Varoitus

Ohjelmoi Arduino ENNEN kuin liität hyppyjohdot OV7670 -kamerasiruun. Tämä estää 5 voltin ulostulonappeja edellisestä ohjelmasta tuhoamasta 3 V3 voltin OV7670 -kamerasirua.

Vaihe 2: Osaluettelo

Osaluettelo
Osaluettelo

Seuraavat osat on hankittu osoitteesta

  • 1 vain OV7670 300KP VGA -kameramoduuli arduino DIY KIT -laitteelle
  • 1 vain kameran kiinnike muttereilla ja ruuveilla
  • 1 vain UNO R3 arduino MEGA328P: lle 100% alkuperäinen ATMEGA16U2 USB -kaapelilla

Seuraavat osat on hankittu paikallisesti

  • 18 Arduinon uros-naarasliitinkaapelia
  • 3 vain Arduinin-naaras-naarasliitinkaapelia
  • 1 vain mini leipälauta
  • Vain 4 4K7 ohmin 1/2 watin vastukset
  • 1 vain alumiiniromualusta.

Tarvitset myös seuraavat tiedot:

  • https://web.mit.edu/6.111/www/f2016/tools/OV7670_20…
  • https://www.haoyuelectronics.com/Attachment/OV7670%…

Vaihe 3: Teoria

Teoria
Teoria

OV7670 -kamerasiru

OV7670 -kameran sirun oletuslähtö sisältää YUV (4: 2: 2) videosignaalin ja 3 ajoituksen aaltomuotoa. Muut tulostusmuodot ovat mahdollisia ohjelmoimalla sisäiset rekisterit I2C -yhteensopivan väylän kautta.

YUV (4: 2: 2) videosignaali (kuva 1) on jatkuva mustavalkoisten (mustavalkoisten) pikselien sarja, jotka on erotettu toisistaan U (sininen väriero) ja V (punainen väriero).

Tämä tulostusmuoto tunnetaan nimellä YUV (4: 2: 2), koska jokainen 4 tavun ryhmä sisältää 2 yksiväristä tavua ja ja 2 väritavua.

Yksivärinen

Mustavalkoisen kuvan saamiseksi meidän on otettava näytteitä joka toinen datatavu.

Arduinolla on vain 2 000 satunnaismuistia, mutta jokainen kehys sisältää 640*2*480 = 307, 200 datatavua. Ellei lisäämme kehyskaappainta OV7670: een, kaikki tiedot on lähetettävä PC: lle rivi kerrallaan käsittelyä varten.

On kaksi mahdollisuutta:

Jokaiselle 480 peräkkäiselle kehykselle voimme kaapata yhden rivin Arduinolle suurella nopeudella ennen sen lähettämistä tietokoneelle 1 Mbps: n nopeudella. Tällainen lähestymistapa näkisi OV7670: n toimivan täydellä nopeudella, mutta se kestäisi kauan (reilusti yli minuutin).

Lähestymistapani on hidastaa PCLK 8uS: iin ja lähettää jokainen näyte sellaisena kuin se tulee. Tämä lähestymistapa on huomattavasti nopeampi (6,4 sekuntia).

Vaihe 4: Huomautuksia suunnittelusta

Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia

Yhteensopivuus

OV7670 -kamerasiru on 3 voltin laite. Tietolomake osoittaa, että yli 3,5 voltin jännitteet vahingoittavat sirua.

Estääksesi 5 voltin Arduinoasi tuhoamasta OV7670 -kamerasirua:

  • Arduinon ulkoinen kellosignaali (XCLK) on vähennettävä turvalliselle tasolle jännitteenjakajan avulla.
  • Sisäiset 5 V: n Arduino I2C -vetovastus on poistettava käytöstä ja korvattava ulkoisilla vetovastusvastuksilla 3 voltin jännitteelle.
  • Ohjelmoi Arduino ENNEN minkä tahansa hyppyjohtimen kiinnittämistä, koska jotkut nastat voivat silti olla ohjelmoitu aikaisemman projektin lähtöksi !!! (Opin tämän vaikealla tavalla … onneksi ostin kaksi, koska ne olivat niin halpoja).

Ulkoinen kello

OV7670 -kamerasiru vaatii ulkoisen kellon taajuusalueella 10Mhz - 24MHz.

Suurin taajuus, jonka voimme tuottaa 16 MHz: n Arduinosta, on 8 MHz, mutta tämä näyttää toimivan.

Sarja linkki

Vähintään 10 uS (mikrosekuntia) kestää 1 datatavun lähettäminen 1 Mbps (miljoona bittiä sekunnissa) sarjaliitännän kautta. Tämä aika muodostuu seuraavasti:

  • 8 databittiä (8us)
  • 1 aloitusbitti (1uS)
  • 1 pysäytysbitti (1uS)

Sisäinen kello

OV7670: n sisäisen pikselikellon (PCLK) taajuus asetetaan biteillä [5: 0] rekisterissä CLKRC (katso kuva 1). [1]

Jos asetamme bitit [5: 0] = B111111 = 63 ja käytämme sitä yllä olevaan kaavaan, niin:

  • F (sisäinen kello) = F (tulokello)/(Bitti [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz tai
  • = 8 uS

Koska otamme näytteitä vain joka toinen datatavu, PCLK -aikaväli 8uS johtaa 16uS -näytteeseen, joka on riittävä aika lähettää 1 datatavu (10uS) ja jättää 6uS käsittelyyn.

Ruudunpäivitysnopeus

Jokainen VGA -videokehys sisältää 784*510 pikseliä (kuvaelementtejä), joista 640*480 pikseliä näytetään. Koska YUV (4: 2: 2) -formaatissa on keskimäärin 2 datatavua pikseliä kohden, jokainen kehys kestää 784*2*510*8 uS = 6,4 sekuntia.

Tämä kamera EI ole nopea !!!

Vaakasuora paikannus

Kuvaa voidaan siirtää vaakasuunnassa, jos muutamme HSTART- ja HSTOP -arvoja säilyttäen 640 pikselin eron.

Kun siirrät kuvaa vasemmalle, HSTOP -arvo voi olla pienempi kuin HSTART -arvo!

Älä ole huolissasi … kaikki liittyy vastavirtauksiin, kuten kuvassa 2 selitetään.

Rekisterit

OV7670: ssä on 201 kahdeksan bittistä rekisteriä, joilla voidaan hallita esimerkiksi vahvistusta, valkotasapainoa ja valotusta.

Yksi datatavu sallii vain 256 arvoa alueella [0] - [255]. Jos tarvitsemme enemmän valvontaa, meidän on porrastettava useita rekistereitä. Kaksi tavua antaa meille 65536 mahdollisuutta … kolme tavua antaa meille 16, 777, 216.

Kuvassa 3 näkyvä 16 -bittinen AEC (Automatic Exposure Control) -rekisteri on tällainen esimerkki, ja se luodaan yhdistämällä osia seuraavista kolmesta rekisteristä.

  • AECHH [5: 0] = AEC [15:10]
  • AECH [7: 2] = AEC [9: 2]
  • COM1 [1: 0] = AEC [1: 0]

Varoitus … rekisterin osoitteita ei ole ryhmitelty yhteen!

Sivuvaikutukset

Hidas kuvataajuus tuo mukanaan useita ei -toivottuja sivuvaikutuksia:

Oikean valotuksen saavuttamiseksi OV7670 odottaa toimivan 30 kuvan sekuntinopeudella (kuvaa sekunnissa). Koska jokainen kehys kestää 6,4 sekuntia, elektroninen suljin on auki 180 kertaa tavallista pidempään, mikä tarkoittaa, että kaikki kuvat ovat ylivalotettuja, ellemme muuta joitakin rekisteriarvoja.

Ylivalotuksen estämiseksi olen asettanut kaikki AEC (automaattinen valotuksen hallinta) -rekisteribitit nollaan. Silti neutraalin tiheyden suodatin tarvitaan linssin eteen, kun valaistus on kirkas.

Pitkä altistus näyttää vaikuttavan myös UV -tietoihin. Koska en ole vielä löytänyt oikeita värejä tuottavia rekisteriyhdistelmiä… katsokaa tämä olevan kesken.

Huomautus

[1]

Tietolomakkeessa (kuva 1) esitetty kaava on oikea, mutta alue näyttää vain bitit [4: 0]?

Vaihe 5: Aaltomuotojen ajoitus

Ajoitus -aaltomuodot
Ajoitus -aaltomuodot
Ajoituksen aaltomuodot
Ajoituksen aaltomuodot
Ajoituksen aaltomuodot
Ajoituksen aaltomuodot

"VGA Frame Timing" -kaavion (kuva 1) vasemmassa alakulmassa oleva huomautus kuuluu:

YUV/RGB: tp = 2 x TPCLK

Kuvissa 1, 2 ja 3 tarkistetaan tietolomake (t) ja varmistetaan, että Omnivision käsittelee jokaista 2 datatavua 1 pikselin vastaavana.

Oskilloskoopin aaltomuodot varmistavat myös, että HREF pysyy matalana sammutusvälien aikana.

Kuva 4 vahvistaa, että Arduinon XCLK -lähtö on 8 MHz. Syy, miksi näemme siniaaltoa, ei neliöaaltoa, on se, että kaikki parittomat harmoniset ovat näkymättömiä 20 MHz: n näytteenotto -oskilloskoopilleni.

Vaihe 6: Kehyksen tarttuja

Kehyksen tarttuja
Kehyksen tarttuja

OV7670 -kamerasirun kuva -anturi käsittää 656*486 pikselin sarjan, joista valokuvassa käytetään 640*480 pikselin ruudukkoa.

HSTART-, HSTOP-, HREF- ja VSTRT-, VSTOP-, VREF -rekisteriarvoja käytetään kuvan sijoittamiseen anturin päälle. Jos kuvaa ei ole sijoitettu oikein anturin päälle, näet mustan raidan yhden tai useamman reunan yli, kuten kohdassa”Suunnitteluhuomautukset” selitetään.

OV7670 skannaa kuvan jokaisen rivin pikselin kerrallaan alkaen vasemmasta yläkulmasta, kunnes se saavuttaa oikean alakulman. Arduino yksinkertaisesti välittää nämä pikselit tietokoneelle sarjayhteyden kautta, kuten kuvassa 1.

Kehyksen nappaajan tehtävä on kaapata jokainen näistä 640*480 = 307200 pikselistä ja näyttää sisältö”kuva” -ikkunassa

Käsittely 3 saavuttaa tämän käyttämällä seuraavia neljää koodiriviä !!

Koodirivi 1:

tavu tavuBuffer = uusi tavu [maxBytes+1]; // jossa maxBytes = 307200

Tämän lausuman taustalla oleva koodi luo:

  • 307201 tavutaulukko nimeltä "byteBuffer [307201]"
  • Ylimääräinen tavu on pääte (linefeed) -merkille.

Koodirivi 2:

koko (640, 480);

Tämän lausuman taustalla oleva koodi luo:

  • muuttuja nimeltä "width = 640;"
  • muuttuja nimeltä "korkeus = 480";
  • 307200 pikselin matriisi nimeltä "pikseleitä [307200]"
  • 640*480 pikselin”kuva” -ikkuna, jossa pikselitaulukon sisältö näytetään. Tämä "kuva" -ikkuna päivitetään jatkuvasti 60 kuvan sekuntinopeudella.

Koodirivi 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Tämän lausunnon taustalla oleva koodi:

  • puskuroi saapuvat tiedot paikallisesti, kunnes se näkee "lf" (linefeed) -merkin.
  • jonka jälkeen se tyhjentää ensimmäiset 307200 tavua paikallista dataa tavuBuffer -matriisiin.
  • Se myös tallentaa vastaanotettujen tavujen lukumäärän (307201) muuttujaan nimeltä byteCount.

Koodirivi 4:

pikseliä = väri (tavuBuffer );

Kun se sijoitetaan seuraavaa silmukkaa varten, tämän lausekkeen taustalla oleva koodi:

  • kopioi "byteBuffer " -matriisin sisällön "pixels " -matriisiin
  • jonka sisältö näkyy kuvaikkunassa.

Avainviivat:

Kehyksen tarttuja tunnistaa seuraavat näppäinpainallukset:

  • "C" = kaappaa kuva
  • 'S' = tallenna kuva tiedostoon.

Vaihe 7: Ohjelmisto

Lataa ja asenna jokainen seuraavista ohjelmistopaketeista, jos niitä ei ole jo asennettu:

  • “Arduino” osoitteesta
  • "Java 8" osoitteesta https://java.com/en/download/ [1]
  • "Käsittely 3" osoitteesta

Arduino -luonnoksen asentaminen:

  • Poista kaikki OV7670 -hyppyjohdot [2]
  • Liitä USB -kaapeli Arduinoon
  • Kopioi "OV7670_camera_mono_V2.ino" (liitteenä) sisältö Arduino -luonnokseen ja tallenna.
  • Lataa luonnos Arduinoosi.
  • Irrota Arduino
  • Voit nyt kytkeä OV7670 -hyppyjohdot turvallisesti uudelleen
  • Liitä USB -kaapeli uudelleen.

Processing -luonnoksen asentaminen ja suorittaminen

  • Kopioi”OV7670_camera_mono_V2.pde” (liitteenä) sisältö käsittelyluonnokseen ja tallenna.
  • Napsauta vasemmassa yläkulmassa olevaa "suorita" -painiketta… musta kuvaikkuna tulee näkyviin
  • Napsauta”mustaa” kuvaikkunaa
  • Ota kuva painamalla c -näppäintä. (noin 6,4 sekuntia).
  • Tallenna kuva käsittelykansioon painamalla”s” -näppäintä
  • Toista vaiheet 4 ja 5
  • Poistu ohjelmasta napsauttamalla”stop” -painiketta.

Huomautuksia

[1]

Käsittely 3 vaatii Java 8: n

[2]

Tämä on "vain kerran" turvatoimi, jotta OV7670 -kamerasiru ei vahingoitu.

Kunnes luonnos “OV7670_camera_mono.ini” on ladattu Arduinoosi, sisäiset vetovastusvastukset on kytketty 5 volttiin, ja lisäksi on mahdollista, että jotkut Arduino-datalinjoista voivat olla 5 voltin ulostuloja … jotka kaikki ovat kohtalokkaita 3v3 voltin OV7670 -kamerasiru.

Kun Arduino on ohjelmoitu, sinun ei tarvitse toistaa tätä vaihetta ja rekisteriarvot voidaan muuttaa turvallisesti.

Vaihe 8: Värikuvan saaminen

Värikuvan saaminen
Värikuvan saaminen
Värikuvan saaminen
Värikuvan saaminen
Värikuvan saaminen
Värikuvan saaminen

Seuraava ohjelmisto on puhtaasti kokeellinen ja se lähetetään siinä toivossa, että jotkut tekniikat osoittautuvat hyödyllisiksi. Värit näyttävät kääntyneiltä … En ole vielä löytänyt oikeita rekisteriasetuksia. Jos löydät ratkaisun, lähetä tulokset

Jos aiomme saada värikuvan, kaikki datatavut on otettava talteen ja käytettävä seuraavia kaavoja.

OV7670 käyttää seuraavia kaavoja muuntaakseen RGB -väritiedot (punainen, vihreä, sininen) YUV -muotoon (4: 2: 2): [1]

  • Y = 0,31*R + 0,59*G + 0,11*B
  • U = B - Y
  • V = R - Y
  • Cb = 0,563*(B-Y)
  • Cr = 0,713*(R-Y)

YUV (4: 2: 2) voidaan muuttaa RGB -väreiksi seuraavilla kaavoilla: [2]

  • R = Y + 1,402* (Cr - 128)
  • G = Y -0,344136*(Cb -128) -0,714136*(Cr -128)
  • B = Y + 1,772*(Cb -128)

Liitetty ohjelmisto on yksinkertaisesti yksivärisen ohjelmiston laajennus:

  • Crd -pyyntö lähetetään Arduinolle
  • Arduino lähettää parilliset (yksiväriset) tavut tietokoneelle
  • Tietokone tallentaa nämä tavut taulukkoon
  • Seuraavaksi Arduino lähettää parittomat (kroma) tavut tietokoneelle.
  • Nämä tavut tallennetaan toiseen taulukkoon… meillä on nyt koko kuva.
  • Yllä olevia kaavoja sovelletaan nyt jokaiseen neljän UYVY -datatavun ryhmään.
  • Tuloksena olevat väripikselit sijoitetaan sitten”pixels ” -taulukkoon
  • Tietokone skannaa”pixels ” -ryhmän ja kuva tulee”image” -ikkunaan.

Processing 3 -ohjelmisto näyttää lyhyesti jokaisen skannauksen ja lopulliset tulokset:

  • Kuva 1 näyttää skannauksen 1 U & V -väritiedot
  • Kuva 2 näyttää skannauksen 2 Y1- ja Y2 -luminanssitiedot
  • Kuva 3 näyttää värikuvan … vain yksi asia on väärässä … pussin pitäisi olla vihreä !!

Lähetän uuden koodin, kun olen ratkaissut tämän ohjelman …

Viitteet:

[1]

www.haoyuelectronics.com/Attachment/OV7670%… (sivu 33)

[2]

en.wikipedia.org/wiki/YCbCr (JPEG -muunnos)

Napsauta tätä nähdäksesi muut ohjeeni.

Suositeltava: