Code for OV7670 camera with AL422 FIFO buffer
Dependencies: BufferedSerial mbed OV7670
Revision 4:0b4e26ef4048, committed 2016-01-17
- Comitter:
- wrecky
- Date:
- Sun Jan 17 21:32:55 2016 +0000
- Parent:
- 3:d34a59304693
- Commit message:
- Initial release
Changed in this revision
diff -r d34a59304693 -r 0b4e26ef4048 BufferedSerial.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BufferedSerial.lib Sun Jan 17 21:32:55 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/sam_grove/code/BufferedSerial/#779304f9c5d2
diff -r d34a59304693 -r 0b4e26ef4048 MODSERIAL.lib --- a/MODSERIAL.lib Sat Jan 02 18:09:54 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/Sissors/code/MODSERIAL/#d8422efe4761
diff -r d34a59304693 -r 0b4e26ef4048 main.cpp --- a/main.cpp Sat Jan 02 18:09:54 2016 +0000 +++ b/main.cpp Sun Jan 17 21:32:55 2016 +0000 @@ -1,21 +1,188 @@ +// +// OV7670 + FIFO AL422B camera application +// Author: Martin Kráčala +// Inpired by: Edoardo De Marchi, Martin Smith +// #include "mbed.h" +#include "BufferedSerial.h" #include "ov7670.h" -#include "MODSERIAL.h" -#define BAUDRATE (921600) // Supported baudrates: 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600 +#define BAUDRATE (921600) // supported baudrates: 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600 +#define BUFFER_LEN (32) +#define DELAY_MS (100) +#define RMASK1 (0x0F00) +#define RMASK2 (0x000F) +#define ROFFSET1 (4) +#define ROFFSET2 (0) +#define LED_ON (0) +#define LED_OFF (1) + +#define VGA (640*480) +#define QVGA (320*240) +#define QQVGA (160*120) -DigitalOut ledR(LED1,1); -DigitalOut ledG(LED2,0); -DigitalOut ledB(LED3,1); +#define RAW 'b' +#define RGB 'r' +#define YUV 'y' + + +// OV7670 also supports CIF, QCIF and QQCIF formats + +DigitalOut ledR(LED1,LED_OFF); +DigitalOut ledG(LED2,LED_ON); +DigitalOut ledB(LED3,LED_OFF); + +BufferedSerial pc(USBTX, USBRX); // PTA2,PTA1 -MODSERIAL pc(USBTX, USBRX); +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 +); + +static char colorscheme = ' '; +static int resolution = 0; +char buffer_in[BUFFER_LEN]; + +void setup(char color, int res); +void cmd(); int main() { - pc.baud(BAUDRATE); // set high baud rate - pc.printf("Hello, World\r\n"); + // 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) { + while (true) + { + // Look if 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; + } +} +// Camera setting setup +void setup(char color, int res) +{ + if(camera.Init(color, res) != 1) { + pc.printf("Setup failed!\r\n"); + } else { + pc.printf("Setup successful\r\n"); } } + +// 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 if(strcmp("setup_RGB_QVGA\r\n", buffer_in) == 0) + { + // QVGA (320*240) RGB565 + colorscheme = RGB; + resolution = QVGA; + setup(colorscheme,resolution); + } + else if(strcmp("setup_RAW_QVGA\r\n", buffer_in) == 0) + { + // QVGA (320*240) YUV (Only Y) - monochrome + colorscheme = RAW; + resolution = QVGA; + setup(colorscheme,resolution); + } + else if(strcmp("setup_YUV_QQVGA\r\n", buffer_in) == 0) + { + // QQVGA (160*120) YUV 4:2:2 + colorscheme = YUV; + resolution = QQVGA; + setup(RAW,resolution); + } + else if(strcmp("setup_RGB_QQVGA\r\n", buffer_in) == 0) + { + // QQVGA (160*120) RGB565 + colorscheme = RGB; + resolution = QQVGA; + setup(colorscheme,resolution); + } + else if(strcmp("setup_RAW_QQVGA\r\n", buffer_in) == 0) { + // QQVGA (160*120) YUV (Only Y) - monochrome + colorscheme = RAW; + resolution = QQVGA; + setup(colorscheme,resolution); + } + memset(buffer_in, 0, sizeof(buffer_in)); +} \ No newline at end of file
diff -r d34a59304693 -r 0b4e26ef4048 ov7670.lib --- a/ov7670.lib Sat Jan 02 18:09:54 2016 +0000 +++ b/ov7670.lib Sun Jan 17 21:32:55 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/edodm85/code/ov7670/#119b4c04a4ed +https://developer.mbed.org/users/wrecky/code/OV7670/#2e57ba7138b9