ESP32 UWB 01 开发板/ 下行 TDOA 定位标签

ESP32-UWB-01 开发板采用 ESP32S3 作为主控 MCU,DW-3000 作为 UWB 收发器,还集成了 OLED 显示屏和 WS2812 RGB。

ESP32-UWB-01 的基本电路与 A101 定位基站基本一致,只是它定位于开发板,为了方便开发,引出了 ESP32S3 和 DW3000 的全部引脚,集成了一块 CH340X 芯片可以自动刷写固件和查看UART0。

PCB 3D 效果图正面 PCB 3D 效果图背面

1. 功能简介

开发上方是ESP32S3模块,中间右侧是DWM3000模块,下部是OLED显示屏。

开发板上有2个USB-Type C接口,这2个USB口都可以作为供电输入口。输入电压是5V,需要的电流不超过 400mA。普通的手机充电头输出电压一般是 5V,电流最少可以输出1A,可以用来为这个开发板供电。你可以使用充电宝、手机充电器或电脑USB接口给开发板供电。我们使用了两个二极管防电流倒灌,两个USB口连接到不同的设备时不会因为电压差异导致电流倒灌。

原理图 USB 局部1 原理图 USB 局部2
右下方的USB口用于串口调试。这个USB通过一块CH340X串口转换芯片连接到ESP32S3的UART0,你可以使用这个接口刷写软件,或监控ESP32S3的工作情况。 原理图 CH340X 局部

开发左下方的USB口是ESP32S3的原生USB接口,连接到ESP32S3的USBP(IO20)、USBN(IO19)。这个USB口可以进行JTag调试,或通过编写程序对这个USB口进行控制,实现如USB HID 键盘鼠标、U盘等等。 PCB图 USB1 局部

原理图 USB1 局部1 原理图 USB1 局部2

左下角的按钮是ESP32S3的复位按钮。

PCB 图 RESET 局部 原理图 RESET 局部

右下角的按钮连接到IO45,你可以编程获取按钮状态。

PCB 图 SW1 局部 原理图 SW1 局部

左下USB接口上方白色的元件是高亮WS2812B RGB LED,连接到IO48,你可以编程对其进行控制。在UWB定位基站上,我们使用这个RGB LED作为基站标识。

PCB 图 RGB Led 局部 原理图 RGB Led 局部

在客户现场安装部署了很多UWB定位基站后,而基站通常都安装在比较高的位置。有时我们不确定某个基站是不是安装在正确的位置,会不会跟其他的某个基站弄混了。这时,我们可以通过程序控制指定的某个基站打开RGB LED灯,以判断安装是否正确。

开发板有一些LED指示灯,显示开发板的工作状态。Power 是电源指示灯,当板子上电后,Power灯应该亮。Alive灯是呼吸灯,连接到IO6由程序控制。RF Tx和RF Rx分别是射频发射和接收灯,指示DW3000处于发射或接口状态。

开发板上还使用一个MOS管通过PWM控制LED指示灯的亮度。这个MOS管连接到IO5。你可以使用PWM调整占空比控制4个LED指示灯的亮度,从最亮到完全熄灭。

PCB 图 Led 局部 原理图 Led 局部1 原理图 Led 局部2

我们最初的UWB定位基站成品是没有亮度控制的,后来有客户反馈在夜间定位基站的LED指示太亮了,还闪烁,造成光污染。后来我们的定位基站都加上了LED灯的亮度控制。

开发板引出了ESP32S3和DW3000的全部引脚。如果你觉得开发板的功能不够,你希望附加新的功能,可以利用这些引脚连接外部的模块。例如IMU陀螺仪、GPS/北斗模块、5G模块等。

2. 开箱测试

开发板的初始固件是一个测距综合固件。如果你有两块开发板,可以相互测距。

把两块开发板都上电,OLED显示屏会显示两块开发板之间的距离。 Power Bank

右下角的按钮测试:

  • 短按:按下立即放开,为短按。

    每按一次,LED指示灯亮度降低一些,直到降为0,全部熄灭,再按变为最大亮度。

  • 长按:按下2秒后放开,为长按。

    每长按一次,RGB LED亮,再长按一次,RGB LED灭。每亮一次,颜色在RGBW四种颜色中循环。

如果把右下角的USB连接到电脑,使用串口调试工具查看UART0的输出,可以看到ESP32S3打印的日志。在测距的过程中,会打印测距日志。

通过以上测试,可以测试:

  • ESP32S3芯片是否正常工作
  • DW3000 UWB数据包收发是否正常
  • OLED显示屏是否正常
  • RGB LED是否正常
  • LED指示灯是否正常
  • LED指示灯控制是否正常
  • 测距功能是否正常

3. 例程

因为Qorvo原厂的例程是为ARM MCU(nRF52840-DK和STM_Nucleo_F429)设计的,无法直接运行在ESP32S上。我们使用br101的ESP32 DW3000驱动为基础,并对其进行了适当修改,以尽量维持原生例程不作修改。

所以,DW3000的例程你基本上不需要修改,就可以直接运行。

因为br101的驱动是基于DW3_QM33_SDK_1.0.2进行移植的,所以我们提供的例程也是基于DW3_QM33_SDK_1.0.2。

为了方便你,我们还提供了DW3_QM33_SDK_1.1.1供你参考。如果要让DW3_QM33_SDK_1.1.1适配ESP32S3,估计有大量的移植工作。

我们提供的例程是一个ESP32S3 IDF工程ESP32UWB-Example,其结构与普通的ESP32工程一样。

main目录下源代码,程序的入口是main.c。

DW3000的例程在 API/Src/examples目录下。这个目录中有48个原厂的例子程序。还有一个目录dstwr,这是我们专门为这个开发板开发的例子程序。

如果想要编译不同的例子,可以修改API/Src/example_selection.h文件,取消你想要用的例子定义的注释,同时要不用的例子定义注释掉。请注意,每次只允许打开一个注释,如果有多个注释被取消,编译将会失败。因为你不能同时让几个不同的例子在板子上运行嘛。

如上图,我们允许了 TEST_DS_TWR 这个例子,其他的例子被注释掉。

4. 建议

4.1. 开发环境

开发环境建议使用VSCode,再配合ESP-IDF Extension for VS Code使用。开发环境的安装和使用,有关的文章非常多,请自行在网上搜索。

4.2. IDF vs Arduino

多年前,我计划使用ATMega16做一个项目,当时就纠结是不是使用Arduino。最后还是决定使用原生开发环境。

Arduino开发起来确实比较快捷,但是它经过了一道中转。如果作为爱好者想快速上手,或者只是个人DIY项目,使用Arduino都挺好的。

但是,如果是专业的开发,如果你的项目要作为产品提供给用户,使用原生开发环境会更好。使用原生开发环境,你可能需要了解很多新的知识,需要花时间了解芯片的底层细节。你花费的这些时间,并不是浪费。你可以更有针对性的利用芯片的特性。例如省电方面,你可以做到更低的功耗、更低的静态电流;性能方面,你的业务代码可以跑得更快、你有更多的RAM可以使用。

所以,我的建议是:如果你只是玩玩,使用Arduino很好;如果你是开发产品,最好使用原生开发环境IDF。

4.3. 学习

这只是一个开发板,本身没有太多的技术含量。我们提供的例子程序,更多只是验证开发板能正常工作。降低你使用ESP32S3开发DW3000的入门难度,让你不是从零开始把DW3000的SDK移植到ESP32S3,而是让你一开始就有一个可以跑的系统。

我们不做ESP32S3的推广,也不做DW3000的推广。所以我们不提供ESP32S3和DW3000的教程。

ESP32S3的教程在网上非常多,Espressif在文档方面也非常详细,资料非常多。有关的教程和资料,请在网上搜索。Espressif的IDF的网址是: https://github.com/espressif/esp-idf/。ESP32S3 IDF编程指南的地址是:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/index.html。ESP32 IDF也自带很多例子程序。我在开发中也经常参考这些例子。

DW3000的资料比ESP32S3要少,毕竟UWB是一个小众领域。但是比起其他UWB芯片厂商,DW3000的资料已经非常详细了。DW3000相关的资料,可以从Qorvo的网站下载。有些DW1000的资料,也适用于DW3000。如果有技术问题,也可以在Qorvo的论坛上问交流。Qorvo的论坛上可以找到很多有价值的回复帖子。Qorvo的UWB论坛地址是:https://forum.qorvo.com/c/wireless-connectivity/ultra-wideband/5。Qorvo的UWB产品网址是:https://www.qorvo.com/products/wireless-connectivity/ultra-wideband。

我在知乎上写有一系列关于UWB定位的文章,也许对你会有帮助。地址是: https://www.zhihu.com/people/bd8ncf

5. 能做什么

你肯定会想知道,这个开发板除了跑跑原厂的例子程序,还能做什么。

其实,这个开发板的原型是我们的UWB定位产品的基站和标签。例如,我们的下行TDoA定位系统,基站的电路比这个开发板还少一个OLED显示屏,也没有CH340X芯片可以通过USB直接刷固件。

这个开发板可以刷写我们的UWB下行TDoA定位系统的固件后,作为TDoA定位系统的基站或标签使用。

特别是,作为下行TDoA定位系统的标签时,它要跟踪附近的基站,与这些基站保持时间同步,还要根据这些基站发出的时间同步数据包,解算自己的坐标。

如果你有想法,你完全可以自己开发一套UWB定位系统运行在这个开发板上。你可以使用TWR(TOF)、TDoA、PDoA等方案。当然,如果是PDoA系统,因为它只有一个天线,所以只能作为数据的发送端。