Sadržaj:
- Korak 1: Dijagram kruga
- Korak 2: Popis dijelova
- Korak 3: Teorija
- Korak 4: Napomene o dizajnu
- Korak 5: Mjerenje valnih oblika
- Korak 6: Hvatač okvira
- Korak 7: Softver
- Korak 8: Dobivanje slike u boji
Video: Napravite vlastitu kameru: 8 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:35
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
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
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
Č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
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
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
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
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:
Napravite vlastitu prijenosnu retro igraću konzolu! koja je ujedno i Win10 tablet!: 6 koraka (sa slikama)
Napravite vlastitu prijenosnu retro igraću konzolu! …… koja je ujedno i Win10 tablet !: U ovom ću vam projektu pokazati kako stvoriti prijenosnu retro igraću konzolu koja se može koristiti i kao Windows 10 tablet. Sastojat će se od 7 " HDMI LCD sa zaslonom osjetljivim na dodir, LattePanda SBC, USB napajanje PC Type C PD i još nekoliko komplementarnih
Napravite vlastitu špijunsku grešku (Arduino snimač glasa): 5 koraka (sa slikama)
Napravite vlastitu špijunsku grešku (Arduino snimač glasa): U ovom projektu ću vam pokazati kako sam kombinirao Arduino Pro Mini s nekoliko komplementarnih komponenti kako bih stvorio snimač glasa koji bi se također mogao zloupotrijebiti kao špijunska greška. Traje oko 9 sati, mali je i super jednostavan za
Napravite vlastitu kameru iznad glave s LED osvjetljenjem!: 5 koraka (sa slikama)
Napravite vlastitu opremu za nadzemnu kameru s LED osvjetljenjem !: U ovom projektu pokazat ću vam kako stvoriti jednostavnu opremu za kameru iznad glave. Uređaj ne samo da može držati kameru točno iznad objekta koji želite snimiti, već također ima i monitor za promatranje snimljenog materijala i LED osvjetljenje kako bi savršeno
Kako koristiti kameru kao web kameru: 4 koraka
Kako koristiti kameru kao web kameru: Ako ste poput mene, imate mnogo prijatelja koji su se odselili od kuće, a žive tisućama kilometara dalje, ili imate prijatelje s kojima ste išli na sveučilište u kojima svi živite razna mjesta. Osobno mrzim telefone i upute
Monopod s treking stapom za malu kameru/kameru: 4 koraka
Monopod s motkom za treking za male fotoaparate/videokamere: Volim snimati mnogo fotografija dok planinarim, ali moj stativ je malo pretežak za bilo kakve ozbiljne šetnje i mojem stativu u stilu gorile potrebno je predugo da dođem na pravo mjesto i nije baš stabilan (trebao sam kupiti ljepši). Ovaj jednostavan c