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 23:18] Martin Kráčala [Firmware] |
2015:cam-al422 [2016/02/04 22:47] (aktuální) Martin Kráčala MATLAB link |
||
---|---|---|---|
Řádek 47: | Řádek 47: | ||
===== Zapojení ===== | ===== 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?600 | Obr. 5: Zapojení přípravku}} | + | {{ :2015:cam-al422:zapojeni.jpg | Obr. 5: Zapojení přípravku}} |
===== Firmware ===== | ===== Firmware ===== | ||
Řádek 55: | Řádek 79: | ||
Celý firmware byl tvořen SDK [[https://developer.mbed.org/|mbed.org]]. Projekt se do značné míry inspiruje pracemi | 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. | [[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> | <code cpp> | ||
Řádek 70: | Řádek 115: | ||
while (true) | while (true) | ||
{ | { | ||
- | // Look if things are in the Rx-buffer... | + | // Look whether things are in the RX-buffer... |
if(pc.readable()) | if(pc.readable()) | ||
{ | { | ||
Řádek 88: | Řádek 133: | ||
} | } | ||
</code> | </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 114: | Řá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)]] |