shenhaiyu 发表于 2014-4-14 23:23:56

Arduino上用JPEG Color Camera拍照【转】

原帖地址:http://www.oschina.net/question/1425530_143521


今天晚上用Arduino+JPEG摄像头拍照,并且存到了SD开里面。因为网上的很多例子都说照出来的照片很花,结果果然如此,花了很长的时候将这个问题解决,得到了清晰的图像,现在分享给大家。



硬件清单


[*]Arduino UNO
[*]LinkSprite JPGE Color Camera
[*]SD Card Breakout Board
[*]导线若干
接线方法
SD Card Breakout Board


[*]MOSI – pin 11
[*]MISO – pin 12
[*]CLK – pin 13
[*] CS – pin 4
[*]VCC-5v
JPGE Camera

[*]RX-pin6
[*]TX-pin5
[*]VCC-5v
示例代码

// LinkSprite.com
// Note:
// 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

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

byte ZERO = 0x00;

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;

FilemyFile;

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

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;
int ii;

SendResetCmd();
delay(4000);                            //Wait 2-3 second to send take picture command

SendTakePhotoCmd();

while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
}

myFile = SD.open("pic.jpg", 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=incomingbyte;
if((a==0xFF)&&(a==0xD9))   //tell if the picture is finished
EndFlag=1;
j++;
count++;
}
}

for(j=0;j<count;j++)
{
if(a<0x10)
Serial.print("0");
Serial.print(a,HEX);         // observe the image through serial port
Serial.print(" ");
}

for(ii=0; ii<count; ii++)
myFile.write(a);

Serial.println();

i++;

}

myFile.close();

Serial.print("Finished writing data to file");

while(1);

}

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


测试运行


[*] 将所有的线接好。
[*]在Arduino IDE 1.0.5里面运行代码
[*]编译下载
[*]打开串口触发拍照
[*]当监视串口打出“Finished writing data to file”则照片数据已经写到SD里面
看看我拍的照片。



wing 发表于 2014-4-15 12:50:21

不错不错,效果还可以

shenhaiyu 发表于 2014-4-15 14:48:01

wing 发表于 2014-4-15 12:50 static/image/common/back.gif
不错不错,效果还可以

嗯,转来的帖子,在这分享一下,我没实际做过

hp198969 发表于 2014-4-15 20:09:22

保存后是什么格式呢?

shenhaiyu 发表于 2014-4-16 00:32:26

hp198969 发表于 2014-4-15 20:09 static/image/common/back.gif
保存后是什么格式呢?

没注意看程序吧,第75行:jpg

daiqx2 发表于 2014-5-2 09:07:50

如果要玩这个强烈建议用硬串口读取,速度会快很多

shenhaiyu 发表于 2014-5-5 15:38:27

daiqx2 发表于 2014-5-2 09:07 static/image/common/back.gif
如果要玩这个强烈建议用硬串口读取,速度会快很多

嗯,有待实验一下,给出个速度测试报告

smallfivecn 发表于 2016-9-17 14:14:19

好帖要顶呀
页: [1]
查看完整版本: Arduino上用JPEG Color Camera拍照【转】