项目介绍
本项目为Funpack4-1,DWM3001CDK——超宽带 (UWB) 模块开发套件活动。要求实践时的要求如下:
- 使用两块板卡的UWB通信获得他们之间的相对距离
- 根据距离和角度改变板子上RGB LED灯的颜色和亮度
- 使用屏幕显示相对距离
硬件说明
Qorvo 的 DWM3001CDK是基于DWM3001C模块所做的评估套件。而DWM3001C模块内部是Nordic nRF52833 MCU通过SPI控制UWB芯片DW3110。
UWB(Ultra-Wideband,超宽带)是一种 短距离、高带宽、低功耗 的无线通信技术,它通过 超宽的频谱范围(通常大于 500 MHz)发送极短的脉冲信号,用于高精度定位、测距和高速数据传输。由于 UWB 信号的脉冲时间极短,其多径效应(Multipath Effect)影响较小,因此在复杂环境(如室内)中仍能保持高精度定位。
该芯片能够通过双向飞行时间较为精确的得出两个设备之间的距离,以及到达角度(Angle of Arrival, AoA)技术测量设备的方向,主要依靠相位差(Phase Difference of Arrival, PDoA) 进行计算。
但是这个模组上面只接了一根UWB天线,因此是没法进行角度测量的。
方案说明
大致流程为:将一个DWM3001CDK作为initiator广播信号,另一个作为responder。responder收到信号时返回给initiator,其再进行ToF计算,算出两点距离来,再将结果显示在OLED屏幕上面。
环境部署
使用Arduino作为开发平台,参考自Work-on-DWM3001CDK。
主要步骤为:
- DWM3001CDK烧录bootloader,创建arduino环境
- Arduino中安装Adafruit_nRF52_Arduino
- 增加DW3110外设支持
软件说明
主要部署步骤
这个库UWB-DW3000-NRF52中的example下ex_06b_ss_twr_responder
直接烧录到一个板子上,ex_06a_ss_twr_initiator
下增加对0.96 OLED的显示支持(Adafruit_SSD1306库),并对RGB灯根据距离做一个映射。这样就最低限度的完成任务要求了。
框架分析
初始化阶段(setup()):
- 配置LED、串口和OLED显示。
- 初始化DW3000模块,并进行参数配置。
主循环(loop()):
- 发送TWR(双向测距)请求。
- 等待响应,若超时则重新发送。
- 解析收到的响应,计算时间差(ToF)。
- 计算距离,并更新LED显示状态。
- 继续循环,进行下一次测距。
效果展示与遇到的问题
效果展示
初始化,等待连接
短距离时只有红灯微亮
长距离时绿灯亮起
两块板子合照
遇到的问题
- 第一次安装Arduino后,包管理器安装DWM时一直报错,百度搜了一圈都说是网络代理问题,但是我本地设置这边是有做代理的,还是一直装不上,玄学。遂放在那里,过几天后再进包管理器后又能正常安装了,难道是我那天正好代理有问题?还是没法定位原因,但已经装好包了,先不管了。
- 把卡上电启动后需要很长时间(大概几十秒)才会显示连接上,难道是UWB驱动问题?
- Qorvo的free rtos版SDK和示例没看明白,一堆指针函数,半天找不到,遂转到Arduino。
心得体会
虽然通过Arduino简单的驱动起来了UWB,知道大概的流程,也拿到了距离。但是,底层数据怎么传的,怎么校验,我脑子里还是空的,再加上拿到板子这么久都没怎么摸索,好像我已经失去了参加活动的意义。感觉我好像没有以前那种参加硬禾活动积极探索的精神状态了,自己每天脑子空空的,已经没有以前那种拿到新玩具的快乐了。现在想起大二开学时从材料毅然转到电子专业,每天课余时间抱着51开发板跟着教程学,那是的我一定是很开心的吧,对未来充满了希望。但现在的我又算什么呢。
最近因为找实习的事情压力比较大,一度怀疑自己是不是还适合做嵌入式这个行业,自己是不是这块料,是不是应该换个行业。所以说的有点多,总的来说还是很感谢硬禾的活动扩宽了我的视野,增长了我的见识。
最后祝硬禾越来越好,我也应该好好调整下自己。