電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>基于ESP32 CAM設(shè)備Vader Cam的構(gòu)建

基于ESP32 CAM設(shè)備Vader Cam的構(gòu)建

2022-10-24 | zip | 0.07 MB | 次下載 | 免費

資料介紹

描述

問候。

所以這里有一些引人注目的東西,Vader Cam

Vader Cam 是一個基于 ESP32 CAM 的設(shè)備,它是一個實時視頻源流設(shè)備,我們可以通過網(wǎng)絡(luò)應(yīng)用程序訪問源并查看發(fā)生了什么。

這就像一個以達斯維德為主題的保姆攝像頭或監(jiān)控設(shè)備。

Darth Vader 一直在關(guān)注事物,我制作這個設(shè)備是為了用它來監(jiān)控在另一個房間里進行的 3D 打印作業(yè),但我們可以使用這個設(shè)備來監(jiān)控各種各樣的東西,從保姆到孩子甚至寵物。

這篇文章是關(guān)于這個 Vader Cam 的整個構(gòu)建過程,所以讓我們開始吧。

所需材料

這些是這個內(nèi)置的東西 -

Seeed Studio 的定制 PCB

ESP32 凸輪

M7 二極管 SMA

UART 編程

USB 微型端口

ESP32 板的排針

電源 - 智能手機適配器

關(guān)于 ESP32 CAM

poYBAGNVkTOAF7xtAAB0S8KOrlo436.png

ESP32 CAM 是一款非常實用的開發(fā)板,它在板的底部配備了一個 2MP OV2640 攝像頭模塊和一個 SD 讀卡器。

此外,它的價格約為 10 美元,對于這種功能強大的微控制器來說,這是一個相當不錯的價格標簽

本版本使用的WIFI模塊為ESP-32S,內(nèi)置32Mbit Flash和512KB Internal plus外置4M PSRAM。

它可以承受 5 伏電壓,這意味著我們可以使用低于 5V 的電壓為 ESP32 Cam 供電,如果您提供的電壓高于 5V,它就會被損壞。

Arduino IDE 安裝 ESP32 開發(fā)板

為了在 Arduino IDE 上安裝第三方開發(fā)板,我們必須復(fù)制他們的 JSON URL,

復(fù)制此 URL 并將其粘貼到 Arduino IDE 首選項中的附加板管理器 URL 中。

pYYBAGNVkTaAJ6shAAArJuMUolI422.png

(如果您在附加板管理器中已經(jīng)有其他開發(fā)板 URL,則可以在兩個 URL 之間放置一個逗號)

放好網(wǎng)址后,打開板子管理器,在里面搜索ESP32,然后下載ESP32 Board包。

poYBAGNVkTiAR_3kAAA9t49HI-E344.png

完成所有這些后,您需要重新啟動 Arduino IDE,新的 ESP32 板將出現(xiàn)在板管理器菜單中。

面包板設(shè)置

在開始這個項目之前,我們首先準備一個面包板設(shè)置,該設(shè)置由一個 ESP32 Cam 和一個 FTDI 板根據(jù)下面的示意圖連接。

pYYBAGNVkTqARRN9AACYL9cOdAQ293.png

ESP32 CAM 沒有板載編程芯片,這很糟糕,因此我們必須在串行編程模塊中添加一個外部 USB。

為此,我將使用這個 USB 轉(zhuǎn)串口模塊。該模塊基于 FTDI FT232 芯片。您也可以使用其他串行轉(zhuǎn)換器,它們的接線將保持不變,因為我們只需將 TX 和 RX 與 ESP32 連接。

將 FTDI 輸出設(shè)置為 5V

將 FTDI 的 VCC(即 5V)連接到 ESP32 CAM 的 5V

地到地

RX 到 U0T

TX 轉(zhuǎn) U0R

GPIO0 是 IO0 到 GND(這將使 ESP32 CAM 進入 Flash 模式)

主要代碼

?

#include "esp_camera.h"
#include 
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h"  //disable brownout problems
#include "esp_http_server.h"

//Replace with your network credentials
const char *ssid = "JioFiber-nCDgC";
const char *password = "jiexaifieXai5chu";

#define PART_BOUNDARY "123456789000000000000987654321"

// This project was tested with the AI Thinker Model, M5STACK PSRAM Model and M5STACK WITHOUT PSRAM
#define CAMERA_MODEL_AI_THINKER
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM

// Not tested with this model
//#define CAMERA_MODEL_WROVER_KIT

#if defined(CAMERA_MODEL_WROVER_KIT)
  #define PWDN_GPIO_NUM    -1
  #define RESET_GPIO_NUM   -1
  #define XCLK_GPIO_NUM    21
  #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      19
  #define Y4_GPIO_NUM      18
  #define Y3_GPIO_NUM       5
  #define Y2_GPIO_NUM       4
  #define VSYNC_GPIO_NUM   25
  #define HREF_GPIO_NUM    23
  #define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       32
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       17
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21

#elif defined(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
#else
  #error "Camera model not selected"
#endif

static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";

httpd_handle_t stream_httpd = NULL;

static esp_err_t stream_handler(httpd_req_t *req){
  camera_fb_t * fb = NULL;
  esp_err_t res = ESP_OK;
  size_t _jpg_buf_len = 0;
  uint8_t * _jpg_buf = NULL;
  char * part_buf[64];

  res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
  if(res != ESP_OK){
    return res;
  }

  while(true){
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("Camera capture failed");
      res = ESP_FAIL;
    } else {
      if(fb->width > 400){
        if(fb->format != PIXFORMAT_JPEG){
          bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
          esp_camera_fb_return(fb);
          fb = NULL;
          if(!jpeg_converted){
            Serial.println("JPEG compression failed");
            res = ESP_FAIL;
          }
        } else {
          _jpg_buf_len = fb->len;
          _jpg_buf = fb->buf;
        }
      }
    }
    if(res == ESP_OK){
      size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
      res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
    }
    if(fb){
      esp_camera_fb_return(fb);
      fb = NULL;
      _jpg_buf = NULL;
    } else if(_jpg_buf){
      free(_jpg_buf);
      _jpg_buf = NULL;
    }
    if(res != ESP_OK){
      break;
    }
    //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
  }
  return res;
}

void startCameraServer(){
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  config.server_port = 80;

  httpd_uri_t index_uri = {
    .uri       = "/",
    .method    = HTTP_GET,
    .handler   = stream_handler,
    .user_ctx  = NULL
  };
  
  //Serial.printf("Starting web server on port: '%d'\n", config.server_port);
  if (httpd_start(&stream_httpd, &config) == ESP_OK) {
    httpd_register_uri_handler(stream_httpd, &index_uri);
  }
}

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
 
  Serial.begin(115200);
  Serial.setDebugOutput(false);
  
  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;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  // Camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
  // Wi-Fi connection
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  Serial.print("Camera Stream Ready! Go to: http://");
  Serial.print(WiFi.localIP());
  
  // Start streaming web server
  startCameraServer();
}

void loop() {
  delay(1);
}

?

閃爍板步驟

在閃爍過程之前,您需要更改示例草圖中的一些內(nèi)容。

轉(zhuǎn)到示例> ESP32> 相機并打開CameraWebServer草圖

輸入您的 SSID 和密碼

將相機模塊從#define CAMERA_MODEL_WROVER_KIT更改為#define CAMERA_MODEL_AI_THINKER

現(xiàn)在,轉(zhuǎn)到工具并選擇正確的板,在我們的例子中是 AI-Thinker ESP32-CAM。

選擇正確的端口并點擊上傳。

現(xiàn)在,當 ESP32 開始上傳過程時,您將看到帶有點和破折號的連接消息。按下板底部的重置按鈕,點和劃線開始。

如果您在此設(shè)置過程中遇到無法連接的錯誤,這意味著您的時機不對,請重試,當?shù)谝粋€點出現(xiàn)在調(diào)試菜單中時,長按重置按鈕至少 1 秒鐘。

幾秒鐘后,您的草圖將被上傳。

現(xiàn)在從 FTDI 模塊中拔出 USB 并移除 GPIO0 和 GND 之間的跳線。

插入 USB 并打開串行監(jiān)視器。

ESP32 將與 WIFI 連接(需要 1 分鐘),您將看到 ESP32 CAM 的 IP 地址。

結(jié)果到目前為止...

我們復(fù)制 ESP32 Cam 的 IP 地址并在 Web 瀏覽器中打開它,它將顯示 ESP32 Cam 的實時信息。接下來,我們開始為此設(shè)置準備 PCB。

PCB設(shè)計

pYYBAGNVkT2AIqkIAAKHsk4WEtU830.jpg

1 / 2

完成面包板設(shè)置后,我們準備了一個簡單的 PCB 設(shè)計,其中包括一個 USB 微型端口和一個二極管,用于為 ESP32 Cam 供電。

至于讓這個電路板更美觀和更酷,我下載了一張黑白 Darth Vader 圖像并將其轉(zhuǎn)換為 BMP 圖像,這樣我就可以將它添加到 PCB 設(shè)計中。

我將 ESP32 Cam 放在 Darth Vader 臉的一側(cè),這樣看起來 Vader 正在通過 ESP32 Cam 看著我們。

從 Seeed Fusion 獲取 PCB

1 / 2

在完成 PCB 并生成其 Gerber 數(shù)據(jù)后,我將其發(fā)送到 SEEED STUDIO 以獲取樣本。

訂購了帶有白色絲印的 RED 阻焊層的 PCB。

我在一周內(nèi)收到了多氯聯(lián)苯,考慮到價格也很低,它們的質(zhì)量非常好。

Seeed Fusion PCB 服務(wù)為 PCB 制造和 PCB 組裝提供一站式原型設(shè)計,因此,他們在 7 個工作日內(nèi)生產(chǎn)出優(yōu)質(zhì) PCB 和快速交鑰匙 PCBA。

Seeed Studio Fusion PCB 組裝服務(wù)負責(zé)從PCB 制造、零件采購、組裝和測試服務(wù)的整個制造過程,因此您可以確保他們獲得優(yōu)質(zhì)產(chǎn)品。

在評估市場興趣并驗證工作原型后,Seeed Propagate Service 可以通過專業(yè)指導(dǎo)和強大的聯(lián)系網(wǎng)絡(luò)幫助您將產(chǎn)品推向市場。

PCB組裝

PCB組裝包括兩個步驟,

添加焊膏和二極管

添加頭針和 USB 端口

焊膏和添加二極管

我們首先將焊膏添加到電路板底部的每個組件焊盤,然后將二極管放置在其位置。

接下來,我們小心地提起整個 PCB 并將其放在熱板上。我正在使用我不久前制作的老式DIY 電爐。

熱板將表面加熱到焊膏熔化溫度,然后慢慢熔化。幾分鐘后焊膏完全融化,我們?nèi)∠翽CB并讓它冷卻片刻。

這是最終設(shè)置,我們使用烙鐵放置兩個插頭引腳連接器

結(jié)果

我們將 ESP32 放在 VaderCam 板上并插入 5V 充電器。

等待幾秒鐘后,我們在瀏覽器中打開 Web 應(yīng)用程序,我們可以看到來自 esp32 cam 的實時提要。

這就是今天的人們,如果您需要有關(guān)此項目的任何幫助,請發(fā)表評論。

?

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1ADE-12H混頻器規(guī)格書
  2. 0.28 MB   |  1次下載  |  5 積分
  3. 2AD9984A高性能10位顯示接口英文手冊
  4. 0.49 MB   |  1次下載  |  5 積分
  5. 351開發(fā)板芯片資料
  6. 14.95 MB   |  1次下載  |  1 積分
  7. 4用TL431LI-Q1監(jiān)控電流供應(yīng)
  8. 176.71KB   |  1次下載  |  免費
  9. 5十進制數(shù)據(jù)轉(zhuǎn)十六進制字符_轉(zhuǎn)ASCII碼
  10. 0.01 MB   |  次下載  |  免費
  11. 6使用TRF7970A進行NFC主動和被動點對點通信
  12. 926.87KB   |  次下載  |  免費
  13. 7LP8864-Q1 LP8864S-Q1 LP8866-Q1和LP8866S-Q1診斷說明和故障處理程序
  14. 577.42KB   |  次下載  |  免費
  15. 8將設(shè)計移植到LP3470A低lq電壓監(jiān)控器,以改善電源監(jiān)控
  16. 115.28KB   |  次下載  |  免費

本月

  1. 1HFSS電磁仿真設(shè)計應(yīng)用詳解PDF電子教程免費下載
  2. 24.30 MB   |  129次下載  |  1 積分
  3. 2正激、反激、推挽、全橋、半橋區(qū)別和特點
  4. 0.91 MB   |  36次下載  |  1 積分
  5. 3GBT 4706.1-2024家用和類似用途電器的安全第1部分:通用要求
  6. 7.43 MB   |  20次下載  |  免費
  7. 4在設(shè)計中使用MOSFET瞬態(tài)熱阻抗曲線
  8. 1.57MB   |  15次下載  |  免費
  9. 5幾張電動車充電器電路圖
  10. 0.23 MB   |  9次下載  |  1 積分
  11. 6AD18學(xué)習(xí)筆記
  12. 14.47 MB   |  8次下載  |  2 積分
  13. 7H橋中的電流感測
  14. 545.39KB   |  7次下載  |  免費
  15. 8電機驅(qū)動器電路板布局的最佳實踐
  16. 3.03MB   |  6次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935113次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191360次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183329次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81578次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73804次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65985次下載  |  10 積分