Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2015:cam-al422 [2016/01/17 17:33] Martin Kráčala Ukázky pořízených snímků |
2015:cam-al422 [2016/02/04 22:47] (aktuální) Martin Kráčala MATLAB link |
||
---|---|---|---|
Řádek 18: | Řádek 18: | ||
Projekt je založen na "ultra-low-cost" vývojové desce FRDM-KL25Z firmy Freescale s mikroprocesorem ARM® Cortex™-M0+. | Projekt je založen na "ultra-low-cost" vývojové desce FRDM-KL25Z firmy Freescale s mikroprocesorem ARM® Cortex™-M0+. | ||
Základní charakteristiky desky KL25Z jsou následující: | Základní charakteristiky desky KL25Z jsou následující: | ||
- | * Jádro ARM® Cortex™-M0+: 48MHz, 16KB RAM, 128KB FLASH | + | * Jádro ARM® Cortex™-M0+: 48MHz, 16KB RAM, 128KB FLASH, |
- | * USB (Host/Device), USB sériový port | + | * USB (Host/Device), USB sériový port, |
- | * Rozhraní SPI, I2C, UART | + | * rozhraní SPI, I2C, UART, |
- | * Dotykový senzor | + | * dotykový senzor, |
- | * MMA8451Q - 3-osý akcelerometr | + | * MMA8451Q - 3-osý akcelerometr, |
- | * RGB led | + | * RGB led, |
- | * GPIO a další I/O rozhraní | + | * GPIO a další I/O rozhraní. |
{{ :2015:cam-al422:kl25z.png |Obr. 1: Pin mapa FRDM-KL25Z}} | {{ :2015:cam-al422:kl25z.png |Obr. 1: Pin mapa FRDM-KL25Z}} | ||
==== Kamera OV7670 s FIFO AL422 ==== | ==== Kamera OV7670 s FIFO AL422 ==== | ||
- | Použitou periferií pro snímání obrazu je modul kamery OV7670 firmy OmniVision s integrovaným FIFO bufferem AL422, konkrétně se jedná o verzi CF76700-V3. Tato kamera je vybavena CMOS senzorem schopným zaznamenávat snímky s rozlišením VGA (640x480, 0.3 Mpx) při obnovovací frekvenci až 30 fps společně s dalšími periferiemi zajišťujícími obrazové předzpracování a externí konektivitu. | ||
- | Kamera je ovládána prostřednictvím SCCB sběrnice. Jedná se o I2C rozhraní s maximální hodinovou frekvencí 400 kHz, v projektu je použito 100 kHz.. | ||
- | The sensor can output the following formats on the 8 bit interface: | + | Použitou periferií pro snímání obrazu je modul kamery OV7670 firmy OmniVision s integrovaným FIFO bufferem AL422, konkrétně se jedná o verzi CF76700-V3. Tato kamera je vybavena CMOS senzorem schopným zaznamenávat snímky s rozlišením VGA (640x480, 0.3 Mpx) při obnovovací frekvenci až 30 fps společně s dalšími periferiemi zajišťujícími obrazové předzpracování a externí konektivitu. Kamera díky vnitřnímu zpracování obrazu podporuje VGA i CIF rozlišení a jejich podvzorkované varianty. |
- | YUV/YCbCr 4:2:2 | + | {{:2015:cam-al422:ov7670_front.jpg?300|Obr. 2: Fotografie kamery OV7670 s FIFO AL422}} |
- | RGB565/555/444 | + | {{:2015:cam-al422:ov7670_back.jpg?300|Obr. 3: Fotografie zadní strany kamery OV7670 s FIFO AL422}} |
- | GRB 4:2:2 | + | {{:2015:cam-al422:ov7670-v3_layout.jpg?300||Obr. 4: Layout kamery CF7670C-V3}} |
- | Raw RGB | + | |
- | In addition to the 8 data lines, the following handshaking signals exist: | + | |
- | VSYNC – Vertical sync output – Low during frame | + | Výstupem senzoru je 8-bitová datová sběrnice přenášející následující obrazové formáty: |
- | HREF – Horizontal reference – High during active pixels of row | + | |
- | PCLK – Pixel clock output – Free running clock. Data is valid on rising edge. | + | |
- | The OV7670 is clocked from a 24MHz oscillator. This provides a pixel clock (PCLK) output of 24MHz. | + | |
- | The Averlogic AL422B provides 3Mbits of video frame buffer memory configured as a 393,216 byte x 8 bit FIFO. | + | * YUV/YCbCr 4:2:2 |
+ | * RGB565/555/444 | ||
+ | * GRB 4:2:2 | ||
+ | * Raw RGB | ||
- | The internal memory of the AL422B is DRAM and requires continuous refreshing. The fastest clock applied to either the write clock (WCK) or the read clock (RCK) is used as the DRAM refresh timing clock. The datasheet recommends that the WCK and RCK are kept free running at least 1MHz at all times. | + | Kamera je taktována oscilátorem s frekvencí 24 MHz. Ovládá se prostřednictvím SCCB sběrnice. Jedná se o I2C rozhraní s maximální hodinovou frekvencí 400 kHz, v projektu je použito 100 kHz. |
- | While the OV7670’s pixel clock (PCLK) can be turned off during horizontal blanking COM10 bit 5, the PCLK is feed directly into the write clock (WCK) pin of the AL422B for DRAM refreshing. To prevent clocking the horizontal blanking data into the FIFO, a NAND gate (U1) is used to invert the HREF output and feed this signal into the write enable (WE) pin of the AL422. The second input of the NAND gate is provided as a user controllable active high write enable (WEN). | + | ===== Zapojení ===== |
- | Version 1.0 / Version 2.0 | + | Zapojení jednotlivých pinů kamery je následující: |
- | It appears two versions of the OV7970 Camera Module with AL422 FIFO exist. Apart from the addition of resistors on the SCCB, pin 6 on the version 1 module is designated as write reset (WRST) and pin 6 on the version 2 module is designated as HREF. | + | |
+ | ^ OV7670 ^ Pin ^ KL25Z ^ | ||
+ | | VCC | 1 | 3v3 | | ||
+ | | GND | 2 | GND | | ||
+ | | SCL (SCCB) | 3 | PTC8 | | ||
+ | | SDA (SCCB) | 4 | PTC9 | | ||
+ | | VSYNC | 5 | PTA13 | | ||
+ | | HREF | 6 | NC | | ||
+ | | WEN | 7 | PTE2 | | ||
+ | | XCLK | 8 | NC | | ||
+ | | RRST | 9 | PTE3 | | ||
+ | | OE | 10 | PTE4 | | ||
+ | | RCLK | 11 | PTE5 | | ||
+ | | GND | 12 | GND | | ||
+ | | D0 | 13 | PTB0 | | ||
+ | | D1 | 14 | PTB1 | | ||
+ | | D2 | 15 | PTB2 | | ||
+ | | D3 | 16 | PTB3 | | ||
+ | | D4 | 17 | PTB8 | | ||
+ | | D5 | 18 | PTB9 | | ||
+ | | D6 | 19 | PTB10 | | ||
+ | | D7 | 20 | PTB11 | | ||
- | On the version 2 module, VSYNC from the OV7670 image sensor is connected directly to the AL422’s write reset (WRST). The concept is a low on the VSYNC (start of frame) can reset the write counter of the FIFO automatically. For this to occur, the VSYNC signal needs to be inverted. This can be done by setting COM10, bit 1 (VSYNC negative). | + | Na SCCB (I2C) sběrnici jsou dále připojeny nezbytné 4k7 pull-up rezistory. |
- | {{:2015:cam-al422:ov7670_front.jpg?300|Obr. 2: Fotografie kamery OV7670 s FIFO AL422}} | + | {{ :2015:cam-al422:zapojeni.jpg | Obr. 5: Zapojení přípravku}} |
- | {{:2015:cam-al422:ov7670_back.jpg?300|Obr. 2: Fotografie kamery OV7670 s FIFO AL422}} | + | |
- | Tato kamera standardně disponuje kvalitním CMOS senzorem schopným zaznamenávat rozlišení až 640x480 px (VGA neboli 0.3 Mpx)\\ při obnovovací frekvenci až 30 fps společně s dalšími periferiemi zajišťující obrazové předzpracování a externí konektivitu. Kamera obecně\\ vždy zaznamenává obraz ve výše zmíněném rozlišení a obnovovací frekvenci, který je poté na základě nastavení kamery předzpracováván digitálním signálovým procesorem (DSP) a poté teprve odesílán pomocí DCMI sběrnice do koncového zařízení. Tato konfigurace je prováděna právě pomocí zmíněné SCCB sběrnice. Kamera tedy na základě nastavení podporuje rozlišení jako zmíněné VGA nebo CIF a jejich alternativy, datové formáty jako RGB565/555 nebo YUV/YCbCr(4:2:2) atd. | + | ===== Firmware ===== |
- | ===== Zapojení přípravku ===== | + | Celý firmware byl tvořen SDK [[https://developer.mbed.org/|mbed.org]]. Projekt se do značné míry inspiruje pracemi |
+ | [[https://developer.mbed.org/users/ms523/notebook/ov7670-camera/|OV7670 Camera (by Martin Smith)]] a [[https://developer.mbed.org/users/edodm85/notebook/ov7670-camera-module/|OV7670 Camera + mbed LPC1768 over USB od (by Edoardo De Marchi)]] včetně v obou případech použité knihovny [[https://developer.mbed.org/users/edodm85/code/ov7670/|ov7670]]. Kromě ní bylo využito ještě knihovny [[https://developer.mbed.org/users/sam_grove/code/BufferedSerial/|BufferedSerial]], rozšiřující možnosti běžného Serial interface definovaného v knihovně mbed o softwarový TX a RX buffer. | ||
+ | |||
+ | ==== Odkaz k programu na mbed.org ==== | ||
+ | |||
+ | Firmware pro KL25Z je k dispozici na stránkách mbed.org [https://developer.mbed.org/users/wrecky/code/OV7670-application-over-USB-with-KL25Z/|OV7670 application over USB with KL25Z]]. | ||
+ | |||
+ | ==== Hlavní části main.cpp ==== | ||
+ | |||
+ | Na začátku výkonu programu je inicializováno sériové rozhraní spolu s modulem kamery OV7670. | ||
+ | |||
+ | <code cpp> | ||
+ | BufferedSerial pc(USBTX, USBRX); // PTA2,PTA1 | ||
+ | |||
+ | OV7670 camera ( | ||
+ | PTC9,PTC8, // SDA,SCL(I2C) | ||
+ | PTA13,NC,PTE2, // VSYNC,HREF,WEN(FIFO) | ||
+ | PortB,0x00000F0F, // PortIn data PTB<0-3>,PTB<8-11> | ||
+ | PTE3,PTE4,PTE5 // RRST,OE,RCLK | ||
+ | ); | ||
+ | </code> | ||
+ | |||
+ | Program využívá nejvyšší podporovanou přenosovou rychlost, baudrate 921600. Program záhy zapadne do nekonečné smyčky, ve které čeká na povely z PC skrze Serial-USB. | ||
+ | |||
+ | <code cpp> | ||
+ | int main() | ||
+ | { | ||
+ | // set high baud rate | ||
+ | pc.baud(BAUDRATE); | ||
+ | |||
+ | // send hello message via Serial-USB | ||
+ | pc.printf("Starting FRDM-KL25Z...\r\n"); | ||
+ | |||
+ | // reset camera on power up | ||
+ | camera.Reset() ; | ||
+ | |||
+ | while (true) | ||
+ | { | ||
+ | // Look whether things are in the RX-buffer... | ||
+ | if(pc.readable()) | ||
+ | { | ||
+ | int i = 0; | ||
+ | // if so, load them into buffer_in | ||
+ | while(pc.readable()) | ||
+ | { | ||
+ | buffer_in[i++] = pc.getc(); | ||
+ | } | ||
+ | // compare buffer_in with defined commands, execute | ||
+ | cmd(); | ||
+ | } | ||
+ | ledG = LED_OFF; | ||
+ | wait_ms(DELAY_MS); | ||
+ | ledG = LED_ON; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Následující funkce slouží k rozeznání přijatého příkazu a jeho provedení. Obsahuje funkce na výpis všech registrů kamery (reg_status) používanou především při vývoji programu, dále funkce pro nastavení kamery (setup_...) a sejmutí a odeslání snímku (snapshot). | ||
+ | |||
+ | Základním nástrojem pro všechny tyto funkce je knihovna [[https://developer.mbed.org/users/wrecky/code/OV7670/|OV7670]]. | ||
+ | |||
+ | <code cpp> | ||
+ | // Parse command from buffer_in and execute function | ||
+ | void cmd() | ||
+ | { | ||
+ | // Read all camera registers - commandline use only (for verification) | ||
+ | if(strcmp("reg_status\r\n", buffer_in) == 0) { | ||
+ | int i = 0; | ||
+ | pc.printf("AD: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"); | ||
+ | for (i=0; i<OV7670_REGMAX; i++) { | ||
+ | int data; | ||
+ | data = camera.ReadReg(i); | ||
+ | if ((i & 0x0F) == 0) { | ||
+ | pc.printf("\r\n%02X: ",i); | ||
+ | } | ||
+ | pc.printf("%02X ",data); | ||
+ | } | ||
+ | pc.printf("\r\n"); | ||
+ | } | ||
+ | // Take a picture | ||
+ | else if(strcmp("snapshot\r\n", buffer_in) == 0) { | ||
+ | ledR = LED_ON; | ||
+ | // Kick things off by capturing an image | ||
+ | camera.CaptureNext(); | ||
+ | while(camera.CaptureDone() == false); | ||
+ | // Start reading in the image data from the camera hardware buffer | ||
+ | camera.ReadStart(); | ||
+ | ledG = LED_OFF; | ||
+ | |||
+ | for(int x = 0; x<resolution; x++) { | ||
+ | // Read in the first half of the image | ||
+ | if(colorscheme == RAW && resolution != VGA) { | ||
+ | camera.ReadOnebyte(RMASK1,ROFFSET1,RMASK2,ROFFSET2); | ||
+ | } else if(colorscheme == YUV || colorscheme == RGB) { | ||
+ | pc.putc(camera.ReadOnebyte(RMASK1,ROFFSET1,RMASK2,ROFFSET2)); | ||
+ | } | ||
+ | // Read in the Second half of the image | ||
+ | pc.putc(camera.ReadOnebyte(RMASK1,ROFFSET1,RMASK2,ROFFSET2)); // Y only | ||
+ | } | ||
+ | |||
+ | camera.ReadStop(); | ||
+ | ledG = LED_ON; | ||
+ | |||
+ | camera.CaptureNext(); | ||
+ | while(camera.CaptureDone() == false); | ||
+ | |||
+ | pc.printf("Snap_done\r\n"); | ||
+ | ledR = LED_OFF; | ||
+ | } | ||
+ | // Set up commands... | ||
+ | else if(strcmp("setup_RAW_VGA\r\n", buffer_in) == 0) { | ||
+ | // VGA (640*480) RAW | ||
+ | colorscheme = RAW; | ||
+ | resolution = VGA; | ||
+ | setup(colorscheme,resolution); | ||
+ | } | ||
+ | else if(strcmp("setup_YUV_QVGA\r\n", buffer_in) == 0) | ||
+ | { | ||
+ | // QVGA (320*240) YUV 4:2:2 | ||
+ | colorscheme = YUV; | ||
+ | resolution = QVGA; | ||
+ | setup(RAW,resolution); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | ... // more commands | ||
+ | } | ||
+ | memset(buffer_in, 0, sizeof(buffer_in)); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Zpracování v PC ===== | ||
+ | |||
+ | Pro řízení a přenos dat z kamery je využito sériové komunikace skrze USB port. Možností komunikace na straně PC je několik, např. využití běžných terminálových aplikací nebo návrh programu pro sériovou komunikaci a zpracování snímků. V rámci této úlohy bylo využito prostředí MATLAB, které obsahuje integrované nástroje pro sériovou komunikaci, zpracování dat a v neposlední řadě i vývoj aplikací (GUI). | ||
+ | |||
+ | Aplikace je dostupná ke stažení na [[http://www.mathworks.com/matlabcentral/fileexchange/54966-ov7670-mbed-serial-interface|MATLAB Central]]. Umožňuje připojení k sériovému portu počítače s pokročilými možnostmi nastavení komunikačního módu. Po připojení aplikace funguje podobně, jako jiné terminály pro sériovou komunikaci. Navíc však obsahuje sadu ovládacích prvků pro řízení kamery - nastavení formátu a zachycení jednotlivých snímků, které jsou následně zobrazeny. Aplikace umožňuje také získané snímky uložit do PC. V další části dokumentace jsou uvedeny příklady sejmutých snímků i video ukazující ovládání programu. | ||
+ | |||
+ | {{ :2015:cam-al422:serialgui.png |Obr. 6: OV7670 Serial Communication Interface}} | ||
===== Ukázky pořízených snímků ===== | ===== Ukázky pořízených snímků ===== | ||
Řádek 69: | Řádek 222: | ||
==== Indoor ==== | ==== Indoor ==== | ||
- | {{ :2015:cam-al422:snapshot_rawbayer_2016-1-17_15-25-21.png | Snímek 1: "Selfie" formát RAW Bayer to RGB (640x480)}} | + | {{ :2015:cam-al422:snapshot_rawbayer_2016-1-17_15-25-21.png | Snímek 1: "Selfie" formát RAW Bayer to RGB (640x480)}} |
- | {{:2015:cam-al422:snapshot_rawbayer_2016-1-17_15-49-45.png?300| Snímek 2: "Flora" formát RAW Bayer to RGB (640x480)}} | + | {{:2015:cam-al422:snapshot_rawbayer_2016-1-17_15-49-45.png?300| Snímek 2: "Flora" formát RAW Bayer to RGB (640x480)}} |
- | {{:2015:cam-al422:snapshot_rgb565_2016-1-17_15-51-17.png?300| Snímek 3: "Flora" formát RGB 565 (320x240)}} | + | {{:2015:cam-al422:snapshot_rgb565_2016-1-17_15-51-17.png?300| Snímek 3: "Flora" formát RGB 565 (320x240)}} |
- | {{:2015:cam-al422:snapshot_yuv422_2016-1-17_15-51-50.png?300| Snímek 4: "Flora" formát YUV 4:2:2 (320x240)}} | + | {{:2015:cam-al422:snapshot_yuv422_2016-1-17_15-51-50.png?300| Snímek 4: "Flora" formát YUV 4:2:2 (320x240)}} |
==== Outdoor ==== | ==== Outdoor ==== | ||
- | {{ :2015:cam-al422:snapshot_rawbayer_2016-1-17_15-43-34.png | Snímek 5: "Proti západu slunce" formát RAW Bayer to RGB (640x480)}} | + | {{ :2015:cam-al422:snapshot_rawbayer_2016-1-17_15-43-34.png | Snímek 5: "Proti západu slunce" formát RAW Bayer to RGB (640x480)}} |
- | {{:2015:cam-al422:snapshot_rawbayer_2016-1-17_15-46-5.png?300| Snímek 6: "Zahrady" formát RAW Bayer to RGB (640x480)}} | + | {{:2015:cam-al422:snapshot_rawbayer_2016-1-17_15-46-5.png?300| Snímek 6: "Zahrady" formát RAW Bayer to RGB (640x480)}} |
- | {{:2015:cam-al422:snapshot_rgb565_2016-1-17_15-44-26.png?300| Snímek 7: "Zahrady" formát RGB 565 (320x240)}} | + | {{:2015:cam-al422:snapshot_rgb565_2016-1-17_15-44-26.png?300| Snímek 7: "Zahrady" formát RGB 565 (320x240)}} |
- | {{:2015:cam-al422:snapshot_yuv422_2016-1-17_15-45-38.png?300| Snímek 8: "Zahrady" formát YUV 4:2:2 (320x240)}} | + | {{:2015:cam-al422:snapshot_yuv422_2016-1-17_15-45-38.png?300| Snímek 8: "Zahrady" formát YUV 4:2:2 (320x240)}} |
===== Video ukázka ===== | ===== Video ukázka ===== | ||
Řádek 89: | Řádek 242: | ||
===== Závěr ===== | ===== Závěr ===== | ||
+ | Zadání projektu bylo splněno v celém rozsahu. Ve vývojovém prostředí mbed byl vytvořen firmware pro desku FRDM-KL25Z umožňující komunikace s kamerou OV7670 s FIFO bufferem AL422 skrze sériovou komunikaci přes USB port. V PC byla vytvořena aplikace pro ovládání kamery a příjem snímků. | ||
+ | |||
+ | Dalšími možnostmi rozvoje projektu by byla implementace zbylých formátů, podporovaných kamerou OV7670 a zdokonalení programu v MATLAB. Přes na dnešní dobu nízké maximální rozlišení kamery mají snímky při správném nastavení vysokou kvalitu a kamera by tak byla použitelná například v automatizovaných robotech. | ||
+ | |||
+ | ---- | ||
+ | Odkazy ke stažení: | ||
+ | * KL25Z_OV7670 firmware: [[https://developer.mbed.org/users/wrecky/code/OV7670-application-over-USB-with-KL25Z/|mbed.org]], [[http://www.urel.feec.vutbr.cz/MPOA/_media/2015/cam-al422/kl25z_ov7670_zip_kl25z.zip|Dokuwiki mirror]] | ||
+ | * OV7670 mbed Serial Interface: [[http://www.mathworks.com/matlabcentral/fileexchange/54966-ov7670-mbed-serial-interface|MATLAB Central]], [[http://www.urel.feec.vutbr.cz/MPOA/_media/2015/cam-al422/install_ov7670_mbed_serial_interface.zip|Dokuwiki mirror (exe)]] |