Taula de continguts:

Feu la vostra pròpia càmera: 8 passos
Feu la vostra pròpia càmera: 8 passos

Vídeo: Feu la vostra pròpia càmera: 8 passos

Vídeo: Feu la vostra pròpia càmera: 8 passos
Vídeo: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Desembre
Anonim
Image
Image
Feu la vostra pròpia càmera
Feu la vostra pròpia càmera

Aquesta instrucció explica com fer una càmera monocroma mitjançant un sensor d’imatge Omnivision OV7670, un microcontrolador Arduino, uns quants cables de pont i el programari Processing 3.

També es presenta un programari experimental per obtenir una imatge en color.

Premeu la tecla "c" per capturar una imatge de 640 * 480 píxels … premeu la tecla "s" per desar la imatge al fitxer. Les imatges successives es numeren de manera seqüencial si voleu crear una pel·lícula de poc temps.

La càmera no és ràpida (cada exploració triga 6,4 segons) i només és adequada per utilitzar-la en il·luminació fixa.

El cost, excloent el vostre Arduino i el vostre PC, és inferior a una tassa de cafè.

Imatges

Les parts components, sense cablejat de pont, es mostren a la foto inicial.

La segona foto és una captura de pantalla que mostra el programari de la càmera Arduino i la captura de fotogrames Processing 3. La inserció mostra com està connectada la càmera.

El vídeo mostra la càmera en acció. Quan es prem la tecla de captura "c" es produeix un breu flash seguit d'una ràfega d'activitat a mesura que s'escaneja la imatge. La imatge apareix automàticament a la finestra de visualització un cop finalitzada la cerca. Després es veu que les imatges apareixen a la carpeta Processament després de prémer la tecla "s". El vídeo conclou recorrent ràpidament cadascuna de les tres imatges guardades.

Pas 1: diagrama del circuit

Esquema de connexions
Esquema de connexions
Esquema de connexions
Esquema de connexions
Esquema de connexions
Esquema de connexions

El diagrama del circuit, per a totes les versions d’aquesta càmera, es mostra a la foto 1.

Les fotos 2, 3 mostren com estan connectats els cables i els ponts.

Sense el suport d'alumini, les imatges queden de costat.

Advertiment

Programa el teu Arduino ABANS d’enllaçar qualsevol cable de pont al xip de la càmera OV7670. Això evitarà que els pins de sortida de 5 volts d’un programa anterior destrueixin el xip de càmera OV7670 de 3 volts.

Pas 2: llista de peces

Llista de peces
Llista de peces

Les següents parts es van obtenir a

  • 1 només mòdul de càmera VGA OV7670 300KP per KIT de bricolatge arduino
  • 1 únic suport de càmera complet amb femelles i cargols
  • 1 només UNO R3 per arduino MEGA328P 100% original ATMEGA16U2 amb cable USB

Les següents parts es van obtenir localment

  • 18 cables Arduino masculins-femenins
  • 3 només cables jumper femella-femella Arduinin
  • 1 només mini taula de pa
  • 4 només resistències 4K7 ohm de 1/2 watt
  • 1 només suport de ferralla d'alumini.

També necessitareu els fulls de dades següents:

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

Pas 3: teoria

Teoria
Teoria

Xip de càmera OV7670

La sortida per defecte del xip de càmera OV7670 comprèn un senyal de vídeo YUV (4: 2: 2) i 3 formes d'ona de sincronització. Altres formats de sortida són possibles mitjançant la programació dels registres interns mitjançant un bus compatible I2C.

El senyal de vídeo YUV (4: 2: 2) (foto 1) és una seqüència contínua de píxels monocroms (blanc i negre) separats per informació de color U (diferència de color blau) i V (diferència de color vermell).

Aquest format de sortida es coneix com YUV (4: 2: 2), ja que cada grup de 4 bytes conté 2 bytes monocromats i 2 bytes de color.

Monocrom

Per obtenir una imatge monocroma hem de provar cada segon byte de dades.

Un Arduino només té 2 K de memòria d'accés aleatori, però cada fotograma comprèn 640 * 2 * 480 = 307, 200 bytes de dades. Tret que afegim un capturador de fotogrames a l'OV7670, totes les dades s'han d'enviar al PC línia per línia per processar-les.

