nRF24L01+后ShockBurst协议就升级成了增强型ShockBurst协议。加入了Packet Control字段。加入Packet Control字段有以下几个好处:
可以在Packet Control字段里描述Payload字段的长度,可以说明每个包数据的长度。
Packet Control字段里加入了包的ID标记,即Packet ID,这样方便后期处理数据。
最后,可以规定是否要求返回应答字符(ACK),来确认发出去的数据包是否被接收。
两个nRF24L01/nRF24L01+模块通信时,发送端会以增强型ShockBurst协议向接收端发送包数据,接收到接到包以后就会向发送端回复一个应答字符(ACK),这样一个正常发送过程就完成了。当然这个过程中有时候会出现另外两种情况:
第一种,数据包在发送过程中丢包了,那么接收端没收到也不会返回ACK,发送端没等到ACK过一段时间就会重新发送一次。
第二种,数据包送到了,接收端返回ACK给发送端,但ACK丢了。那同样,发送端没等到ACK过一段时间还是会重新发送一次。
电路连接
那么,接下去让我们用两块nRF24L01/nRF24L01+模块实践一下无线通信。首先,我们需要了解一下nRF24L01/nRF24L01+模块的针脚,它是通过SPI跟Arduino通信等,不熟悉SPI的可以参考《Arduino常用的三种通信协议UART, I2C和SPI》。nRF24L01/nRF24L01+模块接收和发送模块不区分,即nRF24L01/nRF24L01+模块既可以当发送模块,也可以当接受模块。
GND:负极接地
VCC:正极接Arduino的3.3V,nRF24L01/nRF24L01+模块能接收的电压是1.9V-3.9V,接5V可能会烧毁模块!
CE:Chip Enable,拉高启用模模块,拉低模块停止工作。
CSN:片选针脚,拉低开始SPI数据。
MOSI、MISO、SCK:SPI针脚
IRQ:中断针脚,有新数据时可以产生中断。
了解nRF24L01/nRF24L01+模块针脚以后,我们就可以对应地连接Arduino,如下图将nRF24L01/nRF24L01+模块和Arduino UNO连接。发送部分和接收部分是一样的。
这里CE和CSN针脚并不作限定,你可以选择其他数字针脚。
安装依赖库
使用Arduino驱动nRF24L01/nRF24L01+模块需要第三方库。
Arduino代码
将以下发送端和接收端的代码分别上传至两块连接了nRF24L01/nRF24L01+模块的Arduino UNO。
发送端:
接收端:
如果一切正常,打开接收端的串口监视器,就可以看见输出的消息了。
nRF24L01/nRF24L01+模块的使用建议
上面的实例我们只演示了nRF24L01/nRF24L01+模块最基本的通信,因为之前提到的nRF24L01/nRF24L01+模块不同频率的通信,单个接收还支持6个数据通道,这些特性让nRF24L01/nRF24L01+模块可以组合成不同的网络结构。感兴趣的朋友可以看看RF24的库其他一些示例。
射频信号对于供电
电源的噪音较为敏感,为了更稳定更远的信号传输,建议可以在nRF24L01/nRF24L01+模块的VCC和GND两端并联一个10uF左右的滤波电容。
另外nRF24L01/nRF24L01+模块还是存在射频干扰问题,因为2.4G也是WiFi路由器等设备常用的频段,如果周围有频率信道相同的
电子设备还是很容易产生信号干扰。建议nRF24L01/nRF24L01+模块尽量使用高频率的信道,因为大部分WiFi信号用的是相对较低的频率信道。
还有nRF24L01+支持250Kbps、1Mbps和2Mbps的传输速率。如果你的应用不需要很高的传输速率,那么尽量使用250Kbps的传输速率,这样你可以获得更远的传输距离。
原作者:小B 爱上Arduino