Arduino使用NRF24L01模块进行无线通信
前言
其实CSDN有很多关于这个无线模块的使用,包括Arduino的使用例程,但是实际自己跟着做一遍的时候还是发现了有些小问题,于是记录一下方便以后做其他有意思的小项目。(Arduino的库文件在文章末尾)
本文将实现2块Arduino板子之间的无线通信,并控制led的亮灭。
一、NRF24L01无线通信模块图示
1.引脚图
这是该模块的背面引脚图,仅供参考。注意,有些并没有标明具体的引脚,但是顺序基本上是一致的。
正面图如下:
图片来自某宝。(注意在购买时别搞错了,这个跟esp01模块长的很像)
二、参考接线
1.Nano与NRF模块:
Nano | NRF模块 |
---|---|
3.3v | VCC |
GND | GND |
8 | CSN |
7 | CE |
11 | MOSI |
13 | SCK |
12 | MISO |
置空 | IRQ |
注意NRF模块的VCC引脚电压一般是1.9v-3.6v,接5v很有可能会烧坏模块。
2.NRF模块与Arduino Uno:
Uno | NRF模块 |
---|---|
3.3v | VCC |
GND | GND |
8 | CSN |
7 | CE |
11 | MOSI |
13 | SCK |
12 | MISO |
置空 | IRQ |
注:led的正极接Uno的3号引脚,负极接GND。
三、发送端程序(Arduino Nano)
//发射端程序
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7,8);// CE,CSN
const byte address[6] = "00001";//指定一个地址,可以是自定义的其他地址,但要与接收端地址保持一致
void setup()
{
Serial.begin(9600);//设置波特率
Serial.println("请输入你要发送的数据:");//提示字符
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();//发送端,这里我设置为只发,实际是可以互传的
}
void loop()
{
const char text1[] = "OOO";//要发送的内容
const char text2[] = "CCC";
radio.write(&text1,sizeof(text1));
delay(1000);
radio.write(&text2,sizeof(text2));
delay(1000);
}
四、接收端程序(Arduino Uno)
//接收端程序
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7,8);// CE,CSN
int led = 3; //3号引脚接led
const byte address[6] = "00001";//与发送端的地址保持一致
void setup()
{
pinMode(led,OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0,address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();//开始监听,只进行接收
}
void loop()
{
if(radio.available()){
char text[32] = "";
radio.read(&text,sizeof(text));
Serial.println(text);//可以打开串口查看发送过来的数据是否正确
if(text[1]=='O')//我这里只判断一个字符
digitalWrite(led, HIGH);
if(text[1]=='C')
digitalWrite(led, LOW);
}
}
五、实际效果测试
下面是效果图,led每隔1秒闪烁一次。
由于没加天线,这个无线通信模块的透射性不是很强,当有障碍物阻挡的时候通信距离比较短,如果是在比较空旷的环境下通信距离至少有20米。
六、遇到的问题
实际在做的时候遇到了很多问题,但是每个人说的原因都不一样。
问题1:程序和接线都没问题了,但是接收不到信息
参考解答:
①有的人说可以在NRF模块的VCC和GND之间接一个1uf的电容,因为有些Arduino板子的滤波做的不好。(这个方案我没试过)
②用电脑的USB口或者一个充电宝给Arduino供电。(这是我采用的方案,一开始我用的是9v电池,但是发现Arduino板子不稳定,换成充电宝才稳定发送和接收)
③可能是使用的库有问题,需要把相关的库文件放在Arduino的安装目录下。
注意:造成没正确通信的原因可能是多重的,可以自己多摸索一下。
问题2:能通信,但是接收到的信息不对
参考解答:
①有些人说是CSN引脚要接7号,CE引脚要接8号。但我实践证明,按我的这种方式进行接线是没问题的。(我是CSN接8号引脚,CE接7号引脚)
问题3:不同的Arduino板子通信引脚是否不一样?
参考解答:
不一样。Arduino mega和 Arduino Uno的通信引脚就不一样。
参考链接
1.https://howtomechatronics.com/tutorials/arduino/arduino-wireless-communication-nrf24l01-tutorial/
2.https://www.bilibili.com/video/BV1Db41187Pj?spm_id_from=333.1007.top_right_bar_window_history.content.click
3.我使用的Arduino的相关库文件百度网盘链接如下:
链接:https://pan.baidu.com/s/1D1qXRaMpss7f5-e3e6ykOg?pwd=wnu9
提取码:wnu9
–来自百度网盘超级会员V5的分享