Arduino 2.4G通信实验 nRF24L01模块的简单例子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ling3ye/article/details/53054959

nRF24L01是底价的2.4G无线传输实现,可以用来做遥控哦。

输出功率频道选择和协议的设置可以通过SPI 接口进行设置。

几乎可以连接到各种单片机芯片,并完成无线数据传送工作。

极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,

接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。

 

性能参数编辑
◆ 小体积,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引脚快判断是否完成数据接收和数据发送

 

问题反馈

解决方法一:

有不少网友反馈接受端只显示0和1

 

由于我自己没有试过出现这问题,也不知道怎么回事,但总结了一下其中一网友的解决办法,供大家参考

 

解决方法二:

有网友再提供了一个解决方法,就是再

setup()函数里添加

Mirf.cePin = 9;

Mirf.csnPin = 10;

 

解决方法三:

由无名网友,折腾三周,心力交瘁下解决得出得方法,感谢网友提供

主要是库的冲突,可能mirf库不稳定,使用nf24库

库下载地址: https://github.com/nRF24/RF24

或者在Arduino IDE 的库管理器中搜索nrf24,作者为TMRh20

安装库后,有例程可参考。

 

再次实验,重新使用本章的代码,测试通过,没有问题。

但也会因由接线问题,硬件假货问题,库问题,故提供三个解决问题的方法,希望能对你有帮助,

再次感谢提供这些方法的网友。多多交流

 

实验效果

 

BOM表

Arduino Uno *2

nRF24L01 * 2

跳线若干

 

 

针脚说明

 

接线方式

Arduino uno     ---     nRF24L01

3.3V                   ---       VCC

GND                  ---       GND

7                         ---      CSN

8                         ---        CE

11                       ---       MOSI 

13                       ---        SCK

12                       ---        MISO

 

*IRQ示例没有用上,则不用接线了

 

程序开源代码

首先下载库文件

本示例用到库的下载地址:https://github.com/aaronds/arduino-nrf24l01

把下载的文件 Mirf文件夹 解压到Arduino 安装文件夹里的 “libraries”

程序源码和所用库打包下载:
https://u16460183.ctfile.com/fs/16460183-293939883

 

 

然后就可以使用以下代码:

发送端程序 sender.ino

 

//发射端程序

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

int value;

void setup()
{
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"ABCDE"); //设置自己的地址(发送端地址),使用5个字符
  Mirf.payload = sizeof(value);
  Mirf.channel = 90;              //设置所用信道
  Mirf.config();
}

void loop()
{
  Mirf.setTADDR((byte *)"FGHIJ");           //设置接收端地址
  value = random(255);                      //0-255的随机数
  Mirf.send((byte *)&value);                //发送指令,发送随机数value
  while(Mirf.isSending()) delay(1);         //直到发送成功,退出循环
  delay(1000);
}

 

 

 

 

接收端程序 Receiver.ino

 

//接收端程序

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

int value;

void setup()
{
  Serial.begin(9600);
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
 
  Mirf.setRADDR((byte *)"FGHIJ"); //设置自己的地址(接收端地址),使用5个字符
  Mirf.payload = sizeof(value);   
  Mirf.channel = 90;   //设置使用的信道
  Mirf.config(); 
  Serial.println("Listening...");  //开始监听接收到的数据
}

void loop()
{
  if(Mirf.dataReady()) {  //当接收到程序,便从串口输出接收到的数据
    Mirf.getData((byte *) &value);
    Serial.print("Got data: ");
    Serial.println(value);
  }
}

 

 

 

 

没有更多推荐了,返回首页