风筝
发表于: 2020-10-21 10:12:56 | 显示全部楼层

在制作基于Arduino开发板或者其他微控制器平台的项目时,随着经验的积累,我们将需要在两个Arduino开发板或微控制器之间建立通信,用来进行数据交换和/或控制。这种可以使用有线或无线方式来实现通信。有多种方式可以实现设备之间的无线通信,包括WiFi、GSM / GPRS、蓝牙、RF以及LoRaWAN等技术。所有这些通信协议都有其优点和缺点,及其最适合的场合。例如,对于实现两个微控制器之间的中距离通信,最合适的通信协议之一是RF(射频),因为它具有良好的性价比,并且可以使用某些模块实现非常好的通信范围。


在本篇文章中,我们将使用其中最流行的RF通信模块来实现微控制器之间基于射频的通信: NRF24L01模块。


NRF24L01模块是一种低成本的超低功耗双向收发器模块。它在2.4GHz ISM频段内运行,这意味着它可以用于工业、科学和医学应用的项目。该模块可以实现高达2Mbits的数据速率!并且可以使用高速SPI接口实现与Arduino开发板和其他类型的微控制器进行通信。

nRF24L01.jpg


除了可以轻松与Arduino和其他微控制器一起使用之外,该模块的最佳功能之一就是其低功耗。在满速通信模式下,该模块的功耗不到14mA,在掉电模式下的功耗仅为几uA。这使得它非常适合具有较长电池寿命规格的项目。为演示在Arduino中使用此模块,我们将制作一个简单的发射器和接收器项目。发送器定期向接收器发送数据,接收器在串口监视器上显示接收到的数据。传输的虚拟数据可能是现实应用中来自传感器的数据,也可能是使接收器执行某些操作的信号。


所需的组件

●    NRF24L01模块

●    Arduino Uno开发板

●    连接导线


原理图

该项目的原理图非常简单,我们要做的就是将NRF24L01连接到Arduino开发板。 NRF24l01的设计不适用于面包板,因此我们必须使用导线将其连接到Arduino。请按照以下示意图所示连接组件。

schematics-nrf.png


我们将使用相同的组件来制作发送器和接收器,因此接收器的电路也只需要复制它即可。NRF24L01模块的VCC引脚并没有连接到Arduino的5v引脚,这一点很重要,因为这会损坏NRF24L01模块。NRF24L01模块是一个3.3V的设备。


代码

我们将为此项目编写两个不同的Arduino草图代码。其中一个代码用于发送器,另一个代码用于接收器。发送器部分主要实现按时间间隔将数据发送到接收器的任务,接收器在接收到消息后将其打印在串口监视器上。发送器和接收器代码都依赖于RF24库,可以从此处下载该代码。首先我们对发送器部分的代码进行简要说明,通常,我们要做的第一件事就是包括将用于代码的库文件,本文中,指的是Arduino IDE附带的SPI库和上面提到的RF24库。

  1. #include <SPI.h>  
  2. #include "RF24.h"
复制代码

接下来,我们创建RF24库的实例,并将NF24L01的CE和CS引脚连接到Arduino的引脚作为参数。

  1. RF24 myRadio (7, 8);
复制代码

接下来,我们定义一个结构体package,主要用于打包要发送的数据。

  1. struct package
  2. {
  3.   int id=1;
  4.   float temperature = 18.3;
  5.   char  text[100] = "Text to be transmitted";
  6. };


  7. typedef struct package Package;
  8. Package data;
复制代码

void setup()函数中,我们初始化NRF24L01模块,设置通信参数,例如功率电平、通道和数据速率。重要的是要注意发送器上使用的信道,因为接收器上需要使用相同的信道。

  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   delay(1000);
  5.   myRadio.begin();  
  6.   myRadio.setChannel(115);
  7.   myRadio.setPALevel(RF24_PA_MAX);
  8.   myRadio.setDataRate( RF24_250KBPS ) ;
  9.   myRadio.openWritingPipe( addresses[0]);
  10.   delay(1000);
  11. }
复制代码

完成上述操作后,我们需要编写void loop()函数。每次loop运行时,void loop函数都会通过将结构体package中分配给虚拟变量id的值增加1来生成要发送到接收器的虚拟数据。生成数据后,使用myradio.write()函数将其发送到接收器。

  1. void loop()
  2. {
  3.   myRadio.write(&data, sizeof(data));

  4.   Serial.print("\nPackage:");
  5.   Serial.print(data.id);
  6.   Serial.print("\n");
  7.   Serial.println(data.temperature);
  8.   Serial.println(data.text);
  9.   data.id = data.id + 1;
  10.   data.temperature = data.temperature+0.1;
  11.   delay(1000);

  12. }
复制代码

接收器的代码和上述代码类似,主要实现接收来自发射器的数据并将其显示在串口监视器上。首先包含所需的库。

  1. #include <SPI.h>  
  2. #include "RF24.h"
复制代码

接下来,我们创建RF24库的实例,并将NF24L01的CE和CS引脚连接到Arduino的引脚作为参数,之后创建接收温度数据结构体package。

  1. RF24 myRadio (7, 8)
  2. struct package
  3. {
  4.   int id=0;
  5.   float temperature = 0.0;
  6.   char  text[100] ="empty";
  7. };

  8. byte addresses[][6] = {"0"};
复制代码

接下来是void setup()函数。和发射机的代码一样,我们将初始化RF模块,设置通信参数以匹配发射机代码中的参数。

  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   delay(1000);

  5.   myRadio.begin();
  6.   myRadio.setChannel(115);
  7.   myRadio.setPALevel(RF24_PA_MAX);
  8.   myRadio.setDataRate( RF24_250KBPS ) ;
  9.   myRadio.openReadingPipe(1, addresses[0]);
  10.   myRadio.startListening();
  11. }
复制代码

完成上述操作后,我们开始编写void loop()函数。接收器的loop函数非常简单,当有数据可用时,我们使用myRadio.read函数读取数据并将其显示在串口监视器(Serial Monitor)上。

  1. void loop()  
  2. {

  3.   if ( myRadio.available())
  4.   {
  5.     while (myRadio.available())
  6.     {
  7.       myRadio.read( &data, sizeof(data) );
  8.     }
  9.     Serial.print("\nPackage:");
  10.     Serial.print(data.id);
  11.     Serial.print("\n");
  12.     Serial.println(data.temperature);
  13.     Serial.println(data.text);
  14.   }

  15. }
复制代码

效果演示

将相应的代码分别上载到每个板上,并将运行接收器代码的开发板连接到计算机,以便您可以查看在串口监视器上显示的数据。一段时间后,您应该看到来自发射器的数据显示在串口监视器上,如下图所示。

serial-Monitor.jpg


尽管我们在本文中使用的是虚拟数据,您也可以从一个Arduino发送真实数到另一个开发板,为实际问题提供了解决方案。以上就是本文的全部内容,如果您对本文有任何疑问,请随时在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1483



手机版|

GMT+8, 2024-5-20 16:58 , Processed in 0.040515 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表