淘寶購買的ESP-CAM+SD內存卡做一個200W像素的相機arduino IDE開發過程

ESP-CAM介紹

esp-cam是由一個ESP32+OV2640組成的模塊
這裏ESP32是藍牙,WIFI模塊
OV2640是像素爲200W的攝像頭(分辨率現在看來有點低了啊)

先說說開發和搭環境遇到的問題(及時吐槽)

1、首先是在arduino IDE中下載esp32開發板
這個真的是迷惑啊,第一次下載速度很慢,查到有人說打開VPN後下載,打開了VPN以後點擊下載就不能下載了???後來又把VPN關了速度又提上來了???發現好像是在github上下載的東西,那確實是不用掛什麼VPN

2、ESP-CAM的固件或者代碼死活是燒寫不進去
不知道有多少小夥伴都是卡在下面這個界面
在這裏插入圖片描述
這個簡直毒瘤,一直報這個錯誤,我查到大佬們說是在Connecting中按下上面RST按鈕就可以正常燒入,可我拼命連續按,或者按住都是這個報錯

這裏說下我後來是怎麼解決這個問題的,每個人的狀況可能不同
這個ESP-CAM講道理只需要一個串口轉USB就可以燒寫程序,我這裏用的是CH340(用的多比較熟悉),那麼我們想燒入ESP-CAM的接線方法是:
左邊CH340,右邊ESP-CAM
VCC ------ VCC
GND ------ GND
TX ------ RX
RX ------ TX

GND ------ GPIO0
問題就出在VCC接VCC這裏,我用CH340的3.3V接上了ESP-CAM的3.3V,按理來說這樣接肯定是沒有問題的,然後就浪費了我一個上午的時間。。。
一直失敗啊,那我想應該咋辦呢,也不清楚是不是ESP-CAM壞了,乾脆把3.3V拔了,接上5V供電吧,結果真就碰上了,代碼寫進去了。
在這裏插入圖片描述
人生如戲啊,不說了繼續莽

arduino IDE的開發環境搭建(百度其實很多一樣的)

1、先從arduino官網下載arduino IDE,下載地址:https://www.arduino.cc/en/Main/Software

2、下載完成以後打開arduino IDE–文件–首選項,在附加開發板管理器網址填入https://dl.espressif.com/dl/package_esp32_index.json後,點擊好

3、在工具-開發板管理器中搜索ESP32,然後點擊下載,我下載的是1.0.4也就是最新的,這裏下載過程可能有的人需要掛VPN,下面圖片是已經下載好的界面
在這裏插入圖片描述

4、不多廢話按照下圖紅框裏面的選項配置好,之後我們測試一下用例程代碼寫入ESP-CAM中
在這裏插入圖片描述

安信可公司的燒寫方法(這裏記錄一下,不是很方便我用的也少)

1、首先打開網站:
http://wiki.ai-thinker.com/esp32-cam
2、翻到下面下載攝像頭使用說明,大概9到10M的樣子很小的
在這裏插入圖片描述
3、照着裏面的使用說明來使用就行,這裏偷懶就不詳細說了

這裏怕有些人下載不下來我丟百度網盤了,反正才10M不到
鏈接:https://pan.baidu.com/s/1RVH0UbOp_yF435xn6CA64Q
提取碼:ub6a

ESP-CAM硬件連接以及代碼燒寫

這裏比較特殊,要用這個模塊的時候發現CH340沒帶來,正準備放棄,突然找到了機智雲的底板也是CH340,正準備繼續呢,突然又發現公母頭杜邦線只有3條,命運多舛啊,然後又想到剛好可以把VCC的一個腳單獨插啊,然後就有了下面這個圖

在這裏插入圖片描述

不管了我們繼續下一步,反正可以正常使用
打開一個arduino IDE自帶的ESP32的示例程序,這裏選了WIFIScan做一次測試,這個代碼是查找附近的WIFI的

在這裏插入圖片描述
然後一定記得選擇正確的串口還有GPIO0要接地,我們點擊上傳,可以看到上傳成功
在這裏插入圖片描述

然後我們可以打開arduino IDE的串口監視器看看,打開監視器以後按下ESP-CAM上面的復位,出現下面的信息
在這裏插入圖片描述
哇靠,這是什麼啊,代碼出問題了???仔細看看意思就知道原來是自己GPIO0還接着地呢,笨,拔掉後再按下RST試試,現在下圖顯示的纔是正常的,這不是找到10個wifi了嘛
在這裏插入圖片描述

最後ESP-CAM相機的代碼

做ESP-CAM也是心血來潮,突然看到B站的一個視頻挺有意思的
Bilibili:https://www.bilibili.com/video/av78467733/
相機:https://randomnerdtutorials.com/esp32-cam-take-photo-save-microsd-card/

ESP-CAM做相機代碼:

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-cam-take-photo-save-microsd-card
  
  IMPORTANT!!! 
   - Select Board "AI Thinker ESP32-CAM"
   - GPIO 0 must be connected to GND to upload a sketch
   - After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include "esp_camera.h"
#include "Arduino.h"
#include "FS.h"                // SD Card ESP32
#include "SD_MMC.h"            // SD Card ESP32
#include "soc/soc.h"           // Disable brownour problems
#include "soc/rtc_cntl_reg.h"  // Disable brownour problems
#include "driver/rtc_io.h"
#include <EEPROM.h>            // read and write from flash memory

// define the number of bytes you want to access
#define EEPROM_SIZE 1

// Pin definition for CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

int pictureNumber = 0;

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
 
  Serial.begin(115200);
  //Serial.setDebugOutput(true);
  //Serial.println();
  
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG; 
  
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  // Init Camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
  
  //Serial.println("Starting SD Card");
  if(!SD_MMC.begin()){
    Serial.println("SD Card Mount Failed");
    return;
  }
  
  uint8_t cardType = SD_MMC.cardType();
  if(cardType == CARD_NONE){
    Serial.println("No SD Card attached");
    return;
  }
    
  camera_fb_t * fb = NULL;
  
  // Take Picture with Camera
  fb = esp_camera_fb_get();  
  if(!fb) {
    Serial.println("Camera capture failed");
    return;
  }
  // initialize EEPROM with predefined size
  EEPROM.begin(EEPROM_SIZE);
  pictureNumber = EEPROM.read(0) + 1;

  // Path where new picture will be saved in SD Card
  String path = "/picture" + String(pictureNumber) +".jpg";

  fs::FS &fs = SD_MMC; 
  Serial.printf("Picture file name: %s\n", path.c_str());
  
  File file = fs.open(path.c_str(), FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file in writing mode");
  } 
  else {
    file.write(fb->buf, fb->len); // payload (image), payload length
    Serial.printf("Saved file to path: %s\n", path.c_str());
    EEPROM.write(0, pictureNumber);
    EEPROM.commit();
  }
  file.close();
  esp_camera_fb_return(fb); 
  
  // Turns off the ESP32-CAM white on-board LED (flash) connected to GPIO 4
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  rtc_gpio_hold_en(GPIO_NUM_4);
  
  delay(2000);
  Serial.println("Going to sleep now");
  delay(2000);
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}

void loop() {
  
}

如果你能配置完之前的開發環境,以及測試代碼可以燒入,直接可以將上面這段代碼複製到arduino IDE中直接上傳

這代碼就不做解釋了,原文網站中就有提到如何將圖片保存在內存卡排序問題以及其他的東西,ESP-CAM現在玩的人還是太少了,這裏做一個博客的記錄,有空去實現一些現有的github項目,二維碼識別,以及人臉識別,監控攝像頭這些。看完大佬們給個贊吧。
E

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章