Indholdsfortegnelse:

Lav dit eget kamera: 8 trin
Lav dit eget kamera: 8 trin

Video: Lav dit eget kamera: 8 trin

Video: Lav dit eget kamera: 8 trin
Video: The best way for digitizing your negatives 🎞️ 2024, November
Anonim
Image
Image
Lav dit eget kamera
Lav dit eget kamera

Denne instruktive forklarer, hvordan man laver et monokromt kamera ved hjælp af en Omnivision OV7670 billedsensor, en Arduino mikrokontroller, et par jumperwires og Processing 3 software.

Eksperimentel software til opnåelse af et farvebillede præsenteres også.

Tryk på "c" -tasten for at tage et 640*480 pixel billede … tryk på "s" -tasten for at gemme billedet i en fil. Efterfølgende billeder nummereres i rækkefølge, hvis du ønsker at lave en kort time-lapse-film.

Kameraet er ikke hurtigt (hver scanning tager 6,4 sekunder) og er kun egnet til brug i fast belysning.

Omkostningerne, eksklusive din Arduino og pc, er mindre end en kop kaffe.

Billeder

Komponentdelene, uden jumperledninger, er vist på åbningsfotoet.

Det andet foto er et skærmbillede, der viser Arduino-kamerasoftwaren og Processing 3 frame-grabber. Indsatsen viser, hvordan kameraet er tilsluttet.

Videoen viser kameraet i aktion. Når der trykkes på "c" -optagelsestasten, er der et kort blitz efterfulgt af en burst af aktivitet, mens billedet scannes. Billedet vises automatisk i displayvinduet, når scanningen er fuldført. Billederne ses derefter at blive vist i mappen Processing efter hvert tryk på “s” -tasten. Videoen afsluttes med at cykle hurtigt gennem hvert af de tre gemte billeder.

Trin 1: Kredsløbsdiagram

Kredsløbsdiagram
Kredsløbsdiagram
Kredsløbsdiagram
Kredsløbsdiagram
Kredsløbsdiagram
Kredsløbsdiagram

Kredsløbsdiagrammet, for alle versioner af dette kamera, er vist på foto 1.

Billeder 2, 3 viser, hvordan jumpere-ledninger og komponenter er forbundet.

Uden aluminiumsbeslaget ligger billederne på siden.

Advarsel

Programmer din Arduino, FØR du tilslutter jumperkabler til OV7670 -kamerachippen. Dette forhindrer 5 volt udgangsstifter fra et tidligere program i at ødelægge 3v3 volt OV7670 kamerachip.

Trin 2: Deleliste

Liste over dele
Liste over dele

Følgende dele blev hentet fra

  • 1 kun OV7670 300KP VGA kameramodul til arduino DIY KIT
  • 1 kun kamerabeslag komplet med møtrikker og bolte
  • 1 kun UNO R3 til arduino MEGA328P 100% original ATMEGA16U2 med USB -kabel

Følgende dele blev hentet lokalt

  • 18 årlige Arduino han-hun jumperkabler
  • 3 kun Arduinin hun-hun jumperkabler
  • 1 kun mini brødbræt
  • 4 kun 4K7 ohm 1/2 watt modstande
  • 1 stander i skrotaluminium.

Du skal også bruge følgende datablade:

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

Trin 3: Teori

Teori
Teori

OV7670 kamerachip

Standardoutputtet fra OV7670 -kamerachippen omfatter et YUV (4: 2: 2) videosignal og 3 timingbølgeformer. Andre outputformater er mulige ved at programmere de interne registre via en I2C -kompatibel bus.

YUV (4: 2: 2) videosignal (foto 1) er en kontinuerlig sekvens af monokrome (sort og hvide) pixels adskilt af U (blå farveforskel) og V (rød farveforskel) farveinformation.

Dette outputformat er kendt som YUV (4: 2: 2), da hver gruppe på 4 bytes indeholder 2 monokrome bytes og og 2 farvebytes.

Monokrom

For at få et monokromt billede skal vi prøve hver anden databyte.

En Arduino har kun 2K tilfældig adgangshukommelse, men hver ramme omfatter 640*2*480 = 307, 200 databyte. Medmindre vi tilføjer en frame-grabber til OV7670, skal alle data sendes til pc'en linje for linje til behandling.

Der er to muligheder:

For hver af 480 successive rammer kan vi fange en linje til Arduino ved høj hastighed, før vi sender den til pc'en med 1 Mbps. En sådan tilgang ville få OV7670 til at fungere ved fuld hastighed, men ville tage lang tid (godt over et minut).

Den tilgang, jeg har taget, er at bremse PCLK ned til 8uS og sende hver prøve, som den kommer. Denne fremgangsmåde er betydeligt hurtigere (6,4 sekunder).

Trin 4: Designnotater

Design noter
Design noter
Design noter
Design noter
Design noter
Design noter

Kompatibilitet

OV7670 kamerachip er en 3v3 volt enhed. Databladet angiver, at spændinger over 3,5 volt vil beskadige chippen.

For at forhindre din 5 volt Arduino i at ødelægge OV7670 kamerachippen:

  • Det eksterne ur (XCLK) signal fra Arduino skal reduceres til et sikkert niveau ved hjælp af en spændingsdeler.
  • De interne Arduino I2C pull-up modstande til 5 volt skal deaktiveres og erstattes med eksterne pull-up modstande til 3v3 volt forsyningen.
  • Programmer din Arduino, FØR du tilslutter jumper-ledninger, da nogle af benene stadig kan programmeres som et output fra et tidligere projekt !!! (Jeg lærte dette på den hårde måde … heldigvis købte jeg to, da de var så billige).

Eksternt ur

OV7670 kamerachip kræver et eksternt ur i frekvensområdet 10Mhz til 24MHz.

Den højeste frekvens, vi kan generere fra en 16MHz Arduino, er 8MHz, men det ser ud til at fungere.

Serielt link

Det tager mindst 10 uS (mikrosekunder) at sende 1 databyte på tværs af et 1Mbps (million bits pr. Sekund) seriel forbindelse. Denne tid består af følgende:

  • 8 databit (8us)
  • 1 start-bit (1uS)
  • 1 stop-bit (1uS)

Intern ur

Den interne pixelurfrekvens (PCLK) inden for OV7670 er indstillet af bits [5: 0] i register CLKRC (se foto 1). [1]

Hvis vi indstiller bits [5: 0] = B111111 = 63 og anvender det på ovenstående formel, så:

  • F (internt ur) = F (inputur)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz eller
  • = 8uS

Da vi kun sampler hver anden databyte, resulterer et PCLK -interval på 8uS i en 16uS -prøve, som er tilstrækkelig tid til at transmittere 1 databyte (10uS), der efterlader 6uS til behandling.

Billedhastighed

Hver VGA -videoramme omfatter 784*510 pixels (billedelementer), hvoraf 640*480 pixels vises. Da YUV (4: 2: 2) outputformatet i gennemsnit har 2 databyte pr. Pixel, tager hver ramme 784*2*510*8 uS = 6,4 sekunder.

Dette kamera er IKKE hurtigt !!!

Vandret positionering

Billedet kan flyttes vandret, hvis vi ændrer HSTART- og HSTOP -værdierne, samtidig med at der opretholdes en 640 pixel forskel.

Når du flytter dit billede til venstre, er det muligt for din HSTOP -værdi at være mindre end HSTART -værdien!

Vær ikke bekymret … det har alt at gøre med modoverløb som forklaret på foto 2.

Registre

OV7670 har 201 otte-bit registre til styring af ting som forstærkning, hvidbalance og eksponering.

Én databyte tillader kun 256 værdier i området [0] til [255]. Hvis vi har brug for mere kontrol, skal vi kaskade flere registre. To bytes giver os 65536 muligheder … tre bytes giver os 16, 777, 216.

16 -bit AEC (Automatic Exposure Control) -registret vist på foto 3 er et sådant eksempel og skabes ved at kombinere dele af de følgende tre registre.

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

Vær advaret … registeradresserne er ikke grupperet sammen!

Bivirkninger

En langsom billedhastighed introducerer en række uønskede bivirkninger:

For korrekt eksponering forventer OV7670 at arbejde med en billedhastighed på 30 fps (billeder i sekundet). Da hver ramme tager 6,4 sekunder, er den elektroniske lukker åben 180 gange længere end normalt, hvilket betyder, at alle billeder vil blive overeksponeret, medmindre vi ændrer nogle registerværdier.

For at forhindre overeksponering har jeg sat alle AEC (automatisk eksponeringskontrol) registerbits til nul. Alligevel er der brug for et neutralt tæthedsfilter foran objektivet, når belysningen er lys.

En lang eksponering ser også ud til at påvirke UV -dataene. Da jeg endnu ikke har fundet registerkombinationer, der producerer korrekte farver … anser dette for at være i gang.

Bemærk

[1]

Formlen vist i databladet (foto 1) er korrekt, men området viser kun bits [4: 0]?

Trin 5: Timing bølgeformer

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

Noten i nederste venstre hjørne af diagrammet "VGA Frame Timing" (foto 1) lyder:

For YUV/RGB, tp = 2 x TPCLK

Figur 1, 2 og 3 verificerer databladene og bekræfter, at Omnivision behandler hver 2 databyte som værende ækvivalent med 1 pixel.

Oscilloskopbølgeformerne verificerer også, at HREF forbliver LAV under blanking -intervaller.

Fig. 4 bekræfter, at XCLK -output fra Arduino er 8MHz. Grunden til, at vi ser en sinusbølge frem for en firkantbølge, er, at alle de ulige harmoniske er usynlige for mit 20MHz samplingsoscilloskop.

Trin 6: Frame Grabber

Ramme Grabber
Ramme Grabber

Billedsensoren i en OV7670 kamerachip omfatter en matrix på 656*486 pixels, hvoraf et gitter på 640*480 pixels bruges til fotoet.

HSTART-, HSTOP-, HREF- og VSTRT-, VSTOP-, VREF -registerværdierne bruges til at placere billedet over sensoren. Hvis billedet ikke er placeret korrekt over sensoren, vil du se et sort bånd over en eller flere kanter som forklaret i afsnittet "Designnotater".

OV7670 scanner hver billedlinje en pixel ad gangen fra det øverste venstre hjørne, indtil den når den nederste højre pixel. Arduinoen sender simpelthen disse pixels til pc'en via det serielle link som vist på foto 1.

Rammegribernes opgave er at fange hver af disse 640*480 = 307200 pixels og vise indholdet i et "billed" -vindue

Behandling 3 opnår dette ved hjælp af følgende fire linjer med kode !!

Kodelinje 1:

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

Den underliggende kode i denne erklæring skaber:

  • et 307201 byte array kaldet "byteBuffer [307201]"
  • Den ekstra byte er til en terminering (linefeed) karakter.

Kodelinje 2:

størrelse (640, 480);

Den underliggende kode i denne erklæring skaber:

  • en variabel kaldet “bredde = 640;”
  • en variabel kaldet “højde = 480”;
  • et 307200 pixel array kaldet “pixels [307200]”
  • et "image" -vindue på 640*480 pixel, hvor indholdet i pixels -array vises. Dette "billed" -vindue opdateres løbende med en billedhastighed på 60 fps.

Kode linje 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Den underliggende kode i denne erklæring:

  • bufferer de indgående data lokalt, indtil det ser et "lf" (linefeed) tegn.
  • hvorefter den dumper de første 307200 bytes lokale data i byteBuffer -arrayet.
  • Det gemmer også antallet af modtagne bytes (307201) i en variabel kaldet "byteCount".

Kode linje 4:

pixels = farve (byteBuffer );

Når den placeres i en for-next-loop, den underliggende kode i denne erklæring:

  • kopierer indholdet af "byteBuffer " - arrayet til "pixels " - arrayet
  • hvis indhold vises i billedvinduet.

Tastetryk:

Rammegriberen genkender følgende tastetryk:

  • 'C' = tag billedet
  • ‘S’ = gem billedet i en fil.

Trin 7: Software

Download og installer hver af følgende softwarepakker, hvis den ikke allerede er installeret:

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

Installation af Arduino -skitsen:

  • Fjern alle OV7670 jumperwires [2]
  • Tilslut et USB -kabel til din Arduino
  • Kopier indholdet af "OV7670_camera_mono_V2.ino" (vedhæftet) til en Arduino "skitse" og gem.
  • Upload skitsen til din Arduino.
  • Tag Arduino -stikket ud
  • Du kan nu sikkert forbinde OV7670 -jumperledningerne igen
  • Tilslut USB -kablet igen.

Installation og kørsel af behandlingsskitsen

  • Kopier indholdet af “OV7670_camera_mono_V2.pde” (vedhæftet) til en behandlingsskitse og gem.
  • Klik på knappen "Kør" øverst til venstre … et sort billedvindue vises
  • Klik på det "sorte" billedvindue
  • Tryk på "c" -tasten for at tage et billede. (ca. 6,4 sekunder).
  • Tryk på “s” -tasten for at gemme billedet i din behandlingsmappe
  • Gentag trin 4 og 5
  • Klik på knappen "stop" for at afslutte programmet.

Noter

[1]

Forarbejdning 3 kræver Java 8

[2]

Dette er et "kun" sikkerhedstrin for at undgå at beskadige din OV7670 kamerachip.

Indtil skitsen “OV7670_camera_mono.ini” er blevet uploadet til din Arduino, er de interne pull-up-modstande forbundet til 5 volt, plus der er mulighed for, at nogle af Arduino-datalinjerne kan være 5 volt-udgange … som alle er fatale for 3v3 volt OV7670 kamerachip.

Når Arduino er blevet programmeret, er det ikke nødvendigt at gentage dette trin, og registerværdierne kan sikkert ændres.

Trin 8: Opnåelse af et farvebillede

Få et farvebillede
Få et farvebillede
Få et farvebillede
Få et farvebillede
Få et farvebillede
Få et farvebillede

Den følgende software er rent eksperimentel og er lagt ud i håb om, at nogle af teknikkerne vil vise sig nyttige. Farverne ser ud til at være inverterede … Jeg mangler endnu at finde de korrekte registerindstillinger. Hvis du finder en løsning, skal du sende dine resultater

Hvis vi skal opnå et farvebillede, skal alle databyte fanges og følgende formler anvendes.

OV7670 bruger følgende formler til at konvertere RGB (rød, grøn, blå) farveinformation 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 bruges til at konvertere YUV (4: 2: 2) tilbage til RGB -farve: [2]

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

Den vedhæftede software er simpelthen en udvidelse af den monokrome software:

  • En "c" fangstforespørgsel sendes til Arduino
  • Arduino sender de lige nummererede (monokrome) bytes til pc'en
  • PC'en gemmer disse bytes i et array
  • Arduino sender derefter de ulige nummererede (chroma) bytes til pc'en.
  • Disse bytes gemmes i et andet array … vi har nu hele billedet.
  • Ovenstående formler anvendes nu på hver gruppe på fire UYVY -databyte.
  • De resulterende farvepixels placeres derefter i arrayet "pixels"
  • PC'en scanner matrixen "pixels ", og der vises et billede i vinduet "billede".

Processing 3 -softwaren viser kortvarigt hver scanning og de endelige resultater:

  • Foto 1 viser U & V chromadata fra scanning 1
  • Foto 2 viser Y1 & Y2 luminansdata fra scanning 2
  • Foto 3 viser farvebilledet … kun en ting er forkert … posen skal være grøn !!

Jeg sender en ny kode, når jeg har løst dette program …

Referencer:

[1]

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

[2]

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

Klik her for at se mine andre instruktioner.

Anbefalede: