Problem camera LinkSprite

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.

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);        
}

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

I never had this kind of problem :slight_smile:

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);
}