Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2015:cam-al422

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2015:cam-al422 [2016/01/17 21:11]
Martin Kráčala Firmware úvod
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 =====
  
 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> 
 +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 81: Řá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)]]
2015/cam-al422.1453061516.txt.gz · Poslední úprava: 2016/01/17 21:11 autor: Martin Kráčala