准备做平衡车,缺个遥控器,又不想用手机App。刚好手中有个之前买的遥控直升机,配套的2.4G遥控器看着还行,就打算拿来用在平衡车上。于是就开始了破解。先看图吧!
![](https://i-blog.csdnimg.cn/blog_migrate/4c8bc283fb721ec2794bb47345038690.jpeg)
经拆解发现(遥控器端2.4G模块是COB封装的看不出,只能在接收端看芯片型号)为BK2423(和nRF24L01兼容)。于是就可以nRF24L01为接收机接收遥控器数据。当然反过来,也可以用nRF24L01来遥控直升机。
![](https://i-blog.csdnimg.cn/blog_migrate/23438f20e38d0bf9c8e5b801bffa9520.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/c012993657139a78b3277cb3c7978602.jpeg)
查数据手册:(这里用nRF24L01数据手册、BK2423多了一个BANK寄存器但是只有初始化时使用、其余通用)(BK2423的数据手册做的不好,毫无美感,看地眼痛心累)
1. 数据格式
![](https://i-blog.csdnimg.cn/blog_migrate/32d9b232d81b1fc7a1bd5ca3bafebca2.jpeg)
2. 兼容模式(如何配置接收端)
![](https://i-blog.csdnimg.cn/blog_migrate/4a269752aa992a26865e76d5e095d895.jpeg)
3. SPI时序(看懂时序图)
![](https://i-blog.csdnimg.cn/blog_migrate/c4afe20a7c8e5d34895eb086d3f93a69.jpeg)
4. 指令(根据3看4、5)
![](https://i-blog.csdnimg.cn/blog_migrate/d1f6492a79f76d98b6d068761bb82a0f.jpeg)
5. 寄存器(部分)
![](https://i-blog.csdnimg.cn/blog_migrate/6bca2cbd6d172b51f301028b18781241.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/072da8a88abf40bd858fbc7de98cda31.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/bb9d389efdf0b42f3a0e6e2395314754.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3c4143c64dfee13399a18bdc263601d5.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/baea3342c3a2b3b1cf6157d633e9810a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/ffdaacdee8370a89772d5ad108cd5d1a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/505fd22e880370f41fa4043ddffc1fdd.jpeg)
抓数据:通过遥控器的2.4G模块SPI接口获取配置信息,通讯协议跳频列表。
工具: Saleae Logic 16 Clone(逻辑分析仪)、
Saleae Logic 1.2.10(官方软件)、
SigrokPulseView(开源软件)。
(逻辑分析仪这个不是必须的,例:Arduino SPI 来捕获数据,就是在确定引脚的时候会有点麻烦,因为发送端模块的引脚定义不明,但是可以通过单片机新唐N79E814AT20的SPI引脚来查,遥控器的主控用的这个单片机)
下面是硬件和软件的截图:
![](https://i-blog.csdnimg.cn/blog_migrate/739cc6b1ef3e4c0dde788a74c7ccf559.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/25f998c3109b74d03eb818cf6e3f5a8f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/a98eec73a31b09fd70d2e8d468b16262.jpeg)
开整:
1. 连线:(做了个接头直接卡在模块的引脚上,共9个引脚)
![](https://i-blog.csdnimg.cn/blog_migrate/dd338c4f12944455f84a80273a8d3408.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/59200513c3a38ec566178193fe1af246.jpeg)
2. 连接逻辑分析仪、打开软件开始捕获、打开遥控器电源、开始配对、配对成功、操控摇杆一段时间、终止。以25MHz的采样率采集15s,九个引脚对应九个通道。(把开机配置、对频、工作跳频的整个过程都采集下来进行后续的分析)
3. 根据SPI时序图找出MOSI、MISO、CS、CLK。
![](https://i-blog.csdnimg.cn/blog_migrate/db7a8a36b62f14302fe14de65310c6c0.jpeg)
4. 用SPI协议进行分析
5. 查找关键数据:
形式:指令:写指令(0x20) +寄存器地址(0xXX)
数据:D7、D6、D5、D4、D3、D2、D1、D0、
指令:
W_TX_PAYLOAD: = 0xA0
CRC: 0x20+ 0x00 = 0x20
AutoAck: 0x20+ 0x01 = 0x21
地址宽度 : 0x20 + 0x03 = 0x23
频道: 0x20 + 0x05 = 0x25
数据速率: 0x20+ 0x06 = 0x26
数据位宽度: 没有查到,可通过0xA0查找W_TX_PAYLOAD,查看入数据的字节数
发送地址: 0x20+ 0x10 = 0x30
数据:
CRC:0x0E : 0000 1110
1. 开启CRC
2. 2 Bytes
3. PWR_UP
![](https://i-blog.csdnimg.cn/blog_migrate/9235d37e28acdf14632516caff5a0d97.jpeg)
AutoAck: 0x00 : 0000 0000
1. 关闭所有
![](https://i-blog.csdnimg.cn/blog_migrate/f9d21d1eb80509d24c95d0abe0a7d11b.jpeg)
地址宽度:0x03: 0000 0011
1. 5 Bytes
![](https://i-blog.csdnimg.cn/blog_migrate/bca2ffb0aef8a9d6a775510cb1b3d48f.jpeg)
数据速率:0x05 : 0000 0101
1. 1Mbps
![](https://i-blog.csdnimg.cn/blog_migrate/758ee2f965095836d223b2e458ada1ee.jpeg)
发送地址:0x6D 0x6A 0x73 0x73 0x73 : “mjsss”
![](https://i-blog.csdnimg.cn/blog_migrate/c0342346676353e35e72bae173a0624e.jpeg)
注:右下角的Decoded Protocol 列表中配置命令有多个,如有两个则
下一个是BK2423独有的寄存器配置。多个有部分为数据。
频道:经检查发现有两个跳频列表
1. 配对未完成时:(至今也没搞明白这个是干什么的,猜测是对频的部分,但是不清楚对频的方式)
![](https://i-blog.csdnimg.cn/blog_migrate/e1f9e3f82fb81c0ecb5cf8c9e789c7c4.jpeg)
2. 配对成功后:
![](https://i-blog.csdnimg.cn/blog_migrate/108405120866c46cfcda1fb1cf1929d4.jpeg)
Cycle列表每个频道发送两次,循环管往复。
发送数据位宽度由W_TX_PAYLOAD:0xA0 发现:16 Bytes
![](https://i-blog.csdnimg.cn/blog_migrate/4fd099950b04d23bb73fa1f2b4eb08ab.jpeg)
所有必须的信息已经知道了:接下来开始接收数据进行验证!
Arduino 程序 (RF24 Lib)
(这里有两个工程:Arduino & VS2013, 自行下载,篇幅超出范围不能贴出来了)
pan.baidu.com/s/1jIBOXJC
由于不清楚对频过程所以可以不进行对频(漏洞:在对频过程中只要摇动任意摇杆就会打断对频直接进入工作状态)
连接硬件:
VCC —>3.3V
GND —>GND
CE —>Pin 7
CSN —>Pin 8
IRQ —>Pin 2
![](https://i-blog.csdnimg.cn/blog_migrate/2a7e60c4bb3ac3c8bf1270898e2d3df5.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/4dd4f4a3ccf3cf2a5c0f79b5519f0c0c.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/9215dd7afacffca261a7c5055f469f45.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/fb667f80255f66671f059d119083c849.jpeg)
开始接收数据!
![](https://i-blog.csdnimg.cn/blog_migrate/c0ba4ed4b552a006a965d9672f26cdf5.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/8c6703b212179aec776dd40a8bd5f1c8.jpeg)
自左向右依次:0:油门、1:左右转、2:前后飞、3:左右飞、4:左右转微调、5:前后飞微调、6:左右飞微调、14:操作模式/灵敏度、15:校验和。(其余数据含义未知)
至此全部工作已经完成。
总的做下来难道并不高,但是锻炼了自己。把它写下来一方面是总结一下自己所做的工作、步骤,另一方面希望能够对大家有所帮助。
附录:我在上文中提到了sigrok这个开源软件,但是并未提及(因为发现越写思路越清晰,就用不到了),这里作为补充。
Sigrok是一个开源跨平台信号分析软件、支持大量设备。它不仅能够提供通讯协议分析、更可以具体到具体的芯片,比如这里用到的nRF24L01+,它以SPI作为通讯接口,那么就可以应用SPI分析数据内容,进而解析其含义。
这里以一个数据传输过程为例:
![](https://i-blog.csdnimg.cn/blog_migrate/593bf22e6c92943c5c12922bd1c22f98.jpeg)
sigrok支持大量的通讯协议和芯片解码,有需要的可以了解一下。注:暂不支持本文中的设备,折腾了很久,从win7到Ubuntu都试过了就是不行。我是通过官方软件导出为Raw Binary的形式再导入sigrok进行分析的,这个是最快捷的方法。 it依次为0~7Channel,在导入时选择的通道数n是指导入0~(n-1)。另外要填写采样率,单位为Hz。