Arduino 2.4G通信实验 nRF24L01模块的简单例子
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示例没有用上,则不用接线了
程序开源代码
发送端程序 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);
}
}
原文作者:ling3ye