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:
Sat Apr 05 14:02:07 2014 +0000
Revision:
3:df8de18d7fa9
Parent:
2:d6b38a4512eb
Updated for "OV7670 Grabber v2.0"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edodm85 0:2208b72b1ba1 1 /*
edodm85 0:2208b72b1ba1 2 * Author: Edoardo De Marchi
edodm85 3:df8de18d7fa9 3 * Date: 05/04/14
edodm85 3:df8de18d7fa9 4 * Notes: This firmware required "OV7670 Grabber v2.0"
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
edodm85 0:2208b72b1ba1 14 int Init()
edodm85 0:2208b72b1ba1 15 {
edodm85 0:2208b72b1ba1 16 led1 = 0;
edodm85 0:2208b72b1ba1 17 led2 = 0; // mbed status
edodm85 0:2208b72b1ba1 18 led3 = 0; // Ethernet link enable/disable
edodm85 1:0e4d23df43ea 19 led4 = 0; // Snap status
edodm85 1:0e4d23df43ea 20
edodm85 0:2208b72b1ba1 21 //ETHERNET
edodm85 2:d6b38a4512eb 22 //Static IP
edodm85 0:2208b72b1ba1 23 eth.init(ip, mask, gateway);
edodm85 2:d6b38a4512eb 24 //DHCP
edodm85 2:d6b38a4512eb 25 //eth.init();
edodm85 3:df8de18d7fa9 26
edodm85 0:2208b72b1ba1 27 eth.connect();
edodm85 0:2208b72b1ba1 28 server.bind(ECHO_SERVER_PORT);
edodm85 0:2208b72b1ba1 29 server.listen(1);
edodm85 3:df8de18d7fa9 30
edodm85 0:2208b72b1ba1 31 printf("IP Address is %s\r\n", eth.getIPAddress());
edodm85 0:2208b72b1ba1 32
edodm85 0:2208b72b1ba1 33 //THREAD
edodm85 3:df8de18d7fa9 34 osThreadCreate(osThread(Net_Thread), NULL);
edodm85 3:df8de18d7fa9 35 tencid = osThreadCreate(osThread(Grab_Thread), NULL);
edodm85 3:df8de18d7fa9 36
edodm85 0:2208b72b1ba1 37 return 0;
edodm85 0:2208b72b1ba1 38 }
edodm85 0:2208b72b1ba1 39
edodm85 0:2208b72b1ba1 40
edodm85 3:df8de18d7fa9 41 void Net_Thread(void const *argument)
edodm85 0:2208b72b1ba1 42 {
edodm85 0:2208b72b1ba1 43 while (true)
edodm85 0:2208b72b1ba1 44 {
edodm85 0:2208b72b1ba1 45 led3 = 1;
edodm85 0:2208b72b1ba1 46 server.accept(client);
edodm85 1:0e4d23df43ea 47 printf("Connection from: %s\r\n", client.get_address());
edodm85 3:df8de18d7fa9 48
edodm85 0:2208b72b1ba1 49 while (true)
edodm85 0:2208b72b1ba1 50 {
edodm85 0:2208b72b1ba1 51 led3 = 0;
edodm85 0:2208b72b1ba1 52 int n = client.receive(bufferRX, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 53 if (n <= 0) break;
edodm85 0:2208b72b1ba1 54
edodm85 0:2208b72b1ba1 55 bufferRX[n]=0; // make terminater
edodm85 3:df8de18d7fa9 56 parse_cmd(n);
edodm85 0:2208b72b1ba1 57 }
edodm85 0:2208b72b1ba1 58 client.close();
edodm85 0:2208b72b1ba1 59 }
edodm85 0:2208b72b1ba1 60 }
edodm85 0:2208b72b1ba1 61
edodm85 0:2208b72b1ba1 62
edodm85 0:2208b72b1ba1 63 void Send()
edodm85 0:2208b72b1ba1 64 {
edodm85 0:2208b72b1ba1 65 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 66 memset(bufferTX, 0, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 67 }
edodm85 0:2208b72b1ba1 68
edodm85 0:2208b72b1ba1 69
edodm85 3:df8de18d7fa9 70 void Grab_Thread(void const *argument)
edodm85 3:df8de18d7fa9 71 {
edodm85 3:df8de18d7fa9 72 while(true)
edodm85 3:df8de18d7fa9 73 {
edodm85 3:df8de18d7fa9 74 osSignalWait(0x1, osWaitForever);
edodm85 3:df8de18d7fa9 75
edodm85 3:df8de18d7fa9 76 while(bSnap_on || bGrab_on)
edodm85 3:df8de18d7fa9 77 {
edodm85 3:df8de18d7fa9 78 CameraSnap();
edodm85 3:df8de18d7fa9 79 bSnap_on = false;
edodm85 3:df8de18d7fa9 80 }
edodm85 3:df8de18d7fa9 81 }
edodm85 3:df8de18d7fa9 82 }
edodm85 3:df8de18d7fa9 83
edodm85 3:df8de18d7fa9 84
edodm85 3:df8de18d7fa9 85 void CameraSnap()
edodm85 3:df8de18d7fa9 86 {
edodm85 3:df8de18d7fa9 87 led4 = 1;
edodm85 3:df8de18d7fa9 88 int p = 0;
edodm85 3:df8de18d7fa9 89
edodm85 3:df8de18d7fa9 90 camera.CaptureNext();
edodm85 3:df8de18d7fa9 91 while(camera.CaptureDone() == false);
edodm85 3:df8de18d7fa9 92
edodm85 3:df8de18d7fa9 93 camera.ReadStart(); // Start reading in the image data from the camera hardware buffer
edodm85 3:df8de18d7fa9 94
edodm85 3:df8de18d7fa9 95 t1 = t.read_ms();
edodm85 3:df8de18d7fa9 96
edodm85 3:df8de18d7fa9 97 client.send_all(StartCondition, sizeof(StartCondition));
edodm85 3:df8de18d7fa9 98
edodm85 3:df8de18d7fa9 99 if(strcmp("BAW", CMDCamera.format) == 0 || strcmp("RAW", CMDCamera.format) == 0) // B&W
edodm85 3:df8de18d7fa9 100 {
edodm85 3:df8de18d7fa9 101 for(int x = 0; x<CMDCamera.resolution/sizeof(bufferTX); x++)
edodm85 3:df8de18d7fa9 102 {
edodm85 3:df8de18d7fa9 103 for(int q = 0; q<sizeof(bufferTX); q++)
edodm85 3:df8de18d7fa9 104 {
edodm85 3:df8de18d7fa9 105 if(CMDCamera.resolution != VGA)
edodm85 3:df8de18d7fa9 106 camera.ReadOnebyte(); // Read in the first half of the image
edodm85 3:df8de18d7fa9 107
edodm85 3:df8de18d7fa9 108 bufferTX[q] = camera.ReadOnebyte(); // Y only // Read in the Second half of the image
edodm85 3:df8de18d7fa9 109 }
edodm85 3:df8de18d7fa9 110 Send();
edodm85 3:df8de18d7fa9 111 }
edodm85 3:df8de18d7fa9 112 }
edodm85 3:df8de18d7fa9 113
edodm85 3:df8de18d7fa9 114 if(strcmp("YUV", CMDCamera.format) == 0 || strcmp("RGB", CMDCamera.format) == 0) // Color
edodm85 3:df8de18d7fa9 115 {
edodm85 3:df8de18d7fa9 116 for(int x = 0; x<(CMDCamera.resolution/sizeof(bufferTX))*2; x++)
edodm85 3:df8de18d7fa9 117 {
edodm85 3:df8de18d7fa9 118 for(int q = 0; q<sizeof(bufferTX)/2; q++)
edodm85 3:df8de18d7fa9 119 {
edodm85 3:df8de18d7fa9 120 p = q*2;
edodm85 3:df8de18d7fa9 121 bufferTX[p] = camera.ReadOnebyte(); // Read in the first half of the image
edodm85 3:df8de18d7fa9 122 bufferTX[p+1] = camera.ReadOnebyte(); // Read in the Second half of the image
edodm85 3:df8de18d7fa9 123 }
edodm85 3:df8de18d7fa9 124 Send();
edodm85 3:df8de18d7fa9 125 }
edodm85 3:df8de18d7fa9 126 }
edodm85 3:df8de18d7fa9 127
edodm85 3:df8de18d7fa9 128 camera.ReadStop();
edodm85 3:df8de18d7fa9 129 t2 = t.read_ms();
edodm85 3:df8de18d7fa9 130
edodm85 3:df8de18d7fa9 131 led4 = 0;
edodm85 3:df8de18d7fa9 132 }
edodm85 3:df8de18d7fa9 133
edodm85 3:df8de18d7fa9 134
edodm85 3:df8de18d7fa9 135 int main (void)
edodm85 3:df8de18d7fa9 136 {
edodm85 3:df8de18d7fa9 137 led3 = 0;
edodm85 3:df8de18d7fa9 138 int iRet=Init();
edodm85 3:df8de18d7fa9 139
edodm85 3:df8de18d7fa9 140 if (iRet<0)
edodm85 3:df8de18d7fa9 141 {
edodm85 3:df8de18d7fa9 142 printf("Init Error!");
edodm85 3:df8de18d7fa9 143 return iRet;
edodm85 3:df8de18d7fa9 144 }
edodm85 3:df8de18d7fa9 145 t.start();
edodm85 3:df8de18d7fa9 146
edodm85 3:df8de18d7fa9 147 while (true)
edodm85 3:df8de18d7fa9 148 {
edodm85 3:df8de18d7fa9 149 //mbed is alive?
edodm85 3:df8de18d7fa9 150 led2 = !led2;
edodm85 3:df8de18d7fa9 151 osDelay(500);
edodm85 3:df8de18d7fa9 152 }
edodm85 3:df8de18d7fa9 153 }
edodm85 3:df8de18d7fa9 154
edodm85 3:df8de18d7fa9 155
edodm85 3:df8de18d7fa9 156 void parse_cmd(int sizeCMD)
edodm85 3:df8de18d7fa9 157 {
edodm85 0:2208b72b1ba1 158 new_send = false;
edodm85 3:df8de18d7fa9 159 //printf("bufferRX: %s\r\n", bufferRX);
edodm85 0:2208b72b1ba1 160
edodm85 0:2208b72b1ba1 161 if(strcmp("snap", bufferRX) == 0)
edodm85 0:2208b72b1ba1 162 {
edodm85 3:df8de18d7fa9 163 bSnap_on = true;
edodm85 3:df8de18d7fa9 164 osSignalSet(tencid, 0x1);
edodm85 0:2208b72b1ba1 165 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 166 }else
edodm85 3:df8de18d7fa9 167 if(strncmp("grab", bufferRX, 4) == 0) // grab start grab stop
edodm85 0:2208b72b1ba1 168 {
edodm85 3:df8de18d7fa9 169 if(strncmp("start", &bufferRX[5], 5) == 0)
edodm85 3:df8de18d7fa9 170 {
edodm85 3:df8de18d7fa9 171 bGrab_on = true;
edodm85 3:df8de18d7fa9 172 osSignalSet(tencid, 0x1);
edodm85 3:df8de18d7fa9 173 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 3:df8de18d7fa9 174 }else
edodm85 0:2208b72b1ba1 175 {
edodm85 3:df8de18d7fa9 176 bGrab_on = false;
edodm85 3:df8de18d7fa9 177 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 3:df8de18d7fa9 178 }
edodm85 3:df8de18d7fa9 179 }else
edodm85 3:df8de18d7fa9 180 if(strncmp("init", bufferRX, 4) == 0) // init RGB 19200
edodm85 0:2208b72b1ba1 181 {
edodm85 3:df8de18d7fa9 182 char word[10];
edodm85 3:df8de18d7fa9 183 strncpy(CMDCamera.format, &bufferRX[5], 3);
edodm85 3:df8de18d7fa9 184 strncpy(word, &bufferRX[9], sizeCMD-9);
edodm85 3:df8de18d7fa9 185 CMDCamera.resolution = atoi(word);
edodm85 3:df8de18d7fa9 186
edodm85 3:df8de18d7fa9 187 printf("CMDCamera.format: %s\r\n", CMDCamera.format);
edodm85 3:df8de18d7fa9 188 printf("CMDCamera.resolution: %d\r\n", CMDCamera.resolution);
edodm85 3:df8de18d7fa9 189
edodm85 3:df8de18d7fa9 190 if(camera.Init(CMDCamera.format, CMDCamera.resolution) != 1)
edodm85 0:2208b72b1ba1 191 {
edodm85 0:2208b72b1ba1 192 printf("Init Fail\r\n");
edodm85 0:2208b72b1ba1 193 }
edodm85 3:df8de18d7fa9 194
edodm85 3:df8de18d7fa9 195 sprintf(bufferTX, "OV Init OK\r\n");
edodm85 3:df8de18d7fa9 196 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 197 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 198 }else
edodm85 3:df8de18d7fa9 199 if(strncmp("reg", bufferRX, 3) == 0) // reg r 018 reg w 018 004 reg
edodm85 3:df8de18d7fa9 200 {
edodm85 3:df8de18d7fa9 201 if(!bGrab_on)
edodm85 0:2208b72b1ba1 202 {
edodm85 3:df8de18d7fa9 203 strncpy(&Reg.type, &bufferRX[4], 1);
edodm85 3:df8de18d7fa9 204 char word[3];
edodm85 3:df8de18d7fa9 205
edodm85 3:df8de18d7fa9 206
edodm85 3:df8de18d7fa9 207 if(Reg.type == 'r')
edodm85 3:df8de18d7fa9 208 {
edodm85 3:df8de18d7fa9 209 strncpy(word, &bufferRX[6], 3);
edodm85 3:df8de18d7fa9 210 Reg.addr = atoi(word);
edodm85 3:df8de18d7fa9 211 memset(word, 0, sizeof(word));
edodm85 3:df8de18d7fa9 212 sprintf(bufferTX, "reg: %x", camera.ReadReg(Reg.addr));
edodm85 3:df8de18d7fa9 213 }else
edodm85 3:df8de18d7fa9 214 {
edodm85 3:df8de18d7fa9 215 strncpy(word, &bufferRX[6], 3);
edodm85 3:df8de18d7fa9 216 Reg.addr = atoi(word);
edodm85 3:df8de18d7fa9 217 strncpy(word, &bufferRX[10], 3);
edodm85 3:df8de18d7fa9 218 Reg.value = atoi(word);
edodm85 3:df8de18d7fa9 219 memset(word, 0, sizeof(word));
edodm85 3:df8de18d7fa9 220 camera.WriteReg(Reg.addr, Reg.value);
edodm85 3:df8de18d7fa9 221 sprintf(bufferTX, "%x", camera.ReadReg(Reg.addr));
edodm85 3:df8de18d7fa9 222 }
edodm85 3:df8de18d7fa9 223 if(sizeCMD == 3)
edodm85 3:df8de18d7fa9 224 {
edodm85 3:df8de18d7fa9 225 int n = 0;
edodm85 3:df8de18d7fa9 226 int g = 0;
edodm85 3:df8de18d7fa9 227 int c = 650;
edodm85 3:df8de18d7fa9 228 sprintf(bufferTX, "reg_tab: ");
edodm85 3:df8de18d7fa9 229 for (int i=0;i<201;i++)
edodm85 3:df8de18d7fa9 230 {
edodm85 3:df8de18d7fa9 231 n = snprintf(9+bufferTX+g, c, "%02X", camera.ReadReg(i));
edodm85 3:df8de18d7fa9 232 g = g + n;
edodm85 3:df8de18d7fa9 233 c = c - n - 1;
edodm85 3:df8de18d7fa9 234 }
edodm85 3:df8de18d7fa9 235 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 3:df8de18d7fa9 236 }
edodm85 3:df8de18d7fa9 237
edodm85 3:df8de18d7fa9 238 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 239 }
edodm85 3:df8de18d7fa9 240 }else
edodm85 3:df8de18d7fa9 241 if(strncmp("w_bit", bufferRX, 5) == 0) // w_bit0 018 001 w_bit1 018 001
edodm85 3:df8de18d7fa9 242 {
edodm85 3:df8de18d7fa9 243 int type;
edodm85 3:df8de18d7fa9 244 int reg_addr = 0;
edodm85 3:df8de18d7fa9 245 int reg_value = 0;
edodm85 3:df8de18d7fa9 246 char word[3];
edodm85 3:df8de18d7fa9 247 strncpy(word, &bufferRX[5], 1);
edodm85 3:df8de18d7fa9 248 type = atoi(word);
edodm85 3:df8de18d7fa9 249 strncpy(word, &bufferRX[7], 3);
edodm85 3:df8de18d7fa9 250 reg_addr = atoi(word);
edodm85 3:df8de18d7fa9 251 memset(word, 0, sizeof(word));
edodm85 3:df8de18d7fa9 252 strncpy(word, &bufferRX[11], 3);
edodm85 3:df8de18d7fa9 253 reg_value = atoi(word);
edodm85 3:df8de18d7fa9 254 //printf("reg read write: addr: %x - value %x\r\n", reg_addr, reg_value);
edodm85 3:df8de18d7fa9 255 int reg_value_now = camera.ReadReg(reg_addr);
edodm85 3:df8de18d7fa9 256
edodm85 3:df8de18d7fa9 257 if(type == 0)
edodm85 0:2208b72b1ba1 258 {
edodm85 3:df8de18d7fa9 259 reg_value = reg_value_now ^ reg_value;
edodm85 3:df8de18d7fa9 260 }else
edodm85 3:df8de18d7fa9 261 {
edodm85 3:df8de18d7fa9 262 reg_value = reg_value_now | reg_value;
edodm85 0:2208b72b1ba1 263 }
edodm85 3:df8de18d7fa9 264 //printf("reg value new: reg_value_now: %x - reg_value %x\r\n", reg_value_now, reg_value);
edodm85 3:df8de18d7fa9 265 camera.WriteReg(reg_addr, reg_value);
edodm85 3:df8de18d7fa9 266 memset(word, 0, sizeof(word));
edodm85 3:df8de18d7fa9 267 memset(bufferTX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 268 }else
edodm85 0:2208b72b1ba1 269 if(strcmp("reset", bufferRX) == 0)
edodm85 0:2208b72b1ba1 270 {
edodm85 0:2208b72b1ba1 271 mbed_reset();
edodm85 0:2208b72b1ba1 272 }else
edodm85 0:2208b72b1ba1 273 if(strcmp("time", bufferRX) == 0)
edodm85 0:2208b72b1ba1 274 {
edodm85 3:df8de18d7fa9 275 sprintf(bufferTX, "OV Tot time acq + send (mbed): %dms\r\n", t2-t1);
edodm85 0:2208b72b1ba1 276 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 0:2208b72b1ba1 277 memset(bufferTX, 0, sizeof(bufferTX));
edodm85 3:df8de18d7fa9 278 }else
edodm85 3:df8de18d7fa9 279 if(strcmp("ciao", bufferRX) == 0)
edodm85 1:0e4d23df43ea 280 {
edodm85 3:df8de18d7fa9 281 sprintf(bufferTX, "OV Test OK\r\n");
edodm85 3:df8de18d7fa9 282 client.send_all(bufferTX, sizeof(bufferTX));
edodm85 3:df8de18d7fa9 283 memset(bufferTX, 0, sizeof(bufferTX));
edodm85 3:df8de18d7fa9 284 }
edodm85 0:2208b72b1ba1 285 memset(bufferRX, 0, sizeof(bufferRX));
edodm85 0:2208b72b1ba1 286 }