max246
1
Hi,
I go the camera http://www.sparkfun.com/products/10061 and when I bought it works but now I don't know what is going on.
I followed the manual, I tried two example of code but nothing.
I downloaded this script http://www.linksprite.com/download/showdownload.php?id=70&lang=en and I tried to see if after the reset comand I get the right response:
Command (HEX)
56 00 26 00
Return (HEX)
76 00 26 00
I sent the reset but what I got is a result with lot of HEX that there isn't the number 76
I am thinking that my camera is broken or something like that.
system
2
I have buied the same camera.
I have success to run code, but i dont see jpeg file.
Format is invalid.
/* Linksprite */
#include <SoftwareSerial.h>
#include <SD.h>
byte incomingbyte;
SoftwareSerial mySerial(6,7); //Configure pin 4 and 5 as soft serial port
//NewSoftSerial mySerial(6,7); //Configure pin 4 and 5 as soft serial port
int a=0x0000,j=0,k=0,count=0; //Read Starting address
uint8_t MH,ML;
boolean EndFlag=0;
void SendResetCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();
File imgFile, imgFile2, imgFile3, imgFile4;
void setup()
{
Serial.begin(38400);
mySerial.begin(38400);
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
void loop()
{
SendResetCmd();
delay(4000); //After reset, wait 2-3 second to send take picture command
imgFile = SD.open("nic20.jpg", FILE_WRITE);
imgFile2 = SD.open("nic21.jpg", FILE_WRITE);
imgFile3 = SD.open("nic22.jpg", FILE_WRITE);
imgFile4 = SD.open("nic23.jpg", FILE_WRITE);
SendTakePhotoCmd();
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
}
byte a[32];
while(!EndFlag)
{
j=0;
k=0;
count=0;
SendReadDataCmd();
delay(25);
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
k++;
if((k>5)&&(j<32)&&(!EndFlag))
{
a[j]=incomingbyte;
if((a[j-1]==0xFF)&&(a[j]==0xD9)) //Check if the picture is over
EndFlag=1;
j++;
count++;
}
}
for(j=0;j<count;j++)
{ if(a[j]<0x10)
Serial.print("0");
Serial.print(a[j],HEX);
imgFile.print(a[j],HEX);
imgFile2.write(byte(a[j]));
//imgFile3.print(byte(a[j])); sembra sbagliato
//imgFile4.print(a[j]); sembra sbagliato
Serial.print(" ");
} //Send jpeg picture over the serial port
Serial.println();
}
imgFile.close();
imgFile2.close();
imgFile3.close();
imgFile4.close();
while(1);
}
//Send Reset command
void SendResetCmd()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x26);
mySerial.write(byte(0x00));
}
//Send take picture command
void SendTakePhotoCmd()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(byte(0x00));
}
//Read data
void SendReadDataCmd()
{
MH=a/0x100;
ML=a%0x100;
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x32);
mySerial.write(0x0c);
mySerial.write(byte(0x00));
mySerial.write(0x0a);
mySerial.write(byte(0x00));
mySerial.write(byte(0x00));
mySerial.write(MH);
mySerial.write(ML);
mySerial.write(byte(0x00));
mySerial.write(byte(0x00));
mySerial.write(byte(0x00));
mySerial.write(0x20);
mySerial.write(byte(0x00));
mySerial.write(0x0a);
a+=0x20; //address increases 32£¬set according to buffer size
}
void StopTakePhotoCmd()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(0x03);
}
max246
3
My issue was the operation system, I was using Linux and I couldn't run the script.
I have made this article that may be can help you: Projects of max246: Issue with Linksprite and Linux
contecavour is saving data directly to SD, but probably it is not fast enought, and he loose some data from serial
max246
5
I never had this kind of problem 
system
6
i have founf an error in manual.
I must descrt other 5byte after 32byte of data.
#include <SoftwareSerial.h>
#include <SD.h>
byte incomingbyte;
SoftwareSerial mySerial(6,7); //Configure pin 4 and 5 as soft serial port
int a=0x0000,j=0,k=0,count=0; //Read Starting address
uint8_t MH,ML;
boolean EndFlag=0;
void SendResetCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();
void HiRes();
void MiRes();
void LoRes();
void ImageSize();
void Speed9600();
void Speed38400();
void Speed115200();
File imgFile;
char buffer[20];
uint8_t i;
int led = 9;
void setup()
{
mySerial.begin(38400);
pinMode(10, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
SD.begin(4);
}
void loop()
{
//Speed38400();
//delay(1000);
MiRes();
delay(100);
SendResetCmd();
delay(1000); //After reset, wait 2-3 second to send take picture command
strcpy(buffer, "NICJPG00.JPG");
for (i = 0; i < 100; i++) {
buffer[6] = '0' + i/10;
buffer[7] = '0' + i%10;
// create if does not exist, do not open existing, write, sync after write
if (! SD.exists(buffer)) {
break;
}
}
imgFile = SD.open(buffer, FILE_WRITE);
digitalWrite(led, HIGH);
SendTakePhotoCmd();
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
}
byte a[32];
while(!EndFlag)
{
j=0;
k=0;
count=0;
SendReadDataCmd();
delay(35); //con tempi piu bassi sembrano esserci piu errori
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
k++;
if((k>5)&&(j<37)&&(!EndFlag)) //portato a 37 e scarto gli ultimi 5
{
if (j<32)
{
a[j]=incomingbyte;
if((a[j-1]==0xFF)&&(a[j]==0xD9)) //Check if the picture is over
EndFlag=1;
count++;
}
j++;
}
}
for(j=0;j<count;j++)
{
// if(a[j]<0x10)
// Serial.print("0");
// Serial.print(a[j],HEX);
imgFile.write(byte(a[j])); //il piu vicino ai jpeg
// trovato anche così imgFile.write((char*)a);
// Serial.print(" ");
} //Send jpeg picture over the serial port
// Serial.println();
//delay(25);
}
imgFile.close();
digitalWrite(led, LOW);
while(1);
}
//Send Reset command
void SendResetCmd()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x26);
mySerial.write(byte(0x00));
}
//Send take picture command
void SendTakePhotoCmd()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(byte(0x00));
}
//Read data
void SendReadDataCmd()
{
MH=a/0x100;
ML=a%0x100;
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x32);
mySerial.write(0x0c);
mySerial.write(byte(0x00));
mySerial.write(0x0a);
mySerial.write(byte(0x00));
mySerial.write(byte(0x00));
mySerial.write(MH);
mySerial.write(ML);
mySerial.write(byte(0x00));
mySerial.write(byte(0x00));
mySerial.write(byte(0x00));
mySerial.write(0x20);
mySerial.write(byte(0x00));
mySerial.write(0x0a);
a+=0x20; //address increases 32£¬set according to buffer size
}
void StopTakePhotoCmd()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(0x03);
}
void HiRes()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x31);
mySerial.write(0x05);
mySerial.write(0x04);
mySerial.write(0x01);
mySerial.write(byte(0x00));
mySerial.write(0x19);
mySerial.write(byte(0x00));
}
void LoRes()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x31);
mySerial.write(0x05);
mySerial.write(0x04);
mySerial.write(0x01);
mySerial.write(byte(0x00));
mySerial.write(0x19);
mySerial.write(0x22);
}
void MiRes()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x31);
mySerial.write(0x05);
mySerial.write(0x04);
mySerial.write(0x01);
mySerial.write(byte(0x00));
mySerial.write(0x19);
mySerial.write(0x11);
}
void ImageSize()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x34);
mySerial.write(0x01);
mySerial.write(byte(0x00));
}
void Speed9600()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x24);
mySerial.write(0x03);
mySerial.write(0x01);
mySerial.write(0xAE);
mySerial.write(0xC8);
}
void Speed38400()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x24);
mySerial.write(0x03);
mySerial.write(0x01);
mySerial.write(0x2A);
mySerial.write(0xF2);
}
void Speed115200()
{
mySerial.write(0x56);
mySerial.write(byte(0x00));
mySerial.write(0x24);
mySerial.write(0x03);
mySerial.write(0x01);
mySerial.write(0x0D);
mySerial.write(0xA6);
}