Hi ha dues possibilitats:

Per a cadascun dels 480 fotogrames successius, podem capturar una línia a l’Arduino a gran velocitat abans d’enviar-la al PC a 1 Mbps. Amb aquest enfocament, l'OV7670 funcionaria a tota velocitat, però trigaria molt (molt més d'un minut).

L'enfocament que he adoptat és reduir la velocitat del PCLK fins a 8uS i enviar cada mostra a mesura que arribi. Aquest enfocament és significativament més ràpid (6,4 segons).

Pas 4: Notes de disseny

Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny

Compatibilitat

El xip de càmera OV7670 és un dispositiu de 3v3 volts. La fitxa tècnica indica que tensions superiors a 3,5 volts danyaran el xip.

Per evitar que el vostre Arduino de 5 volts destrueixi el xip de la càmera OV7670:

  • El senyal de rellotge extern (XCLK) de l’Arduino s’ha de reduir a un nivell segur mitjançant un divisor de tensió.
  • Les resistències de tracció Arduino I2C internes a 5 volts s'han de desactivar i substituir per resistències de tracció externes a la font de 3v3 volts.
  • Programa el teu Arduino ABANS d’enllaçar qualsevol cable de connexió, ja que alguns dels pins encara es poden programar com a sortida d’un projecte anterior. (Vaig aprendre això de la manera més difícil … afortunadament en vaig comprar dos, ja que eren tan barats).

Rellotge extern

El xip de càmera OV7670 requereix un rellotge extern en el rang de freqüències de 10 MHz a 24 MHz.

La freqüència més alta que podem generar a partir d’un Arduino de 16 MHz és de 8 MHz, però sembla que funciona.

Enllaç sèrie

Es necessiten almenys 10 uS (microsegons) per enviar 1 byte de dades a través d’un enllaç sèrie d’1 Mbps (milions de bits per segon). Aquesta vegada es compon de la següent manera:

  • 8 bits de dades (8us)
  • 1 bit inicial (1uS)
  • 1 bit de parada (1uS)

Rellotge intern

La freqüència de rellotge de píxels interns (PCLK) dins de l’OV7670 s’estableix per bits [5: 0] dins del registre CLKRC (vegeu la foto 1). [1]

Si establim els bits [5: 0] = B111111 = 63 i l’apliquem a la fórmula anterior, llavors:

  • F (rellotge intern) = F (rellotge d'entrada) / (Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz o
  • = 8uS

Com que només prenem mostres cada segon byte de dades, un interval PCLK de 8uS resulta en una mostra de 16uS que és suficient per transmetre 1 byte de dades (10uS) deixant 6uS per al processament.

Velocitat de fotogrames

Cada marc de vídeo VGA inclou 784 * 510 píxels (elements de la imatge) dels quals es mostren 640 * 480 píxels. Com que el format de sortida YUV (4: 2: 2) té una mitjana de 2 bytes de dades per píxel, cada fotograma trigarà 784 * 2 * 510 * 8 uS = 6,4 segons.

Aquesta càmera NO és ràpida !!!

Posicionament horitzontal

La imatge es pot moure horitzontalment si canviem els valors HSTART i HSTOP mantenint una diferència de 640 píxels.

En moure la imatge cap a l'esquerra, és possible que el valor HSTOP sigui inferior al valor HSTART.

No us alarmeu … tot té a veure amb desbordaments de comptador, tal com s’explica a la foto 2.

Registres

L’OV7670 té 201 registres de vuit bits per controlar coses com el guany, el balanç de blancs i l’exposició.

Un byte de dades només permet 256 valors compresos entre [0] i [255]. Si necessitem més control, haurem de registrar en cascada diversos registres. Dos bytes ens proporcionen 65536 possibilitats … tres bytes ens donen 16, 777, 216.

El registre AEC (Control automàtic de l'exposició) de 16 bits que es mostra a la foto 3 és un exemple així i es crea combinant porcions dels tres registres següents.

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

Tingueu en compte que les adreces de registre no estan agrupades.

Efectes secundaris

Una velocitat de fotogrames lenta introdueix una sèrie d’efectes secundaris no desitjats:

Per a una exposició correcta, l’OV7670 espera treballar a una velocitat de fotogrames de 30 fps (fotogrames per segon). Com que cada fotograma triga 6,4 segons, l'obturador electrònic està obert 180 vegades més del normal, cosa que significa que totes les imatges estaran sobreexposades tret que modifiquem alguns valors de registre.

Per evitar una sobreexposició, he establert tots els bits de registre AEC (control de l'exposició automàtica) a zero. Tot i això, cal un filtre de densitat neutre davant de la lent quan la il·luminació és brillant.

També sembla que una exposició llarga afecta les dades UV. Com que encara no he trobat combinacions de registres que produeixin colors correctes … considereu que es tracta d'un treball en curs.

Nota

[1]

La fórmula que es mostra al full de dades (foto 1) és correcta, però l'interval només mostra els bits [4: 0]?

Pas 5: sincronització de les formes d'ona

Formes d'ona de temporització
Formes d'ona de temporització
Formes d'ona de temporització
Formes d'ona de temporització
Formes d'ona de temporització
Formes d'ona de temporització

La nota que hi ha a l'extrem inferior esquerre del diagrama "Temps de marc VGA" (foto 1) diu:

Per a YUV / RGB, tp = 2 x TPCLK

Les figures 1, 2 i 3 verificen els fulls de dades i confirmen que Omnivision tracta cada 2 bytes de dades com l'equivalent a 1 píxel.

Les formes d'ona de l'oscil·loscopi també verificen que HREF roman BAIX durant els intervals de buit.

La figura 4 confirma que la sortida XCLK de l'Arduino és de 8 MHz. La raó per la qual veiem una ona sinusoïdal, més que una ona quadrada, és que tots els estranys harmònics són invisibles per al meu oscil·loscopi de mostreig de 20 MHz.

Pas 6: Frame Grabber

Frame Grabber
Frame Grabber

El sensor d'imatge d'un xip de càmera OV7670 comprèn una matriu de 656 * 486 píxels, dels quals s'utilitza una quadrícula de 640 * 480 píxels per a la foto.

Els valors del registre HSTART, HSTOP, HREF i VSTRT, VSTOP, VREF s’utilitzen per situar la imatge sobre el sensor. Si la imatge no es col·loca correctament sobre el sensor, veureu una banda negra sobre una o més vores, tal com s'explica a la secció "Notes de disseny".

L'OV7670 escaneja cada línia de la imatge d'un píxel a la vegada, començant des de l'extrem superior esquerre fins que arriba al píxel inferior dret. L'Arduino simplement transmet aquests píxels al PC mitjançant l'enllaç sèrie, tal com es mostra a la foto 1.

La tasca dels captors de marcs és capturar cadascun d’aquests 640 * 480 = 307200 píxels i mostrar el contingut en una finestra “imatge”

El processament 3 ho aconsegueix mitjançant les següents quatre línies de codi.

Línia de codi 1:

byte byteBuffer = byte nou [maxBytes + 1]; // on maxBytes = 307200

El codi subjacent d'aquesta declaració crea:

  • una matriu de 307201 bytes anomenada "byteBuffer [307201]"
  • El byte addicional és per a un caràcter de finalització (linefeed).

Línia de codi 2:

mida (640, 480);

El codi subjacent d'aquesta declaració crea:

  • una variable anomenada "ample = 640;"
  • una variable anomenada "altura = 480";
  • una matriu de 307200 píxels anomenada "píxels [307200]"
  • una finestra "imatge" de 640 * 480 píxels on es mostra el contingut de la matriu de píxels . Aquesta finestra "imatge" s'actualitza contínuament a una velocitat de fotogrames de 60 fps.

Línia de codi 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

El codi subjacent d'aquesta declaració:

  • emmagatzema les dades entrants de manera local fins que vegi un caràcter "lf" (linefeed).
  • després d'això, bolca els primers 307200 bytes de dades locals a la matriu byteBuffer .
  • També desa el nombre de bytes rebuts (307201) en una variable anomenada "byteCount".

Línia de codi 4:

píxels = color (byteBuffer );

Quan es col·loca en un bucle per al següent, el codi subjacent d'aquesta sentència:

  • copia el contingut de la matriu "byteBuffer " a la matriu "píxels"
  • el contingut del qual apareix a la finestra de la imatge.

Traços clau:

El captador de marcs reconeix les següents pulsacions de teclat:

  • ‘C’ = captura de la imatge
  • ‘S’ = desa la imatge al fitxer.

Pas 7: programari

Descarregueu i instal·leu cadascun dels paquets de programari següents si encara no està instal·lat:

  • "Arduino" de
  • "Java 8" de https://java.com/en/download/ [1]
  • "S'està processant 3" des de

Instal·lació de l'esbós d'Arduino:

  • Traieu tots els cables del pont OV7670 [2]
  • Connecteu un cable USB al vostre Arduino
  • Copieu el contingut de "OV7670_camera_mono_V2.ino" (adjunt) en un "esbós" d'Arduino i deseu-lo.
  • Pengeu l'esbós al vostre Arduino.
  • Desconnecteu l'Arduino
  • Ara podeu tornar a connectar amb seguretat els cables del pont OV7670
  • Torneu a connectar el cable USB.

Instal·lació i execució de l'esbós de processament

  • Copieu el contingut de "OV7670_camera_mono_V2.pde" (adjunt) en un "esbós" de processament i deseu-lo.
  • Feu clic al botó "executar" de la part superior esquerra … apareixerà una finestra d'imatge en negre
  • Feu clic a la finestra de la imatge "negra"
  • Premeu la tecla "c" per capturar una imatge. (6,4 segons aproximadament).
  • Premeu la tecla "s" per desar la imatge a la carpeta de processament
  • Repetiu els passos 4 i 5
  • Feu clic al botó "Atura" per sortir del programa.

Notes

[1]

El processament 3 requereix Java 8

[2]

Es tracta d'un pas de seguretat "només una vegada" per evitar danyar el xip de la càmera OV7670.

Fins que no s'hagi carregat l'esbós "OV7670_camera_mono.ini" al vostre Arduino, les resistències internes de connexió estan connectades a 5 volts, a més hi ha la possibilitat que algunes de les línies de dades d'Arduino siguin sortides de 5 volts … el xip de càmera OV7670 de 3 volts.

Un cop s'ha programat l'Arduino, no cal repetir aquest pas i és possible que es canviïn els valors del registre.

Pas 8: Obtenir una imatge en color

Obtenció d’una imatge en color
Obtenció d’una imatge en color
Obtenció d’una imatge en color
Obtenció d’una imatge en color
Obtenció d’una imatge en color
Obtenció d’una imatge en color

El següent programari és purament experimental i es publica amb l'esperança que algunes de les tècniques resultin útils. Sembla que els colors estan invertits … Encara no he trobat la configuració de registre correcta. Si trobeu una solució, publiqueu els vostres resultats

Si volem obtenir una imatge en color, cal capturar tots els bytes de dades i aplicar les fórmules següents.

El OV7670 utilitza les fórmules següents per convertir la informació de color RGB (vermell, verd, blau) en 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)

Es poden utilitzar les fórmules següents per convertir YUV (4: 2: 2) de nou a color RGB: [2]

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

El programari adjunt és simplement una extensió del programari monocrom:

  • S'envia una sol·licitud de captura "c" a l'Arduino
  • L'Arduino envia els bytes numerats parells (monocroms) al PC
  • El PC desa aquests bytes en una matriu
  • A continuació, l’Arduino envia els bytes de números senars (croma) al PC.
  • Aquests bytes es guarden en una segona matriu … ara tenim tota la imatge.
  • Les fórmules anteriors s’apliquen ara a cada grup de quatre bytes de dades UYVY.
  • Els píxels de color resultants es col·loquen a la matriu "píxels"
  • El PC analitza la matriu de "píxels " i apareix una imatge a la finestra "imatge".

El programari Processing 3 mostra breument cada exploració i els resultats finals:

  • La foto 1 mostra les dades de croma U & V de l'escaneig 1
  • La foto 2 mostra les dades de luminància Y1 i Y2 de l’escaneig 2
  • La foto 3 mostra la imatge en color … només hi ha un problema … la bossa hauria de ser verda !!

Publicaré un codi nou un cop hàgiu resolt aquest programa …

Referències:

[1]

www.haoyuelectronics.com/Attachment/OV7670%… (pàgina 33)

[2]

ca.wikipedia.org/wiki/YCbCr (conversió JPEG)

Feu clic aquí per veure les meves altres instruccions.

Recomanat: