Készítse el saját fényképezőgépét: 8 lépés
Készítse el saját fényképezőgépét: 8 lépés
Image
Image
Készítse el saját fényképezőgépét
Készítse el saját fényképezőgépét

Ez az oktatható utasítás elmagyarázza, hogyan lehet monokróm kamerát készíteni Omnivision OV7670 képérzékelővel, Arduino mikrokontrollerrel, néhány áthidaló vezetékkel és a Processing 3 szoftverrel.

Kísérleti szoftvert mutatnak be színes kép előállítására is.

Nyomja meg a „c” gombot 640*480 képpontos kép rögzítéséhez… nyomja meg az „s” gombot a kép fájlba mentéséhez. Ha rövid időzített filmet szeretne létrehozni, az egymást követő képek sorszámozva vannak.

A kamera nem gyors (minden szkennelés 6,4 másodpercig tart), és csak rögzített megvilágításban használható.

A költség, az Arduino és a PC nélkül, kevesebb, mint egy csésze kávé.

Képek

Az alkatrészek jumper huzalozás nélkül a nyitóképen láthatók.

A második fotó egy képernyőkép, amely az Arduino kameraszoftvert és a Processing 3 képkockázót mutatja. A betét mutatja a kamera csatlakoztatását.

A videó bemutatja a kamera működését. Amikor megnyomja a „c” rögzítés gombot, a kép beolvasása közben egy rövid villanás, majd egy sorozatnyi tevékenység következik. A kép automatikusan megjelenik a kijelzőablakban, miután a szkennelés befejeződött. A képek az „s” gomb minden egyes megnyomását követően megjelennek a Processing mappában. A videó befejezéseként gyorsan végigmászik a három mentett kép mindegyikén.

1. lépés: Áramköri diagram

Kördiagramm
Kördiagramm
Kördiagramm
Kördiagramm
Kördiagramm
Kördiagramm

A fényképezőgép összes verziójának kapcsolási rajza az 1. képen látható.

A 2., 3. fénykép bemutatja a jumper-vezetékek és az alkatrészek csatlakoztatását.

Az alumínium tartó nélkül a képek az oldalukon fekszenek.

Figyelem

Programozza Arduino -ját Mielőtt bármilyen jumper vezetéket csatlakoztatna az OV7670 kamerachiphez. Ez megakadályozza, hogy egy korábbi program 5 voltos kimeneti csapjai megsemmisítsék a 3v3 voltos OV7670 kameralapkát.

2. lépés: Alkatrészlista

Alkatrész lista
Alkatrész lista

A következő részeket a https://www.aliexpress.com/ webhelyről szerezték be

  • 1 csak OV7670 300KP VGA kamera modul arduino DIY KIT -hez
  • 1 csak a kamera tartója anyákkal és csavarokkal
  • 1 csak UNO R3 arduino MEGA328P esetén 100% -ban eredeti ATMEGA16U2 USB kábellel

A következő részeket helyben szerezték be

  • 18 anly Arduino férfi-női jumper kábel
  • 3 csak Arduinin női-női áthidaló kábel
  • 1 csak mini kenyérlap
  • 4 csak 4K7 ohmos 1/2 wattos ellenállás
  • 1 csak törmelékes alumínium állvány.

A következő adatlapokra is szüksége lesz:

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

3. lépés: Elmélet

Elmélet
Elmélet

OV7670 kamera chip

Az OV7670 kamerachip alapértelmezett kimenete YUV (4: 2: 2) videó jelet és 3 időzítési hullámformát tartalmaz. Más kimeneti formátumok is lehetségesek, ha a belső regisztereket I2C kompatibilis buszon keresztül programozzuk.

A YUV (4: 2: 2) videojel (1. fotó) monokróm (fekete -fehér) képpontok folyamatos sorozata, amelyet U (kék színkülönbség) és V (piros színkülönbség) színinformáció választ el.

Ez a kimeneti formátum YUV (4: 2: 2) néven ismert, mivel minden 4 bájtos csoport 2 monokróm és 2 színes bájtot tartalmaz.

Monokróm

A monokróm kép megszerzéséhez minden második adatbájtból kell mintát vennünk.

Egy Arduino csak 2K véletlen hozzáférésű memóriával rendelkezik, de minden keret 640*2*480 = 307, 200 adatbájtot tartalmaz. Hacsak nem adunk hozzá keretfogót az OV7670-hez, minden adatot soronként kell elküldeni a számítógépre feldolgozás céljából.

Két lehetőség van:

A 480 egymást követő képkocka mindegyikénél nagy sebességgel rögzíthetünk egy sort az Arduino -hoz, mielőtt 1Mbps sebességgel elküldenénk a számítógépre. Ilyen megközelítés esetén az OV7670 teljes sebességgel működne, de sokáig (jóval több mint egy percig) tartana.

Az általam alkalmazott megközelítés az, hogy lelassítom a PCLK -t 8uS -ra, és minden mintát elküldök, ahogy jön. Ez a megközelítés lényegesen gyorsabb (6,4 másodperc).

4. lépés: Tervezési megjegyzések

Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések

Kompatibilitás

Az OV7670 kamerachip egy 3v3 voltos eszköz. Az adatlap azt jelzi, hogy a 3,5 volt feletti feszültség károsítja a chipet.

Annak megakadályozása érdekében, hogy az 5 voltos Arduino megsemmisítse az OV7670 kamerachipet:

  • Az Arduino külső órajelét (XCLK) biztonságos szintre kell csökkenteni egy feszültségosztóval.
  • A belső Arduino I2C felhúzó ellenállásokat 5 voltra le kell tiltani, és külső felhúzó ellenállásokra kell cserélni a 3v3 voltos tápellátásra.
  • Programozza be Arduino-ját Mielőtt bármilyen áthidaló vezetéket csatlakoztatna, mivel néhány tű még mindig programozható egy korábbi projekt kimeneteként !!! (Ezt nehezen tanultam meg … szerencsére vettem kettőt, mert olyan olcsók voltak).

Külső óra

Az OV7670 kamerachiphez 10Mhz és 24MHz frekvenciatartományban külső óra szükséges.

A 16 MHz -es Arduino -ból előállítható legmagasabb frekvencia 8 MHz, de úgy tűnik, ez működik.

Soros link

Legalább 10 uS (mikroszekundum) szükséges 1 adatbájt elküldéséhez 1Mbps (millió bit másodpercenként) soros kapcsolaton keresztül. Ez az idő a következőképpen épül fel:

  • 8 adatbit (8us)
  • 1 kezdő bit (1uS)
  • 1 stop-bit (1uS)

Belső óra

Az OV7670 belső pixelóra (PCLK) frekvenciáját bitek [5: 0] határozzák meg a CLKRC regiszterben (lásd az 1. fényképet). [1]

Ha biteket állítunk be [5: 0] = B111111 = 63, és alkalmazzuk a fenti képletre, akkor:

  • F (belső óra) = F (bemeneti óra)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz vagy
  • = 8uS

Mivel csak minden második adatbájtból veszünk mintát, a 8uS PCLK intervallum egy 16uS mintát eredményez, ami elegendő idő egy 1 bájt (10uS) továbbításához, így 6uS marad feldolgozásra.

Filmkocka szám

Minden VGA videókeret 784*510 képpontot (képelemeket) tartalmaz, amelyből 640*480 képpont látható. Mivel a YUV (4: 2: 2) kimeneti formátum képpontonként átlagosan 2 adatbájtot tartalmaz, minden képkocka 784*2*510*8 uS = 6,4 másodpercet vesz igénybe.

Ez a kamera NEM gyors !!!

Vízszintes pozicionálás

A kép vízszintesen mozoghat, ha megváltoztatjuk a HSTART és a HSTOP értékeket, miközben megtartjuk a 640 pixel különbséget.

Ha a képet balra mozgatja, lehetséges, hogy a HSTOP értéke kisebb lesz, mint a HSTART érték!

Ne ijedjen meg… minden a számláló túlcsordulásaihoz kapcsolódik, amint azt a 2. fotó is elmagyarázza.

Regiszterek

Az OV7670 201 nyolcbites regiszterrel rendelkezik, például az erősítés, a fehéregyensúly és az expozíció szabályozására.

Egy adatbájt csak 256 értéket engedélyez a [0] - [255] tartományban. Ha nagyobb ellenőrzésre van szükségünk, akkor több nyilvántartást kell lépcsőzetesen végrehajtanunk. Két bájt 65536 lehetőséget ad nekünk … három bájt 16, 777, 216 -ot.

Ilyen például a 3. képen látható 16 bites AEC (Automatic Exposure Control) regiszter, amely a következő három regiszter egyes részeinek kombinálásával jön létre.

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

Figyelmeztetés … a nyilvántartási címek nincsenek csoportosítva!

Mellékhatások

A lassú képsebesség számos nem kívánt mellékhatást okoz:

A megfelelő expozíció érdekében az OV7670 30 képkocka / másodperc (képkocka / másodperc) képkocka sebességgel dolgozik. Mivel minden képkocka 6,4 másodpercet vesz igénybe, az elektronikus redőny a szokásosnál 180-szor hosszabb ideig van nyitva, ami azt jelenti, hogy minden kép túlexponált lesz, hacsak nem módosítunk néhány regiszterértéket.

A túlzott expozíció megelőzése érdekében az összes AEC (automatikus expozíciószabályozás) regiszterbitet nullára állítottam. Ennek ellenére semleges sűrűségű szűrőre van szükség az objektív előtt, ha erős a megvilágítás.

Úgy tűnik, hogy a hosszú expozíció befolyásolja az UV -adatokat is. Mivel még nem találtam megfelelő színeket kibocsátó regiszter -kombinációkat… ezt tartsa folyamatban lévő munkának.

jegyzet

[1]

Az adatlapon (1. kép) látható képlet helyes, de a tartomány csak biteket mutat [4: 0]?

5. lépés: Időzítési hullámformák

Időzítési hullámformák
Időzítési hullámformák
Időzítési hullámformák
Időzítési hullámformák
Időzítési hullámformák
Időzítési hullámformák

A „VGA Frame Timing” diagram bal alsó sarkában található megjegyzés (1. fotó) a következő:

YUV/RGB esetén tp = 2 x TPCLK

Az 1., 2. és 3. ábra ellenőrzi az adatlapot és megerősíti, hogy az Omnivision minden 2 adatbájtot 1 képpontnak megfelelőként kezel.

Az oszcilloszkóp hullámformái azt is igazolják, hogy a HREF alacsony marad a leállítási időközönként.

A 4. ábra megerősíti, hogy az Arduino XCLK kimenete 8 MHz. Azért látunk szinuszhullámot, nem pedig négyzethullámot, mert az összes páratlan felharmonikus láthatatlan a 20 MHz -es mintavételi oszcilloszkópom számára.

6. lépés: Frame Grabber

Frame Grabber
Frame Grabber

Az OV7670 kamerachipen található képérzékelő 656*486 pixeles tömböt tartalmaz, amelyből 640*480 pixeles rácsot használnak a fényképhez.

A HSTART, HSTOP, HREF és VSTRT, VSTOP, VREF regiszter értékek a kép pozícionálására szolgálnak az érzékelő felett. Ha a kép nincs megfelelően elhelyezve az érzékelő felett, fekete sáv jelenik meg egy vagy több szélén, a „Tervezési megjegyzések” részben leírtak szerint.

Az OV7670 a kép minden egyes sorát egy -egy képponton keresztül szkenneli a bal felső saroktól kezdve, amíg el nem éri a jobb alsó képpontot. Az Arduino egyszerűen továbbítja ezeket a képpontokat a számítógéphez a soros kapcsolaton keresztül, amint az az 1. képen látható.

A képkockázók feladata, hogy rögzítsék mind a 640*480 = 307200 képpontot, és megjelenítsék a tartalmat egy „kép” ablakban

A 3. feldolgozás ezt a következő négy kódsor segítségével éri el !!

1. kódsor:

bájt bájtBuffer = új bájt [maxBájt+1]; // ahol maxBytes = 307200

A kijelentés mögöttes kódja a következőket hozza létre:

  • egy 307201 bájtos tömb „byteBuffer [307201]”
  • A plusz bájt egy befejező (sorbeviteli) karakterhez tartozik.

2. kódsor:

méret (640, 480);

A kijelentés mögöttes kódja a következőket hozza létre:

  • „szélesség = 640;” nevű változó
  • a „magasság = 480” nevű változó;
  • egy 307200 képpontos tömb, amelyet „pixeleknek [307200]” neveznek
  • egy 640*480 pixeles „kép” ablak, amelyben a pixels tömb tartalma látható. Ez a „kép” ablak folyamatosan frissül 60 képkocka / s képkockasebességgel.

3. kódsor:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Az állítás mögöttes kódja:

  • helyben puffereli a bejövő adatokat, amíg meg nem látja az „lf” (linefeed) karaktert.
  • ezt követően a bájtBuffer tömbbe dobja az első 307200 bájt helyi adatot.
  • Emellett a fogadott bájtok számát (307201) menti a „byteCount” nevű változóba.

4. kódsor:

képpontok = szín (byteBuffer );

Ha a következő ciklusba helyezzük, az utasítás mögöttes kódja:

  • másolja a „byteBuffer ” tömb tartalmát a „pixels ” tömbbe
  • amelynek tartalma megjelenik a képablakban.

Kulcsvonások:

A keretfogó a következő billentyűleütéseket ismeri fel:

  • „C” = rögzítse a képet
  • ’S’ = a kép mentése fájlba.

7. lépés: Szoftver

Töltse le és telepítse az alábbi szoftvercsomagokat, ha még nincs telepítve:

  • „Arduino” a https://www.arduino.cc/en/main/software webhelyen
  • „Java 8” innen: https://java.com/en/download/ [1]
  • "Processing 3" a https://processing.org/download/ címen

Az Arduino vázlat telepítése:

  • Távolítsa el az összes OV7670 áthidaló vezetéket [2]
  • Csatlakoztasson egy USB -kábelt az Arduino -hoz
  • Másolja az „OV7670_camera_mono_V2.ino” (mellékelve) tartalmát egy Arduino „vázlatba”, és mentse.
  • Töltse fel a vázlatot az Arduino készülékére.
  • Húzza ki az Arduino csatlakozót
  • Most már biztonságosan csatlakoztathatja újra az OV7670 áthidaló vezetékeket
  • Csatlakoztassa újra az USB -kábelt.

A Processing vázlat telepítése és futtatása

  • Másolja az „OV7670_camera_mono_V2.pde” (mellékelt) tartalmát egy feldolgozó „vázlatba”, és mentse.
  • Kattintson a bal felső „futtatás” gombra… egy fekete képablak jelenik meg
  • Kattintson a „fekete” képablakra
  • Nyomja meg a „c” gombot a kép rögzítéséhez. (kb. 6,4 másodperc).
  • Nyomja meg az „s” gombot a kép mentéséhez a feldolgozó mappába
  • Ismételje meg a 4. és 5. lépést
  • Kattintson a „stop” gombra a programból való kilépéshez.

Megjegyzések

[1]

A 3. feldolgozáshoz Java 8 szükséges

[2]

Ez az „egyszeri” biztonsági lépés, hogy elkerülje az OV7670 kamerachip károsodását.

Amíg az „OV7670_camera_mono.ini” vázlatot fel nem töltötte az Arduino készülékére, a belső felhúzó ellenállások 5 voltra vannak csatlakoztatva, ráadásul fennáll annak a lehetősége, hogy az Arduino adatvonalainak egy része 5 voltos kimenet lehet… mindezek végzetesek a 3v3 voltos OV7670 kamerachip.

Az Arduino programozása után nem szükséges megismételni ezt a lépést, és a nyilvántartási értékek biztonságosan megváltoztathatók.

8. lépés: Színes kép készítése

Színes kép megszerzése
Színes kép megszerzése
Színes kép megszerzése
Színes kép megszerzése
Színes kép megszerzése
Színes kép megszerzése

Az alábbi szoftver pusztán kísérleti jellegű, és abban a reményben jelenik meg, hogy néhány technika hasznosnak bizonyul. A színek megfordulnak … Még nem találtam meg a megfelelő regiszterbeállításokat. Ha talál megoldást, kérjük, tegye közzé eredményeit

Ha színes képet szeretnénk kapni, akkor minden adatbájtot rögzíteni kell, és a következő képleteket kell alkalmazni.

Az OV7670 a következő képleteket használja az RGB (piros, zöld, kék) színinformációk YUV formátumú (4: 2: 2) alakítására: [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)

A YUV (4: 2: 2) RGB színre való visszaállításához a következő képletek használhatók: [2]

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

A mellékelt szoftver egyszerűen a monokróm szoftver kiterjesztése:

  • A „c” rögzítési kérelmet elküldi az Arduino -nak
  • Az Arduino elküldi a páros számú (monokróm) bájtokat a számítógépre
  • A PC ezeket a bájtokat tömbbe menti
  • Az Arduino ezután elküldi a páratlan számú (chroma) bájtokat a számítógépre.
  • Ezeket a bájtokat egy második tömb tárolja … most már a teljes kép megvan.
  • A fenti képleteket most minden négy UYVY adatbájtos csoportra alkalmazzuk.
  • A kapott színes képpontokat ezután a „pixels ” tömbbe helyezzük
  • A számítógép beolvassa a „pixels ” tömböt, és megjelenik egy kép a „image” ablakban.

A Processing 3 szoftver röviden megjeleníti az egyes szkenneléseket és a végeredményt:

  • Az 1. fénykép az 1. szkennelésből származó U & V színezési adatokat mutatja
  • A 2. fotó az Y1 és Y2 fényerősség adatait mutatja a 2. szkennelésből
  • A 3. fotó a színes képet mutatja … csak egy dolog nincs rendben … a táska zöld legyen !!

Új kódot teszek közzé, amint megoldottam ezt a programot …

Hivatkozások:

[1]

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

[2]

en.wikipedia.org/wiki/YCbCr (JPEG -konvertálás)

Kattintson ide a többi utasításom megtekintéséhez.

Ajánlott: