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/

Committer:
edodm85
Date:
Mon Jul 15 20:51:31 2013 +0000
Revision:
0:2208b72b1ba1
Child:
1:0e4d23df43ea
First Rev

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edodm85 0:2208b72b1ba1 1 /*
edodm85 0:2208b72b1ba1 2 * Author: Edoardo De Marchi
edodm85 0:2208b72b1ba1 3 * Date: 15/07/13
edodm85 0:2208b72b1ba1 4 * Notes: OV7670 camera with Ethernet Connection
edodm85 0:2208b72b1ba1 5 */
edodm85 0:2208b72b1ba1 6
edodm85 0:2208b72b1ba1 7 #include "main.h"
edodm85 0:2208b72b1ba1 8
edodm85 0:2208b72b1ba1 9 #define VGA 307200 //640*480
edodm85 0:2208b72b1ba1 10 #define QVGA 76800 //320*240
edodm85 0:2208b72b1ba1 11 #define QQVGA 19200 //160*120
edodm85 0:2208b72b1ba1 12
edodm85 0:2208b72b1ba1 13 static char format = ' ';
edodm85 0:2208b72b1ba1 14 static int resolution = 0;
edodm85 0:2208b72b1ba1 15
edodm85 0:2208b72b1ba1 16
edodm85 0:2208b72b1ba1 17 int Init()
edodm85 0:2208b72b1ba1 18 {
edodm85 0:2208b72b1ba1 19 led1 = 0;
edodm85 0:2208b72b1ba1 20 led2 = 0; // mbed status
edodm85 0:2208b72b1ba1 21 led3 = 0; // Ethernet link enable/disable
edodm85 0:2208b72b1ba1 22 led4 = 0;
edodm85 0:2208b72b1ba1 23
edodm85 0:2208b72b1ba1 24
edodm85 0:2208b72b1ba1 25
edodm85 0:2208b72b1ba1 26 //ETHERNET
edodm85 0:2208b72b1ba1 27 eth.init(ip, mask, gateway);
edodm85 0:2208b72b1ba1 28 eth.connect();
edodm85 0:2208b72b1ba1 29 server.bind(ECHO_SERVER_PORT);
edodm85 0:2208b72b1ba1 30 server.listen(1);
edodm85 0:2208b72b1ba1 31 printf("IP Address is %s\r\n", eth.getIPAddress());
edodm85 0:2208b72b1ba1 32
edodm85 0:2208b72b1ba1 33 //THREAD
edodm85 0:2208b72b1ba1 34 osThreadCreate(osThread(net_thread), NULL);
edodm85 0:2208b72b1ba1 35
edodm85 0:2208b72b1ba1 36 return 0;
edodm85 0:2208b72b1ba1 37 }
edodm85 0:2208b72b1ba1 38
edodm85 0:2208b72b1ba1 39
edodm85 0:2208b72b1ba1 40
edodm85 0:2208b72b1ba1 41 int main (void)
edodm85 0:2208b72b1ba1 42 {
edodm85 0:2208b72b1ba1 43 Init();
edodm85 0:2208b72b1ba1 44
edodm85 0:2208b72b1ba1 45 t.start();
edodm85 0:2208b72b1ba1 46
edodm85 0:2208b72b1ba1 47 while (true)
edodm85 0:2208b72b1ba1 48 {
edodm85 0:2208b72b1ba1 49 //mbed is alive?
edodm85 0:2208b72b1ba1 50 led2 = !led2;
edodm85 0:2208b72b1ba1 51 osDelay(500);
edodm85 0:2208b72b1ba1 52 }
edodm85 0:2208b72b1ba1 53 }
edodm85 0:2208b72b1ba1 54
edodm85 0:2208b72b1ba1 55
edodm85 0:2208b72b1ba1 56 void net_thread(void const *argument)
edodm85 0:2208b72b1ba1 57 {
edodm85 0:2208b72b1ba1 58 while (true)
edodm85 0:2208b72b1ba1 59 {
edodm85 0:2208b72b1ba1 60 led3 = 1;
edodm85 0:2208b72b1ba1 61 ////printf("\r\nWait for new connection...\r\n");
edodm85 0:2208b72b1ba1 62 server.accept(client);
edodm85 0:2208b72b1ba1 63 //printf("Connection from: %s\r\n", client.get_address());
edodm85 0:2208b72b1ba1 64 while (true)
edodm85 0:2208b72b1ba1 65 {
edodm85 0:2208b72b1ba1 66 led3 = 0;
edodm85 0:2208b72b1ba1 67 int n = client.receive(bufferRX, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 68 if (n <= 0) break;
edodm85 0:2208b72b1ba1 69
edodm85 0:2208b72b1ba1 70 bufferRX[n]=0; // make terminater
edodm85 0:2208b72b1ba1 71 parse_cmd();
edodm85 0:2208b72b1ba1 72 }
edodm85 0:2208b72b1ba1 73 client.close();
edodm85 0:2208b72b1ba1 74 //printf("Connection close.\r\n");
edodm85 0:2208b72b1ba1 75 }
edodm85 0:2208b72b1ba1 76 }
edodm85 0:2208b72b1ba1 77
edodm85 0:2208b72b1ba1 78
edodm85 0:2208b72b1ba1 79 void Send()
edodm85 0:2208b72b1ba1 80 {
edodm85 0:2208b72b1ba1 81 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 82 memset(bufferTX, 0, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 83 }
edodm85 0:2208b72b1ba1 84
edodm85 0:2208b72b1ba1 85
edodm85 0:2208b72b1ba1 86 void parse_cmd(){
edodm85 0:2208b72b1ba1 87 new_send = false;
edodm85 0:2208b72b1ba1 88
edodm85 0:2208b72b1ba1 89 if(strcmp("snap", bufferRX) == 0)
edodm85 0:2208b72b1ba1 90 {
edodm85 0:2208b72b1ba1 91 CameraSnap();
edodm85 0:2208b72b1ba1 92 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 93 }else
edodm85 0:2208b72b1ba1 94 if(strcmp("init_bw_VGA", bufferRX) == 0) // Set up for 640*480 pixels RAW
edodm85 0:2208b72b1ba1 95 {
edodm85 0:2208b72b1ba1 96 format = 'b';
edodm85 0:2208b72b1ba1 97 resolution = VGA;
edodm85 0:2208b72b1ba1 98 if(camera.Init('b', VGA) != 1)
edodm85 0:2208b72b1ba1 99 {
edodm85 0:2208b72b1ba1 100 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 101 }
edodm85 0:2208b72b1ba1 102 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 103 }else
edodm85 0:2208b72b1ba1 104 if(strcmp("init_yuv_QVGA", bufferRX) == 0) // Set up for 320*240 pixels YUV422
edodm85 0:2208b72b1ba1 105 {
edodm85 0:2208b72b1ba1 106 format = 'y';
edodm85 0:2208b72b1ba1 107 resolution = QVGA;
edodm85 0:2208b72b1ba1 108 if(camera.Init('b', QVGA) != 1)
edodm85 0:2208b72b1ba1 109 {
edodm85 0:2208b72b1ba1 110 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 111 }
edodm85 0:2208b72b1ba1 112 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 113 }else
edodm85 0:2208b72b1ba1 114 if(strcmp("init_rgb_QVGA", bufferRX) == 0) // Set up for 320*240 pixels RGB565
edodm85 0:2208b72b1ba1 115 {
edodm85 0:2208b72b1ba1 116 format = 'r';
edodm85 0:2208b72b1ba1 117 resolution = QVGA;
edodm85 0:2208b72b1ba1 118 if(camera.Init('r', QVGA) != 1)
edodm85 0:2208b72b1ba1 119 {
edodm85 0:2208b72b1ba1 120 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 121 }
edodm85 0:2208b72b1ba1 122 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 123 }else
edodm85 0:2208b72b1ba1 124 if(strcmp("init_bw_QVGA", bufferRX) == 0) // Set up for 320*240 pixels YUV (Only Y)
edodm85 0:2208b72b1ba1 125 {
edodm85 0:2208b72b1ba1 126 format = 'b';
edodm85 0:2208b72b1ba1 127 resolution = QVGA;
edodm85 0:2208b72b1ba1 128 if(camera.Init('b', QVGA) != 1)
edodm85 0:2208b72b1ba1 129 {
edodm85 0:2208b72b1ba1 130 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 131 }
edodm85 0:2208b72b1ba1 132 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 133 }else
edodm85 0:2208b72b1ba1 134 if(strcmp("init_yuv_QQVGA", bufferRX) == 0) // Set up for 160*120 pixels YUV422
edodm85 0:2208b72b1ba1 135 {
edodm85 0:2208b72b1ba1 136 format = 'y';
edodm85 0:2208b72b1ba1 137 resolution = QQVGA;
edodm85 0:2208b72b1ba1 138 if(camera.Init('b', QQVGA) != 1)
edodm85 0:2208b72b1ba1 139 {
edodm85 0:2208b72b1ba1 140 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 141 }
edodm85 0:2208b72b1ba1 142 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 143 }else
edodm85 0:2208b72b1ba1 144 if(strcmp("init_rgb_QQVGA", bufferRX) == 0) // Set up for 160*120 pixels RGB565
edodm85 0:2208b72b1ba1 145 {
edodm85 0:2208b72b1ba1 146 format = 'r';
edodm85 0:2208b72b1ba1 147 resolution = QQVGA;
edodm85 0:2208b72b1ba1 148 if(camera.Init('r', QQVGA) != 1)
edodm85 0:2208b72b1ba1 149 {
edodm85 0:2208b72b1ba1 150 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 151 }
edodm85 0:2208b72b1ba1 152 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 153 }else
edodm85 0:2208b72b1ba1 154 if(strcmp("init_bw_QQVGA", bufferRX) == 0) // Set up for 160*120 pixels YUV (Only Y)
edodm85 0:2208b72b1ba1 155 {
edodm85 0:2208b72b1ba1 156 format = 'b';
edodm85 0:2208b72b1ba1 157 resolution = QQVGA;
edodm85 0:2208b72b1ba1 158 if(camera.Init('b', QQVGA) != 1)
edodm85 0:2208b72b1ba1 159 {
edodm85 0:2208b72b1ba1 160 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 161 }
edodm85 0:2208b72b1ba1 162 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 163 }else
edodm85 0:2208b72b1ba1 164 if(strcmp("reset", bufferRX) == 0)
edodm85 0:2208b72b1ba1 165 {
edodm85 0:2208b72b1ba1 166 mbed_reset();
edodm85 0:2208b72b1ba1 167 }else
edodm85 0:2208b72b1ba1 168 if(strcmp("time", bufferRX) == 0)
edodm85 0:2208b72b1ba1 169 {
edodm85 0:2208b72b1ba1 170 sprintf(bufferTX, "Tot time acq + send (mbed): %dms\r\n", t2-t1);
edodm85 0:2208b72b1ba1 171 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 172 memset(bufferTX, 0, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 173 }
edodm85 0:2208b72b1ba1 174 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 175 }
edodm85 0:2208b72b1ba1 176
edodm85 0:2208b72b1ba1 177
edodm85 0:2208b72b1ba1 178 void CameraSnap(){
edodm85 0:2208b72b1ba1 179 led4 = 1;
edodm85 0:2208b72b1ba1 180 t1 = t.read_ms();
edodm85 0:2208b72b1ba1 181
edodm85 0:2208b72b1ba1 182 // Kick things off by capturing an image
edodm85 0:2208b72b1ba1 183 camera.CaptureNext();
edodm85 0:2208b72b1ba1 184 while(camera.CaptureDone() == false);
edodm85 0:2208b72b1ba1 185 // Start reading in the image data from the camera hardware buffer
edodm85 0:2208b72b1ba1 186 camera.ReadStart();
edodm85 0:2208b72b1ba1 187
edodm85 0:2208b72b1ba1 188
edodm85 0:2208b72b1ba1 189 int p = 0;
edodm85 0:2208b72b1ba1 190 if(format == 'b') // B&W
edodm85 0:2208b72b1ba1 191 {
edodm85 0:2208b72b1ba1 192 for(int x = 0; x<resolution/9600; x++)
edodm85 0:2208b72b1ba1 193 {
edodm85 0:2208b72b1ba1 194 for(int q = 0; q<9600; q++)
edodm85 0:2208b72b1ba1 195 {
edodm85 0:2208b72b1ba1 196 // Read in the first half of the image
edodm85 0:2208b72b1ba1 197 if(resolution != VGA)
edodm85 0:2208b72b1ba1 198 camera.ReadOnebyte();
edodm85 0:2208b72b1ba1 199 // Read in the Second half of the image
edodm85 0:2208b72b1ba1 200 bufferTX[q] = camera.ReadOnebyte(); // Y only
edodm85 0:2208b72b1ba1 201 }
edodm85 0:2208b72b1ba1 202 Send();
edodm85 0:2208b72b1ba1 203 }
edodm85 0:2208b72b1ba1 204 }
edodm85 0:2208b72b1ba1 205
edodm85 0:2208b72b1ba1 206 if(format == 'y' || format == 'r') // Color
edodm85 0:2208b72b1ba1 207 {
edodm85 0:2208b72b1ba1 208 for(int x = 0; x<(resolution/9600)*2; x++)
edodm85 0:2208b72b1ba1 209 {
edodm85 0:2208b72b1ba1 210 for(int q = 0; q<9600/2; q++)
edodm85 0:2208b72b1ba1 211 {
edodm85 0:2208b72b1ba1 212 p = q*2;
edodm85 0:2208b72b1ba1 213 // Read in the first half of the image
edodm85 0:2208b72b1ba1 214 bufferTX[p] = camera.ReadOnebyte();
edodm85 0:2208b72b1ba1 215 // Read in the Second half of the image
edodm85 0:2208b72b1ba1 216 bufferTX[p+1] = camera.ReadOnebyte();
edodm85 0:2208b72b1ba1 217 }
edodm85 0:2208b72b1ba1 218 Send();
edodm85 0:2208b72b1ba1 219 }
edodm85 0:2208b72b1ba1 220 }
edodm85 0:2208b72b1ba1 221 camera.ReadStop();
edodm85 0:2208b72b1ba1 222 t2 = t.read_ms();
edodm85 0:2208b72b1ba1 223
edodm85 0:2208b72b1ba1 224 // Immediately request the next image to be captured (takes around 45ms)
edodm85 0:2208b72b1ba1 225 camera.CaptureNext();
edodm85 0:2208b72b1ba1 226 // Now wait for the image to finish being captured
edodm85 0:2208b72b1ba1 227 while (camera.CaptureDone() == false);
edodm85 0:2208b72b1ba1 228
edodm85 0:2208b72b1ba1 229 //pc.printf("Snap_done\r\n");
edodm85 0:2208b72b1ba1 230 led4 = 0;
edodm85 0:2208b72b1ba1 231 }