Kazalo:

Naredite svojo kamero: 8 korakov
Naredite svojo kamero: 8 korakov

Video: Naredite svojo kamero: 8 korakov

Video: Naredite svojo kamero: 8 korakov
Video: Такое Увидишь Раз в Жизни! Случаи на Дороге Снятые на Камеру 2024, Julij
Anonim
Image
Image
Naredite svojo kamero
Naredite svojo kamero

Ta navodila razlagajo, kako narediti enobarvno kamero s slikovnim senzorjem Omnivision OV7670, mikrokrmilnikom Arduino, nekaj mostičmi in programsko opremo Processing 3.

Predstavljena je tudi eksperimentalna programska oprema za pridobivanje barvne slike.

Pritisnite tipko “c”, da posnamete sliko 640*480 slikovnih pik … pritisnite tipko “s”, da sliko shranite v datoteko. Zaporedne slike so zaporedno oštevilčene, če želite ustvariti kratek časovni zamik.

Kamera ni hitra (vsako skeniranje traja 6,4 sekunde) in je primerna samo za uporabo pri fiksni svetlobi.

Stroški, brez vašega Arduina in računalnika, so manjši od skodelice kave.

Slike

Sestavni deli, brez ožičenja, so prikazani na fotografiji odprtja.

Druga fotografija je posnetek zaslona, na katerem je prikazana programska oprema fotoaparata Arduino in zajemalka okvirjev Processing 3. Vložek prikazuje, kako je fotoaparat priključen.

Video prikazuje kamero v akciji. Ko pritisnete tipko za zajem “c”, pride do kratkega utripa, ki mu sledi rafal aktivnosti med skeniranjem slike. Slika se samodejno prikaže v oknu zaslona, ko je skeniranje končano. Slike se nato prikažejo v mapi Processing po vsakem pritisku tipke “s”. Video se zaključi s hitrim kolesarjenjem po vsaki od treh shranjenih slik.

1. korak: Shema vezja

Shema vezja
Shema vezja
Shema vezja
Shema vezja
Shema vezja
Shema vezja

Shema vezja za vse različice te kamere je prikazana na fotografiji 1.

Fotografije 2, 3 prikazujejo, kako so mostiči in komponente povezani.

Brez aluminijastega nosilca slike ležijo na boku.

Opozorilo

Programirajte svoj Arduino PREDen pritrdite kakršne koli mostične žice na čip kamere OV7670. To bo preprečilo, da bi 5 -voltni izhodni zatiči iz prejšnjega programa uničili čip kamere 3v3 -voltni OV7670.

2. korak: Seznam delov

Seznam delov
Seznam delov

Naslednji deli so bili pridobljeni s spletnega mesta

  • 1 samo OV7670 300KP VGA modul kamere za arduino DIY KIT
  • 1 samo nosilec kamere skupaj z maticami in vijaki
  • 1 samo UNO R3 za arduino MEGA328P 100% original ATMEGA16U2 s kablom USB

Naslednji deli so bili pridobljeni lokalno

  • 18 anly Arduino moško-ženskih mostiščnih kablov
  • 3 samo Arduinin ženski-ženski kabli
  • 1 samo mini plošča za kruh
  • 4 samo 4K7 ohmski upori 1/2 vata
  • 1 samo stojalo iz odpadnega aluminija.

Potrebovali boste tudi naslednje podatkovne liste:

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

3. korak: Teorija

Teorija
Teorija

Čip kamere OV7670

Privzeti izhod iz čipa kamere OV7670 vsebuje video signal YUV (4: 2: 2) in 3 časovne valovne oblike. Druge izhodne oblike so možne s programiranjem notranjih registrov prek vodila, združljivega z I2C.

Video signal YUV (4: 2: 2) (fotografija 1) je neprekinjeno zaporedje enobarvnih (črno -belih) slikovnih pik, ločenih z U (razlika v modri barvi) in V (razlika v rdeči barvi).

Ta izhodna oblika je znana kot YUV (4: 2: 2), saj vsaka skupina po 4 bajte vsebuje 2 enobarvna bajta in 2 barvna bajta.

Enobarvno

Za pridobitev enobarvne slike moramo vzorčiti vsak drugi podatkovni bajt.

Arduino ima samo 2K pomnilnika z naključnim dostopom, vendar vsak okvir vsebuje 640*2*480 = 307, 200 podatkovnih bajtov. Razen če v OV7670 ne dodamo zajemalca okvirjev, morajo biti vsi podatki poslani v računalnik po vrstici za obdelavo.

Obstajata dve možnosti:

Za vsakega od 480 zaporednih sličic lahko z veliko hitrostjo posnamemo eno vrstico na Arduino, preden jo pošljemo v računalnik s hitrostjo 1 Mb / s. S takšnim pristopom bi OV7670 deloval s polno hitrostjo, vendar bi trajal dolgo (precej več kot minuto).

Pristop, ki sem ga uporabil, je, da upočasnim PCLK na 8uS in pošljem vsak vzorec. Ta pristop je bistveno hitrejši (6,4 sekunde).

4. korak: Oblikovalske opombe

Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju

Kompatibilnost

Čip kamere OV7670 je naprava 3v3 voltov. Podatkovni list kaže, da napetost nad 3,5 volta poškoduje čip.

Če želite preprečiti, da bi vaš 5 -voltni Arduino uničil čip kamere OV7670:

  • Signal zunanje ure (XCLK) iz Arduina je treba zmanjšati na varno raven s pomočjo delilnika napetosti.
  • Notranji vlečni upori Arduino I2C do 5 voltov je treba onemogočiti in jih zamenjati z zunanjimi vlečnimi upori do napajanja 3v3 voltov.
  • Programirajte svoj Arduino PRED pritrditvijo kakih mostičnih žic, saj so nekateri zatiči še vedno programirani kot izhod iz prejšnjega projekta !!! (To sem se naučil na težji način … na srečo sem kupil dva, saj sta bila tako poceni).

Zunanja ura

Čip kamere OV7670 zahteva zunanjo uro v frekvenčnem območju od 10 MHz do 24 MHz.

Najvišja frekvenca, ki jo lahko ustvarimo iz 16MHz Arduina, je 8MHz, vendar se zdi, da to deluje.

Serijska povezava

Za pošiljanje 1 bajta podatkov po 1Mbps (milijoni bitov na sekundo) serijske povezave traja najmanj 10 uS (mikrosekund). Ta čas je sestavljen na naslednji način:

  • 8 podatkovnih bitov (8us)
  • 1 začetni bit (1uS)
  • 1 stop-bit (1uS)

Notranja ura

Frekvenca notranje ure slikovnih pik (PCLK) v OV7670 je nastavljena z biti [5: 0] v registru CLKRC (glej fotografijo 1). [1]

Če nastavimo bite [5: 0] = B111111 = 63 in ga uporabimo za zgornjo formulo:

  • F (notranja ura) = F (vhodna ura)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz oz
  • = 8uS

Ker vzorčimo le vsak drugi podatkovni bajt, iz intervala PCLK 8uS dobimo vzorec 16uS, kar je dovolj časa za prenos 1 bajta podatkov (10uS), pri čemer ostane 6uS za obdelavo.

Hitrost sličic

Vsak video okvir VGA obsega 784*510 slikovnih pik (elementi slike), od katerih je prikazanih 640*480 slikovnih pik. Ker ima izhodni format YUV (4: 2: 2) povprečno 2 podatkovna bajta na slikovno piko, bo vsak okvir trajal 784*2*510*8 uS = 6,4 sekunde.

Ta kamera NI hitra !!!

Vodoravno pozicioniranje

Slika se lahko premakne vodoravno, če spremenimo vrednosti HSTART in HSTOP, hkrati pa ohranimo razliko 640 slikovnih pik.

Pri premikanju slike levo je lahko vrednost HSTOP manjša od vrednosti HSTART!

Ne skrbite … vse je povezano s prelivi števcev, kot je razloženo na fotografiji 2.

Registri

OV7670 ima 201 osem-bitni register za nadzor stvari, kot so dobiček, ravnovesje beline in osvetlitev.

En podatkovni bajt dovoljuje samo 256 vrednosti v območju od [0] do [255]. Če potrebujemo več nadzora, moramo kaskadirati več registrov. Dva bajta nam dajeta 65536 možnosti … tri bajta nam dajeta 16, 777, 216.

16 -bitni AEC (samodejni nadzor osvetlitve) register, prikazan na fotografiji 3, je tak primer in je ustvarjen s kombinacijo delov naslednjih treh registrov.

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

Bodite opozorjeni … naslovi registra niso združeni skupaj!

Stranski učinki

Počasna hitrost sličic prinaša številne neželene stranske učinke:

Za pravilno osvetlitev pričakuje, da bo OV7670 deloval pri hitrosti 30 sličic na sekundo (sličic na sekundo). Ker vsak okvir traja 6,4 sekunde, je elektronski zaklop odprt 180-krat dlje kot običajno, kar pomeni, da bodo vse slike preveč osvetljene, razen če spremenimo nekatere vrednosti registra.

Za preprečitev prevelike osvetlitve sem vse registrske bite AEC (samodejna kontrola osvetlitve) nastavil na nič. Kljub temu je potreben filter nevtralne gostote pred objektivom, ko je svetloba močna.

Zdi se, da tudi dolga izpostavljenost vpliva na podatke UV. Ker še nisem našel kombinacij registrov, ki proizvajajo pravilne barve … meni, da je to v teku.

Opomba

[1]

Formula, prikazana na podatkovnem listu (fotografija 1), je pravilna, vendar obseg prikazuje le bite [4: 0]?

5. korak: Časovne oblike valov

Časovne valovne oblike
Časovne valovne oblike
Časovne valovne oblike
Časovne valovne oblike
Časovne valovne oblike
Časovne valovne oblike

Opomba v spodnjem levem kotu diagrama »Časovni okvir VGA« (fotografija 1) se glasi:

Za YUV/RGB je tp = 2 x TPCLK

Slike 1, 2 in 3 preverjajo podatkovne liste in potrjujejo, da Omnivision obravnava vsaka 2 podatkovna bajta kot enakovredno 1 slikovni piki.

Valovne oblike osciloskopa prav tako potrjujejo, da HREF ostane nizek v intervalih zatemnitve.

Slika 4 potrjuje, da je izhod XCLK iz Arduina 8MHz. Razlog, da vidimo sinusni val in ne kvadratni, je, da so vsi čudni harmoniki nevidni za moj osciloskop z vzorčenjem 20 MHz.

Korak 6: Okvir Grabber

Okvir Grabber
Okvir Grabber

Slikovni senzor v čipu kamere OV7670 obsega niz 656*486 slikovnih pik, od katerih je za fotografijo uporabljena mreža 640*480 slikovnih pik.

Vrednosti registra HSTART, HSTOP, HREF in VSTRT, VSTOP, VREF se uporabljajo za postavitev slike nad senzor. Če slika ni pravilno nameščena nad senzorjem, boste na enem ali več robovih videli črni pas, kot je razloženo v razdelku »Opombe pri oblikovanju«.

OV7670 skenira vsako vrstico slike za eno slikovno piko naenkrat, začenši od zgornjega levega kota, dokler ne doseže spodnje desne slikovne pike. Arduino te slikovne pike preprosto posreduje v računalnik prek serijske povezave, kot je prikazano na fotografiji 1.

Naloga zajemanja okvirjev je zajeti vsakega od teh 640*480 = 307200 slikovnih pik in prikazati vsebino v oknu »slika«

Obdelava 3 to doseže z uporabo naslednjih štirih vrstic kode !!

Kodirana vrstica 1:

byte byteBuffer = nov bajt [maxBytes+1]; // kjer je maxBytes = 307200

Osnovna koda v tej izjavi ustvarja:

  • bajtni niz 307201, imenovan »byteBuffer [307201]«
  • Dodatni bajt je za zaključni (vnos vrstice) znak.

Koda 2. vrstica:

velikost (640, 480);

Osnovna koda v tej izjavi ustvarja:

  • spremenljivka, imenovana "width = 640;"
  • spremenljivko, imenovano "višina = 480";
  • matrika 307200 slikovnih pik, imenovana "piksli [307200]"
  • okno s sliko 640*480 slikovnih pik, v katerem je prikazana vsebina slikovnih pik . To okno "slika" se nenehno osvežuje pri hitrosti sličic 60 fps.

Kodirana vrstica 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Temeljna koda v tej izjavi:

  • lokalno medpomni vhodne podatke, dokler ne vidi znaka »lf« (vnos vrstice).
  • nato iztisne prvih 307200 bajtov lokalnih podatkov v matriko byteBuffer .
  • Shrani tudi število prejetih bajtov (307201) v spremenljivko, imenovano "byteCount".

Koda 4. vrstica:

slikovnih pik = barva (byteBuffer );

Ko je postavljena v zanko for-next, je osnovna koda v tej izjavi:

  • kopira vsebino matrike »byteBuffer « v matriko »pixels «
  • katerih vsebina se prikaže v oknu s sliko.

Ključni udarci:

Hvatalnik okvirjev prepozna naslednje pritiske tipk:

  • 'C' = zajem slike
  • ‘S’ = shranite sliko v datoteko.

7. korak: Programska oprema

Prenesite in namestite vsakega od naslednjih programskih paketov, če še ni nameščen:

  • "Arduino" iz
  • »Java 8« s spletnega mesta https://java.com/en/download/ [1]
  • "Obdelava 3" s

Namestitev skice Arduino:

  • Odstranite vse mostične žice OV7670 [2]
  • Priključite kabel USB na svoj Arduino
  • Kopirajte vsebino »OV7670_camera_mono_V2.ino« (priloženo) v Arduinovo »skico« in shranite.
  • Skico naložite v svoj Arduino.
  • Odklopite Arduino
  • Zdaj lahko varno znova priključite mostičke OV7670
  • Ponovno priključite kabel USB.

Namestitev in zagon skice Processing

  • Kopirajte vsebino “OV7670_camera_mono_V2.pde” (priloženo) v obdelavo “skice” in shranite.
  • Kliknite zgornji levi gumb »teči« … prikaže se črno okno s sliko
  • Kliknite »črno« okno s slikami
  • Za zajem slike pritisnite tipko “c”. (približno 6,4 sekunde).
  • Pritisnite tipko “s”, da sliko shranite v mapo za obdelavo
  • Ponovite koraka 4 in 5
  • Za izhod iz programa kliknite gumb »stop«.

Opombe

[1]

Za obdelavo 3 je potrebna Java 8

[2]

To je "samo enkrat" varnostni korak, da se izognete poškodbam čipa fotoaparata OV7670.

Dokler skica »OV7670_camera_mono.ini« ni naložena na vaš Arduino, so notranji vlečni upori priključeni na 5 voltov, poleg tega pa obstaja možnost, da so nekatere podatkovne linije Arduino 5-voltni izhodi … vsi so usodni za 3v3 -voltni čip kamere OV7670.

Ko je Arduino programiran, ni treba ponoviti tega koraka in vrednosti registra se lahko varno spremenijo.

8. korak: Pridobite barvno sliko

Pridobitev barvne slike
Pridobitev barvne slike
Pridobitev barvne slike
Pridobitev barvne slike
Pridobitev barvne slike
Pridobitev barvne slike

Naslednja programska oprema je zgolj eksperimentalna in objavljena v upanju, da se bodo nekatere tehnike izkazale za uporabne. Zdi se, da so barve obrnjene … Pravilnih nastavitev registra še nisem našel. Če najdete rešitev, objavite svoje rezultate

Če želimo dobiti barvno sliko, moramo zajeti vse podatkovne bajte in uporabiti naslednje formule.

OV7670 uporablja naslednje formule za pretvorbo barvnih informacij RGB (rdeča, zelena, modra) v YUV (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)

Za pretvorbo YUV (4: 2: 2) nazaj v barvo RGB se lahko uporabijo naslednje formule: [2]

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

Priložena programska oprema je preprosto podaljšek enobarvne programske opreme:

  • Zahteva za zajem »c« je poslana Arduinu
  • Arduino pošlje v računalnik parne (enobarvne) bajte
  • Računalnik shrani te bajte v matriko
  • Arduino nato pošlje lične (chroma) bajte v računalnik.
  • Ti bajti so shranjeni v drugo polje … zdaj imamo celotno sliko.
  • Zgornje formule se zdaj uporabljajo za vsako skupino štirih podatkovnih bajtov UYVY.
  • Nastale barvne pike se nato postavijo v matriko »pikslov «
  • Računalnik skenira polje »piksli « in v oknu »slika« se prikaže slika.

Programska oprema Processing 3 na kratko prikaže vsako skeniranje in končne rezultate:

  • Na fotografiji 1 so prikazani podatki o barvi U & V iz skeniranja 1
  • Fotografija 2 prikazuje podatke o svetlosti Y1 in Y2 iz skeniranja 2
  • Fotografija 3 prikazuje barvno sliko … samo ena stvar je narobe … torba mora biti zelena !!

Ko bom rešil ta program, bom objavil novo kodo …

Reference:

[1]

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

[2]

en.wikipedia.org/wiki/YCbCr (pretvorba JPEG)

Kliknite tukaj, če si želite ogledati moja druga navodila.

Priporočena: