我是靠谱客的博主 贪玩紫菜,最近开发中收集的这篇文章主要介绍arduino笔记31:NRF24L01通信,控制一个LED灯亮灭性能参数编辑模块电气特性通讯相关,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

目录

性能参数编辑

模块电气特性

通讯相关


 

调了两天,终于实现简单的信号传递了。

查找资料解决问题的过程走了很多弯路,包括去了解了arduino的SPI通信,尝试了RF24、Mirf库,增加电解电容、电源问题、修改程序,最后是调整接线顺序调好的,但是估计最开始不是接线的问题,期间修正了其他问题,不断调整之后最终调好了。

其间参考了很多网上的资料,包括b站的视频、How To Mechtronics、arduinoo中文社区,以及个人博客、csdn等等。感谢各位大佬的指引!相关参考资料都会整理汇总在文末。

 

nRF24L01,工作于2.4 GHz~2.5 GHz ISM频段, 最高工作速率2Mbps,125 频道,满足多点通信和跳频通信需要,低功耗1.9 - 3.6V 工作,待机模式下状态为22uA;掉电模式下为900nA,可以用SPI控制

 

性能参数编辑


◆ 小体积,QFN20 4x4mm封装
◆ 宽电压工作范围,1.9V~3.6V,输入引脚可承受5V电压输入
◆ 工作温度范围,-40℃~+80℃
◆ 工作频率范围,2.400GHz~2.525GHz
◆ 发射功率可选择为0dBm、-6dBm、-12dBm和-18dBm
◆ 数据传输速率支持1Mbps、2Mbps[1] 
◆ 低功耗设计,接收时工作电流12.3mA,0dBm功率发射时11.3mA,掉电模式时仅为900nA
◆ 126个通讯通道,6个数据通道,满足多点通讯和调频需要
◆ 增强型“ShockBurst”工作模式,硬件的CRC校验和点对多点的地址控制
◆ 数据包每次可传输1~32Byte的数据
◆ 4线SPI通讯端口,通讯速率最高可达8Mbps,适合与各种MCU连接,编程简单
◆ 可通过软件设置工作频率、通讯地址、传输速率和数据包长度
◆ MCU可通过IRQ引脚快判断是否完成数据接收和数据发送


 

 

模块电气特性

 

认识NRF24L01模块:

这是引脚

 

这个产品特性:

本模块采用国产射频芯片SI24R1,内部集成了所有与RF协议相关的高速信号处理部分,由于链路层完全集成在模块上,非常便于开发。自动检测和自动重发丢失的数据包,重发时间及重发次数可软件控制,自动存储未收到应答信号的数据包;在收到有效数据后,模块自动发送应答信号,无须另行编程;载波检测—固定频率检测,内置硬件CRC检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道。SI24R1的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。

 

产品参数:

 

  • 板载2.4G PCB天线,ISM频段,标准插针DIP 2.54mm间距接口,体积小巧,便于嵌入式应用。
  • 支持六路通道的数据接收(一对六)
  • 支持GFSK/FSK等通用调制方式
  • 支持2Mbps/1Mbps/250Kbps 数据速率,可设不同的发射功率
  • 多频点:126频点,满足多点通信和跳频通信需要,2400MHz~2525MHz,1MHz跳频步进
  • 内部集成高PSRR的LDO
  • 宽电源电压范围:1.9~3.6V,典型3.3V
  • 平均发射电流低至25mA(7dBm)
  • 接收灵敏度:-96dBm@250kbps
  • 发射功率可高达+7±1dBm
  • 采用四线SPI接口,速率可达10MHz
  • 内部集成智能ARQ基带协议引擎
  • 收发数据硬件中断输出
  • 支持1bit RSSI输出
  • 工作温度:-20℃~85℃
  • 最好的传输距离:小于240米(250kbp空旷环境无遮挡无电磁干扰)可靠距离推荐在 30%-50%内使用。

 

 

 

原理图::

 

这个是信号加强版的nrf24l01模块:

 

他的参数:

 

  • 板载2.4G天线SMA-KE天线接口方便外接天线,ISM频段,标准插针DIP 2.54mm间距接口
  • 内置Enhanced ShockBurst™ 基带协议引擎
  • 支持六路通道的数据接收(一对六)
  • 支持GFSK/FSK等通用调制方式
  • 支持2Mbps/1Mbps/250Kbps 数据速率,可设不同的发射功率
  • 多频点:126频点,满足多点通信和跳频通信需要,2400MHz~2525MHz,1MHz跳频步进
  • 内部集成高PSRR的LDO
  • 宽电源电压范围:1.9~3.6V,典型3.3V
  • 平均发射电流低至250mA(20dB)  !!!这个很重要,遇到问题首先要解决电源的问题。
  • 接收灵敏度:-96dBm@250kbps
  • 发射功率可高达20dBm
  • 采用四线SPI接口,速率可达10MHz
  • 收发数据硬件中断输出
  • 支持1bit RSSI输出
  • 工作温度:-20℃~85℃
  • 最好的传输距离:小于1000米(250kbp空旷环境无遮挡无电磁干扰)可靠距离推荐在 30%-50%内使用。

 

 

关于引脚的具体含义:

 

各张表格是按照引脚对应所在的位置排列的::

VCC电源GND接地
CSN接收端选择引脚,Not代表低电平有效CE发射/接收状态选择引脚
MOSI主出从入,是控制端输出,接收端输入引脚,通常简写成MOSCK时钟信号引脚
IRQ中断请求引脚MISO主入从出,是控制端输入,接收端输出引脚,通常简写成MI

其中,MOSI、SCK、MISO用来连接Arduino的SPI引脚。

 

  • SS : 外设选择线(Slave Select),指定要联机的外设,此线输入0,代表选取,1代表未选取。这条线也称为CS(Chip Select,芯片选择线或简称片选)。分配给所有的设备,用于enable/disable指定的设备,同时用于避免由于线路忙导致的错误传输。

 

 

VDD 电源输入端
GND 接地
CSNChip Select Not接收端选择引脚,Not代表低电平有效
CEChip Enable发射/接收状态选择引脚
MOSIMaster Out Slave In主出从入,是控制端输出,接收端输入引脚,通常简写成MO
SCKSerial Clock时钟信号脚
IRQInterrupt Request中断请求脚
MISOMaster In Slave Out主入从出,是控制端输入,接收端输出引脚,通常简写成MI

 

电压控制在3。3v,用5容易烧坏

 

2.4G模块容易受到干扰,通常接一个电解电容,

如果你在测试无线模块的时候发现无法工作  是因为arduino板子的电源滤波没有做好,你只需要在无线模块的VCC和GND之间加上一个10UF或者以上的电容,有些电容需要注意电容极性。那么就能够解决问题。

电路图,接图::

 

 

注意,每个arduino开发板都有不同的SPI引脚,CSN和CE引脚可以连接刀Arduino板的任何数字引脚,它们用于将模块设置为待机或活动模式,以及用于在发送或命令模式之间切换,

 

 

通讯相关

 

 

nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发芯片。

 

设定通道地址,在2.4~2.5GHz上划分了0~125个频道,通过程序可以自由设定使用的频道,只要发射端和接收端频道相同就可以了,每个频道内可容纳六个通道,每个通道可对应一个发射器,一个接收器可以接收来自六个发射器的讯号,在一个频道内,至少有一个发射器和一个接收器才能通讯,发射器可以位于0~5内的任意个通道,并且指定任意的一个地址值。

 

注意每个NRF24L01只有一个发送通道,用来指示向接收端NRF24l01的哪个接收通道发送数据,即TX_ADDR(即只有一个发送目标地址寄存器)不要被TX5迷惑,这里5是指第五个NRF24l01.但一个NRF24L01是有6个接收通道的,每个通道有自己的地址。所以一个2401可以接收6个2401发送来的数据。在发送模式下,发送端的2401会用自己接收通道0来接受 接收端的2401发送来的相应信号。但是接收端的2401发送应答信号的时候,也发送的地址就是接收端的某个接受通道的地址。所以发送端的接收通道0的地址要设置成这个地址。

 

发送端代码:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define buttonPin 3

int buttonState = 0;

RF24 radio(7,8);   // 设置 CE,CSN
const byte address[6] = "00001";  //通讯通道地址,可以为任意的5个字符串
void setup()
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  radio.begin();   //启动nRF模组
  radio.openWritingPipe(address);  //设定通道地址
  radio.setPALevel(RF24_PA_MIN);  //设定广播功率
  radio.stopListening();   //停止侦听,设定成发射模式
  }

void loop() {
  // put your main code here, to run repeatedly:
/*  
  const char text = '110';
  radio.write(&text, sizeof(text));
  delay(1000);
 */ 
  buttonState = digitalRead(buttonPin); //读取3号引脚的状态
  if(buttonState)
  {
    Serial.println("开关高电平");
    }
  radio.write(&buttonState,sizeof(buttonState));  //使用radio.write()函数将数据发送出去

}

通过在变量名之前使用“&”,我们实际上设置了一个指示存储我们想要发送的数据的变量,并使用第二个参数设置了我们想要从该变量中获取的字节数。在这种情况下,sizeof()函数获取字符串“text”的所有字节。

 

 

接收端代码:

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>



#define buzzerPin 3

int buttonState = 0;

RF24 radio(7,8);   // 设置CE, CSN
const byte address[6] = "00001";  //通讯通道地址
void setup()
{
  Serial.begin(9600);
  pinMode(buzzerPin, OUTPUT);
  digitalWrite(buzzerPin,LOW);
  radio.begin();   //启动nRF模组
  radio.openReadingPipe(0,address);  //设定通道地址
  radio.setPALevel(RF24_PA_MIN);  //设定广播功率
  radio.startListening();  //开始监听无线广播
  }

void loop() {
  // put your main code here, to run repeatedly:
 /*
  if (radio.available())
  {
    char text = "";
    radio.read(&text,sizeof(text));
    Serial.println(text);
    delay(500);
    }
    */
 
  if (radio.available())   //检查是否有可用的数据
  {
  radio.read(&buttonState, sizeof(buttonState));//读取
  
  if (buttonState == HIGH){
    digitalWrite(buzzerPin,HIGH);
    Serial.println("HIGH");
    }
  else
  {
    digitalWrite(buzzerPin,LOW);
    //Serial.println("LOW");
    }
  
  }
  
}

 

 

 

 

const  关键字,限定一个变量不允许被改变,产生静态作用,使用const在一定程度上可以提高程序的安全性和可靠性。

 

关于函数radio.available()总是返回true的原因::

The problem is once the message is read, it remains in the receive buffer. So, radio.available() is always true. I am manually flushing the receive buffer to get around this currently.

 

2020/9/23

补充

本人先后试用了三个库,即Mirf库、RF24库和nRF24L01库。


先说说Mirf库

对于点对点的通讯,其完全能够胜任。我想,很多人会和我一样,被接收地址、发送地址搞得晕头转向。大家都收到过快递吧,也发过快递吧?你如果没有街道门牌号码(接收地址),别人就没法给你寄快递,你如果不知道对方的街道门牌号码(发送地址),就无法给别人发快递。对于每一个模块,都要有自己的街道门牌号码(接收地址),信息要发到哪个模块,就将“发送地址”填写成那个模块的街道门牌号码。


RF24库

它带的函数很丰富,可实现很多功能,其中之一就是多对一,最多实现6对1通讯,用同一频道,包含六个通道。可以修改发射功率、数据传输速率、发射频道等等。但在测试中,出现接收地址和发送地址不正确而无法通讯。


    最后说说nRF24L01库,简单有效,2对1一试就通,相信多对1也不会有问题。在这几天的实际应用中发现,只要信息没有及时读取,就会被新接收到的信息冲掉(按道理6个通道不同,别的通道的信息不会冲掉本通道的),这样看来,用不用这6个通道接收信息都无所谓,一个就够了,只要发送端互相之间有效错开发送时刻,再多的发送端都可以!花了10天时间,想了很多办法,要实现多对一,结果,不用那么费事。
   另外,查了nRF24L01芯片的资料,发现6个通道实际共享3个RX FIFO寄存器,理论上是只能同时接收3路信息。

 

 

!!!

先给nrf24l01模块通电,,然后再开启arduino。

不然通信不成功

 

 

一个arduino和RPI使用NRF24L01模块进行通信的例子::https://www.cnblogs.com/wuchaodzxx/p/8436571.html

 

参考:

  1. b站视频创客e工坊:https://www.bilibili.com/video/BV117411P7dH?from=search&seid=11469222345673799857
  2. 性能参数参考::https://blog.csdn.net/ling3ye/article/details/53054959
  3. RF24库函数解析:http://maniacbug.github.io/RF24/index.html
  4. arduino中文社区::https://www.arduino.cn/thread-8420-1-1.html
  5. 关于SPI通信::https://www.yiboard.com/thread-1040-1-1.html

  6. nRF24L01通道:地址:https://blog.csdn.net/qq_26602023/article/details/51016724

  7. 关于radio.available总是返回True:https://forum.arduino.cc/index.php?topic=366025.0

 

最后

以上就是贪玩紫菜为你收集整理的arduino笔记31:NRF24L01通信,控制一个LED灯亮灭性能参数编辑模块电气特性通讯相关的全部内容,希望文章能够帮你解决arduino笔记31:NRF24L01通信,控制一个LED灯亮灭性能参数编辑模块电气特性通讯相关所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部