Innholdsfortegnelse:

Lag ditt eget kamera: 8 trinn
Lag ditt eget kamera: 8 trinn

Video: Lag ditt eget kamera: 8 trinn

Video: Lag ditt eget kamera: 8 trinn
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, Juli
Anonim
Image
Image
Lag ditt eget kamera
Lag ditt eget kamera

Denne instruksen forklarer hvordan du lager et monokromt kamera ved hjelp av en Omnivision OV7670 bildesensor, en Arduino mikrokontroller, noen få hoppetråder og Processing 3 -programvare.

Eksperimentell programvare for å skaffe et fargebilde blir også presentert.

Trykk på "c" -tasten for å ta et bilde på 640*480 piksler … trykk på "s" -tasten for å lagre bildet i en fil. Etterfølgende bilder nummereres i rekkefølge hvis du ønsker å lage en kort time-lapse-film.

Kameraet er ikke raskt (hver skanning tar 6,4 sekunder) og er bare egnet for bruk i fast belysning.

Kostnaden, unntatt Arduino og PC, er mindre enn en kopp kaffe.

Bilder

Komponentdelene, uten jumperkabler, er vist på åpningsbildet.

Det andre bildet er et skjermbilde som viser Arduino kameraprogramvare og Processing 3 frame-grabber. Innlegget viser hvordan kameraet er koblet til.

Videoen demonstrerer kameraet i aksjon. Når du trykker på "c" -opptakstasten, blir det et kort blunk etterfulgt av et utbrudd av aktivitet mens bildet skannes. Bildet vises automatisk i displayvinduet når skanningen er fullført. Bildene blir deretter sett til å vises i Behandlingsmappen etter hvert trykk på “s” -tasten. Videoen avsluttes med å sykle raskt gjennom hvert av de tre lagrede bildene.

Trinn 1: Kretsdiagram

Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram

Kretsdiagrammet, for alle versjoner av dette kameraet, er vist på bilde 1.

Bilder 2, 3 viser hvordan hoppertrådene og komponentene er koblet sammen.

Uten aluminiumsbraketten ligger bildene på siden.

Advarsel

Programmer din Arduino FØR du fester eventuelle jumperkabler til OV7670 kamerabrikken. Dette forhindrer at 5 volt utgangspinner fra et tidligere program ødelegger 3v3 volt OV7670 kamerabrikke.

Trinn 2: Deleliste

Deleliste
Deleliste

Følgende deler ble hentet fra

  • 1 bare OV7670 300KP VGA kameramodul for arduino DIY KIT
  • 1 eneste kameraholder komplett med muttere og bolter
  • 1 kun UNO R3 for arduino MEGA328P 100% original ATMEGA16U2 med USB -kabel

Følgende deler ble hentet lokalt

  • 18 årlige Arduino mannlige-kvinnelige hoppekabler
  • 3 bare Arduinin kvinnelige-kvinnelige jumperkabler
  • 1 bare mini brødbrett
  • 4 bare 4K7 ohm 1/2 watt motstander
  • 1 stativ i skrapaluminium.

Du trenger også følgende datablad:

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

Trinn 3: Teori

Teori
Teori

OV7670 kamerabrikke

Standardutgangen fra OV7670 kamerabrikken består av et YUV (4: 2: 2) videosignal og 3 timingbølgeformer. Andre utdataformater er mulig ved å programmere de interne registerene via en I2C -kompatibel buss.

YUV (4: 2: 2) videosignal (foto 1) er en kontinuerlig sekvens av monokrome (svart og hvite) piksler atskilt med U (blå farge forskjell) og V (rød farge forskjell) farge informasjon.

Dette utdataformatet er kjent som YUV (4: 2: 2) siden hver gruppe på 4 byte inneholder 2 monokrome byte og og 2 fargebyte.

Monokrom

For å få et monokromt bilde må vi prøve annenhver databyte.

En Arduino har bare 2K minne med tilfeldig tilgang, men hver ramme består av 640*2*480 = 307, 200 databytes. Med mindre vi legger til en frame-grabber til OV7670, må alle data sendes til PC-en linje for linje for behandling.

Det er to muligheter:

For hver av 480 påfølgende rammer kan vi fange én linje til Arduino i høy hastighet før vi sender den til PC -en med 1 Mbps. En slik tilnærming ville se OV7670 arbeide i full fart, men ville ta lang tid (godt over et minutt).

Tilnærmingen jeg har tatt er å bremse PCLK ned til 8uS og sende hver prøve som den kommer. Denne tilnærmingen er betydelig raskere (6,4 sekunder).

Trinn 4: Designnotater

Designnotater
Designnotater
Designnotater
Designnotater
Designnotater
Designnotater

Kompatibilitet

OV7670 kamerabrikken er en 3v3 volt enhet. Dataarket indikerer at spenninger over 3,5 volt vil skade brikken.

For å forhindre at din 5 volt Arduino ødelegger OV7670 kamerabrikken:

  • Det eksterne klokkesignalet (XCLK) fra Arduino må reduseres til et sikkert nivå ved hjelp av en spenningsdeler.
  • De interne Arduino I2C pull-up motstandene til 5 volt må deaktiveres og erstattes med eksterne pull-up motstander til 3v3 volt forsyningen.
  • Programmer din Arduino FØR du fester noen jumper-ledninger ettersom noen av pinnene fremdeles kan programmeres som en utgang fra et tidligere prosjekt !!! (Jeg lærte dette på den harde måten … heldigvis kjøpte jeg to da de var så billige).

Ekstern klokke

OV7670 kamerabrikken krever en ekstern klokke i frekvensområdet 10Mhz til 24MHz.

Den høyeste frekvensen vi kan generere fra en 16MHz Arduino er 8MHz, men dette ser ut til å fungere.

Seriell lenke

Det tar minst 10 uS (mikrosekunder) å sende 1 databyte over en seriell kobling på 1 Mbps (millioner biter per sekund). Denne tiden består av følgende:

  • 8 databiter (8us)
  • 1 startbit (1uS)
  • 1 stopp-bit (1uS)

Intern klokke

Den interne pikselklokke (PCLK) frekvensen i OV7670 er satt av biter [5: 0] i register CLKRC (se bilde 1). [1]

Hvis vi setter biter [5: 0] = B111111 = 63 og bruker den på formelen ovenfor:

  • F (intern klokke) = F (inngangsklokke)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz eller
  • = 8uS

Siden vi bare sampler annenhver databyte, resulterer et PCLK -intervall på 8uS i en 16uS -prøve som er tilstrekkelig tid til å overføre 1 databyte (10uS) slik at 6uS etterlates for behandling.

Bildefrekvens

Hver VGA -videoramme består av 784*510 piksler (bildeelementer), hvorav 640*480 piksler vises. Siden YUV (4: 2: 2) utdataformat har et gjennomsnitt på 2 databyte per piksel, vil hver ramme ta 784*2*510*8 uS = 6,4 sekunder.

Dette kameraet er IKKE fort !!!

Horisontal posisjonering

Bildet kan flyttes horisontalt hvis vi endrer HSTART- og HSTOP -verdiene mens vi opprettholder en forskjell på 640 piksler.

Når du flytter bildet til venstre, er det mulig at HSTOP -verdien din er mindre enn HSTART -verdien!

Ikke bli skremt … alt har å gjøre med motoverløp som forklart på bilde 2.

Registre

OV7670 har 201 åtte-biters registre for å kontrollere ting som forsterkning, hvitbalanse og eksponering.

En databyte tillater bare 256 verdier i området [0] til [255]. Hvis vi trenger mer kontroll, må vi kaskade flere registre. To byte gir oss 65536 muligheter … tre byte gir oss 16, 777, 216.

16 -biters AEC (Automatic Exposure Control) -registeret vist på bilde 3 er et slikt eksempel og opprettes ved å kombinere deler av de følgende tre registrene.

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

Vær advart … registeradressene er ikke gruppert sammen!

Bivirkninger

En langsom bildefrekvens introduserer en rekke uønskede bivirkninger:

For riktig eksponering forventer OV7670 å fungere med en bildefrekvens på 30 fps (bilder per sekund). Siden hver ramme tar 6,4 sekunder, er den elektroniske lukkeren åpen 180 ganger lenger enn normalt, noe som betyr at alle bilder blir overeksponert med mindre vi endrer noen registerverdier.

For å forhindre overeksponering har jeg satt alle AEC (automatisk eksponeringskontroll) registerbiter til null. Likevel er det nødvendig med et nøytralt tetthetsfilter foran objektivet når lyset er sterkt.

En lang eksponering ser også ut til å påvirke UV -dataene. Siden jeg ennå ikke har funnet registerkombinasjoner som produserer riktige farger … anser dette som pågående arbeid.

Merk

[1]

Formelen vist i databladet (foto 1) er korrekt, men området viser bare biter [4: 0]?

Trinn 5: Timing Waveforms

Timing bølgeformer
Timing bølgeformer
Timing bølgeformer
Timing bølgeformer
Timing bølgeformer
Timing bølgeformer

Notatet i nedre venstre hjørne av diagrammet "VGA Frame Timing" (bilde 1) lyder:

For YUV/RGB, tp = 2 x TPCLK

Figurene 1, 2 og 3 bekrefter databladene og bekrefter at Omnivision behandler hver 2 databyte som ekvivalent med 1 piksel.

Oscilloskopets bølgeformer bekrefter også at HREF forblir LAV i løpet av blankingintervallene.

Figur 4 bekrefter at XCLK -utgangen fra Arduino er 8MHz. Grunnen til at vi ser en sinusbølge, i stedet for en firkantbølge, er at alle de merkelige harmonene er usynlige for mitt 20MHz samplingsoscilloskop.

Trinn 6: Frame Grabber

Frame Grabber
Frame Grabber

Bildesensoren i en OV7670 kamerachip består av en rekke på 656*486 piksler, hvorav et rutenett på 640*480 piksler brukes til bildet.

HSTART-, HSTOP-, HREF- og VSTRT-, VSTOP-, VREF -registerverdiene brukes til å plassere bildet over sensoren. Hvis bildet ikke er plassert riktig over sensoren, vil du se et svart bånd over en eller flere kanter som forklart i delen "Designnotater".

OV7670 skanner hver linje i bildet én piksel om gangen, og starter fra øverste venstre hjørne til den når den nedre høyre piksel. Arduinoen sender ganske enkelt disse pikslene til PC -en via den serielle lenken som vist på bilde 1.

Frame-grabbers oppgave er å fange hver av disse 640*480 = 307200 piksler og vise innholdet i et "bilde" -vindu

Processing 3 oppnår dette ved å bruke følgende fire kodelinjer !!

Kodelinje 1:

byte byteBuffer = ny byte [maxBytes+1]; // hvor maxBytes = 307200

Den underliggende koden i denne setningen skaper:

  • en 307201 byte -array kalt "byteBuffer [307201]"
  • Den ekstra byten er for en terminering (linefeed) karakter.

Kodelinje 2:

størrelse (640, 480);

Den underliggende koden i denne setningen skaper:

  • en variabel som kalles “bredde = 640;”
  • en variabel kalt “høyde = 480”;
  • et 307200 piksler utvalg kalt "piksler [307200]"
  • et "image" -vindu på 640*480 piksler der innholdet i piksler -matrisen vises. Dette "bilde" -vinduet oppdateres kontinuerlig med en bildefrekvens på 60 bps.

Kodelinje 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Den underliggende koden i denne uttalelsen:

  • bufferer innkommende data lokalt til det ser et "lf" (linefeed) tegn.
  • hvoretter den dumper de første 307200 byte med lokale data i byteBuffer -matrisen.
  • Det lagrer også antall mottatte byte (307201) i en variabel kalt "byteCount".

Kodelinje 4:

piksler = farge (byteBuffer );

Når den plasseres i en for-neste-sløyfe, er den underliggende koden i denne setningen:

  • kopierer innholdet i "byteBuffer " - matrisen til "piksler " - matrisen
  • hvis innhold vises i bildevinduet.

Tastetrykk:

Rammegriperen gjenkjenner følgende tastetrykk:

  • ‘C’ = ta bildet
  • ‘S’ = lagre bildet i filen.

Trinn 7: Programvare

Last ned og installer hver av følgende programvarepakker hvis den ikke allerede er installert:

  • "Arduino" fra
  • “Java 8” fra https://java.com/en/download/ [1]
  • "Behandler 3" fra

Installere Arduino -skissen:

  • Fjern alle OV7670 -hoppertrådene [2]
  • Koble en USB -kabel til Arduino
  • Kopier innholdet i "OV7670_camera_mono_V2.ino" (vedlagt) til en Arduino "skisse" og lagre.
  • Last opp skissen til din Arduino.
  • Koble fra Arduino
  • Du kan nå trygt koble OV7670 -hoppertrådene på nytt
  • Koble til USB -kabelen igjen.

Installere og kjøre behandlingsskissen

  • Kopier innholdet i “OV7670_camera_mono_V2.pde” (vedlagt) til en behandlingsskisse og lagre.
  • Klikk på "run" -knappen øverst til venstre … et svart bildevindu vil vises
  • Klikk på det "svarte" bildevinduet
  • Trykk på "c" -tasten for å ta et bilde. (ca. 6,4 sekunder).
  • Trykk på “s” -tasten for å lagre bildet i behandlingsmappen
  • Gjenta trinn 4 og 5
  • Klikk på "stopp" -knappen for å avslutte programmet.

Merknader

[1]

Behandling 3 krever Java 8

[2]

Dette er et "bare en" sikkerhetstrinn for å unngå å skade OV7670 kamerabrikken.

Inntil skissen “OV7670_camera_mono.ini” er lastet opp til din Arduino, er de interne opptrekksmotstandene koblet til 5 volt, pluss at det er mulig at noen av Arduino-datalinjene kan være 5 volt utganger … som alle er dødelige for 3v3 volt OV7670 kamerabrikke.

Når Arduino er programmert, er det ikke nødvendig å gjenta dette trinnet, og registerverdiene kan sikkert endres.

Trinn 8: Få et fargebilde

Få et fargebilde
Få et fargebilde
Få et fargebilde
Få et fargebilde
Få et fargebilde
Få et fargebilde

Følgende programvare er rent eksperimentell og er lagt ut i håp om at noen av teknikkene vil være nyttige. Fargene ser ut til å være omvendt … Jeg har ennå ikke funnet de riktige registerinnstillingene. Hvis du finner en løsning, vennligst legg ut resultatene

Hvis vi skal få et fargebilde, må alle databyte fanges opp og følgende formler brukes.

OV7670 bruker følgende formler for å konvertere RGB (rød, grønn, blå) fargeinformasjon til 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ølgende formler kan brukes til å konvertere YUV (4: 2: 2) tilbake til RGB -farge: [2]

  • R = Y + 1,402* (Cr - 128)
  • G = Y -0.344136*(Cb -128) -0.714136*(Cr -128)
  • B = Y + 1.772*(Cb -128)

Den vedlagte programvaren er ganske enkelt en utvidelse av den monokrome programvaren:

  • En "c" fangstforespørsel sendes til Arduino
  • Arduino sender partallene (monokrome) til PC -en
  • PC -en lagrer disse byte i en matrise
  • Arduino sender deretter oddetall (chroma) byte til PC -en.
  • Disse byte lagres i en andre matrise … vi har nå hele bildet.
  • Ovennevnte formler brukes nå på hver gruppe på fire UYVY -databyte.
  • De resulterende fargepikslene plasseres deretter i "piksler " -arrayen
  • PC -en skanner "piksler " -matrisen, og et bilde vises i "bilde" -vinduet.

Processing 3 -programvaren viser kort hver skanning og de endelige resultatene:

  • Bilde 1 viser U & V chromadataene fra skanning 1
  • Bilde 2 viser Y1 og Y2 luminansdata fra skanning 2
  • Bilde 3 viser fargebildet … bare en ting er galt … posen skal være grønn !!

Jeg legger ut ny kode når jeg har løst dette programmet …

Referanser:

[1]

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

[2]

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

Klikk her for å se mine andre instrukser.

Anbefalt: