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/
main.cpp
- Committer:
- edodm85
- Date:
- 2013-07-15
- Revision:
- 0:2208b72b1ba1
- Child:
- 1:0e4d23df43ea
File content as of revision 0:2208b72b1ba1:
/*
* 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;
}