| 
 | 
 
UWB定位结合运动传感器IMU可以实现更为精准的定位功能,在之前的一个帖子我们记录了当时imu 工程的开发历程。 
参见之前的帖子:http://51uwb.cn/forum.php?mod=viewthread&tid=410&extra=page%3D1 
本帖主要是分享最新源代码。相对于之前的工程,这里的代码imu 支持STM32F1 BP30/BP50 两款模块做参考基站,降低学习成本。 
工程代码上,属于我们我们第三代固件架构,使用STM32Cube 初始化硬件,底层驱动大部分实现共用,易于二次移植开发。 
 
源码路径:https://gitee.com/bpuwb/bpuwb_imu.git 
 
代码工程截图: 
  
 
 
目录结构说明: 
BP-UWB_LIB            -- > 公共底层驱动 
STM32F1_UWB        -- > STM32F1 Cube 工程,基站硬件初始化 
STM32F4_UWB_PA   -->  STM32F4 Cube 工程,IMU 标签硬件初始化 
Trilateration_PyDQ5  --> 基于Python 的UWB上位机源码 
测试HEX                  --> 已经编译好的HEX 
twr_51uwb.exe        -->  已经编译好的上位机 
 
 
编译说明: 
由于我们采用的标签和基站硬件不一样,需要再两个工程中分别编译基站和标签。 
打开工程后,通过bphero_uwb.h 文件对设备类型(标签或者基站)以及设备短地址等信息进行配置。 
 
基站编译 
基站使用的是STM32F1,Cube工程目录为STM32F1_UWB 。 
如下图所示,基站编译,需要首先确保#define RX_NODE 是“打开的”,每个基站分配一个短地址(SHORT_ADDR),4个基站可以分配0x0001到0x0004 
 
 
 
标签编译 
标签使用的是STM32F4 IMU,Cube工程目录为STM32F4_UWB_PA 
如下图所示,标签编译,首先需要确保#define TX_NODE 是“打开”的,由于IMU 模块没有液晶,所以 #define LCD_ENABLE需要注释掉, 
最重要一点,模块有IMU模块,通过#define IMU_ENABLE 使能IMU功能。 短地址保持默认不需要更改。 
 
 
硬件购买 
这个帖子中的代码 基站可以采用BP30或者BP50,标签必须是F4_PA 标签。 
以最高性价比组合,4个BP30基站+F4_PA模块 
BP30 基站:https://item.taobao.com/item.htm?ft=t&id=650965811316 
F4_PA模块:https://item.taobao.com/item.htm?ft=t&id=617598108897 
 
 
IMU数据测试 
默认我们使用了运动检测(motion detection)功能,只有1bit数据,标识模块是否有移位改变。 在调试的时候,可以将九轴数据全部打印出来。 代码修改如下(注意,需要将Enable_MPU9250_MovetionDetection 注释掉) 
- void Mpu9250_Test(void)
 
 - {
 
 -     Sw_I2C_Init();
 
 -     MPU9250_Init(&mpu9250, MPU9250_Device_0, ACCEL_SCALE_16G, GYRO_SCALE_2000dps, MAG_SCALE_16bit);
 
 -     //Enable_MPU9250_MovetionDetection(&mpu9250);
 
 -     while (1)
 
 -     {
 
 -         MPU9250_ReadAcc(&mpu9250);
 
 -         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, !GPIO_PIN_SET); //PB7 = 1 LED_ON
 
 -         
 
 -         printf("acc.x = %0.2f acc.y = %0.2f acc.z= %0.2f\n",mpu9250.acc[0],mpu9250.acc[1],mpu9250.acc[2]);
 
 -         MPU9250_ReadGyro(&mpu9250);
 
 -         HAL_Delay(300);
 
 -         printf("gyro.x = %0.2f gyro.y = %0.2f gyro.z= %0.2f\n",mpu9250.gyro[0],mpu9250.gyro[1],mpu9250.gyro[2]);
 
  
-         MPU9250_ReadMag(&mpu9250);
 
 -         printf("mag.x = %0.2f mag.y = %0.2f mag.z = %0.2f\n",mpu9250.mag[0],mpu9250.mag[1],mpu9250.mag[2]);
 
  
-         MPU9250_ReadTemperature(&mpu9250);
 
 -         printf("Temp = %0.2f\n",mpu9250.temp);
 
 -         HAL_Delay(1000);
 
  
-     }
 
 - }
 
 
  复制代码 
 
 串口log 打印如下: 
- acc.x = 0.01 acc.y = -0.27 acc.z= 0.95
 
 - gyro.x = -10.67 gyro.y = 0.37 gyro.z= 2.01
 
 - mag.x = 28.27 mag.y = 13.61 mag.z = 7.10
 
 - Temp = 41.36
 
 - acc.x = -0.14 acc.y = -0.01 acc.z= 0.96
 
 - gyro.x = 12.87 gyro.y = 4.21 gyro.z= -43.35
 
 - mag.x = 16.76 mag.y = 20.48 mag.z = 9.08
 
 - Temp = 41.31
 
 - acc.x = -0.18 acc.y = 0.04 acc.z= 0.97
 
 - gyro.x = 1.59 gyro.y = -0.43 gyro.z= -22.87
 
 - mag.x = 15.01 mag.y = 21.99 mag.z = 8.73
 
 - Temp = 41.31
 
 
  复制代码 
 
 
 
 |   
 
 
 
 |