风筝
发表于: 2019-8-15 22:30:30 | 显示全部楼层

如今,在通信和物联网项目中,建立无线连接和创建无线网络非常重要。在本篇文章中,您将学习如何在两个Arduino开发板之间建立无线连接并使用NRF24L01模块创建无线网络。


什么是NRF24L01模块及其工作原理?

无线通信有多种方式,如蓝牙、WiFi等。使用NRF24L01模块是最实惠、最简单、最实用的方法之一。

NRF-1.jpg

NRF24L01模块是一个收发器模块,这意味着它可以发送和接收数据。 NRF24L01工作在2.4 GHz频率并使用GFSK调制。该模块的最大数据传输速度高达2Mbps,最大传输距离为空旷处100米(对于带外部天线的型号,距离可以为1 km)。

参数
典型值
工作电压
3.3 v
发送模式下的使用电流
11.3 mA
接收模式下的使用电流
12.3 mA
睡眠模式下的使用电流
900 nA
温度范围
-40至+85 C
价格
2.5美元

创建网络是NRF模块的优势之一;每个NRF模块可以连接到6个其他模块。


因此,价格合理、易于使用、体积小、网络功能、超远传输距离和合适的数据传输速度使NRF24l01模块成为无线和物联网项目的理想选择。


NRF24L01模块采用SPI协议连接微控制器,有8个引脚:

nrf-pinout-.compressed.jpg

引脚名称
功能描述
GND
电路接地
Vcc
电路供电电压(3.3V)
CE
芯片使能
CSN
SPI芯片选择
SCK
连接时钟
MOSI
从主机Master接收数据
MISO
向主机Master发送数据
IRQ
中断引脚

所需的材料

●    Arduino UNO R3开发板

●    NRF24L01模块

●    Arduino IDE

nrf-required-.compressed.jpg


连接两个Arduino开发板以建立无线连接

为了连接两个Arduino开发板,需要两个NRF24L01模块,一个作为主模块,另一个作为从模块。在此示例中,使用主站侧的音量调节旋钮,我们控制从站侧的伺服电机。


电路

nrf_circuit1.jpg


代码

您需要RF24库才能使用NRF24L01模块。从以下链接下载库:Rf24库

小提示:从模块和主模块需要两个不同的代码才能建立连接。


主模块:上传以下代码到主模块的开发板。

  1. /*
  2.   NRF24L01 - Controle a servo motor wirelessly
  3.   Master
  4.   modified on 8 Apr 2019
  5.   by Saeed Hosseini @ Electropeak
  6.   https://electropeak.com/learn/
  7. */
  8. #include <SPI.h>
  9. #include <nRF24L01.h>
  10. #include <RF24.h>

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

  12. const byte address[][6] = {"Node1"};
  13. const int potpin = A0;

  14. int val = 0;

  15. void setup() {

  16.   radio.begin();
  17.   radio.openWritingPipe(address);
  18.   radio.setPALevel(RF24_PA_MIN);
  19.   radio.stopListening();
  20. }
  21. void loop() {
  22.   val = analogRead(potpin);
  23.   val = map(val, 0, 1023, 0, 179);
  24.   
  25.   radio.write(&val, sizeof(val));

  26.   delay(5);
复制代码

从模块:上传以下代码到从模块的开发板。

  1. /*
  2.   NRF24L01 - Controle a servo motor wirelessly

  3.   Master
  4.   modified on 8 Apr 2019
  5.   by Saeed Hosseini @ Electropeak
  6.   https://electropeak.com/learn/
  7. */
  8. #include <SPI.h>
  9. #include <nRF24L01.h>
  10. #include <RF24.h>
  11. #include <Servo.h>

  12. Servo myservo;
  13. RF24 radio(7, 8); // CE, CSN

  14. const byte address[][6] = {"Node1"};
  15. const int servo = 9;

  16. int val = 0;

  17. void setup() {
  18.   Serial.begin(9600);
  19.   myservo.attach(servo);
  20.   radio.begin();
  21.   radio.openReadingPipe(0, address);
  22.   radio.setPALevel(RF24_PA_MIN);
  23.   radio.startListening();
  24. }
  25. void loop() {
  26.   delay(5);
  27.   radio.startListening();
  28.   if ( radio.available()) {
  29.     while (radio.available()) {

  30.       radio.read(&val, sizeof(val));
  31.       myservo.write(val);
  32.       Serial.print("Servo position = ");
  33.       Serial.println(val);
  34.     }
  35.   }
  36. }
复制代码

让我们仔细看看代码:

  1. RF24 radio(CS, CSN);
复制代码

通过指定CS和CSN引脚为模块创建所需的对象。

  1. const byte address[][6] = {"addr"};
复制代码

指定节点的地址。注意,发送方和接收方地址必须相同才能进行通信。

  1. radio.openWritingPipe(address);
复制代码

为接收器确定发射器。

  1. radio.openReadingPipe(0, address);
复制代码

为发射器确定接收器。

  1. radio.setPALevel(RF24_PA_MIN);
复制代码

确定模块的功耗量,该值必须根据发射器和接收器距离确定。

  1. radio.stopListening();
复制代码

将模块设置为发射器模式。

  1. radio.startListening();
复制代码

将模块设置为接收器模式。

  1. radio.write(&data, sizeof(data));
复制代码

通过指定数据大小来发送数据。

  1. radio.available();
复制代码

如果接收器收到数据,则返回值1

  1. radio.read(&data, sizeof(text));
复制代码

通过指定数据来接收数据,并将其存储在数据变量中。


创建NRF模块网络

使用NRF24L01模块,您可以创建无线连接并在网络中传输数据。


在本示例中,我们要创建一个具有三个从站的网络,并根据从主站发送的温度数据、卷值和密钥状态在从站中执行特定操作。


有两种构建网络的方法,更简单的方法是按照前面的示例进行操作,并且最多有6个单独的地址,通过6个从站向主站发送信息。


在第二种方式中,使用树方法用于组网。因此,主要主服务器仅与其子集相关联,并且每个子集都作为树进行扩展。因此,我们可以构建一个包含最多3125个NRF24L01模块的网络,因此这种方法比第一个更加有效。

nrf-network-compressed.jpg


电路连接

nrf_circuit2.jpg


代码

要使用此方法,您需要RF Network 库。您可以从以下链接下载:RF24Network Library

主机模块

  1. /*
  2.   NRF24L01 - Network
  3.   Master
  4.   modified on 8 Apr 2019
  5.   by Saeed Hosseini @ Electropeak
  6.   https://electropeak.com/learn/
  7. */

  8. #include <RF24Network.h>
  9. #include <RF24.h>
  10. #include <SPI.h>
  11. #include "dht.h"

  12. RF24 radio(7, 8);               // nRF24L01 (CE,CSN)

  13. RF24Network network(radio);
  14. dht DHT;

  15. const uint16_t this_node = 00;
  16. const uint16_t node01 = 01;
  17. const uint16_t node02 = 02;
  18. const uint16_t node03 = 03;

  19. const int butpin = 3;
  20. const int potpin = A0;
  21. const int dhtpin = 4;

  22. void setup() {
  23.   SPI.begin();
  24.   radio.begin();
  25.   network.begin(90, this_node);  //(channel, node address)
  26.   radio.setDataRate(RF24_2MBPS);
  27.   pinMode(butpin, INPUT);
  28.   Serial.begin(9600);
  29. }

  30. void loop() {

  31.   // Send to Node 01
  32.   int potValue = analogRead(potpin);
  33.   int angleValue = map(potValue, 0, 1023, 0, 179);
  34.   RF24NetworkHeader header2(node01);     
  35.   bool ok = network.write(header2, &angleValue, sizeof(angleValue));
  36.   // Send to Node 02
  37.   int buttonState = digitalRead(butpin);
  38.   RF24NetworkHeader header3(node02);
  39.   bool ok2 = network.write(header3, &buttonState, sizeof(buttonState));
  40.   // LEDs control at Node 022
  41.   unsigned long pot2Value = analogRead(A1);
  42.   RF24NetworkHeader header4(node03);   
  43.   DHT.read11(dhtpin);
  44.   bool ok3 = network.write(header4, &DHT.temperature, sizeof(DHT.temperature));
  45. }
复制代码

节点01

  1. /*
  2.   NRF24L01 - Network
  3.   Node01
  4.   modified on 8 Apr 2019
  5.   by Saeed Hosseini @ Electropeak
  6.   https://electropeak.com/learn/
  7. */        
  8.         
  9. #include <RF24Network.h>
  10. #include <RF24.h>
  11. #include <SPI.h>
  12. #include <Servo.h>


  13. RF24 radio(7, 8);               // nRF24L01 (CE,CSN)
  14. Servo myservo;

  15. RF24Network network(radio);      // Include the radio in the network

  16. const uint16_t this_node = 01;   // Address of our node in Octal format ( 04,031, etc)
  17. const uint16_t master00 = 00;    // Address of the other node in Octal format

  18. const int servopin = 9;

  19. void setup() {

  20.   SPI.begin();
  21.   radio.begin();
  22.   network.begin(90, this_node); //(channel, node address)
  23.   radio.setDataRate(RF24_2MBPS);
  24.   myservo.attach(servopin);

  25. }
  26. void loop() {
  27.   network.update();
  28.   while ( network.available() ) {
  29.     RF24NetworkHeader header;
  30.     int data;
  31.     network.read(header, &data, sizeof(data)); // Read the incoming data
  32.     myservo.write(data);

  33.   }
  34.   delay(5);
  35. }
复制代码

节点02

  1. /*
  2.   NRF24L01 - Network
  3.   Node02
  4.   modified on 8 Apr 2019
  5.   by Saeed Hosseini @ Electropeak
  6.   https://electropeak.com/learn/
  7. */

  8. #include <RF24Network.h>
  9. #include <RF24.h>
  10. #include <SPI.h>



  11. RF24 radio(7, 8);               // nRF24L01 (CE,CSN)


  12. RF24Network network(radio);      // Include the radio in the network

  13. const uint16_t this_node = 02;   // Address of our node in Octal format ( 04,031, etc)
  14. const uint16_t master00 = 00;    // Address of the other node in Octal format

  15. const int ledpin = 5;

  16. void setup() {

  17.   SPI.begin();
  18.   radio.begin();
  19.   network.begin(90, this_node); //(channel, node address)
  20.   radio.setDataRate(RF24_2MBPS);
  21.   pinMode(ledpin,OUTPUT);

  22. }
  23. void loop() {
  24.   network.update();
  25.   while ( network.available() ) {
  26.     RF24NetworkHeader header;
  27.     int data;
  28.     network.read(header, &data, sizeof(data)); // Read the incoming data
  29.       digitalWrite(ledpin, !data);

  30.   }
  31.   delay(5);
  32. }
复制代码

节点03

  1. /*
  2.   NRF24L01 - Network
  3.   Node03
  4.   modified on 8 Apr 2019
  5.   by Saeed Hosseini @ Electropeak
  6.   https://electropeak.com/learn/
  7. */

  8. #include <RF24Network.h>
  9. #include <RF24.h>
  10. #include <SPI.h>



  11. RF24 radio(7, 8);               // nRF24L01 (CE,CSN)


  12. RF24Network network(radio);      // Include the radio in the network

  13. const uint16_t this_node = 03;   // Address of our node in Octal format ( 04,031, etc)
  14. const uint16_t master00 = 00;    // Address of the other node in Octal format

  15. const int fan = 5;              //Red wire to pin 13,Black wire to pin GND


  16. void setup() {

  17.   SPI.begin();
  18.   radio.begin();
  19.   network.begin(90, this_node); //(channel, node address)
  20.   radio.setDataRate(RF24_2MBPS);
  21.   pinMode(fan, OUTPUT);
  22.   digitalWrite(fan, LOW);

  23. }
  24. void loop() {
  25.   network.update();
  26.   while ( network.available() ) {
  27.     RF24NetworkHeader header;
  28.     int data;
  29.     network.read(header, &data, sizeof(data)); // Read the incoming data
  30.     if (data > 70)
  31.       digitalWrite(fan, HIGH);
  32.     else
  33.       digitalWrite(fan, LOW);

  34.   }
  35.   delay(5);
  36. }
复制代码

以上就是本篇文章的全部内容。如果有问题,请随时在本帖下面进行回复。

跳转到指定楼层
253289394LJQ
发表于: 2020-3-3 22:26:38 | 显示全部楼层

你好,我复制了代码并在编译时出现以下错误,可以指导一下不,万分感激!










C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp: In member function 'uint16_t RF24Network::read(RF24NetworkHeader&, void*, uint16_t)':

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:694:12: error: 'rf24_min' was not declared in this scope

   maxlen = rf24_min(maxlen,bufsize);

            ^~~~~~~~

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:694:12: note: suggested alternative: 'fmin'

   maxlen = rf24_min(maxlen,bufsize);

            ^~~~~~~~

            fmin

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp: In member function 'bool RF24Network::write(RF24NetworkHeader&, const void*, uint16_t, uint16_t)':

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:794:25: error: 'rf24_min' was not declared in this scope

  uint16_t fragmentLen = rf24_min((uint16_t)(len-offset),max_frame_payload_size);

                         ^~~~~~~~

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:794:25: note: suggested alternative: 'fmin'

  uint16_t fragmentLen = rf24_min((uint16_t)(len-offset),max_frame_payload_size);

                         ^~~~~~~~

                         fmin

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:827:16: error: 'class RF24' has no member named 'txStandBy'

     ok = radio.txStandBy(txTimeout);

                ^~~~~~~~~

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp: In member function 'bool RF24Network::write(uint16_t, uint8_t)':

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:974:11: error: 'class RF24' has no member named 'txStandBy'

     radio.txStandBy(txTimeout);

           ^~~~~~~~~

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp: In member function 'bool RF24Network::write_to_pipe(uint16_t, uint8_t, bool)':

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:1083:14: error: 'class RF24' has no member named 'writeFast'; did you mean 'write'?

   ok = radio.writeFast(frame_buffer, frame_size,0);

              ^~~~~~~~~

              write

C:\Program Files (x86)\Arduino\libraries\RF24Network-master\RF24Network.cpp:1086:16: error: 'class RF24' has no member named 'txStandBy'

     ok = radio.txStandBy(txTimeout);

                ^~~~~~~~~

"RF24Network.h" 对应多个库
已使用: C:\Program
"RF24_config.h" 对应多个库
已使用: C:\Program
"SPI.h" 对应多个库
已使用: C:\Program
exit status 1
为开发板 Arduino Nano 编译时出错。
回复

使用道具 举报

风筝
发表于: 2020-3-4 08:53:21 | 显示全部楼层

253289394LJQ 发表于 2020-3-3 22:26
你好,我复制了代码并在编译时出现以下错误,可以指导一下不,万分感激!

"RF24Network.h" 对应多个库

-----------

删除使用的库,重新按照。库文件冲突
回复

使用道具 举报

253289394LJQ
发表于: 2020-3-4 09:58:36 | 显示全部楼层

风筝 发表于 2020-3-4 08:53
"RF24Network.h" 对应多个库

-----------

可是我搜索又只有一个RF24Network.h的文件呀
回复

使用道具 举报

253289394LJQ
发表于: 2020-3-4 10:09:57 | 显示全部楼层

风筝 发表于 2020-3-4 08:53
"RF24Network.h" 对应多个库

-----------

删掉这个文件又提示找不到文件或目录,不删这个文件又说有对应多个库
回复

使用道具 举报

253289394LJQ
发表于: 2020-3-4 10:36:18 | 显示全部楼层

风筝 发表于 2020-3-4 08:53
"RF24Network.h" 对应多个库

-----------

搞定了,谢谢大神
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-28 17:52 , Processed in 0.175828 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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