【UWB定位】 - DWM1000模块调试简单心得 - 1

记录下调试UWB模块遇到的问题及解决方法以及个人对UWB模块的一些见解,目前本人调试的官方demo实现了一标签对三基站的测距通信以及分基站基站的数据汇总到总基站,室内40米内总体平均误差在30cm左右。旨在抛砖引玉,希望对大家有帮助。

DWM1000模块,采用纳秒至微微秒级的非正弦波窄脉冲传输数据。想要了解更多可以去百度。本质其实就是利用脉冲信号来计算到达时间或者到达时间差,不同的计算方法(TOA 亦或是TDOA)的目的都是测距。

1、准备材料:

(1)stm32F103C8T6开发板   入门可以直接调试的官方demo,(附赠下载地址:https://download.csdn.net/download/qq_37967635/10546057)(很不好意思赚1个积分,哈哈。)官方demo采用stm32作为主控MCU,可以自行移植到其他板子(看个人需要)。

(2)DWM1000模块(淘宝购买大约150左右一块)模块内有内置天线(信号源),模块与stm32通过spi通信,其实官方demo大部分都已经帮我们定义好了。只需要将模块与stm32引脚正确连接即可。

2、1标签1基站环境

(1)软件环境(标签与基站)代码搭建

找到下载的压缩包解压,官方给的例程都存放 在examples里

   主要用到这俩套例子(图中圈到的第一个红圈是 TWR --SS 的测距方法、第二个是TWR -DS方法,相同的是都采用TOF双向飞行测距,即 测量脉冲飞行的时间 * 光速 = 标签与模块的距离。不同是04a & 04b  采用的是单边双向飞行测距,05a & 05b  采用的是手双边双向飞行测距,当然双边更加准确,这里采用双边测距。),如不理解跳转  地址:https://blog.csdn.net/qq_37967635/article/details/82459656 

继续点击去05a 把main.c 文件复制到\Keil工程\MDK-ARM中的project 当中即可。copy 一份在复制05b的代码。 05A即标签的代码,05即基站的代码。好了代码环境就搭建完了(稍后需要调试参数)。对于里边的各种函数还需要自己去稍加理解,压缩包里有带API接口引导手册,名字为《DW1000_Software_API_Guide_rev2p0》。

(2)硬件模块搭建

引脚图如下: ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

其实,这里DWM1000模块就是一个外接模块,内部通过SPI通信。只需要stm32和模块连接即可。SPI接口信息定义在port.h

简单的来说就是:

SPI_CLK      ——    stm32 A5

SPI_MISO    ——    stm32 A6

SPI_MISI      ——    stm32 A7         

SPI_Csn       ——    stm32 A4            

IRQ               ——    stm32 B5

RESET        ——    stm32 B15 

VSS(负)        ——   stm32 GND

VDD3V3(正)  ——   stm32 3.3V

够简单的了吧。。天线模块尽量不要和stm32重叠(标记UWBXX的一侧即天线),不然信号还是会有点影响。

 

先吃饭,下一篇开始调试。

【UWB定位】 - DWM1000模块调试简单心得 - 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 31
    点赞
  • 213
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
UWB是一种无线通信技术,DWM1000是一种UWB模块,可以用于测距、定位等应用。在跟随小车应用中,通常使用两个DWM1000模块,一个放在小车上,一个放在地面上。下面是UWB DWM1000跟随小车的原理和代码解析。 1. 原理 UWB DWM1000跟随小车的原理如下: 1)通过UWB模块测量小车与地面的距离,得到距离数据。 2)将距离数据传输给控制器,控制器计算小车与地面的相对位置和方向。 3)根据相对位置和方向,控制器调整小车的速度和方向,使小车跟随地面。 2. 代码解析 UWB DWM1000跟随小车的代码如下: ```c++ #include <DWM1000.h> // 定义UWB模块对象 DWM1000 uwb; // 定义小车位置、速度、方向变量 float car_x, car_y, car_v, car_h; void setup() { // 初始化UWB模块 uwb.setup(); // 初始化小车位置、速度、方向 car_x = 0; car_y = 0; car_v = 0; car_h = 0; } void loop() { // 获取UWB距离数据 float dist = uwb.getDistance(); // 计算小车相对位置和方向 float car_dx = dist * sin(car_h); float car_dy = dist * cos(car_h); float car_dh = atan2(car_dy, car_dx); // 更新小车位置、速度、方向 car_x += car_dx; car_y += car_dy; car_v = dist / uwb.getInterval(); car_h += car_dh; // 控制小车运动 controlCar(car_v, car_h); } void controlCar(float v, float h) { // 控制小车运动,使其跟随地面 } ``` 代码中,我们先定义了一个UWB模块对象uwb,然后在setup函数中初始化UWB模块和小车位置、速度、方向。在loop函数中,获取UWB距离数据,计算小车相对位置和方向,更新小车位置、速度、方向,最后调用controlCar函数,控制小车运动。其中,controlCar函数需要根据小车速度和方向来控制小车运动,使其跟随地面。 以上就是UWB DWM1000跟随小车的原理和代码解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值