Arduino ile Kamera ile Fotograf cekip SD Karta kayit ettirmek isiyorum.

Başlatan Ugur2006, 19 Kasım 2014, 14:56:52

Ugur2006

Aldigim Foto kalitesi 320x240 Pixel.
Bir örnek kare:


bu edaptaki bir fotoyu 30-40 Saniye gibi bir sürede olusturuyor.
Sanirm Serial Kamera modulun icindeki islemciyi okuyup, sonra SD karta HEX olarak yaziyor bu nedenle.
baska alternatif?

Kabil ATICI

muhtemeler (programını fazla incelemedim) 512 baytlık gruplar halinde okuyup yazıyor.
Tek tek okuyup yazması daha fazla zaman alır. Senin için resim küçük olabilir ama resmi 320x240x3 olarak bayt cinsinden değer sahip bir alanı kaplıyor. Aslında en hızlısı tüm resmi işlemcinin okuyup sonra bunu doğrudan sd karta göndermesi olurdu, ama göreceğin gibi bu işlemcinin alamayacağı bir ram boyutundadır.
Program incelenip kamera ve sd kard kablo boyutları kısaltılıp iletişim protokolleri biraz daha hızlandırılabilir.

daha üst işlemci bulunan bir kart kullanılabilir (RAM olarak),

veya kendi programınızı yazabilecekseniz ARM işlemci kullanan bir kart kullanılabilir.
ambar7

Ugur2006

Neyse hizi simdilik idare eder.
Ama söyle bir sorunla karsilastim.
Bu yaptigim projenin Arduino dosyasi asagidaki linkte.
Su an kod Serial Monitör'ün acilisinda Kameradan bir kere görüntü alip PIC.JPG  adinda SD karta yaziyor.
https://www.dropbox.com/s/2wh5i9ulww5q1lu/Serial_Kamera.ino?dl=0

Ben bu kodu su sekile getirmek istiyorum.Istedigim su:
Bu devreye bir Button ekleyip örnegin A5 pinine.
Bu buttona her tiklandiginda SD karta Resim olustursun.
Her Resimin adini pic1.jpg, pic2.jpg, pic3.jpg, ....  seklinde kayit etsin istiyorum.
Yukardaki kodu bu sekilde nasil düzenlemeliyim?
Ben düzenlemeye calistim fakat bir türlü beceremedim..!

Kabil ATICI

// 1. SD must be formated to FAT16
// 2. As the buffer of softserial has 64 bytes, so the code read 32 bytes each time
// 3. Please add the libaray to the lib path

//  * SD card attached to SPI bus as follows:
//  ** MOSI - pin 11
//  ** MISO - pin 12
//  ** CLK  - pin 13
//  ** CS   - pin 4

//  * Camera
//  ** RX   - pin 6
//  ** TX   - pin 5
//  ** VCC  - 5V
//  ** GND  - GND



#include <SoftwareSerial.h>
#include <SD.h>

byte ZERO = 0x00;
const int buttonPin = 5; //sinyal bacağı girişi
int foto_say=0;  //fotograf sayacı

byte incomingbyte;
SoftwareSerial mySerial(5, 6);         // Set Arduino pin 4 and 5 as softserial

long int a = 0x0000, j = 0, k = 0, count = 0, i = 0;
uint8_t MH, ML;
boolean EndFlag = 0;

File  myFile;

void SendResetCmd();
void SetBaudRateCmd();
void SetImageSizeCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();

void setup()
{

  Serial.begin(38400);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  mySerial.begin(38400);
pinMode(buttonPin, INPUT);

  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

}

void loop()
{

  byte a[32];
  int ii;
if (buttonState == LOW) {   //pin5 girişi lojik 0 ise işleme başla.
  foto_say ++;
  SendResetCmd();
  delay(4000);                            //Wait 2-3 second to send take picture command
  SendTakePhotoCmd();
  while (mySerial.available() > 0)
  {
    incomingbyte = mySerial.read();
  }
  String dosya_adi;
  dosya_adi =String("pic")+ foto_say + "jpg" ;
  myFile = SD.open(dosya_adi, FILE_WRITE); //<strong><span style="color: #ff0000;">The file name should not be too long</span></strong>
  while (!EndFlag)
  {
    j = 0;
    k = 0;
    count = 0;
    SendReadDataCmd();
    delay(20); //250 for regular
    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)) //tell if the picture is finished
          EndFlag = 1;
        j++;
        count++;
      }
    }
    for (j = 0; j < count; j++)
    {
      if (a[j] < 0x10)
        Serial.print("0");
      Serial.print(a[j], HEX);          // observe the image through serial port
      Serial.print(" ");
    }
    for (ii = 0; ii < count; ii++)
      myFile.write(a[ii]);
    Serial.println();
    i++;
  }
  myFile.close();
  Serial.print("Finished writing data to file");
}

}

void SendResetCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x26);
  mySerial.write(ZERO);
}

void SetImageSizeCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x31);
  mySerial.write(0x05);
  mySerial.write(0x04);
  mySerial.write(0x01);
  mySerial.write(ZERO);
  mySerial.write(0x19);
  mySerial.write(0x11);
}

void SetBaudRateCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x24);
  mySerial.write(0x03);
  mySerial.write(0x01);
  mySerial.write(0x2A);
  mySerial.write(0xC8);

}

void SendTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(ZERO);
}

void SendReadDataCmd()
{
  MH = a / 0x100;
  ML = a % 0x100;
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x32);
  mySerial.write(0x0c);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(MH);
  mySerial.write(ML);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(0x20);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  a += 0x20;
}

void StopTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(0x03);
}


Kütüphaneler olmadığı için denemedim o yüzden
hata olabilir ama mantık üç aşağı beş yukarı bu şekilde..

Seri port ile ilgili satırları ayıklarsan biraz daha hızlanabilir. Bu program bazı seri port satırlarını başka açlar için de kullanıyor. Dikkatli olmak gerekir.

Not: Elektrik kesilince pic sayma olayını sıfırdan başlar. dikkat etmek gerekir. Yoksa sayacı eeprom'a yazmak ve oradan okumak gerekirdi....
ambar7

SERRO EFE

Kayıt hızı için kamera daha yüksek baudrate destekliyordur. 38400 baud olarak çalıştırmışsınız bunu 115200 hatta fazlasını destekliyorsa kayıt hızınız o oranda artacaktır.

Ugur2006

Alıntı yapılan: ambar7 - 30 Kasım 2014, 17:39:07
// 1. SD must be formated to FAT16
// 2. As the buffer of softserial has 64 bytes, so the code read 32 bytes each time
// 3. Please add the libaray to the lib path

//  * SD card attached to SPI bus as follows:
//  ** MOSI - pin 11
//  ** MISO - pin 12
//  ** CLK  - pin 13
//  ** CS   - pin 4

//  * Camera
//  ** RX   - pin 6
//  ** TX   - pin 5
//  ** VCC  - 5V
//  ** GND  - GND



#include <SoftwareSerial.h>
#include <SD.h>

byte ZERO = 0x00;
const int buttonPin = 5; //sinyal bacağı girişi
int foto_say=0;  //fotograf sayacı

byte incomingbyte;
SoftwareSerial mySerial(5, 6);         // Set Arduino pin 4 and 5 as softserial

long int a = 0x0000, j = 0, k = 0, count = 0, i = 0;
uint8_t MH, ML;
boolean EndFlag = 0;

File  myFile;

void SendResetCmd();
void SetBaudRateCmd();
void SetImageSizeCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();

void setup()
{

  Serial.begin(38400);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  mySerial.begin(38400);
pinMode(buttonPin, INPUT);

  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

}

void loop()
{

  byte a[32];
  int ii;
if (buttonState == LOW) {   //pin5 girişi lojik 0 ise işleme başla.
  foto_say ++;
  SendResetCmd();
  delay(4000);                            //Wait 2-3 second to send take picture command
  SendTakePhotoCmd();
  while (mySerial.available() > 0)
  {
    incomingbyte = mySerial.read();
  }
  String dosya_adi;
  dosya_adi =String("pic")+ foto_say + "jpg" ;
  myFile = SD.open(dosya_adi, FILE_WRITE); //<strong><span style="color: #ff0000;">The file name should not be too long</span></strong>
  while (!EndFlag)
  {
    j = 0;
    k = 0;
    count = 0;
    SendReadDataCmd();
    delay(20); //250 for regular
    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)) //tell if the picture is finished
          EndFlag = 1;
        j++;
        count++;
      }
    }
    for (j = 0; j < count; j++)
    {
      if (a[j] < 0x10)
        Serial.print("0");
      Serial.print(a[j], HEX);          // observe the image through serial port
      Serial.print(" ");
    }
    for (ii = 0; ii < count; ii++)
      myFile.write(a[ii]);
    Serial.println();
    i++;
  }
  myFile.close();
  Serial.print("Finished writing data to file");
}

}

void SendResetCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x26);
  mySerial.write(ZERO);
}

void SetImageSizeCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x31);
  mySerial.write(0x05);
  mySerial.write(0x04);
  mySerial.write(0x01);
  mySerial.write(ZERO);
  mySerial.write(0x19);
  mySerial.write(0x11);
}

void SetBaudRateCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x24);
  mySerial.write(0x03);
  mySerial.write(0x01);
  mySerial.write(0x2A);
  mySerial.write(0xC8);

}

void SendTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(ZERO);
}

void SendReadDataCmd()
{
  MH = a / 0x100;
  ML = a % 0x100;
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x32);
  mySerial.write(0x0c);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(MH);
  mySerial.write(ML);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(0x20);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  a += 0x20;
}

void StopTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(0x03);
}

@ambar7
Dostum buttonPin degiskeni tanimlamissin fakat kod icinde buttonState yazmissin , orayi düzelltim fakat su satirdada hata veriyor
myFile = SD.open(dosya_adi, FILE_WRITE); [code]verdigi hata söyle:

no matching function for call to 'SDClass::open(String&, int)

open fonksiyonu char tipinde paremteresini aliyormus.
File SDClass::open(const char*, uint8_t)
 

@SERRO EFE
Kayit hizini 115200 yaptigimda olusan .jpg dosyasinin ici bos cikiyor. 

Kabil ATICI

#include <SPI.h>
#include <SoftwareSerial.h>
#include <SD.h>

// 1. SD must be formated to FAT16
// 2. As the buffer of softserial has 64 bytes, so the code read 32 bytes each time
// 3. Please add the libaray to the lib path

//  * SD card attached to SPI bus as follows:
//  ** MOSI - pin 11
//  ** MISO - pin 12
//  ** CLK  - pin 13
//  ** CS   - pin 4

//  * Camera
//  ** RX   - pin 6
//  ** TX   - pin 5
//  ** VCC  - 5V
//  ** GND  - GND



//#include <SoftwareSerial.h>
//#include <SD.h>

byte ZERO = 0x00;
const int buttonPin = 5; //sinyal bacağı girişi
int foto_say = 0; //fotograf sayacı
int buttonState = 0;

byte incomingbyte;
SoftwareSerial mySerial(5, 6);         // Set Arduino pin 4 and 5 as softserial

long int a = 0x0000, j = 0, k = 0, count = 0, i = 0;
uint8_t MH, ML;
boolean EndFlag = 0;

File  myFile;

/*void SendResetCmd();
void SetBaudRateCmd();
void SetImageSizeCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();
*/
void setup()
{

  Serial.begin(38400);
  mySerial.begin(38400);
  pinMode(buttonPin, INPUT);

  // Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    ;//   Serial.println("initialization failed!");
    return;
  }
  // Serial.println("initialization done.");
}

void loop()
{

  byte a[32];
  int ii;
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {   //pin5 girişi lojik 0 ise işleme başla.
    foto_say ++;
    SendResetCmd();
    delay(4000);                            //Wait 2-3 second to send take picture command
    SendTakePhotoCmd();
    while (mySerial.available() > 0)
    {
      incomingbyte = mySerial.read();
    }
    dosya_adi(foto_say);
    //myFile = SD.open(dosya_adi[foto_say], FILE_WRITE); //<strong><span style="color: #ff0000;">The file name should not be too long</span></strong>
    while (!EndFlag)
    {
      j = 0;
      k = 0;
      count = 0;
      SendReadDataCmd();
      delay(20); //250 for regular
      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)) //tell if the picture is finished
            EndFlag = 1;
          j++;
          count++;
        }
      }
      for (j = 0; j < count; j++)
      {
        if (a[j] < 0x10)
          Serial.print("0");
        Serial.print(a[j], HEX);          // observe the image through serial port
        Serial.print(" ");
      }
      for (ii = 0; ii < count; ii++)
        myFile.write(a[ii]);
      Serial.println();
      i++;
    }
    myFile.close();
    // Serial.print("Finished writing data to file");
  }

}

void dosya_adi(int dosya_no)
{
if (dosya_no==1)
myFile = SD.open("pic1.jpg", FILE_WRITE);
else if (dosya_no==2)
myFile = SD.open("pic2.jpg", FILE_WRITE);
else if (dosya_no==3)
myFile = SD.open("pic1.jpg", FILE_WRITE);
else if (dosya_no==4)
myFile = SD.open("pic4.jpg", FILE_WRITE);
else if (dosya_no==5)
myFile = SD.open("pic5.jpg", FILE_WRITE);
else if (dosya_no==6)
myFile = SD.open("pic6.jpg", FILE_WRITE);
else if (dosya_no==7)
myFile = SD.open("pic7.jpg", FILE_WRITE);
else if (dosya_no==8)
myFile = SD.open("pic8.jpg", FILE_WRITE);
else if (dosya_no==9)
myFile = SD.open("pic9.jpg", FILE_WRITE);
else if (dosya_no==10)
myFile = SD.open("pic10.jpg", FILE_WRITE);
else if (dosya_no==11)
myFile = SD.open("pic11.jpg", FILE_WRITE);
else if (dosya_no==12)
myFile = SD.open("pic12.jpg", FILE_WRITE);
else if (dosya_no==13)
myFile = SD.open("pic13.jpg", FILE_WRITE);
else if (dosya_no==14)
myFile = SD.open("pic14.jpg", FILE_WRITE);
else if (dosya_no==15)
myFile = SD.open("pic15.jpg", FILE_WRITE);
else if (dosya_no==16)
myFile = SD.open("pic16.jpg", FILE_WRITE);
else if (dosya_no==17)
myFile = SD.open("pic17.jpg", FILE_WRITE);
else if (dosya_no==18)
myFile = SD.open("pic18.jpg", FILE_WRITE);
else if (dosya_no==19)
myFile = SD.open("pic19.jpg", FILE_WRITE);
else if (dosya_no==20)
myFile = SD.open("pic20.jpg", FILE_WRITE);
}


void SendResetCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x26);
  mySerial.write(ZERO);
}

void SetImageSizeCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x31);
  mySerial.write(0x05);
  mySerial.write(0x04);
  mySerial.write(0x01);
  mySerial.write(ZERO);
  mySerial.write(0x19);
  mySerial.write(0x11);
}

void SetBaudRateCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x24);
  mySerial.write(0x03);
  mySerial.write(0x01);
  mySerial.write(0x2A);
  mySerial.write(0xC8);

}

void SendTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(ZERO);
}

void SendReadDataCmd()
{
  MH = a / 0x100;
  ML = a % 0x100;
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x32);
  mySerial.write(0x0c);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(MH);
  mySerial.write(ML);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(0x20);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  a += 0x20;
}

void StopTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(0x03);
}


Benim bulduğum çözüm ancak bu kadar olabiliyor...

void dosya_adi(int dosya_no)  fonksiyonu altında dosya isimlerini ayrı ayrı tanımlamakta. Pek iyi bir çözüm olmasada şidilik bu kadar.
sadece foto_say dikkate etmek gerekecek. Ben 20'ye kadar dosyaya isim verdirdim. Daha isteniyorsa eklenmesi ve foto_say  o değeri geçtiği zaman sıfırlanması gerekir yoksa resimleri kaydetmez.

mesaj birleştirme:: 01 Aralık 2014, 00:14:23

#include <SPI.h>
#include <SoftwareSerial.h>
#include <SD.h>

// 1. SD must be formated to FAT16
// 2. As the buffer of softserial has 64 bytes, so the code read 32 bytes each time
// 3. Please add the libaray to the lib path

//  * SD card attached to SPI bus as follows:
//  ** MOSI - pin 11
//  ** MISO - pin 12
//  ** CLK  - pin 13
//  ** CS   - pin 4

//  * Camera
//  ** RX   - pin 6
//  ** TX   - pin 5
//  ** VCC  - 5V
//  ** GND  - GND

byte ZERO = 0x00;
const int buttonPin = 5; //sinyal bacağı girişi
int foto_say = 0; //fotograf sayacı
int buttonState = 0;

byte incomingbyte;
SoftwareSerial mySerial(5, 6);         // Set Arduino pin 4 and 5 as softserial

long int a = 0x0000, j = 0, k = 0, count = 0, i = 0;
uint8_t MH, ML;
boolean EndFlag = 0;

File  myFile;

/*void SendResetCmd();
void SetBaudRateCmd();
void SetImageSizeCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();
*/
void setup()
{

  Serial.begin(38400);
  mySerial.begin(38400);
  pinMode(buttonPin, INPUT);

  // Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    ;//   Serial.println("initialization failed!");
    return;
  }
  // Serial.println("initialization done.");
}

void loop()
{

  byte a[32];
  int ii;
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {   //pin5 girişi lojik 0 ise işleme başla.
    foto_say ++;
    SendResetCmd();
    delay(4000);                            //Wait 2-3 second to send take picture command
    SendTakePhotoCmd();
    while (mySerial.available() > 0)
    {
      incomingbyte = mySerial.read();
    }

    char dosya_adi[25] = {};
    sprintf(dosya_adi, "pic%d.jpg", foto_say);

    myFile = SD.open(dosya_adi, FILE_WRITE); //<strong><span style="color: #ff0000;">The file name should not be too long</span></strong>
    while (!EndFlag)
    {
      j = 0;
      k = 0;
      count = 0;
      SendReadDataCmd();
      delay(20); //250 for regular
      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)) //tell if the picture is finished
            EndFlag = 1;
          j++;
          count++;
        }
      }
      for (j = 0; j < count; j++)
      {
        if (a[j] < 0x10)
          Serial.print("0");
        Serial.print(a[j], HEX);          // observe the image through serial port
        Serial.print(" ");
      }
      for (ii = 0; ii < count; ii++)
        myFile.write(a[ii]);
      Serial.println();
      i++;
    }
    myFile.close();
    // Serial.print("Finished writing data to file");
  }

}

void SendResetCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x26);
  mySerial.write(ZERO);
}

void SetImageSizeCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x31);
  mySerial.write(0x05);
  mySerial.write(0x04);
  mySerial.write(0x01);
  mySerial.write(ZERO);
  mySerial.write(0x19);
  mySerial.write(0x11);
}

void SetBaudRateCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x24);
  mySerial.write(0x03);
  mySerial.write(0x01);
  mySerial.write(0x2A);
  mySerial.write(0xC8);

}

void SendTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(ZERO);
}

void SendReadDataCmd()
{
  MH = a / 0x100;
  ML = a % 0x100;
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x32);
  mySerial.write(0x0c);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(MH);
  mySerial.write(ML);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(0x20);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  a += 0x20;
}

void StopTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(0x03);
}


Böyle bir çözümü de olabiliyormuş...
ambar7

Ugur2006

Dostum bugün deneme firsatim oldu düzenledigin Kodu denemek icin. Sonuc oluyor, SD kartina
PIC1.jpg
PIC2.jpg
PIC3.jpg
diye kayit ediyor.

Fakat,
PIC1.jpg dosyasi aciliyor ve resim görünüyor yaklasik 13 kb dolayinda.
Diger  PIC2.jpg,PIC3.jpg,PIC4.jpg, ... dosyalarinin hepsi bos oluyor, ve 0 kb büyüklügünde yaziliyor.

Kabil ATICI

#include <SPI.h>
#include <SoftwareSerial.h>
#include <SD.h>

// 1. SD must be formated to FAT16
// 2. As the buffer of softserial has 64 bytes, so the code read 32 bytes each time
// 3. Please add the libaray to the lib path

//  * SD card attached to SPI bus as follows:
//  ** MOSI - pin 11
//  ** MISO - pin 12
//  ** CLK  - pin 13
//  ** CS   - pin 4

//  * Camera
//  ** RX   - pin 6
//  ** TX   - pin 5
//  ** VCC  - 5V
//  ** GND  - GND

byte ZERO = 0x00;
const int buttonPin = 5; //sinyal bacağı girişi
int foto_say = 0; //fotograf sayacı
int buttonState = 0;

byte incomingbyte;
SoftwareSerial mySerial(5, 6);         // Set Arduino pin 4 and 5 as softserial

long int a = 0x0000, j = 0, k = 0, count = 0, i = 0;
uint8_t MH, ML;
boolean EndFlag = 0;

File  myFile;

void setup()
{

  Serial.begin(38400);
  mySerial.begin(38400);
  pinMode(buttonPin, INPUT);

  // Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    ;//   Serial.println("initialization failed!");
    return;
  }
  // Serial.println("initialization done.");
}

void loop()
{

  byte a[32];
  int ii;
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {   //pin5 girişi lojik 0 ise işleme başla.

 j = 0;      //başlangıç değerleri
 k = 0;  //her dosya yazmada sıfırlanması gereken
 count = 0;
 i = 0;
 EndFlag = 0; 
 ZERO = 0x00;
 for (int gg=0;gg<32;gg++)
 {
 a[gg]=0;
 }
//a = 0;      
    
    foto_say ++;
    SendResetCmd();
    delay(4000);                            //Wait 2-3 second to send take picture command
    SendTakePhotoCmd();
    while (mySerial.available() > 0)
    {
      incomingbyte = mySerial.read();
    }

    char dosya_adi[25] = {};
    sprintf(dosya_adi, "pic%d.jpg", foto_say);

    myFile = SD.open(dosya_adi, FILE_WRITE); //<strong><span style="color: #ff0000;">The file name should not be too long</span></strong>
    while (!EndFlag)
    {
      j = 0;
      k = 0;
      count = 0;
      SendReadDataCmd();
      delay(20); //250 for regular
      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)) //tell if the picture is finished
            EndFlag = 1;
          j++;
          count++;
        }
      }
      for (j = 0; j < count; j++)
      {
        if (a[j] < 0x10)
          Serial.print("0");
        Serial.print(a[j], HEX);          // observe the image through serial port
        Serial.print(" ");
      }
      for (ii = 0; ii < count; ii++)
        myFile.write(a[ii]);
      Serial.println();
      i++;
    }
    myFile.close();
    // Serial.print("Finished writing data to file");
  }
}

void SendResetCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x26);
  mySerial.write(ZERO);
}

void SetImageSizeCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x31);
  mySerial.write(0x05);
  mySerial.write(0x04);
  mySerial.write(0x01);
  mySerial.write(ZERO);
  mySerial.write(0x19);
  mySerial.write(0x11);
}

void SetBaudRateCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x24);
  mySerial.write(0x03);
  mySerial.write(0x01);
  mySerial.write(0x2A);
  mySerial.write(0xC8);

}

void SendTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(ZERO);
}

void SendReadDataCmd()
{
  MH = a / 0x100;
  ML = a % 0x100;
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x32);
  mySerial.write(0x0c);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(MH);
  mySerial.write(ML);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(0x20);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  a += 0x20;
}

void StopTakePhotoCmd()
{
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(0x03);
}


Benim bu kodu doğrudan donanım üzerinde deneme şansım yok. Sadece derlenip, derlenmediğini  bakabilirim.
ambar7

sahinn

Merhaba arkadaşlar,

Ben de bitirme tezim için aynı proje üzerinde çalışıyorum. Kodları deniyorum ama bir türlü aşağıdaki resimde yer alan kısmı geçemedim. "Initializing SD card..." yazıp daha sonra "initialization failed!" hatası veriyor ve kalıyor. Burayı geçebilirsek herhalde çalışacaktır. Pin numaraları da aynı şekilde bağlı acaba onlarda mı sıkıntı var? Yardımcı olabilir misiniz?

Pin bağlantısı:
//  * SD card attached to SPI bus as follows:
//  ** MOSI - pin 11
//  ** MISO - pin 12
//  ** CLK  - pin 13
//  ** CS   - pin 4

//  * Camera
//  ** RX   - pin 6
//  ** TX   - pin 5
//  ** VCC  - 5V
//  ** GND  - GND

Proje bunun aynısı: http://learn.linksprite.com/jpeg-camera/use-linksprite-jpeg-camera-to-take-picture-and-store-to-a-sd-card/
Teşekkürler..