uwb 资料

最近关注DWM1000 定位,一方面在看DWM1000 官方提供的代码,也在四处网上找资料看资料。 其中比较好的一份开源源代码是bitcaze的lps-node-firmwar,github直接共享,bitcraze 做的是四轴无人机,还有定位上位机软件,全部都开源。 国内很多模块现在使用或者使用bitcraze 改版程序。

     lps-node-firmware是基于FREERTOS的,准备分析完官方源码后接着分析这份源码,bitcaze同时提供了模块的原理图,设计比较简单,准备自己打样一版试试,12月份全部搞定,come on!!

 

 

附上bitcraze 官网:https://www.bitcraze.io/

bitcraze开源项目github:https://github.com/bitcraze

lps-node-firmware:https://github.com/bitcraze/lps-node-firmware

 

最好通过git 命令clone 代码,如果值通过网页下载,里面的三个库是不包括其中的。 clone 命令:

git clone --recursive https://github.com/bitcraze/lps-node-firmware.git

 

UWB 目前比较火热,不论国内还是国外目前都掀起一股热潮。 但是实际工程代码很少,开源代码更少。

目前代码主要有

1 DecaWave Release的定位源码,代码基于TWR,一个非常大的状态机。 之前在博客进行过分析,对于初学者来说门槛太高。

2 淘宝商家Release的定位源码,大多基于官方基本例程去修改,实现测距,进而实现定位,这样的代码通常涉及的东西dwm1000 功能较少,在实际工程中应用比较困。

这里开源一个uwb 框架,姑且命名为51uwb_base,介于二者之间,作为一个工程的base code,希望uwb 工程开发者少走一些弯路。base code 并非实际工程完整代码,只是进行模块化,功能化的一个框架,可以实现UWB无线收发。 开发者可以基于此代码进行测距,传输甚至实现TDOA定位。base code 为项目工程提供,不适合初学者以及学生。base code 本身是从完整工程中提取,去掉了项目细节。

51uwb_base 特点:

A . 代码模块化

  将代码根据功能不同,进行模块化区分,不同模块尽量放置不同文件或函数(项目代码基本要求)

B 帧过滤功能

  多节点工程必然给每个模块分配地址,基于dwm1000 实现配置帧过滤功能

C dwm1000 硬件中断

  使用dwm1000 中断信号,可以提供更高的实时性。同时后期可以根据空闲状态情况进入低功耗休眠

D 移植目前我已知最为牛X的串口代码。

部分代码:

?

1

2

3

4

5

6

7

8

int main(void)

{

    peripherals_init();

    BPhero_UWB_Message_Init();

    BPhero_UWB_Init(); 

    tx_main();

  //rx_main();

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

void BPhero_UWB_Message_Init(void)

{

    //set frame type (0-2), SEC (3), Pending (4), ACK (5), PanIDcomp(6)

    msg_f_send.frameCtrl[0] = 0x1 /*frame type 0x1 == data*/ | 0x40 /*PID comp*/|0x20/* ACK request*/;

    //source/dest addressing modes and frame version

    //msg_f.frameCtrl[0] = 0x41;

    msg_f_send.frameCtrl[1] = 0x8 /*dest extended address (16bits)*/ | 0x80 /*src extended address (16bits)*/;

    msg_f_send.panID[0] = 0xF0;

    msg_f_send.panID[1] = 0xF0;

 

    msg_f_send.seqNum = 0;

    msg_f_send.messageData[POLL_RNUM] = 3; //copy new range number

    msg_f_send.messageData[FCODE] = RTLS_DEMO_MSG_ANCH_POLL; //message function code (specifies if message is a poll, response or other...)

    psduLength = (TAG_POLL_MSG_LEN + FRAME_CRTL_AND_ADDRESS_S + FRAME_CRC);

 

    msg_f_send.seqNum = 0; //copy sequence number and then increment

    msg_f_send.sourceAddr[0] = SHORT_ADDR & 0xFF; //copy the address

    msg_f_send.sourceAddr[1] =(SHORT_ADDR>>8)& 0xFF; //copy the address

 

    msg_f_send.destAddr[0] = 0x01;  //set the destination address (broadcast == 0xffff)

    msg_f_send.destAddr[1] = 0x01;  //set the destination address (broadcast == 0xffff)

}

  

51uwb_base code使用说明:

1 框架完成数据收发,有TX 节点和 RX节点,通过main函数选择,如下代码为TX节点,反之为RX节点。

?

1

2

3

4

5

6

7

8

int main(void)

{

    peripherals_init();

    BPhero_UWB_Message_Init();

    BPhero_UWB_Init(); 

    tx_main();

     //rx_main();

}

2 每个节点需要配置不同短地址,在bphero_uwb.h中指定

?

1

2

3

#ifndef SHORT_ADDR

#define SHORT_ADDR 0x0032

#endif

配置以上两步编译下载即可。  

注意:

1由于嵌入式代码与硬件有着天然紧密联系,我的代码基于蓝点无限开发板,如果使用其它开发板,需要进行底层匹配,主要代码在port.c中,主要修改dwm1000 与主控的连线引脚配置以及主控的串口配置。

2代码中目前TX发送信息,对应接收信息RX节点地址为TX节点地址+1,故设置RX节点时需要考虑这个不然无法实现测试功能。

?

1

2

3

4

5

void BPhero_Distance_Measure_Specail_TAG(void)

{

    // dest address  = SHORT_ADDR+1,only for test!!

    msg_f_send.destAddr[0] =(SHORT_ADDR+1) &0xFF;

    msg_f_send.destAddr[1] =  ((SHORT_ADDR+1)>>8) &0xFF;

  

 项目开源位置:www.51uwb.cn

 

 

DW1000 官网 https://www.decawave.com/support

你可能感兴趣的:(uwb)