Sadržaj:

Napravite vlastitu kameru: 8 koraka
Napravite vlastitu kameru: 8 koraka

Video: Napravite vlastitu kameru: 8 koraka

Video: Napravite vlastitu kameru: 8 koraka
Video: НОВИНКА! ЛУЧШЕЕ СЛЕЖЕНИЕ ЗА ЧЕЛОВЕКОМ камера ANBIUX 2 в1 2024, Srpanj
Anonim
Image
Image
Napravite vlastitu kameru
Napravite vlastitu kameru

Ove upute objašnjavaju kako napraviti jednobojnu kameru pomoću senzora slike Omnivision OV7670, Arduino mikrokontrolera, nekoliko kratkospojnih žica i softvera Processing 3.

Također je predstavljen eksperimentalni softver za dobivanje slike u boji.

Pritisnite tipku "c" za snimanje slike od 640*480 piksela … pritisnite tipku "s" za spremanje slike u datoteku. Uzastopne slike numeriraju se redom ako želite stvoriti kratki film s vremenskim odmakom.

Kamera nije brza (svako skeniranje traje 6,4 sekunde) i prikladna je samo za uporabu pri stalnom osvjetljenju.

Cijena, isključujući vaš Arduino i računalo, manja je od šalice kave.

Slike

Sastavni dijelovi, bez kratkospojnika, prikazani su na fotografiji otvaranja.

Druga fotografija je snimak zaslona koji prikazuje softver kamere Arduino i hvatač okvira Frame Processing 3. Uložak prikazuje kako je kamera spojena.

Video prikazuje kameru na djelu. Kada se pritisne tipka za snimanje "c", dolazi do kratkog bljeska praćenog naletom aktivnosti tijekom skeniranja slike. Slika se automatski pojavljuje u prozoru za prikaz nakon što je skeniranje dovršeno. Slike se tada pojavljuju u mapi Obrada nakon svakog pritiska tipke "s". Videozapis završava brzim kretanjem kroz svaku od tri spremljene slike.

Korak 1: Dijagram kruga

Kružni dijagram
Kružni dijagram
Kružni dijagram
Kružni dijagram
Kružni dijagram
Kružni dijagram

Dijagram kola za sve verzije ovog fotoaparata prikazan je na fotografiji 1.

Fotografije 2, 3 pokazuju kako su spojene žice i komponente povezane.

Bez aluminijskog držača slike leže na boku.

Upozorenje

Programirajte svoj Arduino PRIJE priključivanja bilo kakvih kratkospojnih žica na čip kamere OV7670. To će spriječiti 5 -voltne izlazne pinove iz prethodnog programa da unište čip kamere 3v3 -voltnog OV7670.

Korak 2: Popis dijelova

Popis dijelova
Popis dijelova

Sljedeći dijelovi su nabavljeni sa

  • 1 samo OV7670 300KP VGA modul kamere za arduino DIY KIT
  • 1 samo nosač kamere zajedno s maticama i vijcima
  • 1 samo UNO R3 za arduino MEGA328P 100% original ATMEGA16U2 s USB kabelom

Sljedeći dijelovi nabavljeni su lokalno

  • 18 anly Arduino muško-ženskih prespojnih kabela
  • 3 samo Arduinin ženski ženski kratkospojni kablovi
  • 1 samo mini ploča za kruh
  • 4 samo 4K7 ohm 1/2 vatna otpornika
  • 1 samo aluminijsko postolje za otpad.

Također će vam trebati sljedeći listovi s podacima:

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

Korak 3: Teorija

Teorija
Teorija

Čip kamere OV7670

Zadani izlaz iz čipa kamere OV7670 sadrži YUV (4: 2: 2) video signal i 3 vremenska valna oblika. Drugi izlazni formati mogući su programiranjem internih registara putem sabirnice kompatibilne s I2C.

Video signal YUV (4: 2: 2) (fotografija 1) kontinuirani je niz jednobojnih (crno -bijelih) piksela odvojenih U (razlika u plavoj boji) i V (razlika u crvenoj boji) u boji.

Ovaj izlazni format poznat je kao YUV (4: 2: 2) budući da svaka skupina od 4 bajta sadrži 2 jednobojna bajta i 2 bajta u boji.

Jednobojno

Za dobivanje jednobojne slike moramo uzorkovati svaki drugi bajt podataka.

Arduino ima samo 2K memorije sa nasumičnim pristupom, ali svaki okvir sadrži 640*2*480 = 307, 200 podatkovnih bajtova. Osim ako ne dodamo hvatač okvira OV7670, svi se podaci moraju slati na računalo linijski za obradu.

Postoje dvije mogućnosti:

Za svaki od 480 uzastopnih okvira, možemo snimiti jednu liniju na Arduino velikom brzinom prije nego što je pošaljemo na računalo pri 1Mbps. Takav pristup omogućio bi da OV7670 radi punom brzinom, ali bi trajao dugo (više od minute).

Pristup koji sam zauzeo je usporiti PCLK na 8uS i poslati svaki uzorak kako dođe. Ovaj pristup je znatno brži (6,4 sekunde).

Korak 4: Napomene o dizajnu

Bilješke o dizajnu
Bilješke o dizajnu
Bilješke o dizajnu
Bilješke o dizajnu
Bilješke o dizajnu
Bilješke o dizajnu

Kompatibilnost

Čip kamere OV7670 je uređaj od 3v3 volta. Tehnički list pokazuje da će naponi iznad 3,5 volti oštetiti čip.

Da biste spriječili da vaš 5 -voltni Arduino uništi čip kamere OV7670:

  • Signal vanjskog takta (XCLK) iz Arduina mora se smanjiti na sigurnu razinu pomoću razdjelnika napona.
  • Unutarnji Arduino I2C pull-up otpornici do 5 volti moraju se onemogućiti i zamijeniti vanjskim pull-up otpornicima na napajanje od 3v3 volti.
  • Programirajte svoj Arduino PRIJE priključivanja bilo kakvih kratkospojnih žica jer se neke pinove mogu programirati kao izlaz iz ranijeg projekta !!! (Ovo sam naučio na teži način … srećom, kupio sam dva jer su bili tako jeftini).

Vanjski sat

Čip kamere OV7670 zahtijeva vanjski sat u frekvencijskom rasponu od 10 MHz do 24 MHz.

Najviša frekvencija koju možemo generirati od 16MHz Arduina je 8MHz, ali čini se da ovo radi.

Serijska veza

Potrebno je najmanje 10 uS (mikrosekundi) za slanje 1 bajta podataka preko 1Mbps (milijun bitova u sekundi) serijske veze. Ovo vrijeme je sastavljeno na sljedeći način:

  • 8 bitova podataka (8us)
  • 1 početni bit (1uS)
  • 1 stop-bit (1uS)

Unutarnji sat

Unutarnja frekvencija sata piksela (PCLK) unutar OV7670 postavljena je bitovima [5: 0] unutar registra CLKRC (vidi fotografiju 1). [1]

Ako postavimo bitove [5: 0] = B111111 = 63 i primijenimo ga na gornju formulu tada:

  • F (unutarnji sat) = F (ulazni sat)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz ili
  • = 8uS

Budući da uzorkujemo samo svaki drugi bajt podataka, PCLK interval od 8uS rezultira uzorkom od 16uS što je dovoljno vremena za prijenos 1 bajta podataka (10uS) ostavljajući 6uS za obradu.

Okvirna stopa

Svaki VGA video okvir sadrži 784*510 piksela (elementi slike) od kojih je prikazano 640*480 piksela. Budući da YUV (4: 2: 2) izlazni format ima prosječno 2 bajta podataka po pikselu, svaki okvir će trajati 784*2*510*8 uS = 6,4 sekunde.

Ova kamera NIJE brza !!!

Vodoravno pozicioniranje

Slika se može pomicati vodoravno ako promijenimo vrijednosti HSTART i HSTOP zadržavajući razliku od 640 piksela.

Prilikom pomicanja slike ulijevo moguće je da vrijednost HSTOP -a bude manja od vrijednosti HSTART -a!

Ne bojte se … sve je povezano s preljevima brojača kako je objašnjeno na fotografiji 2.

Registri

OV7670 ima 201 osmobitni registar za kontrolu stvari poput pojačanja, balansa bijele boje i ekspozicije.

Jedan bajt podataka dopušta samo 256 vrijednosti u rasponu [0] do [255]. Ako nam je potrebna veća kontrola, tada moramo kaskadirati nekoliko registara. Dva bajta daju nam 65536 mogućnosti … tri bajta daju nam 16, 777, 216.

16 -bitni AEC (automatska kontrola ekspozicije) registar prikazan na fotografiji 3 je takav primjer i nastaje kombiniranjem dijelova sljedeća tri registra.

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

Upozorenje … adrese registra nisu grupirane zajedno!

Nuspojave

Spora brzina kadrova uvodi niz neželjenih nuspojava:

Za ispravnu ekspoziciju, OV7670 očekuje rad pri brzini od 30 fps (sličica u sekundi). Budući da svakom kadru traje 6,4 sekunde, elektronički zatvarač otvoren je 180 puta dulje od uobičajenog, što znači da će sve slike biti previše eksponirane osim ako promijenimo neke vrijednosti registra.

Kako bih spriječio prekomjernu ekspoziciju, sve registarske bitove AEC (automatska kontrola ekspozicije) postavio sam na nulu. Čak i tako potreban je filter neutralne gustoće ispred objektiva kada je osvjetljenje jako.

Čini se da i duga izloženost utječe na UV podatke. Budući da tek moram pronaći kombinacije registara koje proizvode ispravne boje … smatrajte da je to u tijeku.

Bilješka

[1]

Formula prikazana u podatkovnom listu (fotografija 1) je točna, ali raspon prikazuje samo bitove [4: 0]?

Korak 5: Mjerenje valnih oblika

Vremenski rasponi valnih oblika
Vremenski rasponi valnih oblika
Vremenski rasponi valnih oblika
Vremenski rasponi valnih oblika
Vremenski rasponi valnih oblika
Vremenski rasponi valnih oblika

Bilješka u donjem lijevom kutu dijagrama "Vremenski okvir VGA okvira" (fotografija 1) glasi:

Za YUV/RGB, tp = 2 x TPCLK

Slike 1, 2 i 3 potvrđuju podatkovne listove i potvrđuju da Omnivision svaka 2 bajta podataka tretira kao ekvivalent 1 piksela.

Talasni oblici osciloskopa također provjeravaju da li HREF ostaje NISKA tijekom intervala prikrivanja.

Slika 4 potvrđuje da je XCLK izlaz iz Arduina 8MHz. Razlog zašto vidimo sinusni val, a ne kvadratni val, je taj što su svi neparni harmonici nevidljivi za moj osciloskop za uzorkovanje od 20 MHz.

Korak 6: Hvatač okvira

Frame Grabber
Frame Grabber

Senzor slike unutar čipa kamere OV7670 sadrži niz od 656*486 piksela od kojih se za fotografiju koristi mreža od 640*480 piksela.

Vrijednosti registra HSTART, HSTOP, HREF i VSTRT, VSTOP, VREF koriste se za postavljanje slike preko senzora. Ako slika nije pravilno postavljena iznad senzora, vidjet ćete crnu traku preko jednog ili više rubova kako je objašnjeno u odjeljku "Napomene o dizajnu".

OV7670 skenira svaki redak slike po jedan piksel, počevši od gornjeg lijevog kuta dok ne dosegne donji desni piksel. Arduino jednostavno prenosi te piksele na računalo putem serijske veze kao što je prikazano na fotografiji 1.

Zadatak hvatača okvira je snimiti svaki od ovih 640*480 = 307200 piksela i prikazati sadržaj u prozoru "slika"

Obradom 3 to se postiže pomoću sljedeća četiri retka koda !!

Redak koda 1:

byte byteBuffer = novi bajt [maxBytes+1]; // gdje je maxBytes = 307200

Temeljni kôd u ovoj izjavi stvara:

  • niz bajtova 307201 pod nazivom "byteBuffer [307201]"
  • Dodatni bajt služi za završetak (unos linije).

Redak koda 2:

veličina (640, 480);

Temeljni kôd u ovoj izjavi stvara:

  • varijabla pod nazivom "width = 640;"
  • varijabla pod nazivom "visina = 480";
  • niz piksela od 307200 pod nazivom "pikseli [307200]"
  • prozor sa slikom 640*480 piksela u kojem se prikazuje sadržaj niza piksela . Ovaj prozor "slike" neprestano se osvježava brzinom sličica od 60 fps.

Kodni redak 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Temeljni kôd u ovoj izjavi:

  • sprema dolazne podatke lokalno sve dok ne vidi znak "lf" (unos linije).
  • nakon čega ubacuje prvih 307200 bajtova lokalnih podataka u niz byteBuffer .
  • Također sprema broj primljenih bajtova (307201) u varijablu pod nazivom "byteCount".

Redak koda 4:

pikseli = boja (byteBuffer );

Kada se stavi u petlju for-next, osnovni kôd u ovoj izjavi:

  • kopira sadržaj niza “byteBuffer ” u niz “pixels ”
  • čiji se sadržaj pojavljuje u prozoru sa slikom.

Ključni potezi:

Hvatač okvira prepoznaje sljedeće pritiske tipki:

  • ‘C’ = snimiti sliku
  • ‘S’ = spremite sliku u datoteku.

Korak 7: Softver

Preuzmite i instalirajte svaki od sljedećih programskih paketa ako već nisu instalirani:

  • "Arduino" s
  • "Java 8" s https://java.com/en/download/ [1]
  • "Obrada 3" s

Instaliranje Arduino skice:

  • Uklonite sve žice kratkospojnika OV7670 [2]
  • Spojite USB kabel na svoj Arduino
  • Kopirajte sadržaj "OV7670_camera_mono_V2.ino" (u privitku) u Arduino "skicu" i spremite.
  • Prenesite skicu na svoj Arduino.
  • Isključite Arduino
  • Sada možete sigurno ponovno spojiti žice kratkospojnika OV7670
  • Ponovno spojite USB kabel.

Instaliranje i pokretanje skice Obrada

  • Kopirajte sadržaj “OV7670_camera_mono_V2.pde” (u privitku) u “skicu” za obradu i spremite.
  • Pritisnite gornji lijevi gumb "pokreni" … pojavit će se prozor sa crnom slikom
  • Pritisnite "crni" prozor sa slikom
  • Pritisnite tipku “c” za snimanje slike. (približno 6,4 sekunde).
  • Pritisnite tipku “s” za spremanje slike u mapu za obradu
  • Ponovite korake 4 i 5
  • Pritisnite gumb "stop" za izlaz iz programa.

Bilješke

[1]

Za obradu 3 potrebna je Java 8

[2]

Ovo je sigurnosni korak "samo jednom" kako biste izbjegli oštećenje čipa kamere OV7670.

Dok se skica “OV7670_camera_mono.ini” ne prenese na vaš Arduino, unutarnji pull-up otpornici spojeni su na 5 volti, plus postoji mogućnost da neki od Arduino podatkovnih vodova mogu imati izlaze od 5 volti … a svi su kobni za 3v3 -voltni čip kamere OV7670.

Nakon što je Arduino programiran, nema potrebe ponavljati ovaj korak, a vrijednosti registra mogu se sigurno promijeniti.

Korak 8: Dobivanje slike u boji

Dobivanje slike u boji
Dobivanje slike u boji
Dobivanje slike u boji
Dobivanje slike u boji
Dobivanje slike u boji
Dobivanje slike u boji

Sljedeći softver je isključivo eksperimentalni i objavljen je u nadi da će se neke od tehnika pokazati korisnima. Čini se da su boje obrnute … Još nisam pronašao ispravne postavke registra. Ako pronađete rješenje, objavite svoje rezultate

Ako želimo dobiti sliku u boji, svi bajti podataka moraju se snimiti i primijeniti sljedeće formule.

OV7670 koristi sljedeće formule za pretvaranje informacija o RGB (crvenoj, zelenoj, plavoj) boji u 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 pretvaranje YUV (4: 2: 2) u RGB boju mogu se koristiti sljedeće 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ženi softver jednostavno je proširenje jednobojnog softvera:

  • Zahtjev za hvatanje "c" šalje se na Arduino
  • Arduino šalje parne (jednobojne) bajte na računalo
  • Računalo sprema ove bajtove u niz
  • Arduino zatim šalje neparne (chroma) bajtove na računalo.
  • Ovi bajtovi su spremljeni u drugi niz … sada imamo cijelu sliku.
  • Gore navedene formule sada se primjenjuju na svaku skupinu od četiri UYVY bajta podataka.
  • Dobiveni pikseli u boji tada se stavljaju u niz “piksela ”
  • Računalo skenira niz "piksela " i slika se pojavljuje u prozoru "slika".

Softver Processing 3 ukratko prikazuje svako skeniranje i konačne rezultate:

  • Na fotografiji 1 prikazani su U & V kromatski podaci iz skeniranja 1
  • Fotografija 2 prikazuje podatke o svjetlini Y1 i Y2 iz skeniranja 2
  • Fotografija 3 prikazuje sliku u boji … samo jedna stvar nije u redu … vrećica bi trebala biti zelena !!

Objavit ću novi kôd kad riješim ovaj program …

Reference:

[1]

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

[2]

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

Kliknite ovdje da biste vidjeli moje ostale upute.

Preporučeni: