Turinys:

Sukurkite savo fotoaparatą: 8 žingsniai
Sukurkite savo fotoaparatą: 8 žingsniai

Video: Sukurkite savo fotoaparatą: 8 žingsniai

Video: Sukurkite savo fotoaparatą: 8 žingsniai
Video: Skyrybos? Kaip palengvinti išsiskyrimo skausmą ir paspartinti gijimo procesą? 8 žingsniai 2024, Liepa
Anonim
Image
Image
Sukurkite savo fotoaparatą
Sukurkite savo fotoaparatą

Šioje instrukcijoje paaiškinama, kaip padaryti vienspalvę kamerą naudojant „Omnivision OV7670“vaizdo jutiklį, „Arduino“mikrovaldiklį, kelis trumpiklius ir „Processing 3“programinę įrangą.

Taip pat pateikiama eksperimentinė spalvoto vaizdo gavimo programinė įranga.

Paspauskite „c“klavišą, kad nufotografuotumėte 640*480 pikselių vaizdą … paspauskite klavišą „s“, kad vaizdas būtų išsaugotas faile. Jei norite sukurti trumpą laiko intervalo filmą, nuoseklūs vaizdai numeruojami iš eilės.

Fotoaparatas nėra greitas (kiekvienas nuskaitymas trunka 6,4 sekundės) ir yra tinkamas naudoti tik esant pastoviam apšvietimui.

Kaina, neįskaitant „Arduino“ir kompiuterio, yra mažesnė nei puodelis kavos.

Vaizdai

Sudedamosios dalys be jungiamojo laido yra parodytos atidarymo nuotraukoje.

Antroji nuotrauka yra ekrano kopija, kurioje pavaizduota „Arduino“fotoaparato programinė įranga ir „Processing 3“kadrų griebtuvas. Įdėklas rodo, kaip prijungta kamera.

Vaizdo įrašas demonstruoja fotoaparato veikimą. Paspaudus „c“fiksavimo klavišą, nuskaitomas vaizdas trumpai mirksi, o po to - veiklos pliūpsnis. Kai nuskaitymas bus baigtas, vaizdas automatiškai pasirodys ekrano lange. Vaizdai bus rodomi aplanke Apdorojimas po kiekvieno „s“klavišo paspaudimo. Vaizdo įrašas baigiamas sparčiu važiavimu per kiekvieną iš trijų išsaugotų vaizdų.

1 žingsnis: grandinės schema

Grandinės schema
Grandinės schema
Grandinės schema
Grandinės schema
Grandinės schema
Grandinės schema

Visų šios kameros versijų schema parodyta 1 nuotraukoje.

2, 3 nuotraukose parodyta, kaip prijungti trumpikliai, laidai ir komponentai.

Be aliuminio laikiklio vaizdai guli ant šono.

Įspėjimas

Užprogramuokite „Arduino“PRIEŠ prijungdami trumpiklius prie OV7670 fotoaparato mikroschemos. Tai neleis ankstesnės programos 5 voltų išvesties kaiščiams sunaikinti 3v3 voltų OV7670 kameros mikroschemą.

2 žingsnis: dalių sąrašas

Dalių sąrašas
Dalių sąrašas

Šios dalys buvo gautos iš

  • 1 tik OV7670 300KP VGA kameros modulis, skirtas „arduino DIY KIT“
  • 1 tik fotoaparato laikiklis su veržlėmis ir varžtais
  • 1 tik UNO R3, skirtas arduino MEGA328P 100% originaliam ATMEGA16U2 su USB kabeliu

Šios dalys buvo gautos vietoje

  • 18 „Arduino“vyrų ir moterų trumpiklių kabelių
  • 3 tik „Arduinin“moteriški ir moteriški trumpikliai
  • 1 tik mini duonos lenta
  • 4 tik 4K7 omų 1/2 vatų rezistoriai
  • 1 aliuminio stovas.

Jums taip pat reikės šių duomenų lapų:

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

3 žingsnis: teorija

Teorija
Teorija

OV7670 fotoaparato mikroschema

Numatytoji OV7670 kameros mikroschemos išvestis apima YUV (4: 2: 2) vaizdo signalą ir 3 laiko bangų formas. Kiti išvesties formatai galimi programuojant vidinius registrus per I2C suderinamą magistralę.

YUV (4: 2: 2) vaizdo signalas (1 nuotrauka) yra nenutrūkstama vienspalvių (nespalvotų) pikselių seka, atskirta U (mėlynos spalvos skirtumas) ir V (raudonos spalvos skirtumas) spalvų informacija.

Šis išvesties formatas yra žinomas kaip YUV (4: 2: 2), nes kiekvienoje 4 baitų grupėje yra 2 vienspalviai ir 2 spalvų baitai.

Nespalvotas

Norėdami gauti nespalvotą vaizdą, turime imti kas antrą duomenų baitą.

„Arduino“turi tik 2K atsitiktinės prieigos atminties, tačiau kiekvieną kadrą sudaro 640*2*480 = 307, 200 duomenų baitų. Jei prie OV7670 nepridėsime kadrų griebtuvo, visi duomenys turi būti siunčiami į kompiuterį eilutei eilutei apdoroti.

Yra dvi galimybės:

Kiekvienam iš 480 kadrų iš eilės galime dideliu greičiu užfiksuoti vieną eilutę į „Arduino“, prieš siunčiant ją į kompiuterį 1Mbps sparta. Tokiu būdu OV7670 veiktų visu greičiu, tačiau užtruktų ilgai (gerokai ilgiau nei minutę).

Mano pasirinktas metodas yra sulėtinti PCLK iki 8uS ir siųsti kiekvieną mėginį, kai jis ateina. Šis metodas yra žymiai greitesnis (6,4 sekundės).

4 žingsnis: dizaino pastabos

Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos

Suderinamumas

OV7670 fotoaparato mikroschema yra 3v3 voltų įrenginys. Duomenų lape nurodyta, kad virš 3,5 volto įtampa sugadins lustą.

Kad jūsų 5 voltų „Arduino“nesunaikintų OV7670 kameros mikroschemos:

  • Išorinio laikrodžio (XCLK) signalas iš „Arduino“turi būti sumažintas iki saugaus lygio naudojant įtampos daliklį.
  • Vidiniai 5 voltų „Arduino I2C“traukimo rezistoriai turi būti išjungti ir pakeisti išoriniais ištraukiamaisiais rezistoriais prie 3 voltų maitinimo šaltinio.
  • Užprogramuokite „Arduino“PRIEŠ prijungdami jungiamuosius laidus, nes kai kurie kaiščiai vis tiek gali būti užprogramuoti kaip ankstesnio projekto išvestis !!! (Aš tai išmokau sunkiu būdu … laimei, aš nusipirkau du, nes jie buvo tokie pigūs).

Išorinis laikrodis

OV7670 fotoaparato mikroschemai reikalingas išorinis laikrodis, kurio dažnių diapazonas yra nuo 10 MHz iki 24 MHz.

Aukščiausias dažnis, kurį galime sukurti iš 16 MHz „Arduino“, yra 8 MHz, tačiau atrodo, kad tai veikia.

Serijos nuoroda

Norint išsiųsti 1 duomenų baitą per 1 Mb / s (milijoną bitų per sekundę) nuosekliąją nuorodą, reikia mažiausiai 10 uS (mikrosekundžių). Šis laikas sudaromas taip:

  • 8 duomenų bitai (8us)
  • 1 pradžios bitas (1uS)
  • 1 sustojimo bitas (1uS)

Vidinis laikrodis

OV7670 vidinis pikselių laikrodžio (PCLK) dažnis nustatomas bitais [5: 0] CLKRC registre (žr. 1 nuotrauką). [1]

Jei nustatysime bitus [5: 0] = B111111 = 63 ir pritaikysime juos aukščiau pateikta formule, tada:

  • F (vidinis laikrodis) = F (įvesties laikrodis)/(bitas [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz arba
  • = 8uS

Kadangi imame tik kas antrą duomenų baitą, 8uS PCLK intervalas sukuria 16uS mėginį, kuris yra pakankamas laikas 1 duomenų baitui (10uS) perduoti, paliekant 6uS apdorojimui.

Kadrų dažnis

Kiekvieną VGA vaizdo rėmelį sudaro 784*510 pikselių (vaizdo elementai), iš kurių 640*480 pikselių. Kadangi YUV (4: 2: 2) išvesties formatas turi vidutiniškai 2 duomenų baitus pikseliui, kiekvienas kadras užtruks 784*2*510*8 uS = 6,4 sekundės.

Ši kamera nėra greita !!!

Horizontali padėtis

Vaizdas gali būti perkeltas horizontaliai, jei pakeisime HSTART ir HSTOP reikšmes, išlaikydami 640 pikselių skirtumą.

Perkeliant vaizdą į kairę, jūsų HSTOP reikšmė gali būti mažesnė už HSTART vertę!

Nesijaudinkite … visa tai susiję su skaitiklių perpildymu, kaip paaiškinta 2 nuotraukoje.

Registrai

„OV7670“turi 201 aštuonių bitų registrus, skirtus valdyti tokius dalykus kaip padidėjimas, baltos spalvos balansas ir ekspozicija.

Vienas duomenų baitas leidžia tik 256 reikšmes diapazone nuo [0] iki [255]. Jei mums reikia daugiau kontrolės, turime pakopuoti kelis registrus. Du baitai suteikia mums 65536 galimybes … trys baitai suteikia mums 16, 777, 216.

16 pavyzdžių AEC (automatinio ekspozicijos valdymo) registras, parodytas 3 nuotraukoje, yra toks pavyzdys ir yra sukurtas derinant šių trijų registrų dalis.

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

Būkite įspėti … registro adresai nėra sugrupuoti!

Šalutiniai poveikiai

Lėtas kadrų dažnis sukelia daugybę nepageidaujamų šalutinių poveikių:

Kad ekspozicija būtų teisinga, „OV7670“tikisi dirbti 30 kadrų per sekundę (kadrų per sekundę) kadrų dažniu. Kadangi kiekvienas kadras trunka 6,4 sekundės, elektroninis užraktas yra atidarytas 180 kartų ilgiau nei įprastai, o tai reiškia, kad visi vaizdai bus per daug eksponuojami, nebent pakeisime kai kurias registro reikšmes.

Kad išvengčiau per didelės ekspozicijos, visus AEC (automatinio ekspozicijos valdymo) registro bitus nustatiau į nulį. Nepaisant to, esant šviesiam apšvietimui, prieš objektyvą reikia neutralaus tankio filtro.

Ilgas poveikis taip pat turi įtakos UV duomenims. Kadangi aš dar nerandu teisingų spalvų registrų derinių … mano, kad tai nebaigtas darbas.

Pastaba

[1]

Duomenų lape (1 nuotraukoje) pateikta formulė yra teisinga, tačiau diapazonas rodo tik bitus [4: 0]?

5 žingsnis: laiko bangos formos

Laiko bangos formos
Laiko bangos formos
Laiko bangos formos
Laiko bangos formos
Laiko bangos formos
Laiko bangos formos

Pastaba apatiniame kairiajame diagramos „VGA kadrų laikas“kampe (1 nuotrauka) yra tokia:

YUV/RGB atveju tp = 2 x TPCLK

1, 2 ir 3 paveikslai patikrina duomenų lapą (-us) ir patvirtina, kad „Omnivision“kiekvieną 2 duomenų baitą laiko 1 pikselio ekvivalentu.

Osciloskopo bangos formos taip pat patikrina, ar HREF išlieka ŽEMAS per ištuštinimo intervalus.

4 pav. Patvirtina, kad XCLK išėjimas iš „Arduino“yra 8 MHz. Priežastis, kodėl mes matome sinusines, o ne kvadratines bangas, yra ta, kad visos nelyginės harmonikos yra nematomos mano 20MHz mėginių ėmimo osciloskopui.

6 žingsnis: rėmo griebtuvas

Rėmelių griebtuvas
Rėmelių griebtuvas

Vaizdo jutiklį OV7670 kameros mikroschemoje sudaro 656*486 pikselių masyvas, iš kurių 640*480 pikselių tinklelis naudojamas nuotraukai.

Norėdami nustatyti vaizdą virš jutiklio, naudojamos registro HSTART, HSTOP, HREF ir VSTRT, VSTOP, VREF registro vertės. Jei vaizdas nėra tinkamai išdėstytas virš jutiklio, matysite juodą juostą virš vieno ar kelių kraštų, kaip paaiškinta skyriuje „Dizaino pastabos“.

OV7670 nuskaito kiekvieną vaizdo eilutę po vieną pikselį, pradedant nuo viršutinio kairiojo kampo, kol pasiekia apatinį dešinįjį pikselį. „Arduino“tiesiog perduoda šiuos pikselius į kompiuterį per serijinę nuorodą, kaip parodyta 1 nuotraukoje.

Kadrų griebėjų užduotis yra užfiksuoti kiekvieną iš šių 640*480 = 307200 pikselių ir parodyti turinį „vaizdo“lange

Apdorojant 3, tai pasiekiama naudojant šias keturias kodo eilutes !!

1 kodo eilutė:

baitas baitasBufferis = naujas baitas [maxBytes+1]; // kur maxBytes = 307200

Pagrindinis šio pareiškimo kodas sukuria:

  • 307201 baitų masyvas, vadinamas „byteBuffer [307201]“
  • Papildomas baitas skirtas nutraukimo (eilutės tiekimo) simboliui.

2 kodo eilutė:

dydis (640, 480);

Pagrindinis šio teiginio kodas sukuria:

  • kintamasis, vadinamas „plotis = 640“;
  • kintamasis, vadinamas „aukštis = 480“;
  • 307200 pikselių masyvas, vadinamas „pikseliais [307200]“
  • 640*480 pikselių „vaizdo“langas, kuriame rodomas pikselių masyvo turinys. Šis „vaizdo“langas nuolat atnaujinamas 60 kadrų per sekundę kadrų dažniu.

3 kodo eilutė:

baitų skaičius = myPort.readBytesUntil (lf, byteBuffer);

Pagrindinis šio pareiškimo kodas:

  • saugo gaunamus duomenis lokaliai, kol pamatys „lf“(eilutės tiekimo) simbolį.
  • po to jis išmeta pirmuosius 307200 baitų vietinių duomenų į baitųBuffer masyvą.
  • Taip pat išsaugomas gautų baitų skaičius (307201) į kintamąjį, pavadintą „baitų skaičius“.

4 kodo eilutė:

pikseliai = spalva (baitasBuffer );

Įdėjus į kitą ciklą, pagrindinis šio pareiškimo kodas:

  • nukopijuoja masyvo „byteBuffer “turinį į „pixels “masyvą
  • kurių turinys rodomas vaizdo lange.

Pagrindiniai smūgiai:

Kadrų griebtuvas atpažįsta šiuos klavišų paspaudimus:

  • „C“= užfiksuoti vaizdą
  • „S“= išsaugokite vaizdą faile.

7 žingsnis: programinė įranga

Atsisiųskite ir įdiekite kiekvieną iš šių programinės įrangos paketų, jei dar neįdiegėte:

  • „Arduino“iš
  • „Java 8“iš https://java.com/en/download/ [1]
  • „Apdorojama 3“iš

„Arduino“eskizo diegimas:

  • Nuimkite visus OV7670 trumpiklius [2]
  • Prijunkite USB kabelį prie „Arduino“
  • Nukopijuokite „OV7670_camera_mono_V2.ino“(pridedamą) turinį į „Arduino“eskizą ir išsaugokite.
  • Įkelkite eskizą į „Arduino“.
  • Atjunkite „Arduino“
  • Dabar galite saugiai vėl prijungti OV7670 trumpiklius
  • Vėl prijunkite USB kabelį.

Įdiekite ir paleiskite apdorojimo eskizą

  • Nukopijuokite „OV7670_camera_mono_V2.pde“(pridedamas) turinį į apdorojimo „eskizą“ir išsaugokite.
  • Spustelėkite viršutinį kairįjį mygtuką „Vykdyti“… pasirodys juodas vaizdo langas
  • Spustelėkite „juodą“vaizdo langą
  • Norėdami užfiksuoti vaizdą, paspauskite „c“klavišą. (maždaug 6,4 sekundės).
  • Norėdami išsaugoti vaizdą apdorojimo aplanke, paspauskite klavišą „s“
  • Pakartokite 4 ir 5 veiksmus
  • Norėdami išeiti iš programos, spustelėkite mygtuką „sustabdyti“.

Pastabos

[1]

Norint apdoroti 3, reikia „Java 8“

[2]

Tai yra „vienintelis“saugos žingsnis, kad nesugadintumėte „OV7670“fotoaparato lusto.

Kol eskizas „OV7670_camera_mono.ini“nebus įkeltas į jūsų „Arduino“, vidiniai traukimo rezistoriai yra prijungti prie 5 voltų, be to, yra tikimybė, kad kai kurios „Arduino“duomenų linijos gali būti 5 voltų išėjimai … visa tai yra mirtina 3v3 voltų OV7670 fotoaparato mikroschema.

Užprogramavus „Arduino“, šio veiksmo kartoti nereikia ir registro reikšmės gali būti saugiai pakeistos.

8 žingsnis: Spalvoto vaizdo gavimas

Spalvoto vaizdo gavimas
Spalvoto vaizdo gavimas
Spalvoto vaizdo gavimas
Spalvoto vaizdo gavimas
Spalvoto vaizdo gavimas
Spalvoto vaizdo gavimas

Ši programinė įranga yra tik eksperimentinė ir skelbiama tikintis, kad kai kurie metodai bus naudingi. Spalvos atrodo apverstos … Aš dar neradau teisingų registro nustatymų. Jei radote sprendimą, paskelbkite savo rezultatus

Jei norime gauti spalvotą vaizdą, turi būti užfiksuoti visi duomenų baitai ir taikomos šios formulės.

OV7670 naudoja šias formules, kad RGB (raudona, žalia, mėlyna) spalvų informaciją paverstų 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)

Norint konvertuoti YUV (4: 2: 2) į RGB spalvą, gali būti naudojamos šios formulės: [2]

  • R = Y + 1,402* (Cr - 128)
  • G = Y -0,344136*(Cb -128) -0,714136*(Cr -128)
  • B = Y + 1,772*(Cb -128)

Pridedama programinė įranga yra tik vienspalvės programinės įrangos plėtinys:

  • „A“užfiksavimo užklausa siunčiama „Arduino“
  • „Arduino“siunčia į kompiuterį lyginius numerius (vienspalvius)
  • Kompiuteris išsaugo šiuos baitus į masyvą
  • Toliau „Arduino“siunčia nelyginius (chroma) baitus į kompiuterį.
  • Šie baitai išsaugomi antrame masyve … dabar turime visą vaizdą.
  • Aukščiau pateiktos formulės dabar taikomos kiekvienai keturių UYVY duomenų baitų grupei.
  • Tada gauti spalvų pikseliai dedami į „pixels “masyvą
  • Kompiuteris nuskaito „pixels “masyvą ir „image“lange pasirodo vaizdas.

„Processing 3“programinė įranga trumpai parodo kiekvieną nuskaitymą ir galutinius rezultatus:

  • 1 nuotraukoje rodomi 1 nuskaitymo U ir V spalvos duomenys
  • 2 nuotraukoje rodomi Y1 ir Y2 ryškumo duomenys iš 2 nuskaitymo
  • 3 nuotraukoje rodomas spalvotas vaizdas … tik vienas dalykas negerai … maišelis turi būti žalias !!

Kai išspręsiu šią programą, paskelbsiu naują kodą …

Nuorodos:

[1]

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

[2]

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

Spustelėkite čia, jei norite peržiūrėti kitus mano nurodymus.

Rekomenduojamas: