我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


A good and cheap solution for arduino to take picture.
簡易的arduino拍照方案 最近臉部辨識已經有一些成果,因此研究如何用arduino拍照然後辨識主人來開門之類的指令,但是發現arduino拍照其實有很大的問題,wemos D1裝OV7670後,pin腳幾乎用完無法再接SD卡,最後搜尋到PTC06串口攝影機(NT$400-600之間),2 pin有TX RX即可拍照。 複製arduino程式碼後在D1執行卻發現拍照的結果都失敗,檔案錯誤無法讀取,但是在UNO上卻是正常,比對兩者拍照的檔案才發現,在ESP8266及ESP32會在jpg標頭的部份產生誤差,因此必須觀察才可決定要如何處理。
NodeMcu ESP-32s接法:
SD卡接法:
//MOSI   - pin 23
//MISO  - pin 19
//CLK(SCK) - pin 18
//CS   - pin 5
PTC06接法:
//TX - pin12 //RX - pin13 程式碼 ------------------------------------------------------------------------------------------------------------------------------------- // 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 23
//MISO - pin 19
//CLK(SCK)- pin 18
//CS - pin 5
//*****************************
//CAM setup
//RX - pin12
//TX - pin13
//if tx rx set error will get empty data
#include
#include
#include
HardwareSerial mySerial(1);

byte ZERO = 0x00;
byte incomingbyte;
long int a=0x0000,j=0,k=0,count=0,i=0;
uint8_t MH,ML;
boolean EndFlag=0;
File myFile;
boolean firsttime=true;
void setup()
{
Serial.begin(115200);
mySerial.begin(115200,SERIAL_8N1,13,12);

Serial.print("Initializing SD card...");
if (!SD.begin())
{
Serial.println("initialization failed!");
return;
}
uint8_t cardType = SD.cardType();
if(cardType == CARD_NONE){
Serial.println("No SD card attached");
return;
}

if(cardType == CARD_MMC) {Serial.println("MMC");}
else if(cardType == CARD_SD) { Serial.println("SDSC");}
else if(cardType == CARD_SDHC) {Serial.println("SDHC");}
else {Serial.println("UNKNOWN");}

Serial.println("initialization done.");
SD.remove("/pic.jpg");

byte a[32];
int ii;
SetImageSizeCmd("m");//set pic size s=160x120,m=620x240,l=640x480
delay(20);
SendResetCmd();
delay(2000); //Wait 2-3 second to send take picture command
Serial.println("Take Pic Command");
SendTakePhotoCmd(); //take pic command
firsttime=true;
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
}

myFile = SD.open("/pic.jpg", FILE_WRITE); //open file to save pic
Serial.print("Saving to SD");
while(!EndFlag)
{ Serial.print(".");
j=0;
k=0;
count=0;
SendReadDataCmd();

delay(20);//WAIT
if(firsttime)
{ //第一次可能讀取到表頭,因此要改成k>10,要查看hex資料
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
k++;
if((k>10)&&(j<32)&&(!EndFlag))
{
a[j]=incomingbyte;
j++;
count++;
}
}
firsttime=false;
}
else
{
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)){EndFlag=1;}
j++;
count++;
}
}
}

//print data to serial
// for(j=0;j // {
// if(a[j]<0x10)
// Serial.print("0");
// Serial.print(a[j],HEX);
// Serial.print(" ");
// }
// Serial.println();

//save files to sd card
for(ii=0; ii {
myFile.write(a[ii]);
}
i++;
}
myFile.close();
Serial.println("");
Serial.println("Finished writing data to file");
}

void loop()
{

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

void SetImageSizeCmd(String size)
{
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x31);
mySerial.write(0x05);
mySerial.write(0x04);
mySerial.write(0x01);
mySerial.write(ZERO);
mySerial.write(0x19);
if (size=="s")
{
Serial.println("set pic size as 160x120");
mySerial.write(0x22);//160*120
}
else if (size=="m")
{
Serial.println("set pic size as 320x240");
mySerial.write(0x11);//320*240
}
else if (size=="l")
{
Serial.println("set pic size as 640x480");
mySerial.write(ZERO);//640*480
} else
{
Serial.println("set pic size as 320x240");
mySerial.write(0x11);//320*240
}

}
void SetBaudRateCmd()
{ //seem useless
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x24);
mySerial.write(0x03);
mySerial.write(0x01);
mySerial.write(0x0D);
mySerial.write(0xA6);
}

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

arrow
arrow
    全站熱搜

    夜市 小霸王 發表在 痞客邦 留言(0) 人氣()