Portapack应用开发教程(十七)nrf24l01发射 B

本项目github:

GitHub - jamesshao8/btle_nrf24l01: send or receiver btle packet with nrf24l01

一年多以前我实现了PortaPack接收nrf24l01/btle数据包。后来我一直想实现portapack/hackrf发射nrf24l01数据包,之前的思路是通过更改gr-noridc里的发射代码给它自己的接收代码或者另几个开源接收项目。但是一直没有成功。无论是编码还是调制部分都有问题。

后来我想到了一个新方法。既然hackrf和nrf24l01都有现成项目收发低蓝牙数据包。那我也可以用hackrf发蓝牙数据包给nrf24l01,把数据打包为蓝牙模式可以看作是应用层编码,底层都是符合nrf24l01要求的,也算是间接实现了我的需求。

不过具体实现起来还是有不少坑的,这里做个记录。

我先是用如下项目实现了hackrf收发数据包给手机GitHub - jamesshao8/BTLE: Bluetooth Low Energy (BLE) packet sniffer and transmitter for both standard and non standard (raw bit) based on Software Defined Radio (SDR).

SDR发射低功耗蓝牙数据包_哔哩哔哩_bilibili

上面是对应视频

命令

./btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-070203040506-LOCAL_NAME09-SHAO_HACKRF r30

你可以在iphone上装nrf connect这个app来看搜索到的数据包。

这样hackrf发射低功耗蓝牙就算搞定了,当然接收也没问题用btle_rx就行。

然后我找到了两个项目,分别是nrf24l01发射和接收低功耗蓝牙数据包的。

第一个项目只有发射,对应我github项目下的send_simplified,代码结构十分简单,不需要调用第三方RF24库。另一个项目有接收,对应send和recv,但是收发都比较复杂。

我先用send_simplified项目,确认了arduino+nrf24l01确实能发数据给手机,并且硬件本身和连线都没问题。

然后再尝试send和recv。这时出现了问题,不能发,收到的数据也很奇怪,后来我才知道两个项目默认用的ce csn口反了。所以我改国send recv的代码,本来是radio(9,10)的地方改为radio(10,9)。

然后send才能发数据包给手机,并且recv也能收send的数据包(刷新很快的就是人工用send发的,不是环境的)。但是send和recv代码太多难懂,recv的串口输出数据我当时也不知道是什么。

所以我后来尝试用recv去收send_simplified的数据包,然后从send_simplified的代码里找出对应关系。

我了解到recv数据的数据其实是编码前或者解码后的数据,并且不包含前面的广播地址。知道这个后我就可以按照send_simplified对各种数据位的定义在recv里做解码工作。主要是找出Name的长度和Name本身二进制转字符以及找出Data的长度并直接显示出data数值。

搞定这些后,我尝试用HackRF发数据包给nrf24l01+arduino的recv程序。

我了解到其实send_simplified发数据包,hackrf运行btle_rx的时候,会收到这样的报文。

65776us Pkt1111 Ch37 AA:8e89bed6 ADV_PDU_t2:ADV_NONCONN_IND T1 R0 PloadL21 AdvA:685746352413 Data:0201060608534841524604ccaabbdd CRC0

这与arduino recv里是对应的。然后btle_tx发射的时候也会有提示INFO bit和PHY bit。我猜测INFO bit就是编码前的数据,PHY bit是编码后的(意义不大)。

然后我后来的目标就转变为想办法调节btle_tx的参数,使它发出INFO bit里类似如下的数据(跟send_simplified发的和recv解的一模一样):

 2 1 6 6 8 53 48 41 52 46 4 CC AA BB DD

我发现这样就不能发LOCAL_NAME09包了,否则最前面的几个值(2 1代表数据类型)是不一样的。后来我仔细阅读了hackrf用的btle程序的文档,发现可以直接手工写入编码前的数据,因此我用如下命令:

./btle_tx 39-ADV_IND-TxAdd-1-RxAdd-0-AdvA-685746352413-AdvData-0201060608534841524604ccaabbdd r1000

可以看到,这个手工发数据包,强制了数据类型0201,并且后面的内容也跟我send_simplified发的完全一样,就搞定了,arduino recv可以看到这个数据包了。

你还可以自己改数据ccaabbdd内容随便改,但是别改长度。

SDR发射低功耗蓝牙数据包给nrf24l01_哔哩哔哩_bilibili

理论上,可以用这种方式控制小四轴,小四轴直接用nrf24l01当作接收机的很多。我还找到过一个项目用nrf+arduino实现了ppm输出,这样可以完全替代ppm遥控接收机接到我自己的小四轴上。

但目前还存在几个需要改进的地方:一个是数据精度问题,如果ccaabbdd作为数据,4个通道每个通道用一个cc,也就是一个byte,那么只能区分为256种组合。而原来ppm或者pwm都可以从0到2000变化,这样的话精度要丧失8倍。还有更大的问题是发送的数据间隔比较大,目前看最小300ms,接收的数据间隔由于丢包更大,用这种方式来不及控制飞机。

所以我后面还有几件事要做:

1.简写btle_tx项目,尝试提高发射效率

2.btle_tx移植到portapack中

3.用nrf24l01+arduino pro mini结合cheapass receiver,把自制ppm接收机做好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值