Orodha ya maudhui:

Tengeneza Kamera yako mwenyewe: Hatua 8
Tengeneza Kamera yako mwenyewe: Hatua 8

Video: Tengeneza Kamera yako mwenyewe: Hatua 8

Video: Tengeneza Kamera yako mwenyewe: Hatua 8
Video: Dunia imeisha, shuhuda wachawi wanaswa live na CCTV camera wakifanya yao...... 2024, Novemba
Anonim
Image
Image
Tengeneza Kamera yako mwenyewe
Tengeneza Kamera yako mwenyewe

Hii inaweza kuelezewa jinsi ya kutengeneza kamera ya monochrome ukitumia sensorer ya picha ya Omnivision OV7670, microcontroller ya Arduino, waya chache za kuruka, na programu ya Usindikaji 3.

Programu ya majaribio ya kupata picha ya rangi pia imewasilishwa.

Bonyeza kitufe cha "c" ili kunasa picha ya pikseli 640 * 480… bonyeza kitufe cha "s" ili kuhifadhi picha ya faili. Picha zinazofuatana zinahesabiwa mfululizo ikiwa ungetaka kuunda sinema fupi ya muda mfupi.

Kamera haina haraka (kila skanisho inachukua sekunde 6.4) na inafaa tu kutumika katika taa iliyowekwa.

Gharama, ukiondoa Arduino na PC yako, ni chini ya kikombe cha kahawa.

Picha

Sehemu za sehemu, bila wiring ya kuruka, zinaonyeshwa kwenye picha ya ufunguzi.

Picha ya pili ni picha ya skrini inayoonyesha programu ya kamera ya Arduino na Mchakataji wa sura ya 3. Ujazo unaonyesha jinsi kamera imeunganishwa.

Video inaonyesha kamera kwa vitendo. Wakati kitufe cha kukamata "c" kinabanwa kuna mwangaza mfupi na kufuatiwa na kupasuka kwa shughuli wakati picha inakaguliwa. Picha inaonekana moja kwa moja kwenye dirisha la kuonyesha mara tu skanisho imekamilika. Picha hizo zinaonekana kuonekana kwenye folda ya Usindikaji kufuatia kila vyombo vya habari vya kitufe cha "s". Video inahitimisha kwa kuendesha baiskeli haraka kupitia kila moja ya picha tatu zilizohifadhiwa.

Hatua ya 1: Mchoro wa Mzunguko

Mchoro wa Mzunguko
Mchoro wa Mzunguko
Mchoro wa Mzunguko
Mchoro wa Mzunguko
Mchoro wa Mzunguko
Mchoro wa Mzunguko

Mchoro wa mzunguko, kwa matoleo yote ya kamera hii, umeonyeshwa kwenye picha 1.

Picha 2, 3 zinaonyesha jinsi waya za kuruka na vifaa vimeunganishwa.

Bila bracket ya alumini picha zimelala upande wao.

Onyo

Panga Arduino yako KABLA ya kuambatisha waya yoyote ya kuruka kwenye chip ya kamera ya OV7670. Hii itazuia pini 5 za pato la volt kutoka kwa programu iliyopita kutoharibu 3v3 volt OV7670 chip chip.

Hatua ya 2: Orodha ya Sehemu

Orodha ya Sehemu
Orodha ya Sehemu

Sehemu zifuatazo zilipatikana kutoka

  • 1 tu OV7670 300KP VGA Moduli ya Kamera ya arduino DIY KIT
  • 1 bracket ya kamera kamili na karanga na bolts
  • 1 tu UNO R3 ya arduino MEGA328P 100% asili ATMEGA16U2 na Kebo ya USB

Sehemu zifuatazo zilipatikana ndani

  • Kamba 18 za kuruka za kiume na kike za Arlyino
  • 3 tu nyaya za kuruka za kike na za kike za Arduinin
  • 1 bodi ndogo tu ya mkate
  • Vipinzani 4 tu vya 4K7 ohm 1/2 watt
  • Stendi 1 tu ya chakavu cha aluminium.

Utahitaji pia hati za data zifuatazo:

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

Hatua ya 3: Nadharia

Nadharia
Nadharia

Chip ya kamera ya OV7670

Pato la msingi kutoka kwa chip ya kamera ya OV7670 inajumuisha ishara ya video ya YUV (4: 2: 2) na fomu 3 za mawimbi ya muda. Fomati zingine za pato zinawezekana kwa kupanga daftari za ndani kupitia basi inayolingana ya I2C.

Ishara ya video ya YUV (4: 2: 2) (picha 1) ni mlolongo unaoendelea wa saizi za monochrome (nyeusi na nyeupe) zilizotengwa na U (tofauti ya rangi ya samawati) na V (tofauti ya rangi nyekundu) habari za rangi.

Fomati hii ya pato inajulikana kama YUV (4: 2: 2) kwa kuwa kila kikundi cha ka 4 kina kaiti 2 za monochrome na ka 2 za rangi.

Monochrome

Ili kupata picha ya monochrome lazima tuchunguze kila data ya pili ya data.

Arduino ina 2K tu ya kumbukumbu ya ufikiaji wa nasibu lakini kila fremu ina 640 * 2 * 480 = 307, 200 ka ka. Isipokuwa tuongeze mkabaji kwa OV7670 data zote lazima zitumwe kwa PC-line-by-line kwa usindikaji.

Kuna uwezekano mbili:

Kwa kila muafaka 480 mfululizo, tunaweza kukamata laini moja kwenda Arduino kwa kasi kubwa kabla ya kuipeleka kwa PC kwa 1Mbps. Njia kama hiyo ingeona OV7670 ikifanya kazi kwa kasi kamili lakini itachukua muda mrefu (zaidi ya dakika).

Njia ambayo nimechukua ni kupunguza PCLK chini hadi 8uS na kutuma kila sampuli inavyokuja. Njia hii ni haraka sana (sekunde 6.4).

Hatua ya 4: Vidokezo vya Kubuni

Vidokezo vya Kubuni
Vidokezo vya Kubuni
Vidokezo vya Kubuni
Vidokezo vya Kubuni
Vidokezo vya Kubuni
Vidokezo vya Kubuni

Utangamano

Chip ya kamera ya OV7670 ni kifaa cha volt 3v3. Karatasi ya data inaonyesha kuwa voltages zilizo juu ya volts 3.5 zitaharibu chip.

Ili kuzuia voliti yako 5 ya Arduino kuharibu kifaa cha kamera ya OV7670:

  • Saa ya nje (XCLK) ishara kutoka Arduino lazima ipunguzwe kwa kiwango salama kwa njia ya mgawanyiko wa voltage.
  • Vipinga vya ndani vya Arduino I2C vya kuvuta hadi volts 5 lazima vilemavu na kubadilishwa na vizuizi vya kuvuta vya nje kwa usambazaji wa volt 3v3.
  • Panga Arduino yako KABLA ya kuambatanisha waya za kuruka kama vile pini zingine zinaweza kusanidiwa kama pato kutoka kwa mradi wa mapema !!! (Nilijifunza hii kwa njia ngumu… kwa bahati nzuri nilinunua mbili kwani zilikuwa za bei rahisi sana).

Saa ya nje

Chip ya kamera ya OV7670 inahitaji saa ya nje katika masafa ya 10Mhz hadi 24MHz.

Mzunguko wa juu zaidi tunaweza kutoa kutoka kwa 16MHz Arduino ni 8MHz lakini hii inaonekana inafanya kazi.

Kiunga cha serial

Inachukua angalau 10 uS (microseconds) kutuma 1 data byte kwenye 1Mbps (milioni milioni kwa sekunde) kiungo cha serial. Wakati huu umeundwa kama ifuatavyo:

  • Bits 8 za data (8us)
  • 1 kuanza-kidogo (1uS)
  • 1 kuacha-kidogo (1uS)

Saa ya ndani

Saa ya ndani ya pikseli (PCLK) ndani ya OV7670 imewekwa na bits [5: 0] ndani ya usajili CLKRC (angalia picha 1). [1]

Ikiwa tunaweka bits [5: 0] = B111111 = 63 na kuitumia kwa fomula hapo juu basi:

  • F (saa ya ndani) = F (saa ya kuingiza) / (Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz au
  • = 8uS

Kwa kuwa tunachukua sampuli tu kwa kila data ya pili ya data, muda wa PCLK wa 8uS husababisha sampuli ya 16uS ambayo ni wakati wa kutosha kusambaza data 1 byte (10uS) ikiacha 6uS kwa usindikaji.

Kiwango cha fremu

Kila fremu ya video ya VGA ina saizi 784 * 510 (picha za picha) ambazo saizi 640 * 480 zinaonyeshwa. Kwa kuwa muundo wa pato wa YUV (4: 2: 2) una wastani wa ka 2 za data kwa pikseli, kila fremu itachukua 784 * 2 * 510 * 8 uS = sekunde 6.4.

Kamera hii SI haraka !!!

Nafasi ya usawa

Picha inaweza kuhamishwa kwa usawa ikiwa tutabadilisha maadili ya HSTART na HSTOP wakati tunadumisha tofauti ya pikseli 640.

Wakati wa kuhamisha picha yako kushoto, inawezekana kwa thamani yako ya HSTOP kuwa chini ya thamani ya HSTART!

Usiogope… yote haya yanahusiana na mafuriko ya kaunta kama ilivyoelezewa kwenye picha 2.

Sajili

OV7670 ina rejista 201-bit nane za kudhibiti vitu kama faida, usawa mweupe, na mfiduo.

Nambari moja ya data inaruhusu tu maadili 256 katika masafa [0] hadi [255]. Ikiwa tunahitaji udhibiti zaidi basi lazima tutoe rejista kadhaa. Baiti mbili hutupa uwezekano 65536… ka tatu hutupa 16, 777, 216.

Rejista ya 16 AEC (Udhibiti wa Mfiduo wa Moja kwa Moja) iliyoonyeshwa kwenye picha 3 ni mfano kama huo na imeundwa kwa kuchanganya sehemu za sajili tatu zifuatazo.

  • ACHEKI [5: 0] = AEC [15:10]
  • ACH [7: 2] = AEC [9: 2]
  • COM1 [1: 0] = AEC [1: 0]

Tahadharishwa… anwani za sajili hazijapangwa pamoja!

Madhara

Kiwango cha polepole cha sura huleta athari kadhaa zisizohitajika:

Kwa mfiduo sahihi, OV7670 inatarajia kufanya kazi kwa kiwango cha fremu ya 30 fps (muafaka kwa sekunde). Kwa kuwa kila fremu inachukua sekunde 6.4 shutter ya elektroniki iko wazi mara 180 zaidi ya kawaida ambayo inamaanisha picha zote zitafunuliwa wazi isipokuwa tutabadilisha maadili kadhaa ya sajili.

Ili kuzuia mfiduo zaidi nimeweka AEC zote (udhibiti wa mfiduo wa auto) sajili bits hadi sifuri. Hata hivyo kichujio cha wiani wa upande wowote kinahitajika mbele ya lensi wakati taa ni mkali.

Mfiduo mrefu pia unaonekana kuathiri data ya UV. Kwa kuwa bado sijapata michanganyiko ya rejista ambayo hutoa rangi sahihi… fikiria hii ni kazi inayoendelea.

Kumbuka

[1]

Fomula iliyoonyeshwa kwenye karatasi ya data (picha 1) ni sahihi lakini masafa yanaonyesha tu bits [4: 0]?

Hatua ya 5: Njia za mawimbi ya muda

Njia za Wimbi za Majira
Njia za Wimbi za Majira
Njia za Wimbi za Majira
Njia za Wimbi za Majira
Njia za Wimbi za Majira
Njia za Wimbi za Majira

Ujumbe katika kona ya chini kushoto ya mchoro wa "VGA Frame Timing" (picha 1) inasomeka:

Kwa YUV / RGB, tp = 2 x TPCLK

Takwimu 1, 2, na 3 zinathibitisha karatasi (s) na zinathibitisha kuwa Omnivision inachukua kila ka 2 za data kuwa sawa na pikseli 1.

Fomu za mawimbi ya oscilloscope pia inathibitisha kwamba HREF inabaki CHINI wakati wa vipindi vya kufunika.

Mtini. 4 inathibitisha kuwa pato la XCLK kutoka Arduino ni 8MHz. Sababu tunayoona sinewave, badala ya mawimbi ya mraba, ni kwamba harmonics zote zisizo za kawaida hazionekani kwa oscilloscope yangu ya sampuli ya 20MHz.

Hatua ya 6: Grabber ya Sura

Sura ya Kunyakua
Sura ya Kunyakua

Sura ya picha ndani ya chip ya kamera ya OV7670 inajumuisha saizi 656 * 486 ambazo gridi ya saizi 640 * 480 hutumiwa kwa picha.

HSTART, HSTOP, HREF, na VSTRT, VSTOP, VREF maadili ya rejista hutumiwa kuweka picha juu ya sensa. Ikiwa picha haijawekwa vizuri juu ya kitambuzi utaona bendi nyeusi juu ya kingo moja au zaidi kama ilivyoelezewa katika sehemu ya "Vidokezo vya Kubuni".

OV7670 hutafuta kila mstari wa picha pikseli moja kwa wakati kuanzia kona ya juu kushoto hadi ifikie pikseli ya chini kulia. Arduino hupitisha tu saizi hizi kwa PC kupitia kiunga cha serial kama inavyoonyeshwa kwenye picha 1.

Kazi ya wanyakua fremu ni kukamata kila moja ya saizi hizi 640 * 480 = 307200 na kuonyesha yaliyomo kwenye dirisha la "picha"

Usindikaji 3 unafanikisha hii kwa kutumia laini nne zifuatazo za nambari !!

Mstari wa nambari 1:

byte byteBuffer = new byte [maxBytes + 1]; // wapi maxBytes = 307200

Nambari ya msingi katika taarifa hii inaunda:

  • safu 307201 ya baiti iitwayo "byteBuffer [307201]"
  • Baiti ya ziada ni ya kukomesha (laini).

Mstari wa nambari 2:

saizi (640, 480);

Nambari ya msingi katika taarifa hii inaunda:

  • tofauti inayoitwa "upana = 640;"
  • tofauti inayoitwa "urefu = 480";
  • safu ya pikseli 307200 iitwayo "saizi [307200]"
  • dirisha la picha "pikseli" 640 * 480 ambalo yaliyomo kwenye safu za saizi yanaonyeshwa. Dirisha hili la "picha" linaendelea kuburudishwa kwa kiwango cha fremu ya 60 fps.

Mstari wa nambari 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Nambari ya msingi katika taarifa hii:

  • hupata data inayoingia ndani hadi hapo itakapoona herufi ya "lf" (iliyosawazishwa).
  • baada ya hapo hutupa kaiti za kwanza 307200 za data ya ndani kwenye safu ya ByteBuffer .
  • Pia inaokoa idadi ya ka iliyopokea (307201) katika ubadilishaji uitwao "byteCount".

Mstari wa nambari 4:

saizi = rangi (byBuffer );

Wakati umewekwa kwa kitanzi-kinachofuata, nambari ya msingi katika taarifa hii:

  • nakala nakala za safu ya "byteBuffer " kwa safu ya "saizi"
  • yaliyomo ambayo yanaonekana kwenye dirisha la picha.

Viharusi muhimu:

Mchezaji wa sura anatambua vifuatavyo vifuatavyo:

  • ‘C’ = kunasa picha
  • 'S' = hifadhi picha kwenye faili.

Hatua ya 7: Programu

Pakua na usakinishe kila kifurushi kifuatacho cha programu ikiwa haijasakinishwa tayari:

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

Kufunga mchoro wa Arduino:

  • Ondoa waya zote za kuruka za OV7670 [2]
  • Unganisha kebo ya USB kwa Arduino yako
  • Nakili yaliyomo kwenye "OV7670_camera_mono_V2.ino" (iliyoambatanishwa) kwenye "mchoro" wa Arduino na uhifadhi.
  • Pakia mchoro kwenye Arduino yako.
  • Chomoa Arduino
  • Sasa unaweza kuunganisha tena salama waya za kuruka za OV7670
  • Unganisha tena kebo ya USB.

Kufunga na kuendesha mchoro wa Usindikaji

  • Nakili yaliyomo kwenye "OV7670_camera_mono_V2.pde" (iliyoambatanishwa) kwenye "Mchoro" wa Usindikaji na uhifadhi.
  • Bonyeza kitufe cha kushoto cha "kukimbia" … dirisha la picha nyeusi litaonekana
  • Bonyeza dirisha la picha "nyeusi"
  • Bonyeza kitufe cha "c" ili kunasa picha. (takriban sekunde 6.4).
  • Bonyeza kitufe cha "s" ili kuhifadhi picha kwenye folda yako ya usindikaji
  • Rudia hatua 4 & 5
  • Bonyeza kitufe cha "kuacha" ili kutoka kwenye programu.

Vidokezo

[1]

Usindikaji 3 unahitaji Java 8

[2]

Hii ni hatua ya usalama "mara moja tu" ili kuepuka kuharibu chip yako ya kamera ya OV7670.

Hadi mchoro "OV7670_camera_mono.ini" umepakiwa kwenye Arduino yako vipingamizi vya ndani vya kuvuta vimeunganishwa na volts 5, na pia kuna uwezekano kwamba zingine za mistari ya data ya Arduino inaweza kuwa matokeo ya volt 5 … ambayo yote ni mabaya kwa kamera ya 3v3 volt OV7670 chip.

Mara tu Arduino ikipangwa hakuna haja ya kurudia hatua hii na maadili ya rejista yanaweza kubadilishwa salama.

Hatua ya 8: Kupata Picha ya Rangi

Kupata Picha ya Rangi
Kupata Picha ya Rangi
Kupata Picha ya Rangi
Kupata Picha ya Rangi
Kupata Picha ya Rangi
Kupata Picha ya Rangi

Programu ifuatayo ni ya majaribio tu na imechapishwa kwa matumaini kwamba baadhi ya mbinu zitathibitika kuwa muhimu. Rangi zinaonekana zimebadilishwa… Bado sijapata mipangilio sahihi ya sajili. Ukipata suluhisho tafadhali chapisha matokeo yako

Ikiwa tunapaswa kupata picha ya rangi, kaiti zote za data lazima zichukuliwe na fomula zifuatazo zitumike.

OV7670 hutumia fomula zifuatazo kubadilisha RGB (nyekundu, kijani kibichi, bluu) habari ya rangi kuwa YUV (4: 2: 2): [1]

  • Y = 0.31 * R + 0.59 * G + 0.11 * B
  • U = B - Y
  • V = R - Y
  • Cb = 0.563 * (BY)
  • Cr = 0.713 * (R-Y)

Fomula zifuatazo zinaweza kutumiwa kubadilisha YUV (4: 2: 2) kurudi kwenye rangi ya RGB: [2]

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

Programu iliyoambatanishwa ni ugani tu wa programu ya monochrome:

  • Ombi la kukamata "c" limetumwa kwa Arduino
  • Arduino hutuma hata ka zilizo na nambari (monochrome) kwa PC
  • PC inaokoa ka hizi katika safu
  • Arduino ijayo hutuma kaunti zisizo za kawaida (chroma) kwa PC.
  • Baiti hizi zinahifadhiwa katika safu ya pili… sasa tuna picha nzima.
  • Fomula zilizo hapo juu sasa zinatumika kwa kila kikundi cha ka nne za data za UYVY.
  • Saizi za rangi zinazosababishwa huwekwa kwenye safu ya "saizi"
  • PC inachunguza safu ya "saizi " na picha inaonekana kwenye dirisha la "picha".

Programu ya Usindikaji 3 inaonyesha kwa kifupi kila skana na matokeo ya mwisho:

  • Picha 1 inaonyesha data ya chroma ya U & V kutoka skana 1
  • Picha 2 inaonyesha data ya mwangaza ya Y1 & Y2 kutoka skana 2
  • Picha 3 inaonyesha picha ya rangi… kitu kimoja tu ni kibaya… mfuko unapaswa kuwa kijani !!

Nitachapisha nambari mpya mara nitakapotatua mpango huu…

Marejeo:

[1]

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

[2]

en.wikipedia.org/wiki/YCbCr (uongofu wa JPEG)

Bonyeza hapa kuona maelekezo yangu mengine.

Ilipendekeza: