Arduino开发板使用NRF24L01进行无线通信

datasheet

NRF24L01模块资料:https://download.csdn.net/download/acktomas/11135884
rf24库:https://github.com/nRF24/RF24
rf24库文档:http://tmrh20.github.io/RF24/

相关案例:

使用Arduinon开发板连接RF24L01实现控制伺服电机:
https://www.yiboard.com/thread-970-1-1.html
如何使用Arduino UNO、操纵杆模块和NRF24L01模块控制伺服电机:
https://www.yiboard.com/thread-1095-1-1.html
如何使用多个NRF24L01模块搭建一个Arduino无线网络
https://www.yiboard.com/thread-985-1-1.html

1. Arduino开发板使用NRF24L01进行无线通信

原文地址:https://www.yiboard.com/thread-994-1-1.html

如何使用NRF24L01收发器模块在两个Arduino开发板之间进行无线通信。为了说明无线通信,我们将举两个例子,第一个是从一个Arduino开发板向另一个发送简单的“Hello World”消息,在第二个例子中,我们将在Arduino开发板之间进行双向通信,其中我们使用在第一个Arduino开发板的操纵杆,控制在第二个Arduino开发板的伺服电机,反之亦然,使用第二个Arduino开发板的按钮,我们将控制第一个Arduino开发板的LED灯。

在这里插入图片描述

1.1 NRF24L01收发器模块

该模块的功耗非常低。它在传输过程中消耗大约12mA的功率,甚至低于LED。

该模块工作在3.3V,因此不要将其直接连接到5V的Arduino,因为它可能会损坏。 NRF24L01模块的其他引脚具有5V容限,因此您可以将它们直接连接到Arduino。
在这里插入图片描述
在这里插入图片描述

  • CE: 模块控制线,CSN为低时,CE协同CONFIG寄存器共同决定NRF24L01状态
  • CSN: SPI片选线
  • SCK: SPI时钟线
  • MOSI:SPI数据线(主机输出从机输入)
  • MISO:SPI数据线(主机输入从机输出)
  • IRQ: 中断信号线。中断时变为低电平,在以下三种情况变低:Tx FIFO发完并且收到ACK(使能ACK情况下)、Rx FIFO收到数据、达到最大重发次数

其中三个引脚用于SPI通信,它们需要连接到Arduino的SPI引脚,但请注意每个Arduino开发板都有不同的SPI引脚。引脚CSN和CE可以连接到Arduino板的任何数字引脚,它们用于将模块设置为待机或活动模式,以及用于在发送或命令模式之间切换。最后一个引脚是一个不必使用的中断引脚。

1.2 NRF24L01使用说明

NRF24L01收发器模块使用2.4 GHz频段,可以在250 kbps到2 Mbps的波特率下运行。如果在开放空间中使用且波特率较低,其范围可达100米。

该模块可以使用125个不同的通道,可以在一个地方拥有125个独立工作的调制解调器网络。每个通道最多可以有6个地址,或者每个单元可以同时与多达6个其他单元通信。
在这里插入图片描述

1.3 连接示意图

将NRF24L01模块连接到Arduino开发板,我们就可以为发射器和接收器制作代码了在这里插入图片描述

1.4 Arduino代码

首先,我们需要下载并安装RF24库:https://github.com/nRF24/RF24,这使得编程变得简单。

以下是无线通信的两个代码,在代码下面是对它们的解释。

1.4.1 发射机代码

/*
* Arduino Wireless Communication Tutorial
*     Example 1 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}
void loop() {
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  delay(1000);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

1.4.2 接收机代码

/*
* Arduino Wireless Communication Tutorial
*       Example 1 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#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);
  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);
  }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

1.4.3 代码描述:

我们需要包含基本SPI和新安装的RF24库,并创建一个RF24对象。这里的两个参数是CSN和CE引脚。

RF24 radio(7, 8); // CE, CSN

   
   
  • 1

接下来,我们需要创建一个字节数组,它将代表地址,或两个模块通过的所谓管道。

const byte address[6] = "00001";

   
   
  • 1

我们可以将此地址的值更改为任意5个字母的字符串,这样就可以选择我们要说话的接收器,因此在本例中,我们将在接收器和发送器上具有相同的地址。

在设置部分,我们需要初始化无线电对象,并使用radio.openWritingPipe()函数设置我们将发送数据的接收器的地址,即我们之前设置的5个字母的字符串。

radio.openWritingPipe(address);

   
   
  • 1

另一方面,在接收器处,使用radio.setReadingPipe()函数,我们设置相同的地址,并以此方式启用两个模块之间的通信。

radio.openReadingPipe(0, address);

   
   
  • 1

然后使用radio.setPALevel()函数设置功率放大器电平,在我们的例子中,我将其设置为最小值,因为我的模块彼此非常接近。

radio.setPALevel(RF24_PA_MIN);

   
   
  • 1

请注意,如果使用更高的电平,建议在GND和3.3V模块之间使用旁路电容,以便在工作时具有更稳定的电压。

接下来我们有了radio.stopListening()函数,它将模块设置为发送器,另一方面,我们有radio.startListening()函数,它将模块设置为接收器。

// at the Transmitter
radio.stopListening();

   
   
  • 1
  • 2
// at the Receiver
radio.startListening();

   
   
  • 1
  • 2

在发送器的loop函数中,我们创建了一个字符数组,并为其分配消息“Hello World”。使用radio.write()函数,我们将该消息发送给接收器。这里的第一个参数是想要发送的变量。

void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

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

另一方面,在接收器,在loop()函数部分中,通过使用radio.available()函数,我们检查是否有要接收的数据。如果有数据,首先我们创建一个由32个元素组成的数组,每个元素称为“text”,我们将在其中保存传入的数据。

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

通过使用radio.read()函数,我们读取数据并将其存储到变量“text”中。最后,我们只在串口监视器上打印文本。因此,在我们上传了两个程序之后,就可以在接收器上运行串口监视器,我们会注意到每秒打印一条消息“Hello World”。

  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值