INHOUDSOPGAWE:

Maak u eie kamera: 8 stappe
Maak u eie kamera: 8 stappe

Video: Maak u eie kamera: 8 stappe

Video: Maak u eie kamera: 8 stappe
Video: Морозильная камера не включается (замена пускового реле) 2024, Julie
Anonim
Image
Image
Maak jou eie kamera
Maak jou eie kamera

Hierdie instruksie verduidelik hoe u 'n monochrome kamera kan maak met 'n Omnivision OV7670 -beeldsensor, 'n Arduino -mikrobeheerder, 'n paar springdrade en Processing 3 -sagteware.

Eksperimentele sagteware vir die verkryging van 'n kleurbeeld word ook aangebied.

Druk op die "c" -knoppie om 'n 640*480 pixel beeld te neem … druk die "s" -knoppie om die prent in die lêer te stoor. Opeenvolgende beelde word opeenvolgend genommer as u 'n kort time-lapse film wil maak.

Die kamera is nie vinnig nie (elke skandering duur 6,4 sekondes) en is slegs geskik vir gebruik in vaste beligting.

Die koste, uitgesluit u Arduino en rekenaar, is minder as 'n koppie koffie.

Beelde

Die onderdele, sonder bedradingskabel, word op die openingsfoto getoon.

Die tweede foto is 'n skermkiekie van die Arduino-kamerasagteware en die Processing 3-raamgryp. Die insetsel wys hoe die kamera verbind is.

Die video toon die kamera in aksie. As die "c" opname -toets ingedruk word, word 'n kort flits gevolg deur 'n uitbarsting van aktiwiteit terwyl die beeld geskandeer word. Die prent verskyn outomaties in die vertoonvenster sodra die skandering voltooi is. Die beelde verskyn dan in die verwerkingsmap na elke druk op die "s" -toets. Die video word afgesluit deur vinnig deur elk van die drie gestoorde beelde te blaai.

Stap 1: Kringdiagram

Stroombaandiagram
Stroombaandiagram
Stroombaandiagram
Stroombaandiagram
Stroombaandiagram
Stroombaandiagram

Die stroombaandiagram, vir alle weergawes van hierdie kamera, word op foto 1 getoon.

Foto's 2, 3 wys hoe die springdrade en komponente met mekaar verbind is.

Sonder die aluminiumbeugel lê die beelde op hul sy.

Waarskuwing

Programmeer jou Arduino VOORDAT jy enige draaddrade aan die OV7670 -kamera -chip koppel. Dit sal voorkom dat 5 volt -uitsetpenne van 'n vorige program die 3v3 volt OV7670 -kamera -chip vernietig.

Stap 2: Onderdele lys

Onderdele lys
Onderdele lys

Die volgende onderdele is verkry vanaf

  • 1 slegs OV7670 300KP VGA -kameramodule vir arduino DIY KIT
  • 1 enigste kameras, met moere en boute
  • 1 slegs UNO R3 vir arduino MEGA328P 100% oorspronklike ATMEGA16U2 met USB -kabel

Die volgende dele is plaaslik verkry

  • 18 jaarlikse Arduino-manlike-vroulike springkabels
  • 3 slegs Arduinin vroulike-vroulike springkabels
  • 1 slegs mini broodbord
  • 4 slegs 4K7 ohm 1/2 watt weerstande
  • 1 enigste skroefaluminiumstaander.

U benodig ook die volgende gegewensblaaie:

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

Stap 3: Teorie

Teorie
Teorie

OV7670 kameraskyfie

Die standaarduitset van die OV7670 -kamera -chip bestaan uit 'n YUV (4: 2: 2) videosignaal en 3 tydsgolfvorms. Ander uitvoerformate is moontlik deur die interne registers via 'n I2C -versoenbare bus te programmeer.

Die YUV (4: 2: 2) videosignaal (foto 1) is 'n deurlopende reeks monochroom (swart en wit) pixels geskei deur U (blou kleurverskil) en V (rooi kleurverskil) kleurinligting.

Hierdie uitvoerformaat staan bekend as YUV (4: 2: 2), aangesien elke groep van 4 grepe 2 monochroom grepe en en 2 kleur grepe bevat.

Monochroom

Om 'n monochrome beeld te verkry, moet ons elke tweede datagreep monster.

'N Arduino het slegs 2K geheue vir ewekansige toegang, maar elke raam bestaan uit 640*2*480 = 307, 200 databytes. Tensy ons 'n raamgrijper by die OV7670 voeg, moet alle data lyn-vir-lyn na die rekenaar gestuur word vir verwerking.

Daar is twee moontlikhede:

Vir elk van die 480 opeenvolgende rame kan ons een lyn met hoë spoed na die Arduino vang voordat ons dit met 1 Mbps na die rekenaar stuur. Met so 'n benadering sou die OV7670 op volle snelheid werk, maar dit sal lank neem (meer as 'n minuut).

Die benadering wat ek gevolg het, is om die PCLK tot 8uS te vertraag en elke monster te stuur soos dit kom. Hierdie benadering is aansienlik vinniger (6,4 sekondes).

Stap 4: Ontwerpnotas

Ontwerpnotas
Ontwerpnotas
Ontwerpnotas
Ontwerpnotas
Ontwerpnotas
Ontwerpnotas

Verenigbaarheid

Die OV7670 -kamera -chip is 'n 3v3 volt -toestel. Die gegewensblad dui aan dat spanning van meer as 3,5 volt die chip kan beskadig.

Om te voorkom dat u 5 volt Arduino die OV7670 -kamera -chip vernietig:

  • Die eksterne klok (XCLK) sein van die Arduino moet deur middel van 'n spanningsverdeler na 'n veilige vlak verminder word.
  • Die interne Arduino I2C optrekweerstands tot 5 volt moet afgeskakel word en vervang word met eksterne optrekweerstands na die 3v3 volt-toevoer.
  • Programmeer jou Arduino Voordat jy enige draaddrade aanheg, aangesien sommige van die penne nog steeds as 'n uitset van 'n vorige projek geprogrammeer kan word !!! (Ek het dit op die harde manier geleer … gelukkig het ek twee gekoop omdat dit so goedkoop was).

Eksterne klok

Die OV7670 -kamera -chip benodig 'n eksterne klok in die frekwensiebereik 10Mhz tot 24MHz.

Die hoogste frekwensie wat ons met 'n 16MHz Arduino kan genereer, is 8MHz, maar dit lyk asof dit werk.

Seriële skakel

Dit neem ten minste 10 uS (mikrosekondes) om 1 databytes oor 'n 1 Mbps (miljoen bisse per sekonde) reeksskakel te stuur. Hierdie tyd word soos volg saamgestel:

  • 8 databits (8us)
  • 1 begin-bis (1uS)
  • 1 stop-bietjie (1uS)

Interne horlosie

Die frekwensie van die interne pixelklok (PCLK) binne die OV7670 word bepaal deur bisse [5: 0] in die register CLKRC (sien foto 1). [1]

As ons bits [5: 0] = B111111 = 63 stel en dit op die formule hierbo toepas, dan:

  • F (interne klok) = F (invoerklok)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz of
  • = 8uS

Aangesien ons slegs elke tweede databyte bemonster, lei 'n PCLK -interval van 8uS tot 'n 16uS -monster, wat voldoende tyd is om 1 databyte (10uS) oor te dra, wat 6uS laat verwerk.

Raamkoers

Elke VGA -videorame bestaan uit 784*510 pixels (prentelemente), waarvan 640*480 pixels vertoon word. Aangesien die YUV (4: 2: 2) uitvoerformaat gemiddeld 2 databytes per pixel het, sal elke raam 784*2*510*8 uS = 6,4 sekondes neem.

Hierdie kamera is NIE vinnig nie !!!

Horisontale posisionering

Die beeld kan horisontaal verskuif word as ons die HSTART- en HSTOP -waardes verander, terwyl ons 'n verskil van 640 pixels behou.

As u u prent na links skuif, is dit moontlik dat u HSTOP -waarde minder is as die HSTART -waarde!

Moenie bekommerd wees nie; dit het alles te doen met teenoorstromings, soos verduidelik op foto 2.

Registers

Die OV7670 het 201 agt-bis registers vir die beheer van dinge soos wins, witbalans en blootstelling.

Een databyt laat slegs 256 waardes in die reeks [0] tot [255] toe. As ons meer beheer nodig het, moet ons verskeie registers stort. Twee grepe gee ons 65536 moontlikhede … drie grepe gee ons 16, 777, 216.

Die 16 bit AEC (Automatic Exposure Control) register op foto 3 is so 'n voorbeeld en word geskep deur gedeeltes van die volgende drie registers te kombineer.

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

Wees gewaarsku … die registeradresse is nie saamgegroepeer nie!

Newe-effekte

'N Stadige raamtempo lei tot 'n aantal ongewenste newe -effekte:

Vir die korrekte blootstelling verwag die OV7670 dat dit teen 'n raamsnelheid van 30 fps (rame per sekonde) werk. Aangesien elke raam 6,4 sekondes neem, is die elektroniese sluiter 180 keer langer as normaal oop, wat beteken dat alle beelde te veel blootgestel sal word, tensy ons die registerwaardes verander.

Om oorblootstelling te voorkom, het ek al die AEC (outomatiese blootstellingskontrole) register-bisse op nul gestel. Tog is 'n neutrale digtheidsfilter voor die lens nodig as die beligting helder is.

Dit blyk ook dat 'n lang blootstelling die UV -data beïnvloed. Aangesien ek nog registerkombinasies wat korrekte kleure produseer, nog nie gevind het nie, beskou dit as 'n proses.

Let op

[1]

Die formule in die gegewensblad (foto 1) is korrek, maar die reeks toon slegs stukkies [4: 0]?

Stap 5: Timing -golfvorms

Tydsberekening golfvorms
Tydsberekening golfvorms
Tydsberekening golfvorms
Tydsberekening golfvorms
Tydsberekening golfvorms
Tydsberekening golfvorms

Die nota in die onderste linkerhoek van die diagram "VGA Frame Timing" (foto 1) lui:

Vir YUV/RGB, tp = 2 x TPCLK

Figuur 1, 2 en 3 verifieer die gegewensblad (e) en bevestig dat Omnivision elke 2 datagrepe die ekwivalent van 1 pixel behandel.

Die ossilloskoopgolfvorms verifieer ook dat HREF LOW bly tydens die blaasintervalle.

Figuur 4 bevestig dat die XCLK -uitset van die Arduino 8MHz is. Die rede waarom ons 'n sinusgolf sien, eerder as 'n vierkantgolf, is dat al die vreemde harmonieke onsigbaar is vir my 20MHz bemonsteringsosilloskoop.

Stap 6: Frame Grabber

Frame Grabber
Frame Grabber

Die beeldsensor in 'n OV7670 -kamera -chip bestaan uit 'n skikking van 656*486 pixels, waarvan 'n rooster van 640*480 pixels vir die foto gebruik word.

Die HSTART-, HSTOP-, HREF- en VSTRT-, VSTOP-, VREF -registerwaardes word gebruik om die beeld oor die sensor te plaas. As die prentjie nie korrek oor die sensor geplaas is nie, sien u 'n swart band oor een of meer rande, soos uiteengesit in die gedeelte "Ontwerpnotas".

Die OV7670 skandeer elke reël van die prentjie een pixel op 'n slag vanaf die linker boonste hoek totdat dit die regterkantste pixel bereik. Die Arduino stuur hierdie pixels eenvoudig na die rekenaar via die seriële skakel soos op foto 1 getoon.

Die raamgrypers se taak is om elkeen van hierdie 640*480 = 307200 pixels vas te lê en die inhoud in 'n 'beeld'-venster te vertoon

Verwerking 3 bereik dit met behulp van die volgende vier reëls kode !!

Kode reël 1:

byte byteBuffer = nuwe byte [maxBytes+1]; // waar maxBytes = 307200

Die onderliggende kode in hierdie stelling skep:

  • 'n 307201 -greepskikking genaamd "byteBuffer [307201]"
  • Die ekstra byte is vir 'n beëindiging (lynvoer) karakter.

Kode reël 2:

grootte (640, 480);

Die onderliggende kode in hierdie stelling skep:

  • 'n veranderlike genaamd "width = 640;"
  • 'n veranderlike genaamd "hoogte = 480";
  • 'n 307200 pixel skikking genaamd "pixels [307200]"
  • 'n "beeld" -venster van 640*480 pixel waarin die inhoud van pixels skikking vertoon word. Hierdie 'beeld' -venster word voortdurend verfris teen 'n raamtempo van 60 fps.

Kode reël 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Die onderliggende kode in hierdie stelling:

  • buffer die inkomende data plaaslik totdat dit 'n "lf" (lynvoer) karakter sien.
  • waarna dit die eerste 307200 grepe plaaslike data in die byteBuffer skikking stort.
  • Dit stoor ook die aantal grepe wat ontvang is (307201) in 'n veranderlike genaamd 'byteCount'.

Kode reël 4:

pixels = kleur (byteBuffer );

As dit in 'n volgende-lus geplaas word, is die onderliggende kode in hierdie stelling:

  • kopieer die inhoud van die "byteBuffer " skikking na die "pixels " skikking
  • waarvan die inhoud in die beeldvenster verskyn.

Sleuteltrekke:

Die raamgrijper herken die volgende toetsaanslagen:

  • 'C' = neem die prentjie
  • 'S' = stoor die prent in die lêer.

Stap 7: sagteware

Laai en installeer elk van die volgende sagtewarepakkette as dit nog nie geïnstalleer is nie:

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

Die installering van die Arduino -skets:

  • Verwyder alle OV7670 springdrade [2]
  • Koppel 'n USB -kabel aan u Arduino
  • Kopieer die inhoud van 'OV7670_camera_mono_V2.ino' (aangeheg) in 'n Arduino 'skets' en stoor.
  • Laai die skets op na u Arduino.
  • Ontkoppel die Arduino
  • U kan nou weer die OV7670 -jumperdrade weer verbind
  • Koppel die USB -kabel weer aan.

Die verwerkingskets geïnstalleer en uitgevoer

  • Kopieer die inhoud van "OV7670_camera_mono_V2.pde" (aangeheg) in 'n verwerkingsskets en stoor.
  • Klik op die "run" -knoppie links bo … 'n swart beeldvenster verskyn
  • Klik op die "swart" beeldvenster
  • Druk die "c" -knoppie om 'n foto te neem. (ongeveer 6,4 sekondes).
  • Druk die "s" -toets om die prent in u verwerkingsmap te stoor
  • Herhaal stap 4 en 5
  • Klik op die "stop" -knoppie om die program te verlaat.

Notas

[1]

Verwerking 3 vereis Java 8

[2]

Dit is 'n eenmalige veiligheidsstap om skade aan u OV7670 -kamera -chip te voorkom.

Totdat die skets “OV7670_camera_mono.ini” na u Arduino opgelaai is, is die interne optelweerstands gekoppel aan 5 volt, en daar is ook die moontlikheid dat sommige van die Arduino-datalyne 5 volt-uitsette kan hê … wat almal noodlottig is die 3v3 volt OV7670 kameraskyfie.

Sodra die Arduino geprogrammeer is, is dit nie nodig om hierdie stap te herhaal nie en die registerwaardes kan veilig verander word.

Stap 8: Verkryging van 'n kleurbeeld

Verkryging van 'n kleurbeeld
Verkryging van 'n kleurbeeld
Verkryging van 'n kleurbeeld
Verkryging van 'n kleurbeeld
Verkryging van 'n kleurbeeld
Verkryging van 'n kleurbeeld

Die volgende sagteware is suiwer eksperimenteel en word geplaas in die hoop dat sommige van die tegnieke nuttig sal wees. Dit lyk asof die kleure omgekeerd is … ek het nog nie die korrekte registerinstellings gevind nie. As u 'n oplossing vind, plaas u resultate

As ons 'n kleurbeeld wil verkry, moet alle datagrepe vasgelê word en die volgende formules toegepas word.

Die OV7670 gebruik die volgende formules om RGB (rooi, groen, blou) kleurinligting om te skakel in 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)

Die volgende formules kan gebruik word om YUV (4: 2: 2) terug te skakel na RGB -kleur: [2]

  • R = Y + 1.402* (Cr - 128)
  • G = Y -0.344136*(Cb -128) -0.714136*(Cr -128)
  • B = Y + 1.772*(Cb -128)

Die aangehegte sagteware is bloot 'n uitbreiding van die monochrome sagteware:

  • 'N "c" -opname -versoek word na die Arduino gestuur
  • Die Arduino stuur die ewe genommerde (monochroom) grepe na die rekenaar
  • Die rekenaar stoor hierdie grepe in 'n skikking
  • Die Arduino stuur vervolgens die onewe genommerde (chroma) grepe na die rekenaar.
  • Hierdie grepe word in 'n tweede skikking gestoor … ons het nou die hele beeld.
  • Bogenoemde formules word nou toegepas op elke groep van vier UYVY -datagrepe.
  • Die resulterende kleurpiksels word dan in die "pixels " skikking geplaas
  • Die rekenaar skandeer die "pixels " skikking en 'n prentjie verskyn in die "beeld" venster.

Die Processing 3 -sagteware vertoon elke skandering en die finale resultate kortliks:

  • Foto 1 toon die U & V chromadata van skandering 1
  • Foto 2 toon die Y1 & Y2 -luminansdata van skandering 2
  • Foto 3 toon die kleurbeeld … net een ding is verkeerd … die sak moet groen wees !!

Ek sal nuwe kode plaas sodra ek hierdie program opgelos het …

Verwysings:

[1]

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

[2]

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

Klik hier om my ander instruksies te sien.

Aanbeveel: