ARDUINO nRF24L01+ - простое объяснение принципа работы и построения сети.

Madcape

✩✩✩✩✩✩✩
22 Окт 2019
15
2
Итак требуется построить сеть как минимум из трех модулей.

Первое: прояснить нужно вообще как работают отдельные модули. Все модули работают на одной частоте (чтобы было слышно и можно было говорить ;) )

Режим отправки: формируется пакет сигналов, в котором содержится служебная информация - кто выслал, кому выслал, проверочная сумма и полезная информация.

Режим приема: мониторит радио-эфир и как только услышал код с которого ждет (имя хоста) приходит в готовность, принимает данные.

Второе: любой модуль одновременно может принимать от 6 других модулей - на большее у него нет столько внутренней памяти, чтобы помнить эти коды. Можно настроить и на один, и на два и т.д. количество от кого он будет ждать посылки.

Третье: отправку производит просто "в воздух" - ну нет у него направленной антенны, да и отдельного провода тоже.

И тут самое интересное. На схеме под номерами 1 и 3 нарисована отправка данных, НО с разными кодами (адресами) отправителя!!! Модуль один, а шифруется под несколько. Этот финт проделывается легко и быстро.

Вот код (с использование библиотеке RF24):
C++:
/* Передатчик */

radio.stopListening(); // выключить прослышивание эфира
radio.openWritingPipe("1Host"); // отправка будет проихводится от имени 1Host
bool ok = radio->write(buf, <размер_данных>); // отправили от имени 1Host
radio.startListening();

/* дальше ваш код что-нибудь вытворяющий, например готовит пирожки другому узлу
    который ждет от 2Host`а ;)
*/

radio.stopListening();
radio.openWritingPipe("2Host"); // отправка будет производится от имени 2Host
bool ok2 = radio.write(buf2, <размер_данных>); // отправили от имени 2Host
radio.startListening();
Функцией "radio.openWritingPipe( ) мы просто заменяет в определенном регистре у самой nRF24 код отправителя - для нее это безболезненно, для этого и предназначена. И далее nRF24 уже отправлять будет от этого имени.
А раз наши передатчики каждый ждет от своего передатчика, то и получит посылку только один определенный получатель. Выходит, что мы не смотря на то, что у нас несколько модулей, единовременно по сути организуем закрытую передачу только между двумя модулями.

А на стороне приемника 2 такое:
C++:
radio.openWritingPipe("2Node");   // открываем трубу для передачи данных с адреса "2Node"
radio.openReadingPipe(0, "2Host"  ); // ждём с адреса "2Host"
Что все это дает?! А то, что простой сменой кода отправителя, мы высылаем конкретному получателю, а также прекрасно работает аппаратное подтверждение посылок (это когда получатель обратно передатчику высылает служебную информацию, что данные до него дошли верно и что вообще дошли ;) команда radio.setAutoAck(1) - становится актуальной, ведь посылка будет подтверждена только одним получателем, и больше никакой модуль не вклиниться в разговор.

Таким образом, полностью разводим модули. Понятно, что это наиболее эффективно если строить сеть по типу "Звезда" (один главный и несколько ведомых). Но можно и варьировать - главное чтобы не было пересечений.

Замечу, что например у Передатчика может быть указано до шести адресов, с которых он будет слушать:

C++:
radio.openReadingPipe(0, addressNode[0]); //открываем трубу для приема от адреса "1Node"
radio.openReadingPipe(1, addressNode[1]); //открываем трубу для приема от адреса "2Node"
radio.openReadingPipe(2, addressNode[2]); //открываем трубу для приема от адреса "3Node"
radio.openReadingPipe(3, addressNode[3]); //открываем трубу для приема от адреса "4Node"
radio.openReadingPipe(4, addressNode[4]); //открываем трубу для приема от адреса "5Node"
radio.openReadingPipe(5, addressNode[5]); //открываем трубу для приема от адреса "6Node"

--------------
nRF24.png
 
Изменено:
  • Лойс +1
Реакции: Timon(studnet)