Talaan ng mga Nilalaman:
- Hakbang 1: Diagram ng Circuit
- Hakbang 2: Listahan ng Mga Bahagi
- Hakbang 3: Teorya
- Hakbang 4: Mga Tala ng Disenyo
- Hakbang 5: Mga Timing ng Waveform
- Hakbang 6: Frame Grabber
- Hakbang 7: Software
- Hakbang 8: Pagkuha ng isang Kulay ng Imahe
Video: Gumawa ng Iyong Sariling Camera: 8 Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:13
Ang itinuturo na ito ay nagpapaliwanag kung paano gumawa ng isang monochrome camera gamit ang isang Omnivision OV7670 image sensor, isang Arduino microcontroller, ilang mga jumper wires, at Pagproseso ng 3 software.
Ipinakita rin ang pang-eksperimentong software para sa pagkuha ng isang kulay ng imahe.
Pindutin ang "c" key upang makuha ang isang 640 * 480 pixel na imahe … pindutin ang "s" key upang mai-save ang imahe sa file. Ang sunud-sunod na mga imahe ay sunud-sunod na bilang kung nais mong lumikha ng isang maikling pelikula na lumipas ng oras.
Ang camera ay hindi mabilis (ang bawat pag-scan ay tumatagal ng 6.4 segundo) at angkop lamang para magamit sa naayos na ilaw.
Ang gastos, hindi kasama ang iyong Arduino at PC, ay mas mababa sa isang tasa ng kape.
Mga imahe
Ang mga bahagi ng bahagi, nang walang mga kable ng jumper, ay ipinapakita sa pambungad na larawan.
Ang pangalawang larawan ay isang screen-shot na nagpapakita ng software ng Arduino camera at ang Processing 3 frame-grabber. Ipinapakita ng inset kung paano nakakonekta ang camera.
Ipinapakita ng video ang camera sa pagkilos. Kapag ang "c" capture key ay pinindot mayroong isang maikling flash na sinusundan ng isang pagsabog ng aktibidad habang ang imahe ay na-scan. Awtomatikong lilitaw ang imahe sa display window kapag nakumpleto ang pag-scan. Pagkatapos ay makikita ang mga imahe na lilitaw sa folder ng Pagproseso ng pagsunod sa bawat pindutin ng "s" key. Nagtatapos ang video sa pamamagitan ng pagbibisikleta nang mabilis sa bawat isa sa tatlong nai-save na mga imahe.
Hakbang 1: Diagram ng Circuit
Ang circuit diagram, para sa lahat ng mga bersyon ng camera na ito, ay ipinapakita sa larawan 1.
Ipinapakita ng mga larawan 2, 3 kung paano nakakonekta ang mga jumpers-wires at mga bahagi.
Nang walang aluminyo bracket ang mga imahe ay nakahiga sa kanilang panig.
Babala
I-program ang iyong Arduino BAGO ilakip ang anumang mga jumper wires sa OV7670 camera chip. Pipigilan nito ang 5 volt output pin mula sa isang nakaraang programa mula sa pagwawasak sa 3v3 volt OV7670 camera chip.
Hakbang 2: Listahan ng Mga Bahagi
Ang mga sumusunod na bahagi ay nakuha mula sa
- 1 lamang ang OV7670 300KP VGA Camera Module para sa arduino DIY KIT
- 1 lamang ang bracket ng kamera na kumpleto sa mga nut at bolts
- 1 lang ang UNO R3 para sa arduino MEGA328P 100% orihinal na ATMEGA16U2 na may USB Cable
Ang mga sumusunod na bahagi ay nakuha nang lokal
- 18 anly Arduino male-female jumper cables
- 3 lamang ang mga Arduinin female-female jumper cables
- 1 lamang ang mini board-board
- 4 lamang na 4K7 ohm 1/2 watt resistors
- 1 lamang ang scrap ng aluminyo na nakatayo.
Kakailanganin mo rin ang mga sumusunod na datasheet:
- https://web.mit.edu/6.111/www/f2016/tools/OV7670_20…
- https://www.haoyuelectronics.com/Attachment/OV7670%…
Hakbang 3: Teorya
OV7670 camera chip
Ang default na output mula sa OV7670 camera chip ay naglalaman ng isang YUV (4: 2: 2) signal ng video at 3 mga format ng alon ng tiyempo. Ang iba pang mga format ng output ay posible sa pamamagitan ng pagprograma ng panloob na mga pagrehistro sa pamamagitan ng isang katugmang bus na I2C.
Ang YUV (4: 2: 2) signal ng video (larawan 1) ay isang tuloy-tuloy na pagkakasunud-sunod ng monochrome (itim at puti) na mga pixel na pinaghiwalay ng U (asul na pagkakaiba ng kulay) at impormasyon ng kulay ng V (pulang kulay).
Ang format ng output na ito ay kilala bilang YUV (4: 2: 2) dahil ang bawat pangkat ng 4 bytes ay naglalaman ng 2 monochrome bytes at at 2 color bytes.
Monochrome
Upang makakuha ng isang imahe ng monochrome dapat nating sample ang bawat pangalawang byte ng data.
Ang isang Arduino ay mayroon lamang 2K ng random na memorya ng pag-access ngunit ang bawat frame ay naglalaman ng 640 * 2 * 480 = 307, 200 data bytes. Maliban kung magdagdag kami ng isang frame-grabber sa OV7670 lahat ng data ay dapat na ipadala sa linya ng linya ng PC para sa pagproseso.
Mayroong dalawang posibilidad:
Para sa bawat 480 na sunud-sunod na mga frame, maaari naming makuha ang isang linya sa Arduino sa mataas na bilis bago ipadala ito sa PC sa 1Mbps. Ang nasabing diskarte ay makikita ang OV7670 na nagtatrabaho sa buong bilis ngunit tatagal ng mahabang panahon (higit sa isang minuto).
Ang diskarte na kinuha ko ay upang mabagal ang PCLK pababa sa 8uS at ipadala ang bawat sample pagdating. Ang diskarte na ito ay makabuluhang mas mabilis (6.4 segundo).
Hakbang 4: Mga Tala ng Disenyo
Pagkakatugma
Ang chip ng OV7670 camera ay isang aparato na 3v3 volt. Ipinapahiwatig ng sheet ng data na ang mga voltages na higit sa 3.5 volts ay makakasira sa maliit na tilad.
Upang maiwasan ang iyong 5 volt Arduino mula sa pagwasak sa chip ng camera ng OV7670:
- Ang panlabas na orasan (XCLK) signal mula sa Arduino ay dapat na mabawasan sa isang ligtas na antas sa pamamagitan ng isang voltage divider.
- Ang panloob na Arduino I2C pull-up resistors sa 5 volts ay dapat na hindi paganahin at palitan ng panlabas na pull-up resistors sa supply ng 3v3 volt.
- I-program ang iyong Arduino BAGO ilakip ang anumang mga jumper-wires dahil ang ilan sa mga pin ay maaari pa ring mai-program bilang isang output mula sa isang naunang proyekto !!! (Natutunan ko ito sa mahirap na paraan … mabuti na lang at bumili ako ng dalawa dahil napakamura nila).
Panlabas na orasan
Ang chip ng OV7670 camera ay nangangailangan ng isang panlabas na orasan sa saklaw na dalas na 10Mhz hanggang 24MHz.
Ang pinakamataas na dalas na maaari naming mabuo mula sa isang 16MHz Arduino ay 8MHz ngunit tila gagana ito.
Serial na link
Tumatagal ng hindi bababa sa 10 uS (microseconds) upang magpadala ng 1 data byte sa isang 1Mbps (milyong piraso bawat segundo) serial link. Ang oras na ito ay binubuo tulad ng sumusunod:
- 8 data bit (8us)
- 1 start-bit (1uS)
- 1 stop-bit (1uS)
Panloob na orasan
Ang dalas ng panloob na pixel na orasan (PCLK) sa loob ng OV7670 ay itinatakda ng mga piraso [5: 0] sa loob ng pagrehistro sa CLKRC (tingnan ang larawan 1). [1]
Kung magtakda kami ng mga bit [5: 0] = B111111 = 63 at ilapat ito sa pormula sa itaas kung gayon:
- F (panloob na orasan) = F (input orasan) / (Bit [5: 0} +1)
- = 8000000/(63+1)
- = 125000 Hz o
- = 8uS
Dahil sinusulit lamang namin ang bawat segundo na byte ng data, isang agwat ng PCLK na 8uS ay nagreresulta sa isang sample na 16uS na sapat na oras upang maipadala ang 1 data byte (10uS) na iniiwan ang 6uS para sa pagproseso.
Frame rate
Ang bawat VGA video frame ay naglalaman ng 784 * 510 mga pixel (mga elemento ng larawan) kung saan 640 * 480 pixel ang ipinapakita. Dahil ang format ng output ng YUV (4: 2: 2) ay may average na 2 data bytes per pixel, ang bawat frame ay tatagal ng 784 * 2 * 510 * 8 uS = 6.4 segundo.
Ang camera na ito ay HINDI mabilis !!!
Pahalang na pagpoposisyon
Maaaring ilipat ang imahe nang pahalang kung binago namin ang mga halagang HSTART at HSTOP habang pinapanatili ang pagkakaiba ng 640 pixel.
Kapag inililipat ang iyong imahe sa kaliwa, posible na ang iyong halaga ng HSTOP ay mas mababa kaysa sa HSTART na halaga!
Huwag maalarma … ang lahat ay gawin sa mga counter overflows tulad ng ipinaliwanag sa larawan 2.
Mga rehistro
Ang OV7670 ay mayroong 201 walong bit na rehistro para sa pagkontrol sa mga bagay tulad ng kita, puting balanse, at pagkakalantad.
Pinapayagan lamang ng isang byte ng data ang 256 na halaga sa saklaw na [0] hanggang [255]. Kung nangangailangan kami ng higit na kontrol sa gayon kailangan nating mag-kaskad ng maraming mga rehistro. Dalawang byte ang nagbibigay sa amin ng 65536 na posibilidad … tatlong byte ang nagbibigay sa amin ng 16, 777, 216.
Ang 16 bit AEC (Awtomatikong Pagkalantad sa Pagkalantad) na ipinapakita sa larawan 3 ay isang halimbawa at nilikha sa pamamagitan ng pagsasama ng mga bahagi ng mga sumusunod na tatlong rehistro.
- AECHH [5: 0] = AEC [15:10]
- AECH [7: 2] = AEC [9: 2]
- COM1 [1: 0] = AEC [1: 0]
Babalaan … ang mga rehistro ng rehistro ay hindi naka-grupo!
Mga epekto
Ang isang mabagal na rate ng frame ay nagpapakilala ng isang bilang ng mga hindi nais na epekto:
Para sa tamang pagkakalantad, inaasahan ng OV7670 na gumana sa isang frame rate na 30 fps (mga frame bawat segundo). Dahil ang bawat frame ay tumatagal ng 6.4 segundo ang elektronikong shutter ay bukas 180 beses na mas mahaba kaysa sa normal na nangangahulugang ang lahat ng mga imahe ay sobrang mailantad maliban kung baguhin namin ang ilang mga halaga ng rehistro.
Upang maiwasan ang labis na pagkakalantad naitakda ko ang lahat ng mga rehistro ng AEC (awtomatikong pagkakalantad sa kontrol) na mga bit sa zero. Kahit na kailangan ng isang neutral na filter ng density sa harap ng lens kapag ang ilaw ay maliwanag.
Lumilitaw din ang isang mahabang pagkakalantad upang makaapekto sa data ng UV. Tulad ng hindi ko pa mahanap ang mga kumbinasyon ng rehistro na gumagawa ng tamang mga kulay … isaalang-alang na ito ay gumagana sa isinasagawa.
Tandaan
[1]
Ang formula na ipinapakita sa sheet ng data (larawan 1) ay tama ngunit ang saklaw ay nagpapakita lamang ng mga piraso [4: 0]?
Hakbang 5: Mga Timing ng Waveform
Ang tala sa ibabang kaliwang sulok ng diagram na "VGA Frame Timing" (larawan 1) ay binabasa:
Para sa YUV / RGB, tp = 2 x TPCLK
Ang mga numero 1, 2, at 3 ay nagpapatunay sa (mga) sheet ng data at kumpirmahing tinatrato ng Omnivision ang bawat 2 data byte bilang katumbas ng 1 pixel.
Ang mga oscilloscope waveforms ay nagpapatunay din na ang HREF ay mananatiling LOW habang ang mga blangko na agwat.
Kinukumpirma ng Fig.4 na ang output ng XCLK mula sa Arduino ay 8MHz. Ang dahilan kung bakit nakikita namin ang isang sinewave, sa halip na isang squarewave, ay ang lahat ng mga kakaibang harmonika ay hindi nakikita ng aking 20MHz sampling oscilloscope.
Hakbang 6: Frame Grabber
Ang sensor ng imahe sa loob ng isang OV7670 camera chip ay binubuo ng isang hanay ng 656 * 486 mga pixel kung saan ang isang grid na 640 * 480 pixel ay ginagamit para sa larawan.
Ang mga halaga ng rehistro ng HSTART, HSTOP, HREF, at VSTRT, VSTOP, VREF ay ginagamit upang mailagay ang imahe sa sensor. Kung ang imahe ay hindi nakaposisyon nang tama sa sensor makikita mo ang isang itim na banda sa isa o higit pang mga gilid tulad ng ipinaliwanag sa seksyong "Mga Tala ng Disenyo".
Sinusuri ng OV7670 ang bawat linya ng larawan ng isang pixel nang paisa-isa simula sa kaliwang sulok sa itaas hanggang sa maabot nito ang kanang kanang pixel. Ipinapasa lamang ng Arduino ang mga pixel na ito sa PC sa pamamagitan ng serial link tulad ng ipinakita sa larawan 1.
Ang gawain ng mga taga-frame ay upang makuha ang bawat isa sa 640 * 480 = 307200 na mga pixel at ipakita ang mga nilalaman sa isang window ng "imahe"
Nakamit ito ng pagproseso ng 3 gamit ang sumusunod na apat na linya ng code !!
Linya ng code 1:
byte byteBuffer = bagong byte [maxBytes + 1]; // kung saan maxBytes = 307200
Lumilikha ang kalakip na code sa pahayag na ito:
- isang 307201 byte array na tinatawag na "byteBuffer [307201]"
- Ang sobrang byte ay para sa isang character na pagwawakas (linefeed).
Linya ng code 2:
laki (640, 480);
Lumilikha ang kalakip na code sa pahayag na ito:
- isang variable na tinatawag na "lapad = 640;"
- isang variable na tinatawag na "taas = 480";
- isang 307200 pixel array na tinawag na "mga pixel [307200]"
- isang 640 * 480 pixel na "imahe" na window kung saan ipinakita ang mga nilalaman ng mga pixel na] array. Ang window na "imahe" na ito ay patuloy na nai-refresh sa isang frame rate na 60 fps.
Linya ng code 3:
byteCount = myPort.readBytesUntil (lf, byteBuffer);
Ang kalakip na code sa pahayag na ito:
- buffer ang papasok na data nang lokal hanggang sa makita ang isang character na "lf" (linefeed).
- pagkatapos nito ay itinatapon ang unang 307200 bytes ng lokal na data sa byteBuffer array.
- Nai-save din nito ang bilang ng mga byte na natanggap (307201) sa isang variable na tinatawag na "byteCount".
Linya ng code 4:
mga pixel = kulay (byteBuffer );
Kapag inilagay sa isang para sa susunod na loop, ang kalakip na code sa pahayag na ito:
- kinopya ang nilalaman ng "byteBuffer " na array sa "pixel " na array
- ang mga nilalaman nito ay lilitaw sa window ng imahe.
Mga Key Stroke:
Kinikilala ng frame-grabber ang mga sumusunod na keystroke:
- ‘C’ = makuha ang imahe
- ‘S’ = i-save ang imahe upang mag-file.
Hakbang 7: Software
Mag-download at mag-install ng bawat isa sa mga sumusunod na mga pakete ng software kung hindi pa nai-install:
- "Arduino" mula sa
- “Java 8” mula sa https://java.com/en/download/ [1]
- "Pagproseso ng 3" mula sa
Pag-install ng Arduino sketch:
- Alisin ang lahat ng mga OV7670 jumper wires [2]
- Ikonekta ang isang USB cable sa iyong Arduino
- Kopyahin ang mga nilalaman ng “OV7670_camera_mono_V2.ino“(nakakabit) sa isang “sketch” ng Arduino at i-save.
- I-upload ang sketch sa iyong Arduino.
- I-unplug ang Arduino
- Maaari mo na ngayong ligtas na ikonekta muli ang OV7670 jumper wires
- Ikonekta muli ang USB cable.
Pag-install at pagpapatakbo ng Pagproseso ng sketch
- Kopyahin ang mga nilalaman ng "OV7670_camera_mono_V2.pde" (naka-attach) sa isang "sketch" sa Pagproseso at i-save.
- I-click ang kaliwang tuktok na "patakbuhin" na pindutan … lilitaw ang isang itim na window ng imahe
- I-click ang "itim" na window ng imahe
- Pindutin ang "c" key upang makakuha ng isang imahe. (tinatayang 6.4 segundo).
- Pindutin ang "s" key upang mai-save ang imahe sa iyong folder ng pagproseso
- Ulitin ang mga hakbang 4 at 5
- I-click ang pindutan na "ihinto" upang lumabas sa programa.
Mga tala
[1]
Ang pagpoproseso ng 3 ay nangangailangan ng Java 8
[2]
Ito ay isang "minsan lamang" na hakbang sa kaligtasan upang maiwasan na mapinsala ang iyong OV7670 camera chip.
Hanggang sa ang sketch na "OV7670_camera_mono.ini" ay na-upload sa iyong Arduino ang panloob na mga pull-up resistor ay konektado sa 5 volts, kasama ang posibilidad na ang ilan sa mga linya ng data ng Arduino ay maaaring 5 volt na output … na lahat ay nakamamatay sa ang 3v3 volt OV7670 camera chip.
Kapag na-program ang Arduino hindi na kailangang ulitin ang hakbang na ito at ang mga halaga ng rehistro ay maaaring ligtas na mabago.
Hakbang 8: Pagkuha ng isang Kulay ng Imahe
Ang sumusunod na software ay purong pang-eksperimentong at nai-post sa pag-asa na ang ilan sa mga diskarte ay patunayan na kapaki-pakinabang. Ang mga kulay ay lilitaw na baligtad … Hindi ko pa makita ang tamang mga setting ng rehistro. Kung makakita ka ng solusyon mangyaring i-post ang iyong mga resulta
Kung kukuha kami ng isang imahe ng kulay, ang lahat ng mga byte ng data ay dapat makuha at ilapat ang mga sumusunod na formula.
Gumagamit ang OV7670 ng mga sumusunod na pormula upang mai-convert ang RGB (pula, berde, asul) na impormasyon sa kulay sa 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)
Ang mga sumusunod na formula ay maaaring magamit upang mai-convert ang YUV (4: 2: 2) pabalik sa kulay ng RGB: [2]
- R = Y + 1.402 * (Cr - 128)
- G = Y - 0.344136 * (Cb -128) - 0.714136 * (Cr -128)
- B = Y + 1.772 * (Cb -128)
Ang nakalakip na software ay isang extension lamang ng monochrome software:
- Isang kahilingan sa pagkuha ng "c" ay ipinadala sa Arduino
- Nagpapadala ang Arduino ng pantay na may bilang (monochrome) na byte sa PC
- Sine-save ng PC ang mga byte na ito sa isang array
- Susunod na ipinapadala ng Arduino ang kakaibang bilang (chroma) byte sa PC.
- Ang mga byte na ito ay nai-save sa isang pangalawang array … mayroon na kaming buong imahe.
- Ang mga formula sa itaas ay inilalapat na ngayon sa bawat pangkat ng apat na byte ng data ng UYVY.
- Ang mga nagresultang mga pixel ng kulay pagkatapos ay inilagay sa "pixel " na array
- Sinusuri ng PC ang array na "mga pixel " at lilitaw ang isang imahe sa window ng "imahe".
Maipapakita ng software ng Pagproseso 3 ang bawat pag-scan at ang pangwakas na mga resulta:
- Ipinapakita ng Larawan 1 ang data ng U & V chroma mula sa pag-scan 1
- Ipinapakita ng Larawan 2 ang data ng ilaw ng Y1 at Y2 mula sa pag-scan 2
- Ipinapakita ng Larawan 3 ang kulay ng imahe … isang bagay lamang ang mali … ang bag ay dapat na berde !!
Magpo-post ako ng bagong code sa sandaling nalutas ko ang program na ito …
Mga Sanggunian:
[1]
www.haoyuelectronics.com/Attachment/OV7670%… (pahina 33)
[2]
en.wikipedia.org/wiki/YCbCr (conversion ng JPEG)
Mag-click dito upang matingnan ang aking iba pang mga itinuturo.
Inirerekumendang:
Gumawa ng Iyong Sariling Nakakonektang Heating Therostat at Gumawa ng Pagtipid Sa Pag-init: 53 Hakbang (na may Mga Larawan)
Gumawa ng Iyong Sariling Nakakonektang Heating Therostat at Gumawa ng Pagtipid Sa Pag-init: Ano ang layunin? Palakihin ang ginhawa sa pamamagitan ng pag-init ng iyong bahay nang eksakto kung nais mo Gumawa ng pagtipid at bawasan ang mga emissions ng greenhouse gas sa pamamagitan lamang ng pag-init ng iyong bahay kung kailangan mo Panatilihin ang kontrol sa iyong pag-init saan ka man maging maipagmalaki ginawa mo ito
Paano Gumawa ng Iyong Sariling WIFI Gateway upang Ikonekta ang Iyong Arduino sa IP Network?: 11 Mga Hakbang (na may Mga Larawan)
Paano Gumawa ng Iyong Sariling WIFI Gateway upang Ikonekta ang Iyong Arduino sa IP Network?: Tulad ng maraming mga tao sa tingin mo Arduino ay isang napakahusay na solusyon upang gawin ang automation ng bahay at robotic! Ngunit sa term ng komunikasyon ang Arduinos ay may serial link lamang. Nagtatrabaho ako sa isang robot na kailangang permanenteng konektado sa isang server na nagpapatakbo ng ar
Gumawa ng Iyong Sariling Motor Camera Slider: 6 Hakbang (na may Mga Larawan)
Gumawa ng Iyong Sariling Motor Camera Slider: Sa proyektong ito ipapakita ko sa iyo kung paano ko muling nag-repurposed ang dalawang lumang tripod ng camera upang lumikha ng isang motorized camera slider. Ang mekanikal na sistema ay binubuo ng karamihan ng aluminyo at hindi kinakalawang na asero na gumagawa ng slider na matibay at medyo disente na pagtingin. Ang
Gumawa ng Iyong Sariling Overhead Camera Rig Na May LED Illumination !: 5 Hakbang (na may Mga Larawan)
Gumawa ng Iyong Sariling Overr Camera Rig Sa LED na Pag-iilaw !: Sa proyektong ito ipapakita ko sa iyo kung paano lumikha ng isang simpleng overr camera rig. Ang rig ay hindi lamang maaaring hawakan ang camera sa itaas mismo ng bagay na nais mong i-film, ngunit nagtatampok din ito ng isang monitor upang maobserbahan ang kuha at LED na pag-iilaw sa perpektong l
Gumawa ng Iyong Sariling Monopod ng Camera Sa Isang Boteng-tapunan: 3 Hakbang
Gumawa ng Iyong Sariling Monopod ng Camera Sa Isang Boteng-tapunan: Ang tutorial na ito ay napakadaling gawin at napakamura din. Ang kailangan mo lang sa tagumpay ay isang 6mm mahabang tripod screw (1/4 ") at isang bote-cork. MAHALAGA. Kailangan mong magkaroon ng exakt thread sa tornilyo para sa hangaring ito o masisira mo ang iyong camera thread.