====== Kamera OV7670 s FIFO AL422 ====== Vytvořil: [[Martin.Kracala@VUT.cz|Martin Kráčala]], 17.1.2015 ===== Zadání ===== * Připojte modul kamery OV7670 s FIFO bufferem AL422 ke vhodnému Freedom boardu. * Vytvořte firmware pro sejmutí snímku z kamery, vyřešte jeho přenos do PC a následné zobrazení. * Využijte prostředí KDS nebo mbed. ---- ===== Úvod ===== Tento projekt se zabývá využitím CMOS kamerového modulu OV7670 firmy OmniVision s FIFO bufferem AL422 ve spojení s mikrokontroléry s architekturou ARM. Projekt byl realizován na platformě FRDM-KL25Z od firmy Freescale s mikroprocesorem ARM Cortex-M0+ ve vývojovém prostředí mbed. Obrazová data jsou KL25Z postupně vyčítána z FIFO bufferu a posílána sériovou komunikací do PC. V rámci tohoto projektu byla dále vytvořena aplikace v prostředí MATLAB, která umožňuje připojení k sériovému portu a zpracování přijímaných obrazových dat. ===== Hardware ===== ==== Vývojová deska FRDM-KL25Z ==== 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í: * Jádro ARM® Cortex™-M0+: 48MHz, 16KB RAM, 128KB FLASH, * USB (Host/Device), USB sériový port, * rozhraní SPI, I2C, UART, * dotykový senzor, * MMA8451Q - 3-osý akcelerometr, * RGB led, * GPIO a další I/O rozhraní. {{ :2015:cam-al422:kl25z.png |Obr. 1: Pin mapa FRDM-KL25Z}} ==== 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 díky vnitřnímu zpracování obrazu podporuje VGA i CIF rozlišení a jejich podvzorkované varianty. {{:2015:cam-al422:ov7670_front.jpg?300|Obr. 2: Fotografie kamery OV7670 s FIFO AL422}} {{:2015:cam-al422:ov7670_back.jpg?300|Obr. 3: Fotografie zadní strany kamery OV7670 s FIFO AL422}} {{:2015:cam-al422:ov7670-v3_layout.jpg?300||Obr. 4: Layout kamery CF7670C-V3}} Výstupem senzoru je 8-bitová datová sběrnice přenášející následující obrazové formáty: * YUV/YCbCr 4:2:2 * RGB565/555/444 * GRB 4:2:2 * Raw RGB 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. ===== Zapojení ===== Zapojení jednotlivých pinů kamery je následující: ^ 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 | Na SCCB (I2C) sběrnici jsou dále připojeny nezbytné 4k7 pull-up rezistory. {{ :2015:cam-al422:zapojeni.jpg | Obr. 5: Zapojení přípravku}} ===== Firmware ===== 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. 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 ); 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. 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; } } 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]]. // 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 ===== 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ů ===== Na následujících snímcích je předvedena kvalita snímků při různých světelných podmínkách a různých formátech snímání. Pro praktické využití je největší překážkou obtížně nastavitelné zaostření, které je vysoce citlivé a lze jej hledat pouze metodou pokud-omyl. V případě snímání na stálou vzdálenost ale prokazuje kamera poměrně vysokou kvalitu snímků, dostatečnou pro širokou nabídku praktických uplatnění. ==== 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-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_yuv422_2016-1-17_15-51-50.png?300| Snímek 4: "Flora" formát YUV 4:2:2 (320x240)}} ==== 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-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_yuv422_2016-1-17_15-45-38.png?300| Snímek 8: "Zahrady" formát YUV 4:2:2 (320x240)}} ===== Video ukázka ===== Následující video dokazuje funkčnost projektu. Je spuštěna aplikace v MATLABu, provedeno připojení k sériovému portu, zachycení a přenesení několika snímků s různým nastavením. {{ youtube>suJiIMRlHSE?large }} ===== 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)]]