前言
开一个新坑,谋划了很久,最初是为了测试 Moonraker 的 Sensor 组件,逐步扩展到设计一个完整的控制系统。硬件选择 ESP 系列芯片,功能足够,还支持 WiFi/BT。软件看了一圈选择 ESPHome,轻代码,功能强大配置简单易上手。
本文涉及的硬件:
- DFRobor FireBeetle2 ESP32-C6 迷你开发板
本文涉及的软件:
- ESPHome 2024.3.2 -> 2024.4.1(写作过程中已发布新版)
- Windows11 with WSL2(Debian Bookworm)
本文涉及的问题:
- ESPHome 和 PlatformIO 的基本命令
- ESPHome 正确支持 ESP32-C6
- C6 点灯测试
- 使用 external_components 修复 logger
- 修复报错 Refusing to overwrite
- WSL2 连接 USB 设备
1、文档资料
1.1 FireBeetle 2 硬件规格
【图 FireBeetle 2 ESP32 C6开发板】
我们感兴趣的硬件特性总结如下:
1.2 ESPHome 介绍与优点
- 项目主页:https://esphome.io/,默认支持 ESP32/ESP8266/RP2040/BK72XX/RTL87XX
- 支持的硬件列表:由于使用 PlatformIO 进行编译,所以和 PIO 的支持列表相同: PIO Registry Platform
ESPHome is a system to control your microcontrollers by simple yet powerful configuration files and control them remotely through Home Automation systems.
ESPHome 使用配置文件来控制微控制器,旨在和家庭自动化控制系统(如 HomeAssistant 等)结合使用。它使用和配置简单,和 HA 语法基本一致,功能强大,支持多种模块,无需复杂的编程知识即可实现各种功能。
类似的还有 Tasmota/ESPEasy 等项目,相比之下 Tasmota 可以实现在固件中进行设置修改,但是支持的主控芯片与模块不如 ESPHome 多,使用流程也不像 ESPHome 那样提供一揽子方案。ESPHome 使用 PlatformIO 作为底层进行固件编译,所以支持非常多的设备。
2、安装使用 ESPHome(理想版)
为了防止劝退新手,先公布答案走一遍流程。以下使用 WSL2-Debian Bookworm。
## 安装配置 ESPHome
sudo apt-get install python3-venv
cd ~ && python3 -m venv esphome-env
source ~/esphome-env/bin/activate
pip3 install -U pip
pip3 install -U esphome
# 查看 esphome 软件版本
esphome version
# 创建配置文件目录
mkdir ~/esphome_config
## 使用向导创建配置文件
esphome wizard firebeetle2-esp32c6-demo.yaml
## 也可以使用 esphome dashboard 网页面板创建,后面是配置目录
# esphome dashboard ~/esphome_config
# 退出 Python 虚拟环境
deactivate
2.1 为 ESP32-C6 编译 EPSHome 固件
查看 esphome 官方代码,已经支持 esp32c6 芯片了,再继续搜索,找到最新的一次提交:Fix logger compile error on ESP32-C6,发现需要指定使用新版的 Platformio(ESP32-C6 需要 PIO 版本最低为 6.4,目前最新为 6.6),但是目前配置文件创建向导 wizard 还不直接支持,因此我们可以选一个相近的同样采用 RISC-V 核心的 ESP32-C3,然后手动修改,配置如下:
esphome:
name: firebeetle2-esp32c6-demo
esp32:
board: esp32-c6-devkitc-1
variant: esp32c6
flash_size: 4MB
framework:
type: esp-idf
version: 5.2.1 # 默认为 esp-idf 5.1.2 + PIO 6.5.0
platform_version: 6.6.0 # at least 6.4 for ESP32-C6
ota:
password: ""
wifi:
ssid: [ssid]
password: [password]
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Firebeetle2-Esp32C6-Demo"
password: "F4Qwm19jxEKj"
captive_portal:
然后可以使用命令或者 Dashboard 网页烧录固件。
# 一键命令编译烧录固件,ESP32 RISC-V 的工具链还是比较大的
esphome run firebeetle2-esp32c6-demo.yaml
# - Validates the configuration | 验证配置文件
# - Compiles a firmware | 编译固件
# - Uploads the firmware (over OTA or USB) | 上传固件(OTA 或者 USB)
# - Starts the log view | 开启日志查看
## 其他相关命令
# 验证配置文件并编译生成固件
esphome compile firebeetle2-esp32c6-demo.yaml
# 验证配置文件并上传最近一次编译的固件(USB首次上传需要进入烧录模式)
esphome upload firebeetle2-esp32c6-demo.yaml -d [/dev/serial_path]
esphome upload firebeetle2-esp32c6-demo.yaml --host-port [IP_ADDRESS]
更多命令参考:Command Line Interface — ESPHome,可以看到整体使用还是很简单的。
2.2 Hello World Via Onboard LED
一切的开始都是一盏灯,根据 DFRobot 的产品介绍,FireBeetle 2 有个板载LED,连接 GPIO15,我们使用 Light 组件。在上述配置文件中添加下述内容,重新编译上传,此时可选 OTA 无线升级。
# 定义一个状态灯
light:
# 板载 LED灯
- platform: status_led
name: "Switch state"
pin: GPIO15
3、使用 ESPHome(现实版)
3.1 支持 ESP32-C6
查询 PIO 设备支持列表,搜索 ESP32 C6,接近的有两个,esp32-c6-devkitc-1 和 esp32-c6-devkitm-1,和前者更接近,注意 Flash 为 4MiB。
但是无论我们使用 Wizard 向导选择 esp32-c6-devkitc-1
还是 esp32-c6-devkitm-1
作为模板,都无法创建,提示:
Processing firebeetle2-esp32c6-demo (board: esp32-c6-devkitc-1; framework: espidf; platform: platformio/espressif32@5.4.0) UnknownBoard: Unknown board ID 'esp32-c6-devkitc-1'
查看 esphome 官方代码,已经支持 esp32c6 芯片了,再继续搜索,找到最新的一次提交:Fix logger compile error on ESP32-C6,发现需要指定使用新版的 Platformio(ESP32-C6 需要 PIO 版本最低为 6.4,目前最新为 6.6),但是目前配置文件创建向导 wizard 还不直接支持,因此我们可以选一个相近的同样采用 RISC-V 核心的 ESP32-C3,然后手动修改,配置如上文。关于 ESP32 Platform 的介绍:
- platform_version (Optional, string): The version of the platformio/espressif32 package to use.
- version (Optional, string): The base framework version number to use, from ESP32 arduino releases. Defaults to
recommended
. Additional values are:
当前工具链版本如下, 可以看到使用的版本为4.4.6:
HARDWARE: ESP32C6 160MHz, 512KB RAM, 8MB Flash
- framework-espidf home.php?mod=space&uid=854811 3.40406.240122 (4.4.6)
- tool-cmake @ 3.16.4
- tool-ninja @ 1.7.1
- tool-riscv32-esp-elf-gdb @ 12.1.0+20221002
- tool-xtensa-esp-elf-gdb @ 12.1.0+20221002
- toolchain-esp32ulp @ 2.35.0-20220830
- toolchain-riscv32-esp @ 13.2.0+20230928
查看 ESP-IDF 版本:https://registry.platformio.org/tools/platformio/framework-espidf/versions
3.2 修复 logger 组件
当使用 ESP-IDF 5.1.2 和 PIO 6.5.0 时编译通过,但是升级到最新的 5.2.1 和 6.6.0 后,报错 logger uart。有人遇到相似的情况,具体见 ESPHome PR#6487:Fix uart to work with new enum definition in esp-idf-v5.2.1
由于此 PR 还未被合并到官方仓库,我们可以借用 external_components 来支持,详细的用法请移步:https://esphome.io/components/external_components.html
# Enable logging
logger:
external_components:
- source:
type: git
url: https://github.com/luar123/esphome
ref: fix_logger
components: [ logger ]
3.3 报错 Refusing to overwrite
编译固件时报错:
A fatal error occurred: Contents of segment at SHA256 digest offset 0xb0 are not all zero. Refusing to overwrite.
cd /home/pi/esphome_config/.esphome/build/firebeetle2-esp32c6-demo/
pio run -t menuconfig
# 修改 Serial flasher config 的 Flash size 为 4MB
## 其他
# ESP32 的编译工具链较大,约数G,必要时可以挂代理。
# 查看已安装包
pio pkg list
# 查询无用 PIO 数据
pio system prune --dry-run
# 清理无用 PIO 数据
pio system prune
3.4 WSL2 使用 USB 设备
这部分可以参考微软官方文档:WSL 连接 USB 设备
如果使用物理机编译上传固件直接连接即可,但是由于我使用的是 Windows11 + WSL2(使用 WSL2 Distro Manager + Docker Hub Debian Bookworm 镜像),如果想要给 ESP32-C6 烧录固件,需要转发宿主机的 USB 使用,和我们常用的方式不同,不需要在客户机上安装 usbip。以下宿主机称为 host,wsl 称为 wsl。方法如下:
## host 安装 usbip
# 可以从此处下载并安装:https://github.moeyy.xyz/https://github.com/dorssel/usbipd-win/releases/download/v4.1.0/usbipd-win_4.1.0.msi
## host 更新 wsl 内核,重启生效,以下于 PowerShell 中运行
wsl --update --inbox
wsl --shutdown
# host 查看可用 USB 设备并进行转发
usbipd list
usbipd bind --busid 3-1
usbipd list # 验证已转发共享 (Shared)
usbipd detach --busid <busid> # 断开 USB 设备
接下来我们再配置 wsl,由于我用的精简版 Debian,需要进行一些额外的安装设置:
## 【WSL2 Debian】加速 git,使用国内镜像
cat << _EOF_ > $HOME/.gitconfig
[url "https://github.moeyy.xyz/https://github.com/"]
#[url "https://hub.0z.gs/"]
insteadOf = https://github.com/
_EOF_
## 【WSL2】设置 locale,选择 97,314,具体移步 https://wiki.debian.org/Locale
sudo apt install locales usbutils
sudo dpkg-reconfigure locales
## 【WSL2】设置当前用户(pi)的串口设备读写权限,重新登录生效,注意填写正确的串口设备号
sudo usermod -a -G dialout pi
sudo chown -R root:dialout /dev/ttyACM0
sudo chmod 664 /dev/ttyACM0
4、小结
至此我们可以正常使用 ESPHome 为 ESP32-C6 编译固件,后续可以测试板载蓝牙、使用 IO0 读取电池电压等功能。