ESP32-CAM वीडियो स्ट्रीमिंग सर्वर I2C और SPI कनेक्ट करता है

ईएसपी -32 सीएएम मॉड्यूल डायमोर से कैमरे के साथ

ESP32-CAM वीडियो स्ट्रीमिंग सर्वर


उपयोग का एक उदाहरण यहाँ है

आपको पहले पुस्तकालयों को स्थापित करना होगा: Arduino में Esp32 बोर्ड Idu विंडोज / Esp32 बोर्ड में Arduino Ix लिनक्स और मैक

विस्तृत सेटिंग्स लेख में हैं।

मेरे मामले में, मैंने AI-THINKER मॉड्यूल का उपयोग किया ताकि वह अधूरा हो जाए
#define CAMERA_MODEL_AI_THINKER

चेहरे की पहचान की कार्यक्षमता मेरे काम नहीं आई। लेख में टिप्पणी सहायक थी।

ऐसा लगता है कि 1.02 ईएसपी कोर का उपयोग करते समय चेहरे की पहचान अब काम नहीं कर रही है (उदाहरण कार्यक्रम के साथ कम से कम)। 1.01 कोर पर वापस लौटना और उस कोर से संबंधित उदाहरण कार्यक्रम का उपयोग करना, इसे 'ठीक' करेगा

लायब्रेरी के पिछले संस्करण में वापस लुढ़का 1.01 सब कुछ काम किया।


मेरे पास I2C 128x64 और TFT SPI 128x128 डिस्प्ले हैं

यदि आप एक CAM मॉड्यूल नहीं है तो FIFO के साथ आर्टिकल OV7670 को कैमरे को डिस्प्ले से कैसे जोड़ा जाए। OV2640 और OV7670 कैमरों का समर्थन करें

लेखन के समय, निम्नलिखित ने मेरे लिए काम किया

ESP32 कैमरा + वाईफ़ाई सर्वर + I2C प्रदर्शन (प्रवेश)
ESP32 कैमरा + एसपीआई डिस्प्ले 1.44 "TFT 128x128 v1.1 (AdaFruit)
ESP32 कैमरा + SPI डिस्प्ले 1.8 "TFT 128 * 160 (एस्प्रेसिफ लाइब्रेरी)

WiFi ड्राइवर का SPI बस से टकराव होता है। एक अलग पुस्तकालय का उपयोग करने के लिए संभव समाधान। वाईफाई मॉड्यूल के प्रारंभ के समय समस्या उत्पन्न हुई।

मुख्य समस्या यह है कि ईएसपी 32-सीएएम मॉड्यूल में सीमित संख्या में मुक्त पैर हैं। पोर्ट का हिस्सा कैमरा के लिए उपयोग किया जाता है, एसडी-कार्ड के साथ समानांतर में। बोर्ड पर sd-card कनेक्टर स्थापित है। एक अन्य निष्कर्ष (IO4) एलईडी टॉर्च है।

I2C डिस्प्ले B / W कैमरे से प्राप्त छवि के साथ वास्तविक उपयोग के लिए विशेष रुचि नहीं है। TFT रंग और उच्च संकल्प। उस पर आप पहले से ही चेहरा देख सकते हैं। इस तरह के डिस्प्ले या थोड़े उच्च रिज़ॉल्यूशन पर आप डोर आई बना सकते हैं

मैं तुरंत कहूंगा कि AdaFruit पुस्तकालय सबसे तेज नहीं है। मैं प्रति सेकंड कुछ फ्रेम प्रदर्शित करने में कामयाब रहा। यह पुस्तकालयों का उपयोग करने के लिए अधिक आशाजनक है जो निम्न स्तर पर काम करते हैं। लेकिन मैं अपने प्रदर्शन 1.44 "128x128 SPI V1.1 के साथ ESP32_TFT_library प्राप्त करने में सक्षम नहीं था। शायद ILI9163 समर्थित नहीं है। मैंने 1.8" 128 * 160 SPI TFT लिया और मैं लगभग 12 FPS निचोड़ने में कामयाब रहा! लिंक

वहाँ पुस्तकालयों की एक जोड़ी है कि तेजी से काम कर रहे हैं। लेकिन कुछ को esp-32 ( लिंक ) के लिए पोर्ट नहीं किया गया है:

4.98 सेकंड Adafruit_ST7735
1.71 सेकंड ST7735X_kbv
1.30 सेकंड PDQ_ST7735

वीडियो प्रभावशाली है:



दो बंदरगाहों का उपयोग करते समय , माइक्रोकंट्रोलर पर एचएसपीआई या वीएसपीआई हार्डवेयर बंदरगाहों में से एक और ILI9341 चालक के साथ प्रदर्शन प्रति सेकंड 30 फ्रेम प्राप्त कर सकते हैं ( लिंक )।



लेकिन जैसा कि मैंने पहले ईएसपी 32-सीएएम मॉड्यूल में कहा था, केवल एक एसपीआई मुफ्त है। इसे निम्नलिखित पिनों पर प्रदर्शित किया जाता है:

IO2 - डीसी (A0)
IO14 - सीएलके
IO15 - सीएस
IO13 - MOSI (SDA)
IO12 - MISO (इनपुट। प्रयुक्त नहीं)

IO0 - बीसीकेएल (बैकलाइट नहीं)
IO16 - आरएसटी





मैंने जिस पहली लाइब्रेरी की कोशिश की, वह AdaFruit SSD1306 थी

I2C 128x64 ब्लू ओएलईडी डिस्प्ले



#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display; void init_display(){ pinMode(14,INPUT_PULLUP); pinMode(15,INPUT_PULLUP); Wire.begin(14,15); display = Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } .... 

camera_capture ()
 #define BACKCOLOR 0x0000 // Black #define PIXELCOLOR 0xFFFF // White #define FRAME_WIDTH 320 #define FRAME_HEIGHT 240 uint16_t pixel_color = 0; esp_err_t camera_capture(){ //acquire a frame camera_fb_t * fb = esp_camera_fb_get(); if (!fb) { ESP_LOGE(TAG, "Camera Capture Failed"); return ESP_FAIL; } int i = 0; for(int y = 0; y < SCREEN_HEIGHT; y++){ for(int x = 0; x < SCREEN_WIDTH; x++){ i = y * FRAME_WIDTH + x; // FRAMESIZE_QVGA // 320x240 char ch = (char)fb->buf[i]; if (ch > 128) pixel_color = WHITE; else pixel_color = BLACK; // Draw a single pixel in white display.drawPixel(x, y, pixel_color); } } display.display(); //return the frame buffer back to the driver for reuse esp_camera_fb_return(fb); Serial.println("Capture frame ok."); return ESP_OK; } 


Esp32 में काम करते समय, सॉफ्टवेयर I2C अनुकरण का उपयोग किया जाता है। शामिल IO14 और IO15। लगभग किसी भी मुक्त बंदरगाह का उपयोग किया जा सकता है, न कि एच / डब्ल्यू बस का उपयोग किया जाता है।

मोनोक्रोम 0.96 "i2c OLED डिस्प्ले को कैसे कनेक्ट करें। आपको I2C बस पर डिस्प्ले एड्रेस पर ध्यान देने की आवश्यकता है। इस मामले में, 0x3C।

एसपीआई डिस्प्ले 1.8 "टीएफटी 128 * 160 एस्प्रेसिफ लाइब्रेरी




तारों आरेख:

IO2 - ए 0
IO14 - एससीके
IO15 - सीएस
IO13 - एसडीए
IO16 - RESET


बोर्ड पर एक एसडी-कार्ड रीडर भी है

IO कॉन्फ़िगरेशन:

 // Configuration for other boards, set the correct values for the display used //---------------------------------------------------------------------------- #define DISP_COLOR_BITS_24 0x66 //#define DISP_COLOR_BITS_16 0x55 // Do not use! // ############################################# // ### Set to 1 for some displays, ### // for example the one on ESP-WROWER-KIT ### // ############################################# #define TFT_INVERT_ROTATION 0 #define TFT_INVERT_ROTATION1 0 // ################################################ // ### SET TO 0X00 FOR DISPLAYS WITH RGB MATRIX ### // ### SET TO 0X08 FOR DISPLAYS WITH BGR MATRIX ### // ### For ESP-WROWER-KIT set to 0x00 ### // ################################################ #define TFT_RGB_BGR 0x08 // ############################################################## // ### Define ESP32 SPI pins to which the display is attached ### // ############################################################## // The pins configured here are the native spi pins for HSPI interface // Any other valid pin combination can be used #define PIN_NUM_MISO 12 // SPI MISO #define PIN_NUM_MOSI 13 // SPI MOSI #define PIN_NUM_CLK 14 // SPI CLOCK pin #define PIN_NUM_CS 15 // Display CS pin #define PIN_NUM_DC 2 // Display command/data pin #define PIN_NUM_TCS 0 // Touch screen CS pin (NOT used if USE_TOUCH=0) // -------------------------------------------------------------- // ** Set Reset and Backlight pins to 0 if not used ! // ** If you want to use them, set them to some valid GPIO number #define PIN_NUM_RST 0 // GPIO used for RESET control #define PIN_NUM_BCKL 0 // GPIO used for backlight control #define PIN_BCKL_ON 0 // GPIO value for backlight ON #define PIN_BCKL_OFF 1 // GPIO value for backlight OFF // -------------------------------------------------------------- // ####################################################### // Set this to 1 if you want to use touch screen functions // ####################################################### #define USE_TOUCH TOUCH_TYPE_NONE // ####################################################### // ####################################################################### // Default display width (smaller dimension) and height (larger dimension) // ####################################################################### #define DEFAULT_TFT_DISPLAY_WIDTH 128 #define DEFAULT_TFT_DISPLAY_HEIGHT 160 // ####################################################################### #define DEFAULT_GAMMA_CURVE 0 #define DEFAULT_SPI_CLOCK 32000000 #define DEFAULT_DISP_TYPE DISP_TYPE_ST7735B //---------------------------------------------------------------------------- #define TFT_INVERT_ROTATION 0 #define TFT_INVERT_ROTATION1 1 #define TFT_INVERT_ROTATION2 0 

एस्प्रेसिफ से पर्यावरण और विकास पर्यावरण स्थापित करें। ऐसा करने के बारे में विस्तृत निर्देश।

पुस्तकालय स्थापित करें। पुस्तकालय को इकट्ठा करने के लिए दो सुधार किए जाने की आवश्यकता है।

makefile:

 + CFLAGS += -Wno-error=tautological-compare \ + -Wno-implicit-fallthrough \ + -Wno-implicit-function-declaration 

घटक / tft / tftspi.c:

 + #include "driver/gpio.h 

पैच

फिर ESP32 कैमरा ड्राइवर स्थापित करें।

कॉन्फ़िगर:

#। $ HOME / esp / esp-idf / export.sh
# idf.py menuconfig




फर्मवेयर और निगरानी के लिए यूएसबी पोर्ट के लिए उपयोग की अनुमति दें:

# सोडो चामोद 777 / देव / टिट्सबी 0

हम इकट्ठा करते हैं और भरते हैं:

#make -j4 && फ्लैश बनाते हैं

12_PS Send_data पद्धति का उपयोग करके पैकेट लेखन के माध्यम से प्राप्त किया जाता है। रिकॉर्डिंग पिक्सेल से पिक्सेल नहीं है, लेकिन स्क्रीन की चौड़ाई के बराबर एक पूरी लाइन है:

 esp_err_t camera_capture(){ uint32_t tstart, t1, t2; tstart = clock(); //acquire a frame camera_fb_t * fb = esp_camera_fb_get(); if (!fb) { printf("Camera Capture Failed\n"); return ESP_FAIL; } t1 = clock() - tstart; printf("Capture camera time: %u ms\r\n", t1); int i = 0, bufPos = 0; uint8_t hb, lb; color_t color; color_t *color_line = heap_caps_malloc(_width*3, MALLOC_CAP_DMA); tstart = clock(); for(int y = 0; y < _height; y++) { bufPos = 0; for(int x = 0; x < _width; x++) { i = (y * FRAME_WIDTH + x) << 1; hb = fb->buf[i] ; lb = fb->buf[i + 1]; color.r = (lb & 0x1F) << 3; color.g = (hb & 0x07) << 5 | (lb & 0xE0) >> 3; color.b = hb & 0xF8; color_line[bufPos] = color; bufPos++; // TFT_drawPixel(0, 0, color, 1); } disp_select(); send_data(0, y, _width-1, y, _width, color_line); wait_trans_finish(1); disp_deselect(); } free(color_line); t1 = clock() - tstart; printf("Send buffer time: %u ms\r\n", t1); esp_camera_fb_return(fb); printf("Capture frame ok.\n"); return ESP_OK; } 

कैमरा कॉन्फ़िगरेशन
 // #if 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 void camera_init_(){ 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.fb_count = 2; // for display config.frame_size = FRAMESIZE_QVGA; config.pixel_format = PIXFORMAT_RGB565; // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { printf("Camera init failed with error 0x%x", err); return; } printf("Camera init OK\n"); } 


जिस्ट

FRAME_WIDTH QVGA के लिए 320 पिक्सेल की फ़्रेम चौड़ाई है

 config.frame_size = FRAMESIZE_QVGA; // 320x240 

वास्तव में, हम पूर्ण फ्रेम से डिस्प्ले विंडो 128 * 160 पर देखते हैं

एक वीडियो कैमरा बफर के साथ विन्यास के लिए लॉग इन करें (config.fb_count = 1)
कैमरा समय पर कब्जा: 32 एमएस
बफर समय भेजें: 47 एमएस
कब्जा फ्रेम ठीक है।

परिणाम
1000 / (32 + 47) = 12.65 एफपीएस

दो कैमकॉर्डर बफ़र के साथ कॉन्फ़िगरेशन के लिए लॉग इन करें (config.fb_count = 2)
कैमरा समय पर कब्जा: 39 एमएस

बफर समय भेजें: 63 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 59 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 34 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 40 एमएस

बफर समय भेजें: 64 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 59 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 34 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 40 एमएस

बफर समय भेजें: 63 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 60 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 34 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 39 एमएस

बफर समय भेजें: 63 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 60 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 1 एमएस

बफर समय भेजें: 34 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 40 एमएस

बफर समय भेजें: 63 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 60 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 34 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 40 एमएस

बफर समय भेजें: 63 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 59 एमएस

कब्जा फ्रेम ठीक है।
कैमरा समय पर कब्जा: 0 एमएस

बफर समय भेजें: 35 एमएस

कब्जा फ्रेम ठीक है।

कैमकॉर्डर के दूसरे बफर के उपयोग के कारण, कुछ चक्रों में बफर तुरन्त प्राप्त होता है। सबसे पहले, पूरा चक्र एक बफर का उपयोग करने से कम में प्राप्त किया जाता है, लेकिन फिर इस समय "पर चलता है"। चक्रों के बीच अंतराल तैर रहा है।

कई बार मैंने लॉग में पकड़ा "ब्राउनआउट डिटेक्टर चालू हो गया था" इसलिए मैंने डिटेक्टर को बंद कर दिया। क्योंकि सबसे पहले मैंने 3.3V ESP32-CAM पिन से बैकलाइट डिस्प्ले खिलाया

 #include "soc/rtc_cntl_reg.h" ... WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector 

निष्कर्ष


ESP32 कम लागत वाले कार्यात्मक मॉड्यूल। बोर्ड के सीएएम संस्करण में कार्यान्वित बंदरगाहों के लिए निष्कर्षों की एक भयावह कमी है, इसलिए यदि आपको वास्तव में कैमरे की आवश्यकता है तो सीएएम संस्करण चुनें।

Source: https://habr.com/ru/post/hi463157/


All Articles