Obsah:

Vytvořte si vlastní fotoaparát: 8 kroků
Vytvořte si vlastní fotoaparát: 8 kroků

Video: Vytvořte si vlastní fotoaparát: 8 kroků

Video: Vytvořte si vlastní fotoaparát: 8 kroků
Video: ANDROID MÁ JEDNO SKRYTÉ NASTAVENÍ 🤖 2024, Červenec
Anonim
Image
Image
Vytvořte si vlastní fotoaparát
Vytvořte si vlastní fotoaparát

Tento návod vysvětluje, jak vytvořit jednobarevnou kameru pomocí obrazového snímače Omnivision OV7670, mikrokontroléru Arduino, několika propojovacích vodičů a softwaru Processing 3.

Je také představen experimentální software pro získání barevného obrázku.

Stisknutím tlačítka „c“pořídíte obrázek 640*480 pixelů… stisknutím tlačítka „s“obrázek uložíte do souboru. Pokud chcete vytvořit krátký časosběrný film, jsou postupně po sobě číslovány obrázky.

Fotoaparát není rychlý (každé skenování trvá 6,4 sekundy) a je vhodný pouze pro použití za stálého osvětlení.

Náklady, kromě Arduina a PC, jsou nižší než šálek kávy.

snímky

Součásti bez propojky jsou uvedeny na úvodní fotografii.

Druhá fotografie je snímek obrazovky zobrazující software fotoaparátu Arduino a zachycovač snímků Processing 3. Vložka ukazuje, jak je kamera připojena.

Video ukazuje kameru v akci. Když je stisknuto tlačítko snímání „c“, při skenování obrázku krátce zablikne a následuje výbuch aktivity. Po dokončení skenování se obrázek automaticky zobrazí v zobrazovacím okně. Obrázky se poté zobrazí ve složce Zpracování po každém stisknutí klávesy „s“. Video je zakončeno rychlým cyklováním po každém ze tří uložených obrázků.

Krok 1: Schéma zapojení

Kruhový diagram
Kruhový diagram
Kruhový diagram
Kruhový diagram
Kruhový diagram
Kruhový diagram

Schéma zapojení pro všechny verze tohoto fotoaparátu je zobrazeno na fotografii 1.

Fotografie 2, 3 ukazují, jak jsou propojeny vodiče a komponenty.

Bez hliníkové konzoly leží obrázky na boku.

Varování

Naprogramujte si Arduino PŘED připojením propojovacích kabelů k čipu kamery OV7670. To zabrání 5voltovým výstupním pinům z předchozího programu ve zničení čipu kamery OV7670 3v3 voltů.

Krok 2: Seznam dílů

Seznam dílů
Seznam dílů

Následující části byly získány z

  • 1 pouze OV7670 300KP kamerový modul VGA pro arduino DIY KIT
  • 1 pouze držák kamery s maticemi a šrouby
  • 1 pouze UNO R3 pro arduino MEGA328P 100% originál ATMEGA16U2 s USB kabelem

Následující části byly získány lokálně

  • 18 propojovacích kabelů Arduino pro muže a ženy
  • 3 pouze propojovací kabely Arduinin žena-žena
  • 1 pouze mini chleba
  • 4 pouze 4K7 ohm 1/2 wattové odpory
  • 1 pouze hliníkový stojan na šrot.

Budete také potřebovat následující datové listy:

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

Krok 3: Teorie

Teorie
Teorie

Čip kamery OV7670

Výchozí výstup z kamerového čipu OV7670 obsahuje video signál YUV (4: 2: 2) a 3 časové průběhy. Jiné výstupní formáty jsou možné programováním interních registrů přes sběrnici kompatibilní s I2C.

Videosignál YUV (4: 2: 2) (foto 1) je spojitou sekvencí monochromatických (černobílých) pixelů oddělených informacemi o barvách U (modrý barevný rozdíl) a V (červený barevný rozdíl).

Tento výstupní formát je známý jako YUV (4: 2: 2), protože každá skupina 4 bajtů obsahuje 2 jednobarevné bajty a 2 barevné bajty.

Černobílý

Abychom získali monochromatický obraz, musíme vzorkovat každý druhý datový bajt.

Arduino má pouze 2 kB paměti s libovolným přístupem, ale každý snímek obsahuje 640*2*480 = 307, 200 datových bytů. Pokud do OV7670 nepřidáme zachycovač snímků, musí být všechna data odeslána do počítače ke zpracování po řádcích.

Jsou dvě možnosti:

Pro každý ze 480 po sobě jdoucích snímků můžeme zachytit jeden řádek do Arduina vysokou rychlostí, než jej odešleme do počítače rychlostí 1 Mb / s. Takový přístup by viděl, že OV7670 pracuje na plné rychlosti, ale bude to trvat dlouho (hodně přes minutu).

Přístup, který jsem použil, je zpomalit PCLK na 8uS a odeslat každý vzorek, jak přijde. Tento přístup je výrazně rychlejší (6,4 sekundy).

Krok 4: Poznámky k návrhu

Poznámky k návrhu
Poznámky k návrhu
Poznámky k návrhu
Poznámky k návrhu
Poznámky k návrhu
Poznámky k návrhu

Kompatibilita

Čip kamery OV7670 je zařízení 3v3 voltů. Datový list uvádí, že napětí nad 3,5 voltů poškodí čip.

Abyste zabránili 5voltovému Arduinu zničit čip kamery OV7670:

  • Signál externích hodin (XCLK) z Arduina musí být snížen na bezpečnou úroveň pomocí děliče napětí.
  • Interní výsuvné odpory Arduino I2C na 5 voltů musí být deaktivovány a nahrazeny externími výsuvnými odpory k napájení 3v3 voltů.
  • Naprogramujte si Arduino PŘED připojením propojovacích vodičů, protože některé piny mohou být stále naprogramovány jako výstup z dřívějšího projektu !!! (Naučil jsem se to tvrdě … naštěstí jsem koupil dva, protože byly tak levné).

Externí hodiny

Čip kamery OV7670 vyžaduje externí hodiny ve frekvenčním rozsahu 10 MHz až 24 MHz.

Nejvyšší frekvence, kterou můžeme generovat z 16MHz Arduina, je 8MHz, ale zdá se, že to funguje.

Sériový odkaz

Odeslání 1 datového bajtu přes sériovou linku 1 Mb / s (milion bitů za sekundu) trvá nejméně 10 uS (mikrosekund). Tento čas se skládá takto:

  • 8 datových bitů (8us)
  • 1 start-bit (1uS)
  • 1 stop-bit (1uS)

Interní hodiny

Frekvence interních pixelů (PCLK) v OV7670 je nastavena bity [5: 0] v registru CLKRC (viz foto 1). [1]

Pokud nastavíme bity [5: 0] = B111111 = 63 a použijeme jej na výše uvedený vzorec, pak:

  • F (interní hodiny) = F (vstupní hodiny)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125 000 Hz nebo
  • = 8uS

Protože vzorkujeme pouze každý druhý datový bajt, výsledkem intervalu PCLK 8uS je vzorek 16uS, což je dostatečný čas k přenosu 1 datového bajtu (10uS), přičemž 6uS zbývá ke zpracování.

Snímková frekvence

Každý rámeček videa VGA obsahuje 784*510 pixelů (obrazové prvky), z nichž je zobrazeno 640*480 pixelů. Protože výstupní formát YUV (4: 2: 2) má v průměru 2 datové bajty na pixel, každý snímek bude trvat 784*2*510*8 uS = 6,4 sekundy.

Tato kamera NENÍ rychlá !!!

Horizontální polohování

Pokud můžeme změnit hodnoty HSTART a HSTOP při zachování rozdílu 640 pixelů, lze obraz posouvat vodorovně.

Při pohybu obrázku doleva je možné, že hodnota HSTOP bude menší než hodnota HSTART!

Nebojte se … vše souvisí s přetečením čítače, jak je vysvětleno na fotografii 2.

Registry

OV7670 má 201 osmibitových registrů pro ovládání věcí, jako je zisk, vyvážení bílé a expozice.

Jeden datový bajt umožňuje pouze 256 hodnot v rozsahu [0] až [255]. Pokud požadujeme větší kontrolu, musíme kaskádovat několik registrů. Dva bajty nám dávají 65 536 možností … tři bajty nám dávají 16, 777, 216.

16bitový registr AEC (Automatic Exposure Control) zobrazený na fotografii 3 je takovým příkladem a je vytvořen kombinací částí následujících tří registrů.

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

Buďte varováni … adresy registrů nejsou seskupeny!

Vedlejší efekty

Pomalá snímková frekvence přináší řadu nežádoucích vedlejších účinků:

Pro správnou expozici OV7670 očekává, že bude pracovat při snímkové frekvenci 30 fps (snímků za sekundu). Protože každý snímek trvá 6,4 sekundy, je elektronická závěrka otevřena 180krát déle než obvykle, což znamená, že všechny snímky budou přeexponované, pokud nezměníme některé hodnoty registru.

Aby se zabránilo nadměrné expozici, nastavil jsem všechny bity registru AEC (automatické řízení expozice) na nulu. Přesto je při jasném osvětlení před objektivem zapotřebí filtr s neutrální hustotou.

Zdá se, že dlouhodobá expozice také ovlivňuje údaje o UV. Protože jsem ještě nenašel kombinace registrů, které vytvářejí správné barvy … považujte to za nedokončenou práci.

Poznámka

[1]

Vzorec uvedený v datovém listu (foto 1) je správný, ale rozsah zobrazuje pouze bity [4: 0]?

Krok 5: Načasování průběhů

Načasování průběhů
Načasování průběhů
Načasování průběhů
Načasování průběhů
Načasování průběhů
Načasování průběhů

Poznámka v levém dolním rohu diagramu „VGA Frame Timing“(foto 1) zní:

Pro YUV/RGB tp = 2 x TPCLK

Obrázky 1, 2 a 3 ověřují datový list a potvrzují, že Omnivision považuje každé 2 datové bajty za ekvivalent 1 pixelu.

Průběhy osciloskopu také ověřují, že HREF zůstává během intervalů zatemnění NÍZKÝ.

Obr.4 potvrzuje, že výstup XCLK z Arduina je 8 MHz. Důvodem, proč vidíme sinusovou vlnu, a nikoli čtvercovou vlnu, je to, že všechny liché harmonické jsou pro můj 20MHz vzorkovací osciloskop neviditelné.

Krok 6: Frame Grabber

Rám Grabber
Rám Grabber

Obrazový snímač v čipu kamery OV7670 obsahuje pole 656*486 pixelů, z nichž je pro fotografii použita mřížka 640*480 pixelů.

K umístění obrazu nad senzor slouží hodnoty registru HSTART, HSTOP, HREF a VSTRT, VSTOP, VREF. Pokud není obraz umístěn správně nad snímačem, uvidíte černý pruh na jednom nebo více okrajích, jak je vysvětleno v části „Poznámky k návrhu“.

OV7670 skenuje každý řádek obrázku po jednom pixelu, počínaje od levého horního rohu, dokud nedosáhne pravého dolního pixelu. Arduino jednoduše předává tyto pixely do počítače přes sériové propojení, jak je znázorněno na fotografii 1.

Úkolem zachycovačů snímků je zachytit každý z těchto 640*480 = 307200 pixelů a zobrazit obsah v okně „obrázku“

Processing 3 toho dosahuje pomocí následujících čtyř řádků kódu !!

Kódový řádek 1:

byte byteBuffer = nový byte [maxBytes+1]; // kde maxBytes = 307200

Podkladový kód v tomto prohlášení vytvoří:

  • pole 307201 bajtů s názvem „byteBuffer [307201]“
  • Extra byte je pro znak ukončení (linefeed).

Řádek kódu 2:

velikost (640, 480);

Podkladový kód v tomto prohlášení vytvoří:

  • proměnná s názvem „width = 640;“
  • proměnná nazvaná „výška = 480“;
  • pole 307200 pixelů s názvem „pixely [307200]“
  • okno „obrázku“640*480 pixelů, ve kterém je zobrazen obsah pole pixelů . Toto okno „obrázku“se průběžně obnovuje při snímkové frekvenci 60 fps.

Kódový řádek 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Podkladový kód v tomto prohlášení:

  • ukládá příchozí data místně, dokud neuvidí znak „lf“(linefeed).
  • načež uloží prvních 307200 bajtů lokálních dat do pole byteBuffer .
  • Uloží také počet přijatých bytů (307201) do proměnné nazvané „byteCount“.

Kódový řádek 4:

pixely = barva (byteBuffer );

Při umístění do smyčky pro další smyčku základní kód v tomto prohlášení:

  • zkopíruje obsah pole „byteBuffer “do pole „pixely “
  • jejichž obsah se zobrazí v okně obrázku.

Klávesové úhozy:

Grabber rozpoznává následující stisknutí kláves:

  • ‘C’ = zachycení obrázku
  • ‘S’ = uloží obrázek do souboru.

Krok 7: Software

Stáhněte a nainstalujte každý z následujících softwarových balíků, pokud ještě nejsou nainstalovány:

  • „Arduino“z
  • „Java 8“z https://java.com/en/download/ [1]
  • „Zpracování 3“z

Instalace skici Arduino:

  • Odstraňte všechny propojovací vodiče OV7670 [2]
  • Připojte kabel USB k vašemu Arduinu
  • Zkopírujte obsah „OV7670_camera_mono_V2.ino“(přiložen) do „skici“Arduina a uložte.
  • Nahrajte skicu do svého Arduina.
  • Odpojte Arduino
  • Nyní můžete bezpečně znovu připojit propojovací kabely OV7670
  • Znovu připojte kabel USB.

Instalace a spuštění náčrtu Zpracování

  • Zkopírujte obsah „OV7670_camera_mono_V2.pde“(přiložen) do „skici“zpracování a uložte.
  • Klikněte na tlačítko „spustit“vlevo nahoře … zobrazí se černé okno s obrázkem
  • Klikněte na „černé“okno obrázku
  • Pořiďte snímek stisknutím klávesy „c“. (přibližně 6,4 sekundy).
  • Stisknutím tlačítka „s“uložíte obrázek do složky pro zpracování
  • Opakujte kroky 4 a 5
  • Program ukončíte kliknutím na tlačítko „stop“.

Poznámky

[1]

Processing 3 vyžaduje Java 8

[2]

Toto je bezpečnostní krok „pouze jednou“, aby nedošlo k poškození čipu vaší kamery OV7670.

Dokud do vašeho Arduina nenahrajete skicu „OV7670_camera_mono.ini“, budou vnitřní výsuvné odpory připojeny k 5 voltům a navíc je možné, že některé datové linky Arduino mohou mít 5 voltové výstupy… všechny jsou pro ně smrtelné čip kamery OV7670 3v3 voltů.

Jakmile je Arduino naprogramováno, není nutné tento krok opakovat a hodnoty registru lze bezpečně změnit.

Krok 8: Získání barevného obrázku

Získání barevného obrázku
Získání barevného obrázku
Získání barevného obrázku
Získání barevného obrázku
Získání barevného obrázku
Získání barevného obrázku

Následující software je čistě experimentální a je zveřejněn v naději, že se některé z technik ukáží jako užitečné. Barvy se zdají být převrácené … Ještě jsem nenašel správné nastavení registru. Pokud najdete řešení, pošlete prosím své výsledky

Pokud máme získat barevný obrázek, musí být zachyceny všechny datové bajty a použity následující vzorce.

OV7670 používá následující vzorce k převodu barevných informací RGB (červená, zelená, modrá) na 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)

K převodu YUV (4: 2: 2) zpět na barvu RGB lze použít následující vzorce: [2]

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

Připojený software je jednoduše rozšířením monochromatického softwaru:

  • Arduinu je odeslán požadavek na zachycení „c“
  • Arduino odesílá sudé (jednobarevné) bajty do počítače
  • PC tyto bajty uloží do pole
  • Arduino dále odešle liché bajty (chroma) do počítače.
  • Tyto bajty jsou uloženy do druhého pole … nyní máme celý obraz.
  • Výše uvedené vzorce jsou nyní aplikovány na každou skupinu čtyř datových bytů UYVY.
  • Výsledné barevné pixely jsou poté umístěny do pole „pixely “
  • Počítač naskenuje pole „pixely “a v okně „obrázek“se objeví obrázek.

Software Processing 3 krátce zobrazí každé skenování a konečné výsledky:

  • Fotografie 1 ukazuje chroma data U & V ze skenování 1
  • Fotografie 2 ukazuje data jasu Y1 a Y2 ze skenu 2
  • Fotografie 3 ukazuje barevný obrázek … jen jedna věc je špatná … taška by měla být zelená !!

Jakmile vyřeším tento program, zveřejním nový kód …

Reference:

[1]

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

[2]

en.wikipedia.org/wiki/YCbCr (převod JPEG)

Kliknutím sem zobrazíte mé další pokyny.

Doporučuje: