Sisukord:

Tehke oma kaamera: 8 sammu
Tehke oma kaamera: 8 sammu

Video: Tehke oma kaamera: 8 sammu

Video: Tehke oma kaamera: 8 sammu
Video: На Барби с сестрой! 😆💖 #shorts 2024, November
Anonim
Image
Image
Tehke oma kaamera
Tehke oma kaamera

Selles juhendis selgitatakse, kuidas teha ühevärvilist kaamerat, kasutades Omnivision OV7670 pildisensorit, Arduino mikrokontrollerit, mõnda hüppaja juhtmest ja tarkvara Processing 3.

Esitatakse ka eksperimentaalne tarkvara värvipildi saamiseks.

640*480 pikslise pildi jäädvustamiseks vajutage klahvi “c” … pildi salvestamiseks faili vajutage klahvi “s”. Kui soovite luua lühikese aegluubis filmi, on järjestikused pildid nummerdatud.

Kaamera ei ole kiire (iga skannimine võtab 6,4 sekundit) ja sobib kasutamiseks ainult püsivalguses.

Maksumus, välja arvatud teie Arduino ja arvuti, on väiksem kui tass kohvi.

Pildid

Komponendid ilma hüppaja juhtmestikuta on näidatud avafotol.

Teine foto on ekraanipilt, millel on näha Arduino kaamera tarkvara ja kaadripüüdja Processing 3. Sisend näitab, kuidas kaamera on ühendatud.

Video näitab kaamera toimimist. Kui pildistamisklahvi “c” vajutatakse, vilgub kujutise skannimisel lühike välk ja sellele järgnev tegevus. Pärast skannimise lõppu ilmub pilt automaatselt ekraanile. Pärast iga klahvi „s” vajutamist kuvatakse pildid kaustas Processing. Video lõpetuseks jalgrattasõit kiiresti läbi kõigi kolme salvestatud pildi.

Samm: vooluahela skeem

Lülitusskeem
Lülitusskeem
Lülitusskeem
Lülitusskeem
Lülitusskeem
Lülitusskeem

Selle kaamera kõigi versioonide lülitusskeem on näidatud fotol 1.

Fotod 2, 3 näitavad, kuidas džemprid-juhtmed ja komponendid on ühendatud.

Ilma alumiiniumklambrita jäävad pildid külili.

Hoiatus

Programmeerige oma Arduino ENNE hüppajajuhtmete kinnitamist kaamera kiibile OV7670. See hoiab ära eelmise programmi 5 -voldise väljundpoldi 3V3 -voldise OV7670 kaamera kiibi hävitamise.

Samm: osade loend

Osade nimekiri
Osade nimekiri

Järgmised osad saadi saidilt

  • 1 ainult OV7670 300KP VGA kaameramoodul arduino DIY KIT jaoks
  • 1 ainult kaamera kronstein koos mutrite ja poltidega
  • 1 ainult UNO R3 arduino MEGA328P jaoks 100% originaal ATMEGA16U2 koos USB -kaabliga

Järgmised osad saadi kohapeal

  • 18 anly Arduino isas-naine hüppajakaablit
  • 3 ainult Arduinini emane-emane hüppajakaablit
  • 1 ainult väike leivalaud
  • 4 ainult 4K7 oomi 1/2 vatti takistit
  • 1 alumiiniumist alus.

Teil on vaja ka järgmisi andmelehti:

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

3. samm: teooria

Teooria
Teooria

OV7670 kaamera kiip

OV7670 kaamera kiibi vaikiväljund sisaldab YUV (4: 2: 2) videosignaali ja 3 ajastuse lainekuju. Muud väljundvormingud on võimalikud, programmeerides siseregistrid I2C -ga ühilduva siini kaudu.

YUV (4: 2: 2) videosignaal (foto 1) on mustvalgete (mustvalgete) pikslite pidev jada, mis on eraldatud U (sinine värvierinevus) ja V (punane värvierinevus) värviteabega.

See väljundvorming on tuntud kui YUV (4: 2: 2), kuna iga 4 -baidine rühm sisaldab 2 ühevärvilist ja 2 värvibaiti.

Ühevärviline

Ühevärvilise pildi saamiseks peame proovima iga teine andmebait.

Arduinol on ainult 2K muutmälu, kuid iga kaader sisaldab 640*2*480 = 307, 200 andmebaiti. Kui me OV7670-le raamihaarajat ei lisa, tuleb kõik andmed arvutile rida-realt töödelda saata.

On kaks võimalust:

Iga 480 järjestikuse kaadri puhul saame jäädvustada ühe rea Arduinole suure kiirusega enne selle saatmist arvutisse kiirusega 1 Mbps. Sellise lähenemisviisi korral näeks OV7670 täiskiirusel töötavat, kuid see võtaks kaua aega (üle minuti).

Minu valitud lähenemisviis on PCLK aeglustamine 8uS -ni ja iga proovi saatmine nii, nagu see tuleb. See lähenemine on oluliselt kiirem (6,4 sekundit).

4. samm: kujundusmärkused

Disaini märkmed
Disaini märkmed
Disaini märkmed
Disaini märkmed
Disaini märkmed
Disaini märkmed

Ühilduvus

OV7670 kaamera kiip on 3v3 -voldine seade. Andmeleht näitab, et pinged üle 3,5 voldi kahjustavad kiipi.

Selleks, et teie 5 -voldine Arduino ei hävitaks OV7670 kaamera kiipi:

  • Arduino välise kella (XCLK) signaal tuleb pingejaguri abil vähendada ohutule tasemele.
  • Sisemised Arduino I2C tõmbetakistid kuni 5 volti tuleb välja lülitada ja asendada 3v3-voldise toiteallikaga väliste tõmbetakistustega.
  • Programmeerige oma Arduino ENNE hüppajajuhtmete kinnitamist, kuna mõned tihvtid võivad siiski olla programmeeritud varasema projekti väljundina !!! (Õppisin seda raskel viisil … õnneks ostsin kaks, kuna need olid nii odavad).

Väline kell

OV7670 kaamera kiip vajab välist kella sagedusvahemikus 10Mhz kuni 24MHz.

Kõrgeim sagedus, mida saame 16MHz Arduino abil genereerida, on 8MHz, kuid tundub, et see töötab.

Seeria link

1 andmebaidi saatmiseks 1Mbps (miljon bitti sekundis) jadaühenduse kaudu kulub vähemalt 10 uS (mikrosekundit). See aeg koosneb järgmisest:

  • 8 andmebitti (8us)
  • 1 stardibitt (1uS)
  • 1 stopp-bit (1uS)

Sisemine kell

OV7670 sisemise pikslikella (PCLK) sagedus määratakse bittidega [5: 0] registris CLKRC (vt foto 1). [1]

Kui määrame bitid [5: 0] = B111111 = 63 ja rakendame selle ülaltoodud valemile, siis:

  • F (sisemine kell) = F (sisendkell)/(bitt [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz või
  • = 8uS

Kuna proovide võtmine toimub ainult igal teisel andmebaidil, annab PCLK intervall 8uS 16uS proovi, mis on piisav aeg 1 andmebaidi (10uS) edastamiseks, jättes 6uS töötlemiseks.

Kaadrisagedus

Iga VGA videokaader sisaldab 784*510 pikslit (pildielemendid), millest kuvatakse 640*480 pikslit. Kuna YUV (4: 2: 2) väljundvormingus on keskmiselt 2 andmebaiti piksli kohta, võtab iga kaader aega 784*2*510*8 uS = 6,4 sekundit.

See kaamera EI OLE kiire !!!

Horisontaalne positsioneerimine

Kui muudame HSTART ja HSTOP väärtusi, säilitades 640 piksli erinevuse, võidakse pilti horisontaalselt liigutada.

Kui liigutate oma pilti vasakule, on võimalik, et teie HSTOP väärtus on väiksem kui HSTART väärtus!

Ärge muretsege … see kõik on seotud vastuvooludega, nagu on selgitatud fotol 2.

Registrid

OV7670-l on 201 kaheksa-bitist registrit, et juhtida selliseid asju nagu võimendus, valge tasakaal ja säritus.

Üks andmebait võimaldab ainult 256 väärtust vahemikus [0] kuni [255]. Kui vajame suuremat kontrolli, peame mitu registrit kaskaadima. Kaks baiti annab meile 65536 võimalust … kolm baiti annavad meile 16, 777, 216.

Fotol 3 näidatud 16 -bitine AEC (automaatne särikontroll) register on selline näide ja see on loodud järgmiste kolme registri osade kombineerimisel.

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

Olge hoiatatud … registriaadressid pole rühmitatud!

Kõrvalmõjud

Aeglane kaadrisagedus toob kaasa mitmeid soovimatuid kõrvaltoimeid:

Õige särituse korral eeldab OV7670, et see töötab kaadrisagedusega 30 kaadrit sekundis (kaadrit sekundis). Kuna iga kaader võtab aega 6,4 sekundit, on elektrooniline katik avatud 180 korda kauem kui tavaliselt, mis tähendab, et kõik pildid on ülevalgustatud, kui me ei muuda mõnda registriväärtust.

Liigse särituse vältimiseks olen seadnud kõik AEC (automaatse särituse juhtimise) registri bitid nulliks. Sellegipoolest on ereda valgustuse korral vaja objektiivi ette neutraalse tihedusega filtrit.

Pikaajaline kokkupuude mõjutab ka UV -andmeid. Kuna ma ei ole veel leidnud õigeid värve tekitavaid registrikombinatsioone, siis pidage seda pooleli.

Märge

[1]

Andmelehel (foto 1) näidatud valem on õige, kuid vahemik näitab ainult bitte [4: 0]?

5. samm: lainekujundite ajastus

Ajastuslainekujud
Ajastuslainekujud
Ajastuslainekujud
Ajastuslainekujud
Ajastuslainekujud
Ajastuslainekujud

Märkus diagrammi „VGA Frame Timing” vasakus alanurgas (foto 1) on järgmine:

YUV/RGB puhul tp = 2 x TPCLK

Joonised 1, 2 ja 3 kontrollivad andmelehte (lehti) ja kinnitavad, et Omnivision käsitleb iga 2 andmebaiti 1 piksli ekvivalendina.

Ostsilloskoobi lainekujud kontrollivad ka seda, et HREF jääb tühjendusintervallide ajal madalaks.

Joonis 4 kinnitab, et Arduino XCLK väljund on 8 MHz. Põhjus, miks me näeme siinus-, mitte ruutlainet, on see, et kõik veidrad harmoonilised on minu 20MHz proovivõtuostsilloskoobi jaoks nähtamatud.

6. samm: raamihaarats

Raami haarats
Raami haarats

Pildiandur OV7670 kaamera kiibis sisaldab massiivi 656*486 pikslit, millest foto jaoks kasutatakse võrku 640*480 pikslit.

Pildi paigutamiseks sensori kohale kasutatakse registriväärtusi HSTART, HSTOP, HREF ja VSTRT, VSTOP, VREF. Kui pilt pole sensori kohale õigesti paigutatud, näete ühe või mitme serva kohal musta riba, nagu on selgitatud jaotises „Kujundusmärkused”.

OV7670 skannib pildi iga rida üks piksel korraga, alustades vasakust ülanurgast, kuni jõuab paremasse alumisse pikslisse. Arduino edastab need pikslid lihtsalt jadaühenduse kaudu arvutisse, nagu on näidatud fotol 1.

Kaadripüüdjate ülesanne on jäädvustada kõik need 640*480 = 307200 pikslit ja kuvada sisu "pildi" aknas

Töötlemine 3 saavutab selle, kasutades nelja järgmist koodirida !!

Koodirida 1:

bait baitBuffer = uus bait [maxBytes+1]; // kus maxBytes = 307200

Selle avalduse aluseks olev kood loob:

  • 307201 baidimassiivi nimega „byteBuffer [307201]”
  • Täiendav bait on mõeldud lõpetamise (linefeed) märgi jaoks.

Koodirida 2:

suurus (640, 480);

Selle avalduse aluseks olev kood loob:

  • muutuja nimega „width = 640;”
  • muutuja nimega “kõrgus = 480”;
  • 307200 pikslimassiivi, mida nimetatakse piksliteks [307200]
  • 640*480 piksline “pilt” aken, kus kuvatakse pikslite massiivi sisu. Seda "pildi" akent värskendatakse pidevalt kaadrisagedusega 60 kaadrit sekundis.

Koodirida 3:

baitarv = myPort.readBytesUntil (lf, byteBuffer);

Selle avalduse aluseks olev kood:

  • puhverdab sissetulevad andmed kohapeal, kuni näeb märki „lf” (linefeed).
  • misjärel see tühjendab esimesed 307200 baiti kohalikke andmeid baitBuffer massiivi.
  • See salvestab ka vastuvõetud baitide arvu (307201) muutujaks, mida nimetatakse baitideks.

Koodirida 4:

pikslid = värv (baitpuhver );

Kui see paigutatakse järgmisesse silmusesse, on selle avalduse aluseks olev kood:

  • kopeerib massiivi „byteBuffer ” massiivi „pixels ”
  • mille sisu kuvatakse pildiaknas.

Võtmejooned:

Kaadripüüdja tunneb ära järgmised klahvivajutused:

  • "C" = jäädvusta pilt
  • 'S' = salvestage pilt faili.

Samm 7: Tarkvara

Laadige alla ja installige kõik järgmised tarkvarapaketid, kui neid pole veel installitud:

  • “Arduino” saidilt
  • „Java 8” saidilt https://java.com/et/download/ [1]
  • "Töötlemine 3" saidilt

Arduino visandi installimine:

  • Eemaldage kõik OV7670 hüppaja juhtmed [2]
  • Ühendage Arduinoga USB -kaabel
  • Kopeerige „OV7670_camera_mono_V2.ino“(lisatud) sisu Arduino „visandisse“ja salvestage.
  • Laadige visand oma Arduinole üles.
  • Ühendage Arduino vooluvõrgust lahti
  • Nüüd saate OV7670 hüppaja juhtmed turvaliselt uuesti ühendada
  • Ühendage USB -kaabel uuesti.

Protsessi visandi installimine ja käivitamine

  • Kopeerige „OV7670_camera_mono_V2.pde” (lisatud) sisu töötlemise „visandisse” ja salvestage.
  • Klõpsake vasakus ülanurgas nuppu "Käivita" … ilmub must pildiaken
  • Klõpsake "musta" pildi akent
  • Pildistamiseks vajutage klahvi “c”. (umbes 6,4 sekundit).
  • Pildi salvestamiseks töötluskausta vajutage klahvi „s“
  • Korrake samme 4 ja 5
  • Programmist väljumiseks klõpsake nuppu "stop".

Märkused

[1]

Töötlemiseks 3 on vaja Java 8

[2]

See on „ainult üks kord“ohutus samm, et vältida OV7670 kaamera kiibi kahjustamist.

Kuni visand „OV7670_camera_mono.ini” pole teie Arduinole üles laaditud, on sisemised tõmbetakistid ühendatud 5 voltiga, lisaks on võimalik, et mõned Arduino andmeliinid võivad olla 5-voldised väljundid … mis kõik võivad lõppeda 3v3 -voldine OV7670 kaamera kiip.

Kui Arduino on programmeeritud, pole seda sammu vaja korrata ja registri väärtusi võidakse ohutult muuta.

Samm: värvilise pildi saamine

Värvilise pildi saamine
Värvilise pildi saamine
Värvilise pildi saamine
Värvilise pildi saamine
Värvilise pildi saamine
Värvilise pildi saamine

Järgmine tarkvara on puhtalt eksperimentaalne ja postitatakse lootuses, et mõned tehnikad osutuvad kasulikuks. Tundub, et värvid on ümberpööratud … Ma pole veel õigeid registrisätteid leidnud. Kui leiate lahenduse, postitage oma tulemused

Värvilise pildi saamiseks tuleb jäädvustada kõik andmebaidid ja kasutada järgmisi valemeid.

OV7670 kasutab RGB (punane, roheline, sinine) värviteabe YUV -ks (4: 2: 2) teisendamiseks järgmisi valemeid: [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) RGB värviks muutmiseks võib kasutada järgmisi valemeid: [2]

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

Lisatud tarkvara on lihtsalt ühevärvilise tarkvara laiendus:

  • Arduinole saadetakse c -püüdmise taotlus
  • Arduino saadab arvutisse paarisarvulised (ühevärvilised) baidid
  • Arvuti salvestab need baidid massiivi
  • Järgmisena saadab Arduino arvutisse paaritu arvuga (chroma) baiti.
  • Need baidid salvestatakse teise massiivi … meil on nüüd kogu pilt.
  • Ülaltoodud valemid on nüüd rakendatud igale neljale UYVY andmebaiti rühmale.
  • Saadud värvipikslid paigutatakse seejärel massiivi „pixels ”
  • Arvuti skaneerib „pikslite ” massiivi ja pilt ilmub aknasse „pilt”.

Tarkvara Processing 3 kuvab lühidalt iga skannimise ja lõpptulemused:

  • Foto 1 näitab skaneeringu 1 U & V värvuse andmeid
  • Foto 2 näitab skaneeringu 2 Y1 ja Y2 heleduse andmeid
  • Foto 3 näitab värvilist pilti … ainult üks asi on valesti … kott peaks olema roheline !!

Postitan uue koodi, kui olen selle programmi lahendanud …

Viited:

[1]

www.haoyuelectronics.com/Attachment/OV7670%… (lehekülg 33)

[2]

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

Muude juhendite vaatamiseks klõpsake siin.

Soovitan: