Përmbajtje:

Bëni kamerën tuaj: 8 hapa
Bëni kamerën tuaj: 8 hapa

Video: Bëni kamerën tuaj: 8 hapa

Video: Bëni kamerën tuaj: 8 hapa
Video: СБОРКА И ЗАПУСК 16-ЛИТРОВОГО V8 ДВИГАТЕЛЯ SCANIA. ПРОБЕГ 1.6 МЛН КМ. DC16 PDE 2024, Korrik
Anonim
Image
Image
Bëni Kamera Tënde
Bëni Kamera Tënde

Ky udhëzues shpjegon se si të bëni një aparat fotografik njëngjyrësh duke përdorur një sensor imazhi Omnivision OV7670, një mikrokontrollues Arduino, disa tela kërcyes dhe softuer Processing 3.

Softwareshtë paraqitur gjithashtu softuer eksperimental për marrjen e një imazhi me ngjyra.

Shtypni butonin "c" për të kapur një imazh 640*480 pixel … shtypni butonin "s" për të ruajtur imazhin në skedar. Imazhet e njëpasnjëshme numërohen në mënyrë sekuenciale nëse dëshironi të krijoni një film të shkurtër me vonesë.

Kamera nuk është e shpejtë (çdo skanim zgjat 6.4 sekonda) dhe është i përshtatshëm vetëm për përdorim në ndriçim fiks.

Kostoja, pa Arduino -n dhe kompjuterin tuaj, është më pak se një filxhan kafe.

Imazhe

Pjesët përbërëse, pa instalime elektrike, janë treguar në foton e hapjes.

Fotografia e dytë është një fotografi e ekranit që tregon programin e kamerës Arduino dhe kapjen e kornizës Processing 3. Pjesa e brendshme tregon se si është e lidhur kamera.

Videoja tregon kamerën në veprim. Kur shtypet butoni i kapjes "c", shfaqet një blic i shkurtër i ndjekur nga një shpërthim aktiviteti ndërsa skanohet imazhi. Imazhi shfaqet automatikisht në dritaren e ekranit sapo skanimi të ketë përfunduar. Imazhet pastaj shihen të shfaqen në dosjen Processing pas çdo shtypjeje të butonit “s”. Videoja përfundon duke ecur me biçikletë me shpejtësi në secilën prej tre imazheve të ruajtura.

Hapi 1: Diagrami i Qarkut

Diagrami i qarkut
Diagrami i qarkut
Diagrami i qarkut
Diagrami i qarkut
Diagrami i qarkut
Diagrami i qarkut

Diagrami i qarkut, për të gjitha versionet e kësaj kamere, tregohet në foton 1.

Fotografitë 2, 3 tregojnë se si janë lidhur telat dhe komponentët.

Pa kllapa alumini imazhet janë shtrirë në anën e tyre.

Paralajmërim

Programoni Arduino -n tuaj PARA para se të lidhni ndonjë tela kërcyes në çipin e kamerës OV7670. Kjo do të parandalojë kunjat e daljes 5 volt nga një program i mëparshëm nga shkatërrimi i çipit të kamerës 3v3 volt OV7670.

Hapi 2: Lista e Pjesëve

Lista e Pjesëve
Lista e Pjesëve

Pjesët e mëposhtme janë marrë nga

  • 1 vetëm OV7670 300KP VGA Kamera Modul për arduino DIY KIT
  • 1 kllapa vetëm e kamerës e kompletuar me arra dhe bulona
  • 1 vetëm UNO R3 për arduino MEGA328P 100% ATMEGA16U2 origjinale me kabllo USB

Pjesët e mëposhtme janë marrë në vend

  • 18 vetëm kabllo kërcimi meshkuj-femra Arduino
  • 3 vetëm kabllo kërcyese femër-femër Arduinin
  • 1 mini mini-pjatë
  • 4 vetëm 4K7 ohm 1/2 vat rezistorë
  • 1 qëndrim i vetëm i mbeturinave të aluminit.

Ju gjithashtu do të keni nevojë për fletët e mëposhtme të të dhënave:

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

Hapi 3: Teoria

Teori
Teori

Çipi i kamerës OV7670

Dalja e paracaktuar nga çipi i kamerës OV7670 përfshin një sinjal video YUV (4: 2: 2) dhe 3 forma valore të kohës. Formate të tjera dalëse janë të mundshme duke programuar regjistrat e brendshëm përmes një autobusi të pajtueshëm me I2C.

Sinjali video YUV (4: 2: 2) (foto 1) është një sekuencë e vazhdueshme e pikselëve pikturë njëngjyrëshe (e zezë dhe e bardhë) të ndarë nga informacionet e ngjyrave U (ngjyra e diferencës blu) dhe V (ndryshimi i ngjyrës së kuqe).

Ky format dalës është i njohur si YUV (4: 2: 2) pasi që çdo grup prej 4 bajtësh përmban 2 bajtë njëngjyrëshe dhe dhe 2 bajtë me ngjyra.

Njëngjyrëshe

Për të marrë një imazh njëngjyrësh, ne duhet të marrim mostër çdo bajt të dytë të të dhënave.

Një Arduino ka vetëm 2K memorie me akses të rastësishëm, por secila kornizë përfshin 640*2*480 = 307, 200 bajt të dhënash. Nëse nuk shtojmë një kapës kornizash në OV7670, të gjitha të dhënat duhet t'i dërgohen PC-së rresht për linjë për përpunim.

Ka dy mundësi:

Për secilën prej 480 kornizave të njëpasnjëshme, ne mund të kapim një linjë në Arduino me shpejtësi të madhe para se ta dërgojmë në PC me 1Mbps. Një qasje e tillë do të shihte që OV7670 të punonte me shpejtësi të plotë, por do të merrte një kohë të gjatë (shumë më tepër se një minutë).

Qasja që kam marrë është të ngadalësoj PCLK në 8uS dhe të dërgoj çdo mostër ashtu siç vjen. Kjo qasje është dukshëm më e shpejtë (6.4 sekonda).

Hapi 4: Shënimet e Dizajnit

Shënimet e Dizajnit
Shënimet e Dizajnit
Shënimet e Dizajnit
Shënimet e Dizajnit
Shënimet e Dizajnit
Shënimet e Dizajnit

Pajtueshmëria

Çipi i kamerës OV7670 është një pajisje 3v3 volt. Fleta e të dhënave tregon se tensionet mbi 3.5 volt do të dëmtojnë çipin.

Për të parandaluar që Arduino juaj 5 volt të shkatërrojë çipin e kamerës OV7670:

  • Sinjali i orës së jashtme (XCLK) nga Arduino duhet të reduktohet në një nivel të sigurt me anë të një ndarësi të tensionit.
  • Rezistencat e brendshme tërheqëse Arduino I2C në 5 volt duhet të çaktivizohen dhe zëvendësohen me rezistorë tërheqës të jashtëm në furnizimin me 3v3 volt.
  • Programoni Arduino-n tuaj PARAJA se të lidhni ndonjë tela kërcyesi pasi disa kunja mund të programohen akoma si dalje nga një projekt i mëparshëm !!! (E mësova këtë në mënyrën e vështirë … për fat të mirë bleva dy pasi ishin aq të lira).

Ora e jashtme

Çipi i kamerës OV7670 kërkon një orë të jashtme në intervalin e frekuencës 10Mhz deri në 24MHz.

Frekuenca më e lartë që mund të gjenerojmë nga një Arduino 16MHz është 8MHz, por kjo duket se funksionon.

Lidhje serike

Duhen të paktën 10 uS (mikrosekonda) për të dërguar 1 bajt të dhënash në një lidhje serike 1Mbps (milion bit për sekondë). Kjo kohë përbëhet si më poshtë:

  • 8 bit të dhënash (8us)
  • 1 fillim-bit (1uS)
  • 1 bit-ndalues (1uS)

Ora e brendshme

Frekuenca e orës së brendshme të pikselit (PCLK) brenda OV7670 caktohet me bit [5: 0] brenda regjistrit CLKRC (shiko foton 1). [1]

Nëse vendosim bit [5: 0] = B111111 = 63 dhe e zbatojmë në formulën e mësipërme atëherë:

  • F (ora e brendshme) = F (ora hyrëse)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz ose
  • = 8uS

Meqenëse ne po marrim mostra çdo bajt të dytë të të dhënave, një interval PCLK prej 8uS rezulton në një mostër 16uS e cila është kohë e mjaftueshme për të transmetuar 1 bajt të dhënash (10uS) duke lënë 6uS për përpunim.

Shkalla e kornizës

Çdo kornizë video VGA përfshin 784*510 piksele (elementë fotografie) nga të cilët shfaqen 640*480 piksele. Meqenëse formati i daljes YUV (4: 2: 2) ka mesatarisht 2 bajt të dhënash për piksel, secila kornizë do të marrë 784*2*510*8 uS = 6.4 sekonda.

Kjo kamera NUK është e shpejtë !!!

Pozicionimi horizontal

Imazhi mund të zhvendoset horizontalisht nëse ndryshojmë vlerat HSTART dhe HSTOP duke ruajtur një ndryshim 640 piksel.

Kur lëvizni imazhin tuaj majtas, është e mundur që vlera juaj HSTOP të jetë më e vogël se vlera HSTART!

Mos u shqetësoni … gjithçka ka të bëjë me tejmbushjet e kundërsulmeve siç shpjegohet në foton 2.

Regjistrat

OV7670 ka 201 regjistra tetë-bitësh për të kontrolluar gjëra të tilla si fitimi, balanca e bardhë dhe ekspozimi.

Një bajt i të dhënave lejon vetëm 256 vlera në rangun [0] deri [255]. Nëse kërkojmë më shumë kontroll atëherë duhet të kaskadojmë disa regjistra. Dy bajtë na japin 65536 mundësi … tre byte na japin 16, 777, 216.

Regjistri 16 bit AEC (Kontrolli Automatik i Ekspozimit) i treguar në foton 3 është një shembull i tillë dhe krijohet duke kombinuar pjesë të tre regjistrave të mëposhtëm.

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

Kini kujdes … adresat e regjistrit nuk grupohen së bashku!

Efekte anësore

Një normë e ngadaltë e kornizës prezanton një numër efektesh anësore të padëshiruara:

Për ekspozimin e duhur, OV7670 pret të punojë me një shpejtësi prej 30 fps (kuadro për sekondë). Meqenëse secila kornizë po merr 6.4 sekonda, qepen elektronike është e hapur 180 herë më shumë se zakonisht, që do të thotë se të gjitha imazhet do të ekspozohen më shumë nëse nuk ndryshojmë disa vlera regjistri.

Për të parandaluar ekspozimin e tepërt, unë i kam vendosur të gjitha bitët e regjistrit AEC (kontrolli i ekspozimit automatik) në zero. Edhe kështu një filtër me densitet neutral është i nevojshëm para lenteve kur ndriçimi është i ndritshëm.

Një ekspozim i gjatë gjithashtu duket se ndikon në të dhënat UV. Meqenëse ende nuk kam gjetur kombinime të regjistrit që prodhojnë ngjyra të sakta … konsiderojeni se kjo është punë në progres.

shënim

[1]

Formula e treguar në fletën e të dhënave (foto 1) është e saktë, por diapazoni tregon vetëm bite [4: 0]?

Hapi 5: Koha e formave të valëve

Format e valëve të kohës
Format e valëve të kohës
Format e valëve të kohës
Format e valëve të kohës
Format e valëve të kohës
Format e valëve të kohës

Shënimi në këndin e poshtëm të majtë të diagramit "Koha e Kornizës VGA" (foto 1) lexon:

Për YUV/RGB, tp = 2 x TPCLK

Figurat 1, 2 dhe 3 verifikojnë fletën (et) e të dhënave dhe konfirmojnë se Omnivision i trajton çdo 2 bajt të dhënash si ekuivalent të 1 piksel.

Format e valëve të oshiloskopit gjithashtu verifikojnë që HREF mbetet e ulët gjatë intervaleve të zbrazjes.

Fig.4 konfirmon që dalja XCLK nga Arduino është 8MHz. Arsyeja pse ne shohim një valë sinus, në vend se një valë katrore, është se të gjitha harmonikat e çuditshme janë të padukshme për oshiloskopin tim të marrjes së mostrave 20MHz.

Hapi 6: Kornizë Grabber

Grabber kornizë
Grabber kornizë

Sensori i imazhit brenda një çipi kamere OV7670 përfshin një grup prej 656*486 piksele, nga të cilat një rrjet prej 640*480 piksele përdoret për fotografinë.

Vlerat e regjistrit HSTART, HSTOP, HREF dhe VSTRT, VSTOP, VREF përdoren për të pozicionuar imazhin mbi sensorin. Nëse imazhi nuk është pozicionuar saktë mbi sensorin, do të shihni një brez të zi mbi një ose më shumë skaje siç shpjegohet në seksionin "Shënimet e Dizajnit".

OV7670 skanon çdo rresht të figurës një piksel në të njëjtën kohë duke filluar nga këndi i sipërm i majtë derisa të arrijë pikselin e poshtëm të djathtë. Arduino thjesht i kalon këto piksele në PC përmes lidhjes serike siç tregohet në foton 1.

Detyra e grabitësve është të kapni secilën nga këto 640*480 = 307200 piksele dhe të shfaqni përmbajtjen në një dritare "imazhi"

Përpunimi 3 e arrin këtë duke përdorur katër rreshtat e mëposhtëm të kodit !!

Linja e kodit 1:

bajt byteBuffer = bajt i ri [maxBytes+1]; // ku maxBytes = 307200

Kodi themelor në këtë deklaratë krijon:

  • një grup 307201 byte i quajtur "byteBuffer [307201]"
  • Bajti shtesë është për një karakter të përfundimit (linefeed).

Linja e kodit 2:

madhësia (640, 480);

Kodi themelor në këtë deklaratë krijon:

  • një ndryshore e quajtur "gjerësia = 640;"
  • një ndryshore e quajtur "lartësia = 480";
  • një grup 307200 piksel i quajtur "pixel [307200]"
  • një dritare "imazhi" 640*480 pikselë në të cilën shfaqen përmbajtjet e grupit të pikselëve . Kjo dritare "imazh" rifreskohet vazhdimisht me një shpejtësi kuadri prej 60 fps.

Linja e kodit 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Kodi themelor në këtë deklaratë:

  • ruan të dhënat në hyrje në vend derisa të shohë një karakter "lf" (linefeed).
  • pas së cilës hedh 307200 bajtët e parë të të dhënave lokale në grupin byteBuffer .
  • Gjithashtu ruan numrin e bajtëve të marrë (307201) në një ndryshore të quajtur "byteCount".

Linja e kodit 4:

piksele = ngjyra (byteBuffer );

Kur vendoset në një lak për-ardhshëm, kodi themelor në këtë deklaratë:

  • kopjon përmbajtjen e grupit "byteBuffer " në grupin "pixels"
  • përmbajtja e të cilave shfaqet në dritaren e imazhit.

Goditjet kryesore:

Rrëmbyesi i kornizave njeh goditjet e mëposhtme të tastit:

  • ‘C’ = kapni imazhin
  • 'S' = ruani imazhin në skedar.

Hapi 7: Softueri

Shkarkoni dhe instaloni secilën nga paketat e mëposhtme të softuerit nëse nuk janë instaluar tashmë:

  • "Arduino" nga
  • "Java 8" nga https://java.com/en/download/ [1]
  • "Përpunimi 3" nga

Instalimi i skicës Arduino:

  • Hiqni të gjitha telat e bluzës OV7670 [2]
  • Lidhni një kabllo USB me Arduino -n tuaj
  • Kopjoni përmbajtjen e "OV7670_camera_mono_V2.ino" (bashkangjitur) në një "skicë" Arduino dhe ruani.
  • Ngarko skicën në Arduino tuaj.
  • Shkëputeni Arduino -n nga priza
  • Tani mund të rilidhni me siguri telat e kërcyesit OV7670
  • Rilidhni kabllon USB.

Instalimi dhe ekzekutimi i skicës së Përpunimit

  • Kopjoni përmbajtjen e "OV7670_camera_mono_V2.pde" (bashkangjitur) në një "skicë" të përpunimit dhe ruani.
  • Klikoni në butonin e sipërm të majtë të "drejtimit" … do të shfaqet një dritare me imazh të zi
  • Klikoni në dritaren e imazhit "të zi"
  • Shtypni butonin "c" për të kapur një imazh. (rreth 6.4 sekonda).
  • Shtypni butonin "s" për të ruajtur imazhin në dosjen tuaj të përpunimit
  • Përsëritni hapat 4 dhe 5
  • Klikoni butonin "ndal" për të dalë nga programi.

Shënime

[1]

Përpunimi 3 kërkon Java 8

[2]

Ky është një hap sigurie "vetëm një herë" për të shmangur dëmtimin e çipit tuaj të kamerës OV7670.

Derisa skica "OV7670_camera_mono.ini" të jetë ngarkuar në Arduino tuaj, rezistorët e brendshëm tërheqës janë të lidhur me 5 volt, plus ekziston mundësia që disa nga linjat e të dhënave të Arduino të jenë dalje 5 volt … të gjitha këto janë fatale për çipi i kamerës 3v3 volt OV7670.

Pasi të jetë programuar Arduino, nuk ka nevojë të përsërisni këtë hap dhe vlerat e regjistrit mund të ndryshojnë në mënyrë të sigurt.

Hapi 8: Marrja e një imazhi me ngjyra

Marrja e një imazhi me ngjyra
Marrja e një imazhi me ngjyra
Marrja e një imazhi me ngjyra
Marrja e një imazhi me ngjyra
Marrja e një imazhi me ngjyra
Marrja e një imazhi me ngjyra

Softueri i mëposhtëm është thjesht eksperimental dhe është postuar me shpresën se disa nga teknikat do të rezultojnë të dobishme. Ngjyrat duket se janë të përmbysura … Unë ende nuk kam gjetur cilësimet e sakta të regjistrit. Nëse gjeni një zgjidhje, ju lutemi postoni rezultatet tuaja

Nëse duam të marrim një imazh me ngjyra, të gjithë bajtët e të dhënave duhet të kapen dhe të zbatohen formulat e mëposhtme.

OV7670 përdor formulat e mëposhtme për të kthyer informacionin e ngjyrave RGB (të kuqe, jeshile, blu) në 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)

Formulat e mëposhtme mund të përdoren për të kthyer YUV (4: 2: 2) në ngjyrë RGB: [2]

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

Softueri i bashkangjitur është thjesht një shtesë e softuerit njëngjyrësh:

  • Një kërkesë për kapjen "c" i dërgohet Arduino
  • Arduino dërgon bajtët me numër çift (njëngjyrësh) në PC
  • PC i ruan këto byte në një grup
  • Arduino pastaj dërgon bajtët me numër tek (kroma) në PC.
  • Këto bajt ruhen në një grup të dytë … tani kemi të gjithë imazhin.
  • Formulat e mësipërme tani zbatohen për secilin grup prej katër bajtësh të të dhënave UYVY.
  • Pikselët e ngjyrave që rezultojnë vendosen më pas në grupin "pixel"
  • PC skanon grupin "pixels dhe një imazh shfaqet në dritaren" image ".

Softueri Processing 3 shfaq shkurtimisht çdo skanim dhe rezultatet përfundimtare:

  • Fotografia 1 tregon të dhënat e kromës U & V nga skanimi 1
  • Fotografia 2 tregon të dhënat e ndriçimit Y1 & Y2 nga skanimi 2
  • Fotografia 3 tregon imazhin me ngjyra … vetëm një gjë është e gabuar … çanta duhet të jetë e gjelbër !!

Unë do të postoj kod të ri sapo të zgjidh këtë program…

Referencat:

[1]

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

[2]

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

Klikoni këtu për të parë udhëzimet e mia të tjera udhëzuese.

Recommended: