Talaan ng mga Nilalaman:

Gumawa ng Iyong Sariling Camera: 8 Hakbang
Gumawa ng Iyong Sariling Camera: 8 Hakbang

Video: Gumawa ng Iyong Sariling Camera: 8 Hakbang

Video: Gumawa ng Iyong Sariling Camera: 8 Hakbang
Video: ТЕПЕРЬ НЕ ПРОПАДУ 10-ть самоделок ВЫРУЧАТ ГДЕ УГОДНО! 2024, Hulyo
Anonim
Image
Image
Gumawa ng Iyong Sariling Camera
Gumawa ng Iyong Sariling Camera

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

Diagram ng Circuit
Diagram ng Circuit
Diagram ng Circuit
Diagram ng Circuit
Diagram ng Circuit
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

Listahan ng Mga Bahagi
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

Teorya
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

Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
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

Mga Waveform na Timing
Mga Waveform na Timing
Mga Waveform na Timing
Mga Waveform na Timing
Mga Waveform na Timing
Mga Waveform na Timing

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

Frame Grabber
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

Pagkuha ng Kulay ng Imahe
Pagkuha ng Kulay ng Imahe
Pagkuha ng Kulay ng Imahe
Pagkuha ng Kulay ng Imahe
Pagkuha ng Kulay ng Imahe
Pagkuha ng 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: