Innehållsförteckning:

Gör din egen kamera: 8 steg
Gör din egen kamera: 8 steg

Video: Gör din egen kamera: 8 steg

Video: Gör din egen kamera: 8 steg
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Juli
Anonim
Image
Image
Gör din egen kamera
Gör din egen kamera

Denna instruktör förklarar hur man gör en monokrom kamera med en Omnivision OV7670 bildsensor, en Arduino mikrokontroller, några bygelkablar och Processing 3 -programvara.

Experimentell programvara för att erhålla en färgbild presenteras också.

Tryck på “c” -knappen för att ta en bild på 640*480 pixlar … tryck på “s” -knappen för att spara bilden till en fil. Efterföljande bilder numreras sekventiellt om du vill skapa en kort tidsfördröjd film.

Kameran är inte snabb (varje skanning tar 6,4 sekunder) och är endast lämplig för användning i fast belysning.

Kostnaden, exklusive din Arduino och PC, är mindre än en kopp kaffe.

Bilder

Komponentdelarna, utan bygelkablar, visas på det inledande fotot.

Det andra fotot är ett skärmdump som visar Arduino-kameraprogramvaran och Processing 3-ramsugaren. Insatsen visar hur kameran är ansluten.

Videon visar kameran i aktion. När du trycker på "c" -fångstknappen blir det en kort blixt följt av en aktiv aktivitet när bilden skannas. Bilden visas automatiskt i fönstret när genomsökningen är klar. Bilderna visas sedan i mappen Bearbetning efter varje tryckning på “s” -knappen. Videon avslutas med att snabbt gå igenom var och en av de tre sparade bilderna.

Steg 1: Kretsdiagram

Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram

Kretsschemat, för alla versioner av denna kamera, visas på foto 1.

Bilderna 2, 3 visar hur hopparna och trådarna är anslutna.

Utan aluminiumfästet ligger bilderna på sidan.

Varning

Programmera din Arduino INNAN du ansluter några bygelkablar till kamerakretsen OV7670. Detta förhindrar att 5 volt utgångsstiften från ett tidigare program förstör 3v3 volt OV7670 kamerachip.

Steg 2: Dellista

Reservdelar
Reservdelar

Följande delar erhölls från

  • 1 endast OV7670 300KP VGA -kameramodul för arduino DIY KIT
  • 1 enda kamerafäste komplett med muttrar och bultar
  • 1 endast UNO R3 för arduino MEGA328P 100% original ATMEGA16U2 med USB -kabel

Följande delar erhölls lokalt

  • 18 årliga Arduino-hane-hona-bygelkablar
  • 3 endast Arduinin kvinnliga-kvinnliga bygelkablar
  • 1 endast mini-brödbräda
  • 4 endast 4K7 ohm 1/2 watt motstånd
  • 1 ställning endast i aluminium.

Du behöver också följande datablad:

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

Steg 3: Teori

Teori
Teori

OV7670 kamerachip

Standardutmatningen från OV7670 -kamerachipet består av en YUV (4: 2: 2) videosignal och 3 tidsvågformer. Andra utmatningsformat är möjliga genom att programmera de interna registren via en I2C -kompatibel buss.

YUV (4: 2: 2) videosignal (foto 1) är en kontinuerlig sekvens av svartvita (svartvita) pixlar separerade med U (blå färgskillnad) och V (röd färgskillnad) färginformation.

Detta utdataformat är känt som YUV (4: 2: 2) eftersom varje grupp på 4 byte innehåller 2 monokroma byte och och 2 färgbyte.

Svartvit

För att få en monokrom bild måste vi sampla varannan databyte.

En Arduino har bara 2K av slumpmässigt åtkomstminne men varje ram omfattar 640*2*480 = 307, 200 databyte. Om vi inte lägger till en ram-grabber till OV7670 måste all data skickas till datorn rad för rad för bearbetning.

Det finns två möjligheter:

För var och en av 480 på varandra följande bildrutor kan vi fånga en linje till Arduino i hög hastighet innan vi skickar den till datorn med 1 Mbps. Ett sådant tillvägagångssätt skulle göra att OV7670 fungerar i full fart men skulle ta lång tid (drygt en minut).

Den metod som jag har tagit är att sakta ner PCLK till 8uS och skicka varje prov som det kommer. Detta tillvägagångssätt är betydligt snabbare (6,4 sekunder).

Steg 4: Designanteckningar

Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar

Kompatibilitet

OV7670 -kamerachipet är en 3v3 volt -enhet. Databladet indikerar att spänningar över 3,5 volt kommer att skada chipet.

För att förhindra att din 5 volt Arduino förstör OV7670 kamerachip:

  • Den externa klockans (XCLK) signal från Arduino måste reduceras till en säker nivå med hjälp av en spänningsdelare.
  • De interna Arduino I2C pull-up motstånden till 5 volt måste inaktiveras och ersättas med externa pull-up motstånd till 3v3 volt matningen.
  • Programmera din Arduino INNAN du ansluter bygelkablar eftersom några av stiften fortfarande kan programmeras som en utgång från ett tidigare projekt !!! (Jag lärde mig detta på det hårda sättet … lyckligtvis köpte jag två eftersom de var så billiga).

Extern klocka

OV7670 -kamerachipet kräver en extern klocka i frekvensområdet 10Mhz till 24MHz.

Den högsta frekvensen vi kan generera från en 16MHz Arduino är 8MHz men det verkar fungera.

Seriell länk

Det tar minst 10 uS (mikrosekunder) att skicka 1 databyte över en seriell länk på 1 Mbps (miljoner bitar per sekund). Denna tid består av följande:

  • 8 databitar (8us)
  • 1 startbit (1uS)
  • 1 stoppbit (1uS)

Intern klocka

Den interna pixelklockfrekvensen (PCLK) inom OV7670 ställs in med bitar [5: 0] i registret CLKRC (se foto 1). [1]

Om vi ställer in bitar [5: 0] = B111111 = 63 och applicerar det på ovanstående formel:

  • F (intern klocka) = F (ingångsklocka)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz eller
  • = 8uS

Eftersom vi bara samplar varannan databyte resulterar ett PCLK -intervall på 8uS i ett 16uS -prov som är tillräckligt med tid för att överföra 1 databyte (10uS) och lämnar 6uS för bearbetning.

Bildfrekvens

Varje VGA -videoram innehåller 784*510 pixlar (bildelement) varav 640*480 pixlar visas. Eftersom utmatningsformatet YUV (4: 2: 2) i genomsnitt har 2 databyte per pixel, tar varje bildruta 784*2*510*8 uS = 6,4 sekunder.

Denna kamera är INTE snabb !!!

Horisontell positionering

Bilden kan flyttas horisontellt om vi ändrar HSTART- och HSTOP -värdena samtidigt som vi behåller en skillnad på 640 pixlar.

När du flyttar din bild åt vänster är det möjligt att ditt HSTOP -värde är lägre än HSTART -värdet!

Var inte orolig … allt har att göra med motströmmar som förklaras i foto 2.

Register

OV7670 har 201 åtta-bitars register för att styra saker som förstärkning, vitbalans och exponering.

En databyte tillåter endast 256 värden i intervallet [0] till [255]. Om vi behöver mer kontroll måste vi kaskadera flera register. Två byte ger oss 65536 möjligheter … tre byte ger oss 16, 777, 216.

16 -bitars AEC (Automatic Exposure Control) -registret som visas på foto 3 är ett sådant exempel och skapas genom att kombinera delar av följande tre register.

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

Varnas … registeradresserna är inte grupperade!

Bieffekter

En långsam bildhastighet introducerar ett antal oönskade biverkningar:

För korrekt exponering förväntar sig OV7670 att arbeta med en bildhastighet på 30 fps (bilder per sekund). Eftersom varje bildruta tar 6,4 sekunder är den elektroniska slutaren öppen 180 gånger längre än normalt, vilket innebär att alla bilder blir överexponerade om vi inte ändrar några registervärden.

För att förhindra överexponering har jag satt alla AEC (autoexponeringskontroll) registerbitar till noll. Trots det behövs ett filter med neutral densitet framför objektivet när ljuset är starkt.

En lång exponering verkar också påverka UV -data. Eftersom jag ännu inte har hittat registerkombinationer som ger korrekta färger … anser att detta är på gång.

Notera

[1]

Formeln som visas i databladet (foto 1) är korrekt men intervallet visar bara bitar [4: 0]?

Steg 5: Timing Waveforms

Timing vågformer
Timing vågformer
Timing vågformer
Timing vågformer
Timing vågformer
Timing vågformer

Anteckningen i nedre vänstra hörnet av diagrammet "VGA Frame Timing" (foto 1) lyder:

För YUV/RGB, tp = 2 x TPCLK

Figurerna 1, 2 och 3 verifierar databladet (erna) och bekräftar att Omnivision behandlar varannan databyte som motsvarande 1 pixel.

Oscilloskopets vågformer verifierar också att HREF förblir LÅG under blankningsintervallen.

Figur 4 bekräftar att XCLK -utmatningen från Arduino är 8 MHz. Anledningen till att vi ser en sinusvåg, snarare än en fyrkantvåg, är att alla udda övertoner är osynliga för mitt 20MHz samplingsoscilloskop.

Steg 6: Frame Grabber

Frame Grabber
Frame Grabber

Bildsensorn i ett OV7670 -kamerachip innefattar en uppsättning av 656*486 pixlar varav ett rutnät på 640*480 pixlar används för fotot.

HSTART-, HSTOP-, HREF- och VSTRT-, VSTOP-, VREF -registervärdena används för att placera bilden över sensorn. Om bilden inte är korrekt placerad över sensorn ser du ett svart band över en eller flera kanter som förklaras i avsnittet "Designanteckningar".

OV7670 skannar varje rad i bilden en pixel i taget från det övre vänstra hörnet tills den når den nedre högra pixeln. Arduino skickar helt enkelt dessa pixlar till datorn via den seriella länken som visas på foto 1.

Frame-grabbers uppgift är att fånga var och en av dessa 640*480 = 307200 pixlar och visa innehållet i ett "bild" -fönster

Processing 3 uppnår detta med hjälp av följande fyra kodrader !!

Kodrad 1:

byte byteBuffer = ny byte [maxBytes+1]; // där maxBytes = 307200

Den underliggande koden i detta uttalande skapar:

  • en 307201 byte -array som kallas "byteBuffer [307201]"
  • Den extra byten är för en terminering (linefeed) karaktär.

Kodrad 2:

storlek (640, 480);

Den underliggande koden i detta uttalande skapar:

  • en variabel som kallas "bredd = 640;"
  • en variabel som kallas”höjd = 480”;
  • en 307200 pixel array kallad "pixlar [307200]"
  • ett "bild" -fönster på 640*480 pixlar där innehållet i pixlarna visas. Detta "bild" -fönster uppdateras kontinuerligt med en bildhastighet på 60 fps.

Kodrad 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Den underliggande koden i detta uttalande:

  • buffrar inkommande data lokalt tills det ser ett "lf" (linefeed) -tecken.
  • varefter den dumpar de första 307200 byten lokala data i byteBuffer -matrisen.
  • Det sparar också antalet mottagna byte (307201) i en variabel som kallas "byteCount".

Kodrad 4:

pixlar = färg (byteBuffer );

När den placeras i en för-nästa-loop, den underliggande koden i detta uttalande:

  • kopierar innehållet i "byteBuffer " -matrisen till "pixlar " -matrisen
  • vars innehåll visas i bildfönstret.

Tangenttryckningar:

Ramsugaren känner igen följande tangenttryckningar:

  • ‘C’ = fånga bilden
  • ‘S’ = spara bilden i filen.

Steg 7: Programvara

Ladda ner och installera vart och ett av följande programpaket om det inte redan är installerat:

  • “Arduino” från
  • “Java 8” från https://java.com/en/download/ [1]
  • "Bearbetar 3" från

Installera Arduino -skissen:

  • Ta bort alla OV7670 -bygelkablar [2]
  • Anslut en USB -kabel till din Arduino
  • Kopiera innehållet i "OV7670_camera_mono_V2.ino" (bifogad) till en Arduino "skiss" och spara.
  • Ladda upp skissen till din Arduino.
  • Koppla ur Arduino
  • Du kan nu säkert återansluta bygeln OV7670
  • Anslut USB -kabeln igen.

Installera och köra bearbetningsskissen

  • Kopiera innehållet i “OV7670_camera_mono_V2.pde” (bifogad) till en bearbetningsskiss och spara.
  • Klicka på "kör" -knappen högst upp till vänster … ett svart bildfönster visas
  • Klicka på det "svarta" bildfönstret
  • Tryck på "c" -knappen för att ta en bild. (cirka 6,4 sekunder).
  • Tryck på “s” -knappen för att spara bilden i bearbetningsmappen
  • Upprepa steg 4 och 5
  • Klicka på "stopp" -knappen för att avsluta programmet.

Anteckningar

[1]

Bearbetning 3 kräver Java 8

[2]

Detta är ett”en gång” säkerhetssteg för att undvika att skada ditt OV7670 kamerachip.

Fram till skissen”OV7670_camera_mono.ini” har laddats upp till din Arduino är de interna uppdragningsmotstånden anslutna till 5 volt, plus det finns möjlighet att några av Arduino-datalinjerna kan vara 5 volt-utgångar … som alla är dödliga för 3v3 volt OV7670 kamerachip.

När Arduino har programmerats finns det inget behov av att upprepa detta steg och registervärdena kan säkert ändras.

Steg 8: Skaffa en färgbild

Skaffa en färgbild
Skaffa en färgbild
Skaffa en färgbild
Skaffa en färgbild
Skaffa en färgbild
Skaffa en färgbild

Följande programvara är rent experimentell och publiceras i hopp om att några av teknikerna kommer att vara användbara. Färgerna verkar vara inverterade … Jag har ännu inte hittat rätt registerinställningar. Om du hittar en lösning, vänligen lägg upp dina resultat

Om vi ska få en färgbild måste alla databyte fångas och följande formler tillämpas.

OV7670 använder följande formler för att konvertera RGB (röd, grön, blå) färginformation till 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)

Följande formler kan användas för att konvertera YUV (4: 2: 2) tillbaka till RGB -färg: [2]

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

Den bifogade programvaran är helt enkelt en förlängning av den svartvit programvaran:

  • En "c" fångstbegäran skickas till Arduino
  • Arduino skickar jämna (monokroma) byte till datorn
  • Datorn sparar dessa byte i en array
  • Arduino skickar därefter udda numrerade (chroma) byte till datorn.
  • Dessa byte sparas i en andra array … vi har nu hela bilden.
  • Ovanstående formler tillämpas nu på varje grupp med fyra UYVY -databyte.
  • De resulterande färgpixlarna placeras sedan i "pixlar " -matrisen
  • Datorn skannar "pixlar " -matrisen och en bild visas i "bild" -fönstret.

Processing 3 -programvaran visar kort varje skanning och de slutliga resultaten:

  • Bild 1 visar U & V -chromadata från skanning 1
  • Bild 2 visar Y1 & Y2 luminansdata från skanning 2
  • Bild 3 visar färgbilden … bara en sak är fel … väskan ska vara grön !!

Jag kommer att lägga upp ny kod när jag har löst det här programmet …

Referenser:

[1]

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

[2]

en.wikipedia.org/wiki/YCbCr (JPEG -konvertering)

Klicka här för att se mina andra instruktioner.

Rekommenderad: