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, Novembar
Anonim
Image
Image
Napravite svoju kameru
Napravite svoju kameru

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

Predstavljen je i 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 su numerisane redom ako želite da napravite kratki film sa vremenskim odmakom.

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

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

Slike

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

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

Video prikazuje kameru u akciji. Kada se pritisne tipka za snimanje “c”, dolazi do kratkog bljeska praćenog naletom aktivnosti tokom skeniranja slike. Slika se automatski pojavljuje u prozoru za prikaz nakon što je skeniranje završeno. Slike se tada pojavljuju u fascikli Processing nakon svakog pritiska na tipku “s”. Videozapis završava brzim kretanjem kroz svaku od tri sačuvane slike.

Korak 1: Dijagram kola

Dijagram kola
Dijagram kola
Dijagram kola
Dijagram kola
Dijagram kola
Dijagram kola

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 PRE nego što priključite bilo koju kratkospojnu žicu na čip kamere OV7670. Ovo će spriječiti 5 -voltne izlazne pinove iz prethodnog programa da unište 3v3 -voltni OV7670 čip kamere.

Korak 2: Lista dijelova

Lista delova
Lista delova

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 sa 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 hleb
  • 4 samo 4K7 ohm 1/2 vatna otpornika
  • 1 samo aluminijsko postolje za otpad.

Trebat će vam i 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 talasna oblika. Drugi izlazni formati mogući su programiranjem internih registara putem sabirnice kompatibilne sa 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 grupa od 4 bajta sadrži 2 jednobojna bajta i 2 bajta u boji.

Jednobojno

Da bismo dobili jednobojnu sliku, 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 bajtova podataka. Osim ako OV7670 ne dodamo okvir za hvatanje okvira, svi podaci moraju se slati na računar računalo za obradu.

Postoje dvije mogućnosti:

Za svaki od 480 uzastopnih kadrova možemo snimiti jednu liniju na Arduino velikom brzinom prije nego što je pošaljemo na PC brzinom od 1Mbps. Takav pristup bi omogućio 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 stigne. Ovaj pristup je znatno brži (6,4 sekunde).

Korak 4: Napomene o dizajnu

Napomene o dizajnu
Napomene o dizajnu
Napomene o dizajnu
Napomene o dizajnu
Napomene o dizajnu
Napomene 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 siguran nivo 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 i dalje programirati kao izlaz iz ranijeg projekta !!! (Ovo sam naučio na teži način … srećom sam kupio dvije jer su bile tako jeftine).

Vanjski sat

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

Najviša frekvencija koju možemo generirati sa 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 (milion 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)

Unutrašnji sat

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

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

  • F (unutrašnji 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 koji je dovoljan za prijenos 1 bajta podataka (10uS) ostavljajući 6uS za obradu.

Brzina kadrova

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 !!!

Horizontalno pozicioniranje

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

Prilikom pomicanja slike lijevo, moguće je da vaša vrijednost HSTOP bude manja od vrijednosti HSTART!

Ne brinite … 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 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 pružaju 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 kreiran je kombinacijom 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 da radi pri brzini od 30 fps (kadrova u sekundi). Budući da svakom kadru traje 6,4 sekunde, elektronički zatvarač je otvoren 180 puta duže od normalnog, što znači da će sve slike biti previše eksponirane osim ako ne promijenimo neke vrijednosti registra.

Kako bih spriječio prekomjernu ekspoziciju, sve registarske bitove AEC-a (automatska kontrola ekspozicije) postavio sam na nulu. Čak i u tom slučaju potreban je filter neutralne gustoće ispred objektiva pri jakom osvjetljenju.

Čini se da dugo izlaganje utječe i na UV podatke. Kako tek moram pronaći kombinacije registara koje proizvode ispravne boje … smatrajte da je ovo u tijeku.

Bilješka

[1]

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

Korak 5: Vremenski raspored valnih oblika

Timing Waveforms
Timing Waveforms
Timing Waveforms
Timing Waveforms
Timing Waveforms
Timing Waveforms

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 tehničke listove i potvrđuju da Omnivision tretira svaka 2 bajta podataka kao ekvivalent 1 piksela.

Talasni oblici osciloskopa takođe potvrđuju da HREF ostaje NISKA tokom intervala prikrivanja.

Slika 4 potvrđuje da je XCLK izlaz iz Arduina 8MHz. Razlog zašto vidimo sinusni val, a ne kvadratni, 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 preko senzora, vidjet ćete crnu traku preko jednog ili više rubova kako je objašnjeno u odjeljku “Napomene o dizajnu”.

OV7670 skenira svaki red slike po jedan piksel, počevši od gornjeg lijevog kuta dok ne dosegne donji desni piksel. Arduino jednostavno prosljeđuje te piksele računaru 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 !!

Kodni red 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).

Kodna linija 2:

veličina (640, 480);

Temeljni kôd u ovoj izjavi stvara:

  • varijabla pod nazivom "width = 640;"
  • promenljiva koja se zove „visina = 480“;
  • niz piksela od 307200 pod nazivom „pikseli [307200]”
  • prozor „slika“od 640*480 piksela u kojem se prikazuje sadržaj niza piksela . Ovaj prozor „slike“se stalno osvježava brzinom sličica od 60 fps.

Kodni red 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Temeljni kôd u ovoj izjavi:

  • lokalno memorira dolazne podatke 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 koja se naziva “byteCount”.

Kodni red 4:

pikseli = boja (byteBuffer );

Kada se postavi u petlju for-next, osnovni kôd u ovoj naredbi:

  • 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 na tipke:

  • ‘C’ = snimite sliku
  • ‘S’ = sačuvajte sliku u datoteku.

Korak 7: Softver

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

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

Instaliranje Arduino skice:

  • Uklonite sve žice kratkospojnika OV7670 [2]
  • Priključite USB kabel na svoj Arduino
  • Kopirajte sadržaj „OV7670_camera_mono_V2.ino“(u prilogu) u Arduino „skicu“i spremite.
  • Prenesite skicu na svoj Arduino.
  • Isključite Arduino
  • Sada možete sigurno ponovo spojiti žice kratkospojnika OV7670
  • Ponovo spojite USB kabel.

Instaliranje i pokretanje skice za obradu

  • Kopirajte sadržaj “OV7670_camera_mono_V2.pde” (u prilogu) u “skicu” za obradu i spremite.
  • Kliknite gornji lijevi gumb "pokreni" … pojavit će se prozor sa crnom slikom
  • Kliknite na "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 dugme "stop" za izlaz iz programa.

Napomene

[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 skica “OV7670_camera_mono.ini” ne bude učitana na vaš Arduino, unutrašnji 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 OV7670 čip kamere.

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

Korak 8: Dobijanje slike u boji

Dobijanje slike u boji
Dobijanje slike u boji
Dobijanje slike u boji
Dobijanje slike u boji
Dobijanje slike u boji
Dobijanje slike u boji

Sljedeći softver je čisto eksperimentalni i objavljen je u nadi da će se neke od tehnika pokazati korisnim. Izgleda 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 biti uhvaćeni i primijenjene su 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 monohromatskog softvera:

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

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

  • Na fotografiji 1 prikazani su U & V hromatski 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 … torba 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 za pregled ostalih instrukcija.

Preporučuje se: