I purchased this camera:
Serial Port Camera Module SPI OV528 communication protocol
Specifications:
1.Image sensor:Color CMOS
2.Pixels:0.3 mega pixels
3.Image Resolution:VGA640480\QVGA320240\QQVGA 160120
4.Image Compression:JPEG
5.Focal Length:2.8mm
6.Angle of View :100°
7.Minimum Lumen :1 Lux
8.Night Vision Image :Black-White Image
9.Night Vision Distance ;5 to 10M
10.Interface: RS232
11.Baud Rate:9600 to 115200bps
12.White Balance:Automatic
13.Exposure:Automatic
14.Auto Gain Control:Automatic
15.Working Power:DC5V
16.Working Current :About 80mA
17.Working Temperature:-10 to 60 degree Celsius
18.Size:32mm32mm\38mm*38mm
19.Default lens:F2.8mm IR 940nm (Different customer has different application,so 650nm or 850nm lens can be optional)
650nm lens can provide good and real color picture in normal light or under white led light.
850nm lens can provide more clearer picture under infrared led light.But in Day,some color of picture would be colour cast.
940nm lens'effect is between 650nm and 850nm.The effect in day is better than 850nm lens,the effect in night is better than 650nm
I want to use with Arduino UNO, just take a picture every 5 hours and stored on a SD.
I'm testing with this code:
// File SerialCamera_DemoCode_CJ-OV528.ino
// 8/8/2013 Jack Shao
// Demo code for using seeeduino or Arduino board to cature jpg format
// picture from seeed serial camera and save it into sd card. Push the
// button to take the a picture .
// For more details about the product please check http://www.seeedstudio.com/depot/
#include <arduino.h>
#include <SD.h>
#include <SoftwareSerial.h>
#define PIC_PKT_LEN 128 //data length of each read, dont set this too big because ram is limited
#define PIC_FMT_VGA 7
#define PIC_FMT_CIF 5
#define PIC_FMT_OCIF 3
#define CAM_ADDR 0
#define CAM_SERIAL softSerial
#define PIC_FMT PIC_FMT_VGA
File myFile;
SoftwareSerial softSerial(2, 3); //rx,tx (11-13 is used by sd shield)
const byte cameraAddr = (CAM_ADDR << 5); // addr
const int buttonPin = A5; // the number of the pushbutton pin
unsigned long picTotalLen = 0; // picture length
int picNameNum = 0;
/*********************************************************************/
void setup()
{
Serial.begin(115200);
CAM_SERIAL.begin(9600); //cant be faster than 9600, maybe difference with diff board.
pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input
//Serial.println("Initializing SD card....");
pinMode(4,OUTPUT); // CS pin of SD Card Shield
if (!SD.begin(4)) {
//Serial.print("sd init failed");
return;
}
//Serial.println("sd init done.");
initialize();
}
/*********************************************************************/
void loop()
{
int n = 0;
while(1){
//Serial.println("\r\nPress the button to take a picture");
while (digitalRead(buttonPin) == LOW); //wait for buttonPin status to HIGH
//Serial.println("taking");
if(digitalRead(buttonPin) == HIGH){
delay(20); //Debounce
if (digitalRead(buttonPin) == HIGH)
{
delay(200);
if (n == 0) preCapture();
Capture();
//Serial.print("Saving picture...");
GetData();
}
//Serial.print("\r\nDone ,number : ");
//Serial.println(n);
n++ ;
}
}
}
/*********************************************************************/
void clearRxBuf()
{
while (CAM_SERIAL.available())
{
CAM_SERIAL.read();
}
}
/*********************************************************************/
void sendCmd(char cmd[], int cmd_len)
{
for (char i = 0; i < cmd_len; i++) CAM_SERIAL.write(cmd[i]);
}
/*********************************************************************/
int readBytes(char *dest, int len, unsigned int timeout)
{
int read_len = 0;
unsigned long t = millis();
while (read_len < len)
{
while (CAM_SERIAL.available()<1)
{
if ((millis() - t) > timeout)
{
return read_len;
}
}
*(dest+read_len) = CAM_SERIAL.read();
Serial.write(*(dest+read_len));
read_len++;
}
return read_len;
}
/*********************************************************************/
void initialize()
{
char cmd[] = {0xaa,0x0d|cameraAddr,0x00,0x00,0x00,0x00} ;
unsigned char resp[6];
Serial.print("initializing camera...");
while (1)
{
sendCmd(cmd,6);
if (readBytes((char *)resp, 6,1000) != 6)
{
Serial.print(".");
continue;
}
if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x0d && resp[4] == 0 && resp[5] == 0)
{
if (readBytes((char *)resp, 6, 500) != 6) continue;
if (resp[0] == 0xaa && resp[1] == (0x0d | cameraAddr) && resp[2] == 0 && resp[3] == 0 && resp[4] == 0 && resp[5] == 0) break;
}
}
cmd[1] = 0x0e | cameraAddr;
cmd[2] = 0x0d;
sendCmd(cmd, 6);
//Serial.println("\nCamera initialization done.");
}
/*********************************************************************/
void preCapture()
{
char cmd[] = { 0xaa, 0x01 | cameraAddr, 0x00, 0x07, 0x00, PIC_FMT };
unsigned char resp[6];
while (1)
{
clearRxBuf();
sendCmd(cmd, 6);
if (readBytes((char *)resp, 6, 100) != 6) continue;
if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x01 && resp[4] == 0 && resp[5] == 0) break;
}
}
void Capture()
{
char cmd[] = { 0xaa, 0x06 | cameraAddr, 0x08, PIC_PKT_LEN & 0xff, (PIC_PKT_LEN>>8) & 0xff ,0};
unsigned char resp[6];
while (1)
{
clearRxBuf();
sendCmd(cmd, 6);
if (readBytes((char *)resp, 6, 100) != 6) continue;
if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x06 && resp[4] == 0 && resp[5] == 0) break;
}
cmd[1] = 0x05 | cameraAddr;
cmd[2] = 0;
cmd[3] = 0;
cmd[4] = 0;
cmd[5] = 0;
while (1)
{
clearRxBuf();
sendCmd(cmd, 6);
if (readBytes((char *)resp, 6, 100) != 6) continue;
if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x05 && resp[4] == 0 && resp[5] == 0) break;
}
cmd[1] = 0x04 | cameraAddr;
cmd[2] = 0x1;
while (1)
{
clearRxBuf();
sendCmd(cmd, 6);
if (readBytes((char *)resp, 6, 100) != 6) continue;
if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x04 && resp[4] == 0 && resp[5] == 0)
{
if (readBytes((char *)resp, 6, 1000) != 6)
{
continue;
}
if (resp[0] == 0xaa && resp[1] == (0x0a | cameraAddr) && resp[2] == 0x01)
{
picTotalLen = (resp[3]) | (resp[4] << 8) | (resp[5] << 16);
//Serial.print("picTotalLen:");
//Serial.println(picTotalLen);
break;
}
}
}
}
/*********************************************************************/
void GetData()
{
unsigned int pktCnt = (picTotalLen) / (PIC_PKT_LEN - 6);
if ((picTotalLen % (PIC_PKT_LEN-6)) != 0) pktCnt += 1;
char cmd[] = { 0xaa, 0x0e | cameraAddr, 0x00, 0x00, 0x00, 0x00 };
unsigned char pkt[PIC_PKT_LEN];
char picName[] = "pic00.jpg";
picName[3] = picNameNum/10 + '0';
picName[4] = picNameNum%10 + '0';
if (SD.exists(picName))
{
SD.remove(picName);
}
myFile = SD.open(picName, FILE_WRITE);
if(!myFile){
//Serial.println("myFile open fail...");
}
else{
for (unsigned int i = 0; i < pktCnt; i++)
{
cmd[4] = i & 0xff;
cmd[5] = (i >> 8) & 0xff;
int retry_cnt = 0;
retry:
delay(10);
clearRxBuf();
sendCmd(cmd, 6);
uint16_t cnt = readBytes((char *)pkt, PIC_PKT_LEN, 200);
unsigned char sum = 0;
for (int y = 0; y < cnt - 2; y++)
{
sum += pkt[y];
}
if (sum != pkt[cnt-2])
{
if (++retry_cnt < 100) goto retry;
else break;
}
myFile.write((const uint8_t *)&pkt[4], cnt-6);
//if (cnt != PIC_PKT_LEN) break;
}
cmd[4] = 0xf0;
cmd[5] = 0xf0;
sendCmd(cmd, 6);
}
myFile.close();
picNameNum ++;
}
But the camera does not initialize:
Anyone have experience with this camera and arduino?
thank you very much, greetings to all