Beetle ESP32-C6

产品简介

ESP32-S3 AI CAM是一款基于ESP32-S3芯片设计的智能摄像头模组,专为视频图像处理和语音交互打造,适用于视频监控、边缘图像识别、语音对话等AI项目。ESP32-S3支持高性能神经网络运算与信号处理能力,赋予设备强大的图像识别和语音交互功能。

强大的AI处理能力,智能图像与语音识别
ESP32-S3 AI CAM内置ESP32-S3芯片,具备卓越的神经网络计算能力。它不仅可以在摄像头图像中进行智能识别,还能进行复杂的边缘计算任务。同时,麦克风和扬声器的集成使其支持语音识别、语音对话,能够实现远程指令控制、实时互动等多种AI功能,适用于物联网设备和智能监控应用。

广角红外摄像头,适应全天候监控需求
ESP32-S3 AI CAM的广角红外摄像头结合红外补光灯和光敏传感器,在弱光和完全黑暗的环境中依然能保持出色的图像清晰度。无论是白天还是夜晚,ESP32-S3 AI CAM都能确保监控画面的稳定性和清晰度,为安防和监控系统提供可靠支持。

语音交互与控制,实现智能自动化
ESP32-S3 AI CAM内置麦克风和扬声器,可实现语音识别与对话功能。在智能家居、物联网(IoT)设备中,这一功能可以帮助用户通过语音控制摄像头或其他设备,简化操作流程,增强智能化体验。

联网支持,扩展在线AI功能
除了本地AI处理能力,ESP32-S3 AI CAM可通过Wi-Fi接入互联网,通过云端或在线大模型扩展更多智能功能。通过Wi-Fi联网,该模组可以与云端AI平台进行对接,调用在线的大规模语言模型和视觉模型,实现更复杂的任务处理,如高级的图像分类、语音翻译、自然语言对话等功能。这使得ESP32-S3 AI CAM不仅限于本地计算,还能依托在线资源进行远程智能操作,显著提升其在物联网(IoT)设备中的应用潜力。

产品特性

  • 多样的AI玩法
    • 边缘图像识别(基于EdgeImpulse)
    • 在线图像识别(openCV、yolo)
    • 语音、图像在线大模型(ChatGPT)
  • 具有广角夜视摄像头,红外补光,昼夜可用
  • 板载MIC、功放,单板实现语音交互
  • 提供多种AI模型,提供训练模型教程,快速上手

产品参数

基本参数

  • 工作电压: 3.3V
  • Type-C输入电压: 5V DC
  • VIN输入电压:5-12V DC
  • 工作温度:-10~60℃
  • 模块尺寸:42*42mm

摄像头参数

  • 传感器型号:OV3660
  • 像素:200W
  • 感光:可见光、940nm红外
  • 可视角度:160°
  • 焦距:0.95
  • 光圈:2.0
  • 畸变:<8%

硬件信息

  • 处理器:Xtensa® 双核32位LX7微处理器
  • 主频:240 MHz
  • SRAM:512KB
  • ROM:384KB
  • Flash:16MB
  • PSRAM:8MB
  • RTC SRAM:16KB
  • USB: USB 2.0 OTG全速接口
WIFI
  • WIFI协议:IEEE 802.11b/g/n
  • WIFI频宽: 2.4 GHz 频带支持 20 MHz 和 40 MHz 频宽
  • WIFI模式:Station 模式、SoftAP 模式、SoftAP+Station 模式和混杂模式
  • WIFI频率:2.4GHz
  • 帧聚合: TX/RX A-MPDU, TX/RX A-MSDU
蓝牙
  • 蓝牙协议:Bluetooth 5、Bluetooth mesh
  • 蓝牙频率:125 Kbps、500 Kbps、1 Mbps、2 Mbps

功能指示图

功能示意

  • OV3660:160°广角红外摄像头
  • IR:红外补光灯(IO47)
  • MIC:I2S PDM麦克风
  • LED:板载LED灯(IO3)
  • ALS:LTR-308环境光传感器
  • ESP32-S3:ESP32-S3R8芯片
  • SD:SD卡槽
  • Flash:16MB Flash
  • VIN:5-12V DC输入
  • HM6245:电源芯片
  • Type-C:USB Type-C接口用于供电烧录代码
  • Gravity
    • +: 3.3-5V
    • -:GND
    • 44:IO44,ESP32-S3原生TX
    • 43:IO43,ESP32-S3原生RX
  • RST:复位按键
  • BOOT:BOOT按键(IO0)
  • SPK:MX1.25-2P喇叭接口
  • MAX98357:I2S功放芯片

引脚分配图

首次使用

当您首次使用ESP32,您需要了解以下步骤

  1. 添加开发板JSON链接
  2. 下载主控的核心
  3. 选择开发板以及串口
  4. 烧录程序

Arduino环境配置

添加URL板卡链接

  • 打开Arduino IDE,点击File->Preferences
DFRobot ESP32
  • 点击如下图红色圆圈中的按钮Additional Boards Manager URLs后的按钮。
DFRobot ESP32
  • 填入需要使用的版本链接,点击“OK”
    • 稳定版:https://espressif.github.io/arduino-esp32/package_esp32_index.json
    • 开发版:https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json

注意:

  • 请根据芯片支持情况选择合适的版本。
  • 如果填入过其它链接,在下一行添加新链接即可 。
DFRobot ESP32

下载/更新板卡

  • 打开Tools->Board:->Boards Manager...
Beetle ESP32-C3
  • 等待板卡索引下载完成后搜索ESP32,点击安装或更新(建议安装最新版本)
Beetle ESP32-C3
  • 等待下载更新完成
Beetle ESP32-C3

选择开发板及串口

  • 点击Tools->Board:,选择对应型号的开发板"ESP32S3 Dev Module"
Beetle ESP32-C3
  • 在烧录代码前需设置开发板
    • USB CDC On Boot:
      • Enabled: 通过USB接口打印串口数据
      • Disable: 通过TX、RX打印串口数据
    • Partition Scheme: 磁盘分区方案,请根据开发板Flash选择合适的存储空间
    • Port: 开发板端口(COM号正确即可,与后面芯片型号无关)
firebeetle ESP32

烧录代码

  • 将代码复制到窗口内,点击"Upload"上传代码
int led = 3;
void setup() {
  pinMode(led,OUTPUT);
}

void loop() {
  digitalWrite(led,HIGH);
  delay(1000);
  digitalWrite(led,LOW);
  delay(1000);
}
firebeetle ESP32
  • 等待烧录完成,即可看见板载LED灯开始闪烁
    • 若LED灯没有闪烁,请复位开发板
    • 若无法烧录请查看常见问题
firebeetle ESP32

ESP32基础教程

FireBeetle 2 ESP32-S3基础教程
FireBeetle 2 ESP32-S3进阶教程

视频图传

步骤
1.在arduino IDE中选择File->Examples->ESP32->Camera->CameraWebServer示例
2.使用下面的代码替换CameraWebServer中的代码(注意:需要填入WIFI账号密码)
3.打开串口监视器查看ip地址
4.通过局域网内的设备通过浏览器访问ip,点击start即可看到监控画面

#include "esp_camera.h"
#include <WiFi.h>

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//
//            You must select partition scheme from the board menu that has at least 3MB APP space.
//            Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15
//            seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well

#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM     5
#define Y9_GPIO_NUM       4
#define Y8_GPIO_NUM       6
#define Y7_GPIO_NUM       7
#define Y6_GPIO_NUM       14
#define Y5_GPIO_NUM       17
#define Y4_GPIO_NUM       21
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM       16
#define VSYNC_GPIO_NUM    1
#define HREF_GPIO_NUM     2
#define PCLK_GPIO_NUM     15
#define SIOD_GPIO_NUM  8
#define SIOC_GPIO_NUM  9

// ===========================
// Enter your WiFi credentials
// ===========================
const char *ssid = "**********";
const char *password = "**********";

void startCameraServer();
void setupLedFlash(int pin);

void setup() {
  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_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_UXGA;
  config.pixel_format = PIXFORMAT_JPEG;  // for streaming
  //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.jpeg_quality = 12;
  config.fb_count = 1;

  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if (config.pixel_format == PIXFORMAT_JPEG) {
    if (psramFound()) {
      config.jpeg_quality = 10;
      config.fb_count = 2;
      config.grab_mode = CAMERA_GRAB_LATEST;
    } else {
      // Limit the frame size when PSRAM is not available
      config.frame_size = FRAMESIZE_SVGA;
      config.fb_location = CAMERA_FB_IN_DRAM;
    }
  } else {
    // Best option for face detection/recognition
    config.frame_size = FRAMESIZE_240X240;
#if CONFIG_IDF_TARGET_ESP32S3
    config.fb_count = 2;
#endif
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

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

  sensor_t *s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1);        // flip it back
    s->set_brightness(s, 1);   // up the brightness just a bit
    s->set_saturation(s, -2);  // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  if (config.pixel_format == PIXFORMAT_JPEG) {
    s->set_framesize(s, FRAMESIZE_QVGA);
  }

#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

#if defined(CAMERA_MODEL_ESP32S3_EYE)
  s->set_vflip(s, 1);
#endif

// Setup LED FLash if LED pin is defined in camera_pins.h
#if defined(LED_GPIO_NUM)
  setupLedFlash(LED_GPIO_NUM);
#endif

  WiFi.begin(ssid, password);
  WiFi.setSleep(false);

  Serial.print("WiFi connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // Do nothing. Everything is done in another task by the web server
  delay(10000);
}

录音、播放声音

通过该示例可以实现录音、放音功能。烧录代码并复位开发板,LED灯点亮后开始录音5秒,LED灯熄灭后通过喇叭播放录音。

#include <Arduino.h>
#include <SPI.h>

#include "ESP_I2S.h"

#define SAMPLE_RATE     (16000)
#define DATA_PIN        (GPIO_NUM_39)
#define CLOCK_PIN       (GPIO_NUM_38)
#define REC_TIME 5  //Recording time 5 seconds

void setup()
{
  uint8_t *wav_buffer;
  size_t wav_size;
  I2SClass i2s;
  I2SClass i2s1;
  Serial.begin(115200);
  pinMode(3, OUTPUT);
  pinMode(41, OUTPUT);
  i2s.setPinsPdmRx(CLOCK_PIN, DATA_PIN);
  if (!i2s.begin(I2S_MODE_PDM_RX, SAMPLE_RATE, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO)) {
    Serial.println("Failed to initialize I2S PDM RX");
  }
  i2s1.setPins(45, 46, 42);
  if (!i2s1.begin(I2S_MODE_STD, SAMPLE_RATE, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO)) {
    Serial.println("MAX98357 initialization failed!");
  }
  Serial.println("start REC");
  digitalWrite(3, HIGH);
  wav_buffer = i2s.recordWAV(REC_TIME, &wav_size);
  digitalWrite(3, LOW);
  //Play the recording
  i2s1.playWAV(wav_buffer, wav_size);
}

void loop()
{
  
}

基于电脑openCV实现物体轮廓识别

该示例主要演示了电脑端使用openCV实现物体轮廓识别。

步骤

  • 给模块烧录"CameraWeb"示例代码,查看模块IP地址
  • 安装python环境(https://www.python.org/)(如果安装过,请看下一步)
  • 安装python库
    • 按下Win+R,输入cmd进入命令窗口
    • 输入"pip install numpy" 安装numpy库
    • 输入“pip install opencv-python” 安装opencv-python库
    • 输入“pip install opencv-contrib-python” 安装opencv-contrib-python库
  • 将openCV-demo.py中第5行的IP地址改为ESP32-S3的IP地址
  • 打开python的IDLE,File->Open...,选择openCV-demo.py,在弹出的新窗口中按下F5,即可看到识别画面和识别结果

openCV代码

基于电脑yoloV5实现物体分类

该示例主要演示了电脑端使用yoloV5实现物体分类。

步骤

  • 给模块烧录"CameraWeb"示例代码,查看模块IP地址
  • 安装python环境(https://www.python.org/)(如果安装过,请跳过)
  • 安装yoloV5库
    • 按下Win+R,输入cmd进入命令窗口
    • 输入"pip install numpy" 安装numpy库
    • 输入“pip install yolov5” 安装yolov5库
  • 将yoloV5-demo.py中第8行的IP地址改为ESP32-S3的IP地址
  • 打开python的IDLE,File->Open...,选择yoloV5-demo.py,在弹出的新窗口中按下F5,即可看到识别画面和识别结果

yoloV5代码

基于EdgeImpulse实现图像识别

该示例代码主要演示了,如何在模块上使用EdgeImpulse实现图像识别。

注:SDK版本不同可能会出现编译报错(演示demo SDK版本 3.0.1)

步骤

  • 将训练完成的模型库文件解压到"arduino->libraies"中
  • 替换"src\edge-impulse-sdk\tensorflow\lite\micro\kernels"中的"depthwise_conv.cpp"和"conv.cpp"文件
  • 将edge_camera文件夹及其子文件移动到模型库文件的examples中
  • 打开arduino IDE,选择edge_camera示例,将代码中的第一行改为模型库的.h文件,填入WiFi账号密码,然后编译烧录
  • 打开串口监视器即可看到IP地址和识别结果,访问IP即可看到摄像头画面

EdgeImpulse代码

自定义EdgeImpulse模型

通过该项目,你将学会如何通过EdgeImpulse训练自己的模型并部署到ESP32-S3 AI CAM模块上。
教程链接

获取环境光数据

通过该示例可获取环境光数据
使用前请安装LTR308传感器库

#include <DFRobot_LTR308.h>

DFRobot_LTR308 light;

void setup(){
    Serial.begin(115200);
	//如果使用了摄像头,请将摄像头的初始化放在LTR308初始化之前,否则会出现读取数值为0的情况
    while(!light.begin()){
    Serial.println("Initialization failed!");
    delay(1000);
  }
  Serial.println("Initialization successful!");
  
void loop(){
  uint32_t data = light.getData();
  Serial.print("Original Data: ");
  Serial.println(data);
  Serial.print("Lux Data: ");
  Serial.println(light.getLux(data));
  delay(500);
}

接入HomeAssistant

基于该教程可以将ESP32-S3摄像头模组添加到HomeAssistant中,并看到监控画面
教程链接

接入小智

通过“flash_download_tool”烧录固件,即可实现接入小智AI大模型

接入OpenAI RTC(基于ESP-IDF)

通过这个示例代码,您可以与OpenAl进行实时对话。

注意

  • 此代码在ESP-IDF下运行。
  • 接入OpenAI需要特殊网络

https://github.com/DFRobot/openai-realtime-embedded-sdk

OpenAI图像问答

此示例演示了ESP32-S3 Al CAM与openAl的连接,用于语音和图像识别。在S烧录代码后,按住boot按钮并向模块提问,例如“你看到了什么?”?“这是什么植物?”?“他在干什么?”?该模块将音频和图像数据发送到opeiAl或识别,以语音的形式播放识别结果。

注意

  • 接入OpenAI需要特殊网络

openAIImageQA demo.zip

更多资料