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/
Diff: main.cpp
- Revision:
- 0:2208b72b1ba1
- Child:
- 1:0e4d23df43ea
--- /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