2024-4-23 14:33:36 [显示全部楼层]
819浏览
查看: 819|回复: 0

[ESP8266/ESP32] 基于ESPHome的3DP舱内控制系统(1): 荆棘满途之FireBeetle2初始配置

[复制链接]

前言

开一个新坑,谋划了很久,最初是为了测试 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开发板】

我们感兴趣的硬件特性总结如下:

  • 搭载 ESP32-C6 芯片(160MHz的高性能 RISC-V 32位单核处理器)支持  2.4  Ghz WiFi 6、Bluetooth 5、Zigbee 3.0、Thread 1.3 通讯协议

    • 主频:160 MHz
    • SRAM:512KB
    • ROM:320KB
    • Flash:4MB
  • 支持太阳能充电, 免电源线部署

  • 电池电压检测引脚 IO0,和充电指示灯

    • 熄灭:未接入电源或已充满
    • 常亮:充电中
    • 闪烁:电池未接入
  • 板载GDI接口,轻松连接屏幕

  • PH2.0电池接口,方便连接电池

  • IO15/D13:板载LED引脚

  • RST:复位按键

  • IO9/D9/BOOT:IO引脚/BOOT按键

  • CN3165: 太阳能充电芯片

1.2 ESPHome 介绍与优点

  1. 项目主页:https://esphome.io/,默认支持 ESP32/ESP8266/RP2040/BK72XX/RTL87XX
  2. 支持的硬件列表:由于使用 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

image-20240423141715089

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。

Name MCU Frequency RAM Flash Frameworks Debug
Espressif ESP32-C6-DevKitC-1 ESP32C6 160 MHz 512 KiB 8 MiB espidf
Espressif ESP32-C6-DevKitM-1 ESP32C6 160 MHz 320 KiB 4 MiB espidf External

但是无论我们使用 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

image-20240423133415037

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 设备

image-20240423134305112

接下来我们再配置 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 读取电池电压等功能。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail