Arkadaslar ben bir yerin güvenligi icin kendim Bilgisayar veya ona benzer kayit cihazlari kullanmadan söyle birsey yapmak istiyorum.
Arduino'ya bir Webcam baglayip bu Webcam fotograf cekip bu Fotografi SD kartina kayit ettirmek istiyorum.
Bunun icin su SD kart okuyucuyu almak istiyorum.
http://www.ebay.de/itm/SD-Kartenadapter-Card-Adapter-Arduino-ATmega-STM32-/301376967812?pt=LH_DefaultDomain_77&hash=item462b779484 (http://www.ebay.de/itm/SD-Kartenadapter-Card-Adapter-Arduino-ATmega-STM32-/301376967812?pt=LH_DefaultDomain_77&hash=item462b779484)
Kamera olarak su modul isimi görürümü?
http://www.ebay.de/itm/CMOS-Kamera-Modul-OV7670-640-x-480-SCCB-Compatible-w-I2C-Interface-fur-Arduino-/371033535119?pt=LH_DefaultDomain_77&hash=item566352728f (http://www.ebay.de/itm/CMOS-Kamera-Modul-OV7670-640-x-480-SCCB-Compatible-w-I2C-Interface-fur-Arduino-/371033535119?pt=LH_DefaultDomain_77&hash=item566352728f)
Hatta projeye birde Ultrasonic Module HC-SR04 ekleyip güvenlik icin belirledigim bölgeye yaklasan kisi veya cisimleri algilayip
Kameraya cekim yaptirip SD kartina kayit ettirebilirmiyim?
Böyle bir örnek Proje varmi link verebilirmisiniz?
Yardimci olacak arkadaslara simdiden tesekkürler.
Hiç uğraşma, bir Raspberry Pi ile onun kamerası ile hazır çok sayıda proje var. RPi'ın kendi kamerasını kullanmasanız bile bir uyumlu USB kamera da kullanabilirsiniz. Bir örnek:
http://www.instructables.com/id/Raspberry-Pi-as-low-cost-HD-surveillance-camera/?ALLSTEPS (http://www.instructables.com/id/Raspberry-Pi-as-low-cost-HD-surveillance-camera/?ALLSTEPS)
Saol Dostum ama bu si Arduino ve ona uyumlu modullerle yapmam gerek.
O nedenle Arduino ile yapilmis uygulamalar ariyorum. Bu konuda bilgisi olan varsa yardimci olursa sevinirim.
O zaman şu kamerayı kullanabilirsiniz. Seri porttan görüntü alabiliyorsunuz, elimde bir adet var ama henüz test edemedim.
http://robotic-controls.com/learn/arduino/linksprite-jpeg-camera (http://robotic-controls.com/learn/arduino/linksprite-jpeg-camera)
http://www.linksprite.com/article/shownews.php?lang=en&id=122 (http://www.linksprite.com/article/shownews.php?lang=en&id=122)
mesaj birleştirme:: 19 Kasım 2014, 16:18:46
Şu link tam istediğiniz durumu gösteriyor.
http://robotic-controls.com/learn/sensors/linksprite-jpeg-camera/saving-images-sd-card-0 (http://robotic-controls.com/learn/sensors/linksprite-jpeg-camera/saving-images-sd-card-0)
olmadi yaaa,
ben su kaerayi satin aldim.
http://www.ebay.de/itm/271513576941?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649 (http://www.ebay.de/itm/271513576941?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649)
bu aldigim Kameranin arduino ile uyumlu oldugunu okudugum icin aldim.
ama elle turulur bir proje uygulamasi bulamadim.
Doğru ürün almışsın. Arduino'nun hızı fotoğraf çekmeye müsait değil. Bu nedenle FIFO'lu bir kamera alman gerekirdi ki öyle yapmışsın. Çektiğin fotoğraf fifoya kaydolur, sonrasında fotoğrafı fifodan okursun. Sıkıntı yok.
@muhendisbey
o Zaman iyi yapmisim, peki benim istegime Uygun bir uygulama linki vermeniz mümkünmü?Tabiki bildiginiz bir link varsa?
Su linkte bir örnek var
http://nicolasfley.fast-page.org/?page_id=35 (http://nicolasfley.fast-page.org/?page_id=35)
Hatta orda söyle bir baglanti mevcut.
(http://nicolasfley.fast-page.org/wp-content/uploads/2013/09/schema_arduino_FIFO_OV7670.png)
fakat sitedeki bu resmin altinda verilen Arduino kodunu anlayamadim.
Kamare görüntüsü nasil aliniyor?
Ne Zaman aliniyor, herhangi bir Button veya ultrashall falan yok, SD karti yok.
ben ultrasall göz baglayip, 50 cm yaklasan bir cisim oldugunda Foto ceksin ve SD karta kayit etsin.
https://github.com/arndtjenssen/ov7670 (https://github.com/arndtjenssen/ov7670)
kod var.
Senin için aslında daha iyisi vardı. Ama linkleri kaybolmuş. "Witness camera" başlığı altında yayınlanan hatta elektronik dergilerin birisinde yayınlanmış bir proje.(Atmega32 ile yapılmış) İstediğin gibi pır ile sinyal geldiğinde kameradan görüntü alınır ve sd karta kaydedilen bir yapı)
http://www.electronics-lab.com/blog/?p=1567 (http://www.electronics-lab.com/blog/?p=1567)
http://www.electronics-lab.com/blog/?p=1074 (http://www.electronics-lab.com/blog/?p=1074)
http://www.electronics-lab.com/blog/?p=1460 (http://www.electronics-lab.com/blog/?p=1460)
http://electronix.ru/forum/index.php?act=Attach&type=post&id=16463 (http://electronix.ru/forum/index.php?act=Attach&type=post&id=16463)
en azından bir fikir verebilir.
@ambar7 bahsettiğin proje Ricci Bitti isimli şahsınki galiba ama sayfası kaybolmuş.
http://www.riccibitti.com/witnesscam/entry/witnesscam.htm (http://www.riccibitti.com/witnesscam/entry/witnesscam.htm)
Ruslar şuraya koymuş sağolsunlar:
http://roboforum.ru/forum58/topic5907.html (http://roboforum.ru/forum58/topic5907.html)
İranlılar'da da var ama üyelik istiyor:
http://www.tamirkaran.ir/forum/TamirKaran58/atmega32-3418.html (http://www.tamirkaran.ir/forum/TamirKaran58/atmega32-3418.html)
Biraz daha zorlasak Çinli'sini, Alman'ını filan da bulacaz ama gerek yok :)
@bocek
1.link calismiyor
2.linkdeki calismada Arduino kodu verilmemis
3.link arapca hangi linke tiklanacagini dahi bulamadim.
OV7670 Kamera 'yi satin aldim.
http://www.ebay.de/itm/271513576941?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649 (http://www.ebay.de/itm/271513576941?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649)
cünkü bir cok yerde Arduino ile uyumlu oldugu yaziyordu.
ama hic biryerde bu kameraya görüntü aldirip, bu görüntüyü SD karta resim dosyasi olarak kayit ettiren uygulama veya proje bulamadim.
Tabik ARDUINO UNO ile yapilmis bir örnek!
1. linkin çalışmadığını biliyorum. Onu @ambar7'nin bahsettiği "wittness camera" nın orijinal linki olsun diye verdim. Çünkü "witness camera" diye aratınca hep bu linke çıkıyor.
2. link te, kaybolan orijinal linktekileri bulmak isteyenler içindi.
3. linki (ve rusça, çince gibi olanları) google translate ile okuyacaksın.
Satın aldığın ebay sayfasında adam zaten örnek proje linki vermiş.
"Projekt OV7670 with the AL422 FIFO and an Arduino uno Rev3 , klicken Sie HIER (http://nicolasfley.fast-page.org/?page_id=35)"
mesaj birleştirme:: 22 Kasım 2014, 23:28:53
şurda da tam senin istediğin var:
https://github.com/arndtjenssen/ov7670
Burdaki uygulama ile isi cözdüm.
http://learn.linksprite.com/jpeg-camera/use-linksprite-jpeg-camera-to-take-picture-and-store-to-a-sd-card/ (http://learn.linksprite.com/jpeg-camera/use-linksprite-jpeg-camera-to-take-picture-and-store-to-a-sd-card/)
Simdi kameradan bir görüntüyü SD karta yazdirabiliyorum.
fakat bir kare Fotografi SD karta yaklasik 30-40 saniyede yaziyor.
sanirim buda Arduino üzerindeki Atmega 328P islemcisinin yavasligindan kaynaklaniyor.
Acaba bu süreyi indirme imkanim vami?
Bu olayda biraz zor. Normalde Uno üzerindeki işlemci 20MHz'de çalışabilir. Kart 16MHz'de çalışıyor. Kristal değiştilerek yükseltme imkanı var. Ama bu durumda seri port ve zamanlayıcı ile ilgili ayarlar kayar.
Burada kameradaki görüntüye aktarma şekli ile ilgili bir durumda olabilir. Ram kapasitesi 2k civarındadır. 147 bayt civarı değişkenlere ayrılıyor geri kalan hem veri aktarımında hemde flash belleğe yazmak için kullanılıyor. Baya küçük bir alan kalıyor.
Olay birde Arduino Mega (ATmega2560 işlemci ) bir kart ile de denebilir. Saat frekansı 16 MHz'da ama ram kapasitesi daha yüksek. Muhtemelen hızlanabilir.
Arduino due dahi kullansan olmaz. Kısaltman mümkün ama normal süresine inmesi için iyi bir işlemci kullanman şart.
Bu arada DUE hakkında da bilgi vereyim, işlemci ferrari görünümlü şahin. 84MHz demesine rağmen bunu çalışması esnasında asla göremiyorsunuz ve çalışması UNO'dan farksız kalıyor. Port manipulation dahil herşeyi denedim. Bir tek denemediğim atmel studio kaldı.
Bu arada eğer resmi hangi çözünürlükte kaydediyor bakılıp, çözünürlük azaltılarak kaydedilebilir.
ALternatif yöntem kameranın jpeg resim gönderme özelliği varsa o yöntem ile kaydedilebilir.
Ama bunlar için programın düzenlenmesi ve yeniden yazılması gerekebilir.
Aldigim Foto kalitesi 320x240 Pixel.
Bir örnek kare:
(http://img5.fotos-hochladen.net/uploads/piczmp78eo25f.jpg)
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?
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.
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 (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..!
// 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....
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.
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.
#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ş...
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.
#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.
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/ (http://learn.linksprite.com/jpeg-camera/use-linksprite-jpeg-camera-to-take-picture-and-store-to-a-sd-card/)
Teşekkürler..
(http://s30.postimg.cc/gp2284tcd/Ekran_Al_nt_s.jpg) (http://postimg.cc/image/gp2284tcd/)