找回密码
 立即注册

QQ登录

只需一步,快速开始

基础模块资料库

本帖最后由 lou 于 2020-5-15 11:36 编辑

基于Arduino使用NRF24L01 2.4G无线模块



产品介绍

nRF24L01
是一款新型单片射频收发器件,工作于2.4 GHz~2.5GHz ISM频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,多种低功率工作模式,工作在100mw时电流为160mA,在数据传输方面实现相对WiFi距离更远,但传输数据量不如WiFi(掉电模式和空闲模式)使节能设计更方便。

111.jpg

(NRF24L01 2.4G无线模块)

产品特点

1、低工作电压:1.9V-3.6V低电压工作
2、高速率:2Mbps,由于空中传输时间很短,较大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率)
3、多频点:125频点,满足多点通信和跳频通信需要
4、超小型:内置2.4GHz天线,体积小巧,29mm*15mm
5、低功率:当工作在应答模式通信时,快速的空中传输及启动时间,较大的降低了电流消耗
6、低应用成本:NRF24L01集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理接口,便于使用低成本单片机
7、便于开发:由于链路层全部集成在模块上,非常便于开发,自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制自动存储未收到应答信号的数据包自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程载波检测一固定频率检测内置硬件CRC检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用跳频设置六路接收通道地址,可有选择性的打开接收通道标准插针Dip2.54MM间距接口,便于嵌入式应用。

112.jpg

工作原理

发射数据时,首先将nRF24L01配置为发射模式:接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接收节点地址TX_ADDR一致),如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从TX FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,MAX_RT置高,TX FIFO中数据保留以便再次重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,通知MCU,最后发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。
接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来,当接收方检测到有效的地址和CRC时,就将数据包存储在RX FIFO中,同时中断标志位RX_DR置高,IRQ变低,产生中断,通知MCU去取数据,若此时自动应答开启,接收方则同时进入发射状态回传应答信号,最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。

与单片机的通信接口类型为SPI,读写时序如下图所示:

SPI读操

113.png

SPI写操作

114.png

工作模式

通过配置寄存器可将nRF24L01配置为发射、接收、空闲及掉电四种工作模式。

  
模式
  
PWR_UP
PRIM_RX
CE
FIFO寄存器状态
接收模式
1
1
1
-
发射模式
1
0
1
数据在TX FIFO 寄存器中
发射模式
1
0
1→0
停留在发送模式,直至数据发送完
待机模式2
1
0
1
TX FIFO 为空
待机模式1
1
-
0
无数据传输
掉电
0
-
-
-

待机模式1主要用于降低电流损耗,在该模式下晶体振荡器仍然是工作的;
待机模式2则是在当FIFO寄存器为空且CE=1时进入此模式;
待机模式下,所有配置字仍然保留。
在掉电模式下电流损耗最小,同时nRF24L01也不工作,但其所有配置寄存器的值仍然保留。

引脚功能

115.png

  
引脚
  
接口性质
描述
GND
接电源地
电源地
VCC
接电源正(+3v)
电源正,范围在1.9-3.6V
CE
模块输入信号
由单片机给出信号控制NRF24L01模块内部射频电路工作与否
CSN
模块输入信号
模块的片选信号,单片机发出信号来控制允许向模块读或写数据
SCK
模块输入信号
串行时钟信号,由单片机发出,来控制模块的读或写的运作节拍
MOSI
模块输入信号
是单片机向NRF24L01模块发送数据的接口
MISO
模块输出信号
是NRF24L01模块向单片机送数据的接口
IRQ
模块输出信号
是NRF24L01产生中断信号发送给单片机的接口

电路原理图

116.png

NRF24L01 2.4G无线模块基础小案例

结合两块Arduino、两块NRF24L01 2.4G无线模块,实现数据的发送和接收。

接线方式

NRF24L01 2.4G无线模块                      Arduino
              VCC                      <------>      3.3V
             GND                      <------>      GND
              CSN                      <------>         8
               CE                        <------>         7
              SCK                       <------>        13
             MOSI                      <------>        11
             MISO                      <------>        12

(1)下载库文件

文件名:RF24-master
提取码:fukg

(2)安装库文件

文件下载后无需解压,点击Arduino IDE菜单栏项目—加载库—添加.ZIP库...

117.png

选择RF24-master文件

118.png

程序实现代码

发送端程序 Sender.ino

  1. #include <SPI.h>
  2. #include <nRF24L01.h>
  3. #include <RF24.h>
  4. RF24 radio(7, 8); // CE, CSN
  5. const byte address[6] = "00001";
  6. void setup() {
  7.   radio.begin();
  8.   radio.openWritingPipe(address);
  9.   radio.setPALevel(RF24_PA_MIN);
  10.   radio.stopListening();
  11. }
  12. void loop() {
  13.   const char text[] = "Hello World";
  14.   radio.write(&text, sizeof(text));
  15.   delay(1000);
  16. }
复制代码

接收端程序Receiver.ino

  1. #include <SPI.h>
  2. #include <nRF24L01.h>
  3. #include <RF24.h>
  4. RF24 radio(7, 8); // CE, CSN
  5. const byte address[6] = "00001";
  6. void setup() {
  7.   Serial.begin(9600);
  8.   radio.begin();
  9.   radio.openReadingPipe(0, address);
  10.   radio.setPALevel(RF24_PA_MIN);
  11.   radio.startListening();
  12. }
  13. void loop() {
  14.   if (radio.available()) {
  15.     char text[32] = "";
  16.     radio.read(&text, sizeof(text));
  17.     Serial.println(text);
  18.     delay(1000);
  19.   }
  20. }
复制代码

程序上传后点击接收方的串口监视器进行查看,每隔1秒出现“Hello World”字样

119.png
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册