Indholdsfortegnelse:
- Trin 1: Kredsløbsdiagram
- Trin 2: Deleliste
- Trin 3: Teori
- Trin 4: Designnotater
- Trin 5: Timing bølgeformer
- Trin 6: Frame Grabber
- Trin 7: Software
- Trin 8: Opnåelse af et farvebillede
Video: Lav dit eget kamera: 8 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
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ø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
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
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
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
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
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
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:
Lav dit eget fotovoltaiske 5V -system: 4 trin (med billeder)
Lav dit eget fotovoltaiske 5V-system: Dette bruger en bukkonverter som en 5V-udgang til at oplade batteriet (Li Po/Li-ion). Og Boost -konverter til 3,7V batteri til 5V USB -udgang til nødvendige enheder 5 V. Ligner det originale system, der bruger blybatteri som energilagringsopladning e
Lav dit eget Rock Band Ekit Adapter (uden Legacy Adapter), ikke -destruktivt !: 10 trin
Lav din egen Rock Band Ekit Adapter (uden Legacy Adapter), ikke -destruktivt !: Efter at have hørt en populær podcast -vært nævne sin bekymring for, at hans kabelforbundne USB -adapter dør, søgte jeg efter en DIY -løsning til at tilslutte en bedre/tilpasset eKit til RB . Tak til hr. DONINATOR på Youtube, der lavede en video med detaljer om hans lignende side
Brug kraften og lav dit eget lyssværd (blad): 9 trin (med billeder)
Brug kraften og lav dit eget lyssværd (blad): Denne instruktion er specifikt til at lave et blad til en Ben Solo Legacy Lightsaber købt fra Disneylands Galaxy's Edge i Anaheim, CA, men lignende trin kan tages for at lave dit eget blad til en anden lyssværd. Følg med for
Lav dit eget Retro Nixie -ur med en RTC !: 7 trin (med billeder)
Lav dit eget Retro Nixie -ur med en RTC !: I dette projekt vil jeg vise dig, hvordan du opretter et retro nixie -ur. Det betyder, at jeg vil vise dig, hvordan du kan styre nixie -rør med en højspændings jævnstrømforsyning, og derefter vil jeg kombinere 4 nixie -rør med en Arduino, et Real Time Clock (RTC) og en cu
Lav dit eget kamera Monopod med en flaske-kork: 3 trin
Lav dit eget kamera Monopod med en flaskekork: Denne vejledning er så let at gøre og også meget billig. Alt hvad du behøver for at lykkes er en 6 mm lang stativskrue (1/4 ") og en flaskeprop. VIGTIG. Du skal have den præcise tråd på skruen til dette formål, ellers ødelægger du kameraets tråd