在本教程中,我们将学习如何构建一个由多个NR24L01收发器模块组成的Arduino无线网络。您可以阅读下面的书面教程。
概述
作为一个例子,我制作了一个由5个节点组成的网络,每个节点都可以与网络中的任何节点进行通信,同时它们也可以作为发送器和接收器。这个例子实际上是以一种解释如何建立一个更大的网络的方式设置的,或者更准确地说,我们可以有3125个模块在单个射频信道上相互通信。让我们来看看它是如何工作的。
![8c58a09261e3a158f97027197c2f20c0.png](https://i-blog.csdnimg.cn/blog_migrate/c87d454fae299f5d541054ec7db8e6db.jpeg)
在我之前的教程中我们已经学到了使用NRF24L01模块和RF24库在两个Arduino板之间。现在除了这个库,我们还将使用库,它能够以一种简单的方式构建一个多个板相互通信的Arduino无线网络。下面是网络拓扑的工作原理。
单个NRF24L01模块可同时主动监听6个其他模块。
![eda56bd02106242789e21a1a358fae0f.png](https://i-blog.csdnimg.cn/blog_migrate/3610b13f504d0d986c65bbc3e0ed91f8.jpeg)
rf24networklibrary利用这个能力来生成一个以树状拓扑结构排列的网络,其中一个节点是基础,所有其他节点都是该节点或另一个节点的子节点。每个节点最多可以有5个子节点,这可以深入到5个层次,这意味着我们可以创建一个由3125个节点组成的网络。每个节点都必须定义一个15位地址,它精确地描述了节点在树中的位置。
![0399df47e608db56acdeefbc2b4fcb82.png](https://i-blog.csdnimg.cn/blog_migrate/1775c3c081b60206cd65d4410d1b1a53.jpeg)
我们实际上可以用八进制格式定义节点的地址。因此,主节点或基址的地址是00,基址子地址是01到05,01节点子地址是011到051,依此类推。
注意,如果节点011想要与节点02通信,则通信必须经过节点01和基础节点00,因此这两个节点必须一直处于活动状态,以便通信成功。
![c8c18644ddaeb2aa89c377934a4a5ef9.png](https://i-blog.csdnimg.cn/blog_migrate/d13fd184b4e46533b420ec9a2dc28640.jpeg)
使用RF24网络库的Arduino无线伺服电机控制
在解释本教程的主要示例之前,为了更好地理解库的工作原理,让我们简单地举两个Arduino板互相通信的例子。这是这个例子的电路图。
![e9841e1729a2f4a42ab85816790f5b81.png](https://i-blog.csdnimg.cn/blog_migrate/00574b3d8239cf6156ae4bef6e3bfe55.jpeg)
您可以从以下链接获取本Arduino教程所需的组件:
NRF24L01收发器模块
伺服电机
电位计
Arduino Nano板
所以在第一个Arduino使用电位计,我们将在第二个Arduino控制伺服电机。现在让我们看看源代码。
以下是电位计的代码:
/*
Arduino Wireless Network - Multiple NRF24L01 Tutorial
== Example 01 - Servo Control / Node 00 - Potentiometer ==
by Dejan, www.HowToMechatronics.com
Libraries:
nRF24/RF24, https://github.com/nRF24/RF24
nRF24/RF24Network, https://github.com/nRF24/RF24Network
*/
#include
#include
#include
RF24radio(10, 9);// nRF24L01 (CE,CSN)
RF24Networknetwork(radio);// Include the radio in the network
constuint16_tthis_node =00;// Address of this node in Octal format ( 04,031, etc)
constuint16_tnode01 =01;
voidsetup(){
SPI.begin();
radio.begin();
network.begin(90, this_node);//(channel, node address)
}
voidloop(){
network.update();
unsignedlongpotValue =analogRead(A0);// Read the potentiometer value
unsignedlongangleValue =map(potValue, 0, 1023, 0, 180);// Convert the value to 0-180
RF24Ne