Test Code for OV7670 Camera module. The images are sent over ethernet link.
Dependencies: EthernetInterface mbed-rtos mbed ov7670
You can find more information in this page: https://mbed.org/users/edodm85/notebook/ov7670-camera-and-ethernet-stream/
Revision 0:2208b72b1ba1, committed 2013-07-15
- Comitter:
- edodm85
- Date:
- Mon Jul 15 20:51:31 2013 +0000
- Child:
- 1:0e4d23df43ea
- Commit message:
- First Rev
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EthernetInterface.lib Mon Jul 15 20:51:31 2013 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/mbed_official/code/EthernetInterface/#40640efbfcae
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jul 15 20:51:31 2013 +0000 @@ -0,0 +1,231 @@ +/* + * Author: Edoardo De Marchi + * Date: 15/07/13 + * Notes: OV7670 camera with Ethernet Connection +*/ + +#include "main.h" + +#define VGA 307200 //640*480 +#define QVGA 76800 //320*240 +#define QQVGA 19200 //160*120 + +static char format = ' '; +static int resolution = 0; + + +int Init() +{ + led1 = 0; + led2 = 0; // mbed status + led3 = 0; // Ethernet link enable/disable + led4 = 0; + + + + //ETHERNET + eth.init(ip, mask, gateway); + eth.connect(); + server.bind(ECHO_SERVER_PORT); + server.listen(1); + printf("IP Address is %s\r\n", eth.getIPAddress()); + + //THREAD + osThreadCreate(osThread(net_thread), NULL); + + return 0; +} + + + +int main (void) +{ + Init(); + + t.start(); + + while (true) + { + //mbed is alive? + led2 = !led2; + osDelay(500); + } +} + + +void net_thread(void const *argument) +{ + while (true) + { + led3 = 1; + ////printf("\r\nWait for new connection...\r\n"); + server.accept(client); + //printf("Connection from: %s\r\n", client.get_address()); + while (true) + { + led3 = 0; + int n = client.receive(bufferRX, sizeof(bufferRX)); + if (n <= 0) break; + + bufferRX[n]=0; // make terminater + parse_cmd(); + } + client.close(); + //printf("Connection close.\r\n"); + } +} + + +void Send() +{ + client.send_all(bufferTX, sizeof(bufferTX)); + memset(bufferTX, 0, sizeof(bufferTX)); +} + + +void parse_cmd(){ + new_send = false; + + if(strcmp("snap", bufferRX) == 0) + { + CameraSnap(); + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("init_bw_VGA", bufferRX) == 0) // Set up for 640*480 pixels RAW + { + format = 'b'; + resolution = VGA; + if(camera.Init('b', VGA) != 1) + { + printf("Init Fail\r\n"); + } + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("init_yuv_QVGA", bufferRX) == 0) // Set up for 320*240 pixels YUV422 + { + format = 'y'; + resolution = QVGA; + if(camera.Init('b', QVGA) != 1) + { + printf("Init Fail\r\n"); + } + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("init_rgb_QVGA", bufferRX) == 0) // Set up for 320*240 pixels RGB565 + { + format = 'r'; + resolution = QVGA; + if(camera.Init('r', QVGA) != 1) + { + printf("Init Fail\r\n"); + } + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("init_bw_QVGA", bufferRX) == 0) // Set up for 320*240 pixels YUV (Only Y) + { + format = 'b'; + resolution = QVGA; + if(camera.Init('b', QVGA) != 1) + { + printf("Init Fail\r\n"); + } + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("init_yuv_QQVGA", bufferRX) == 0) // Set up for 160*120 pixels YUV422 + { + format = 'y'; + resolution = QQVGA; + if(camera.Init('b', QQVGA) != 1) + { + printf("Init Fail\r\n"); + } + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("init_rgb_QQVGA", bufferRX) == 0) // Set up for 160*120 pixels RGB565 + { + format = 'r'; + resolution = QQVGA; + if(camera.Init('r', QQVGA) != 1) + { + printf("Init Fail\r\n"); + } + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("init_bw_QQVGA", bufferRX) == 0) // Set up for 160*120 pixels YUV (Only Y) + { + format = 'b'; + resolution = QQVGA; + if(camera.Init('b', QQVGA) != 1) + { + printf("Init Fail\r\n"); + } + memset(bufferRX, 0, sizeof(bufferRX)); + }else + if(strcmp("reset", bufferRX) == 0) + { + mbed_reset(); + }else + if(strcmp("time", bufferRX) == 0) + { + sprintf(bufferTX, "Tot time acq + send (mbed): %dms\r\n", t2-t1); + client.send_all(bufferTX, sizeof(bufferTX)); + memset(bufferTX, 0, sizeof(bufferTX)); + } + memset(bufferRX, 0, sizeof(bufferRX)); +} + + +void CameraSnap(){ + led4 = 1; + t1 = t.read_ms(); + + // 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(); + + + int p = 0; + if(format == 'b') // B&W + { + for(int x = 0; x<resolution/9600; x++) + { + for(int q = 0; q<9600; q++) + { + // Read in the first half of the image + if(resolution != VGA) + camera.ReadOnebyte(); + // Read in the Second half of the image + bufferTX[q] = camera.ReadOnebyte(); // Y only + } + Send(); + } + } + + if(format == 'y' || format == 'r') // Color + { + for(int x = 0; x<(resolution/9600)*2; x++) + { + for(int q = 0; q<9600/2; q++) + { + p = q*2; + // Read in the first half of the image + bufferTX[p] = camera.ReadOnebyte(); + // Read in the Second half of the image + bufferTX[p+1] = camera.ReadOnebyte(); + } + Send(); + } + } + camera.ReadStop(); + t2 = t.read_ms(); + + // Immediately request the next image to be captured (takes around 45ms) + camera.CaptureNext(); + // Now wait for the image to finish being captured + while (camera.CaptureDone() == false); + + //pc.printf("Snap_done\r\n"); + led4 = 0; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Mon Jul 15 20:51:31 2013 +0000 @@ -0,0 +1,53 @@ +#pragma once +#include "mbed.h" +#include "ov7670.h" +#include "EthernetInterface.h" + + +#define ECHO_SERVER_PORT 2000 + + +Timer t; +bool new_send = false; + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +//Camera +OV7670 camera +( + p28,p27, // SDA,SCL(I2C / SCCB) + p23,p24,p25, // VSYNC,HREF,WEN(FIFO) + Port0,0x07878000, // PortIn data p18(P0.26),p17(P0.25),p16(P0.24),p15(P0.23),p11(P0.18),p12(P0.17),p14(P0.16),p13(P0.15) + p26,p29,p30 // RRST,OE,RCLK +); + +//ETHERNET +char* ip = "192.168.153.153"; // ip +char* mask = "255.255.255.0"; // mask +char* gateway = "192.168.153.5"; // gateway +EthernetInterface eth; +TCPSocketConnection client; +TCPSocketServer server; + +//ETHERNET BUFFER +char bufferRX[20]; +char bufferTX[9600]; + +//RESET +extern "C" void mbed_reset(); + +//TIMER +int t1 = 0; +int t2 = 0; + +//THREAD +void net_thread(void const *argument); +osThreadDef(net_thread, osPriorityNormal, DEFAULT_STACK_SIZE); + +//FUNCTION +void Send(); +void parse_cmd(); +void CameraSnap();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Mon Jul 15 20:51:31 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#58b30ac3f00e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jul 15 20:51:31 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/b3110cd2dd17 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ov7670.lib Mon Jul 15 20:51:31 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/edodm85/code/ov7670/#354a00023f79