搭建 ESP32-CAM 开发环境

1 前言

自从去年入坑 NodeMCU 以来,这种只要十几块钱,却功能强大的硬件就深深吸引了我。

随着对单片机学习的深入,只是控制普通元器件已经无法满足我了,所以又剁手了 ESP32-CAM,并准备基于它做个小项目。

不同于 NodeMCU 基于 LUA 脚本的开发模式,开发 ESP32-CAM 的功能,主要基于 espressif 提供的 SDK —— “espidf”,使用 C/C++ 语言编写,因此就需要一个便利的集成开发环境。

本文将介绍开发环境的搭建过程,并且按照国际惯例编写了一个 Hello world 程序,在设备上运行。

2 硬件

2.1 清单

主板:

  • ESP32-CAM

配件:

  • 400 孔面包板
  • 串口板
  • 导线若干

因误操作而烧掉的电源降压模块(R.I.P.):

后使用 USB 线直连电脑,作为 5V 输入电源。

2.2 组装

以下是 ESP32-CAM 的针脚定义(摘自官网):

需要连接的几个接口如下:

主板针脚 对接针脚
5V 5V 电源正极。
GND(任意) 5V 电源负极。
GPIO1 串口板的 RXI 针脚,有些串口板也标作 TXD
GPIO3 串口板的 TXO 针脚,有些串口板也标作 RXD
GND(任意) 串口板的 GND 针脚。
GPIO0 烧录固件时,与主板任意 GND 针脚连接,其他时候悬空。

最终连接效果如下图:

3 软件

推荐在 macOS 或者 Linux 系统上开发,本文以 macOS 为例。

3.1 清单

这里列出本文涉及到的软件,及文中使用的版本。

  • minicom v2.8: 串口通信工具,比系统自带的 cu 命令要好用,可通过 brew 安装。
  • platformio v5.1.1: 单片机开发工具包,整合了多种芯片平台的 SDK 和 Toolchain,可通过 brew 安装。
  • VSCode (Visual Studio Code) v1.55.2: 代码编辑器。
    • 插件: C/C++ v1.3.1
    • 插件: PlatformIO IDE v2.3.2

虽然在 JetBrains CLion 中也有 platformio 的插件,但是与 espidf 的最新版(v4.X)不兼容,因此最终选择了 VSCode。

4 开发固件

4.1 创建项目

点击左边的工具栏的蚂蚁图标,或状态栏的”🏠” 图标,进入 PIO Home:

点击 “New Project” 新建项目,Board 选择 AI Thinker ESP32-CAM,Framework 选择 Espressif IoT Development Framework

第一次创建项目需要等待一段时间,因为 platformio 会去下载必要的 SDK 和 Toolchian。创建完成后,会自动跳到文件目录界面。

打开 src 目录下的 “main.c”,这里的 app_main 函数就是整个项目的入口:

4.2 编写代码

在 espidf 中,也提供了 printf 函数,它会将字符串输出到串口中。

这里不止打印一句简单的”Hello”,也通过 espidf 的 API 检索一些系统信息,一并打印出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <esp_system.h>

void app_main() {
// Print hello message
printf("Hello, ESP!\n");

// Get ESP chip info
esp_chip_info_t info;
esp_chip_info(&info);
printf("Model Type: %d / Core Num: %d\n", info.model, info.cores);

// Get WiFi MAC address
uint8_t mac[6];
esp_read_mac(mac, ESP_MAC_WIFI_STA);
printf("WiFi MAC: ");
for (size_t i = 0; i < 6; i++) {
if (i == 0) {
printf("%02x", mac[i]);
} else {
printf(":%02x", mac[i]);
}
}
printf("\n");
}

4.3 编译固件

点击 VSCode 状态栏中的图标,编译固件:

第一次编译会比较费时,因此要对整个 SDK 进行编译,而后面每次构建只会编译变更的文件。

4.4 烧写固件

烧写固件前,首先需要将主板的 GPIO0 针脚与 GND 针脚连接,进入烧写模式,然后上电:

点击 VSCode 状态栏中的图标,烧写固件:


platformio 会自动检测主机上连接的串口接口。并默认使用找到的第一个端口。如需指定其他端口,可编辑项目根目录下的配置文件 “platformio.ini”,添加配置 upload_port

1
2
3
4
5
6
7
[env:esp32cam]
platform = espressif32
board = esp32cam
framework = espidf

; Custom UART port
upload_port=/dev/tty.usbserial-gggggggg1

烧写完成后,断开供电,并断开 GPIO0 针脚与 GND 针脚的连接,然后按一下主板背面的 RST 按钮。

ESP32-CAM 并没有提供 RST 针脚(至少我没找到),所以每次烧录固件后,都需要要手工按一下 RST 按钮……

4.5 运行固件

首先在主机上执行如下命令,监控串口的输出:

1
minicom -D /dev/tty.usbserial-gggggggg1 -b 115200

这里面的 /dev/tty.usbserial-gggggggg1 是我主机上的串口设备,使用其他串口板时,需要对照修改,一般是”/dev/“目录下,以”tty.usb” 开头的某个设备。

然后给主板上电,从 minicom 的界面中,将看到如下输出:

5 总结

整个搭建开发环境的过程没踩到什么坑(除了被我烧掉的变压模块),主要得益于 platformio 的强大。

其实网上搜到的针对 ESP 芯片的开发,大多是基于 Arduino IDE 的,我也不记得当初自己是怎么找到 platformio 的,不过一试之下 ——

真香!


在演示程序中,只调用了几个获取系统信息的 API,实际上 espidf 的功能非常丰富,而且提供了完善的文档和丰富的示例代码,对开发者非常友好。

主要功能的开发,基本上对照着文档即可完成,等后面踩到坑了,再写篇文章来记录吧。

6 参考