在无线
通信1中小编介绍了433MHz模块,虽然成本低廉、使用方便,但由于干扰原因只比较适合与点对点且单向通信的场景,在一发多收或者多发一收的情况下就不太适用了。那说到价格便宜,支持双向通信且干扰小的方案那就非nRF24L01/nRF24L01+模块莫属了。
nRF24L01/nRF24L01+模块
nRF24L01是由Nordic
半导体生产的一种单片无线收发器芯片,它的射频频段在2.4GHz~2.5GHz之间,这个频段也属于我们之前所说的免许可的ISM(工业、科学和医学)开放频段。围绕这个芯片设计的模块就是我们常见的nRF24L01模块,这类模块种类名称也很多,比如nRF24L01模块,nRF24L01+模块,nRF24L01+ PA/LNA模块。
它们其实大同小异,nRF24L01+是nRF24L01芯片的升级版本,nRF24L01只支持1Mbps和2Mbps的传输速率,而nRF24L01+还支持250Kbps的传输速率,nRF24L01+ PA/LNA模块是在nRF24L01+模块的基础上集成了收发放大的外置天线信号模块,增大了模块的传输距离,如果在空旷的环境里,使用板载
PCB天线的nRF24L01/nRF24L01+模块传输最大距离只有100米,而PA/LNA模块可以到达1000米。
nRF24L01/nRF24L01+如何工作
nRF24L01/nRF24L01+模块收发在特定的频率上,这个频率被成为信道 (Channel)。一对或者多个模块相互通信就必须在同一个频率上。所以这个频率必须在2.4GHz~2.5GHz之间的任意一个频率上,更准确点,应该是2400MHz到2525MHz。由于每个频率占用的信道带宽(bandwidth)要至多1MHz,那么在同一个范围内,如果带宽为1MHz,理论上就可以有125个独立的频率可以用。
nRF24L01/nRF24L01+模块提供了一个原生的多发一收的功能,即多个发送端可以发给一个接收端,但发送端最多是6个。每个物理信道(Channel)被分成6个软件逻辑上的数据管道(Data Pipes),每个数据管道都有自己的配置地址。
中心的nRF24L01/nRF24L01+模块可以同时接收其他6块nRF24L01/nRF24L01+模块的消息,也可以随时停止接收变成发送模块,向其他模块发送消息,但发送过程不能同时,只能一次一个数据管道。
增强ShockBurst协议
nRF24L01/nRF24L01+模块通信时,通信的信息是遵循一定格式的,这个格式就是ShockBurst协议。最初ShockBurst协议格式是只有Preamble、Address、Payload以及CRC字段的。
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