Tartalomjegyzék:

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

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

Videó: Készítse el saját fényképezőgépét: 8 lépés
Videó: Hogyan készítsünk Wordpress weboldalt 2024 | 20 EGYSZERŰ lépésben | Wordpress Oktatóvideó Kezdőknek 2024, November
Anonim
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: