Рубрики
Схемы на Arduino

Беспроводная сеть на Arduino и нескольких модулях NRF24L01

В данной статье мы рассмотрим как построить беспроводную сеть на основе нескольких модулей приемопередатчиков NR24L01, управляться которые будут с помощью плат Arduino. В качестве примера мы рассмотрим создание подобной сети, состоящей из 5 узлов, каждый из которых сможет общаться с любым узлом в сети, и в то же время они могут работать как передатчики, так и приемники. Во многом это будет похоже на так называемую Mesh сеть. Максимально рассматриваемая нами сеть может содержать до 3125 модулей NR24L01, взаимодействующих друг с другом по одному радиочастотному каналу.

Ранее на нашем сайте мы уже рассматривали использование модулей NRF24L01 в следующих проектах:

Но в отличие от данных проектов в этом проекте нам еще дополнительно понадобится библиотека RF24Network , которая позволяет достаточно просто построить беспроводную сеть Arduino с множеством плат,  взаимодействующих друг с другом. Вот как работает топология сети.

Связь нескольких модулей NRF24L01

Один модуль NRF24L01 может активно прослушивать до 6 других подобных модулей одновременно.

Эта возможность используется библиотекой RF24Network для создания сети, организованной по топологии дерева, где один узел является базовым, а все остальные узлы являются дочерними элементами этого или другого узла. У каждого узла может быть до 5 дочерних элементов, и каждое такое поддерево может иметь глубину до 5 уровней, что означает, что мы можем создать сеть из 3125 узлов. Каждый узел должен быть определен с помощью 15-битного адреса, который точно описывает положение узла в дереве.

На самом деле мы можем определить адреса узлов в восьмеричном формате. Итак, адрес мастера или базы — 00, адреса базовых дочерних узлов — от 01 до 05, адреса дочерних узлов 01 — от 011 до 051 и так далее.

Обратите внимание, что если узел 011 хочет поговорить с узлом 02, связь должна будет проходить через узел 01 и базовый узел 00, поэтому эти два узла должны быть активны все время, чтобы связь была успешной.

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. Радиочастотные модули nRF24L01 (купить на AliExpress).
  3. Серводвигатель (купить на AliExpress).
  4. Потенциометр (купить на AliExpress).

Схема проекта

Прежде чем переходить к созданию сети из 5 модулей nRF24L01, рассмотрим более простой пример из двух плат Arduino, взаимодействующих друг с другом с помощью радиочастотных модулей nRF24L01. Схема данного примера показана на следующем рисунке.

В данной схеме мы, используя потенциометр на первой плате Arduino, будем управлять серводвигателем, подключенным ко второй плате Arduino. Давайте теперь посмотрим на исходные коды для этих двух частей проекта.

Код со стороны потенциометра:

В представленном коде программы мы первым делом подключаем обе библиотеки RF24 и RF24Network, а также библиотеку SPI. Затем мы создаем объект RF24 и включаем его в объект RF24Network. Далее нам нужно назначить адреса узлов в восьмеричном формате — это будет 00 для первого узла и 01 для другого узла на стороне сервомотора.

После этого в функции setup() нам необходимо инициализировать сеть, установив канал и адрес этого узла.

Затем в функции loop() нам постоянно нужно вызывать функцию update(), через которую будут происходить все действия в сети. Затем мы считываем значение потенциометра и преобразуем его в диапазон от 0 до 180, подходящее для управления сервомотором. Далее мы создаем заголовок сети, где мы назначаем адрес узла, в который мы будем передавать данные. В конце с помощью функции write() мы отправляем данные на приемный узел. Итак, здесь первый параметр содержит информацию об адресах, второй параметр указывает, какие данные будут отправлены, а третий параметр — это размер данных.

Код на стороне сервопривода:

В приемной части нам необходимо подключить в программе те же самые библиотеки, которые мы подключали в передающей части, а также библиотеку для управления сервомотором. Адрес нашего приемного узла в восьмеричном формате — 01. Далее нам необходимо создать объект для управления сервомотором и инициализировать радиочастотный модуль.

Затем, в функции loop(), с помощью цикла while() и функции available() мы будем постоянно проверять есть ли какие-либо поступающие данные. Если да (true), то мы будем создавать объект, через который будут приниматься данные, а также переменную, в которой эти данные будут храниться. Затем с помощью функции read() мы будем считывать данные и сохранять их в переменной incomingData. В конце мы будем использовать эти данные для перемещения серводвигателя в соответствии с положением оси потенциометра на передающем узле.

Беспроводная сеть из нескольких модулей NRF24L01 под управлением

Arduino

Теперь рассмотрим создание сети из 5 узлов. Ее блок-схема показана на следующем рисунке.

В ней мы из корневого узла с помощью потенциометра будем управлять серводвигателем в узле 01, вторым потенциометром мы будем управлять светодиодами в узле 022, с помощью кнопки мы будем управлять светодиодом в узле 012, а светодиодом в корневом узле мы будем управлять с помощью потенциометра в узле 02. Также с помощью инфракрасного датчика в узле 012 мы будем управлять светодиодом в узле 01. Таким образом, мы сможем передавать и получать данные одновременно, а также взаимодействовать узлами из разных ветвей. Давайте теперь посмотрим на коды Arduino.

Исходный код для корневого узла (узел 00)

В этом коде нам необходимо указать номера всех остальных узлов, на которые мы будем передавать данные с корневого узла. В функции loop() мы первым делом будем постоянно проверять наличие входящих данных. Если они присутствуют, то мы будем считывать их и сохранять их в переменной incomingData и затем использовать их для управления яркостью светодиода. Эти данные будут поступать на корневой узел от потенциометра из узла 02. После считывания значения потенциометра мы преобразуем его в диапазон от 0 до 255 (для ШИМ) и далее будем передавать его для управления светодиодом на другом узле.

Исходный код узла 02

Исходный код узла 01

Узел 01 будет получать данные от двух разных узлов, от одного для управления сервомотором, а от другого для управления светодиодами — данный сигнал будет поступать от инфракрасного датчика узла 012.

Исходный код узла 012

В данном случае мы используем атрибут header.from_node, чтобы получить информацию из какого узла поступают данные. Если данные поступают от мастера (корневого узла), мы используем их для управления сервомотором, а если данные поступают от узла 012, мы используем их для управления светодиодом.

В узле 012 у нас есть и передача, и прием данных. Инфракрасный датчик управляет ранее упомянутым светодиодом в узле 01, а светодиод здесь управляется кнопкой на корневом узле.

Исходный код узла 022

Наконец, светодиоды в узле 022 управляются с использованием данных, поступающих от другого потенциометра на корневом узле.

Итак, в качестве вывода можно отметить, что если все подключено правильно и все узлы постоянно активны, то наша работа сводится к точной адресации узлов, а всю тяжелую работу выполняет потрясающая библиотека RF24Network.

Видео демонстрирующее работу проекта

Источник статьи

2 ответа к “Беспроводная сеть на Arduino и нескольких модулях NRF24L01”

Честно говоря, считал не я, а автор статьи — я ее только перевел. Но неужели вы и вправду собираетесь создать сеть с таким большим числом узлов?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *