ARDUINO Помогите наладить связь по схеме "Главный + два ведомых" nRF24L01

Madcape

✩✩✩✩✩✩✩
22 Окт 2019
16
1
Всем доброго времени суток.

Не могу победить... полностью.

Есть одна ведущий узел (Master) , и несколько ведомых (Slaves). Схематично на Мастере открыта одна труба для чтения и одна труба для получения, также и у ведомых.
В общем добился того, что главный получает от ведомых пакеты стабильно (при этом получается, что ведомый отправляет только мастеру, другим ведомым не идут пакеты), а мастер делает массовую рассылку всем ведомым. Хотя почему-то один из ведомых получает посылку раз-через_два - через_три (в общем фик пойми как) - спамишь его, пока не получит :( .
Хотелось бы сделать так, чтобы мастер отправлял посылку только указанному узлу.
Пробовал схеме, когда на мастере открыто две трубы для отправки (ну а ведомых соответствующие трубы приема с разными адресами)
Пробовал закрывать одну трубу, и отправлять по второй. Только по последней трубе указанной у мастера отправка идет два раза (то есть по ней отправляется даже если ей приказано было закрыться ! ).

Пробовал копать в сторон внутренних буферов самих nRF24, но пока не могу разобраться - может в них загвоздка.

Может кто сталкивался с подобным странным поведением, и как победил?
 

Fleshdeck

★★★✩✩✩✩
19 Янв 2019
296
138
Киев
https://howtomechatronics.com/tutor...eless-network-with-multiple-nrf24l01-modules/
Если шаришь английский. Библиотека RF24Network, очень полезная вещь, потому что обычно ты можешь использовать одну nrf24 для приёма, и 5 для передачи. Если надо приём и передача одновременно смотри материал по ссылке
 

Madcape

✩✩✩✩✩✩✩
22 Окт 2019
16
1
https://howtomechatronics.com/tutor...eless-network-with-multiple-nrf24l01-modules/
Если шаришь английский. Библиотека RF24Network, очень полезная вещь, потому что обычно ты можешь использовать одну nrf24 для приёма, и 5 для передачи. Если надо приём и передача одновременно смотри материал по ссылке
Потестил эту библу с один главным и двумя ведомыми... в общем проблему нифига не решает (( один из узлом, все равно получает посылки не стабильно. При этом поведение точно такое же как и ранее. Если уменьшить интервал между посылками, то начинаются сбои. А если увеличить - то вроде бы устаканивается - все узлы начинают принимать стабильно, без сбоев (также как и ранее было у меня).

Вот код на стороне главного. 0 - это адрес главного.
C++:
radio.openWritingPipe(  address[0]  );   // открываем трубу для передачи данных с адреса 0

radio.openReadingPipe(  0,  address[1]  );      //открываем трубу для приема от адреса 1
radio.openReadingPipe(  1,  address[2]  );        // открываем трубу для приема от адреса 2
У меня в наличии четыре приемопередатчика, все протестированы на тестовых скетчах, все рабочие. Тасовал их между узлами (просто тупо переставлял между ардуинками) - в любом случае сбоит тот, кто не последний в списке рассылке у главного. Как будто иногда главный "забывает" выслать первому указанному ведомому, но всегда заботиться о последнем ведомом, чья труба была привязана к нему последней (операция
openReadingPipe).

В общем, по моемому дело не в библиотеке, а в самих модулях nRF24 ( . Что-то там с ними не то происходит с их буферами отсылки (кстати у них буфер на шесть ячеек!)

Хотя да, соглашусь - удобная библа, "поднять" сеть можно быстро и "недорого".
 
Последнее редактирование:

Fleshdeck

★★★✩✩✩✩
19 Янв 2019
296
138
Киев
в этой библиотеке не нужно трубу открывать, используй примеры с сайта, если у тебя модули одинаковые и из одной партии, то все будет работать
 

Madcape

✩✩✩✩✩✩✩
22 Окт 2019
16
1
в этой библиотеке не нужно трубу открывать, используй примеры с сайта, если у тебя модули одинаковые и из одной партии, то все будет работать
Все нормально. Я сделал по примерам. Тот код я привел без использования Network - о чем еще поначалу говорил.
Ну короче, пропуски есть ( - и дело все равно в самом принципе работы НРФок в режиме рассылки одного сообщения на несколько приемников ( .

Использовал примеры от сюда:
http://maniacbug.github.io/RF24Network/index.html

Да нрфки из одной партии (скорее всего ... китайцы же... у них ведь и на мне может закончиться одна партия, они мне из другой могли сунуть ) )
 

Madcape

✩✩✩✩✩✩✩
22 Окт 2019
16
1
Странности однако...
Код передатчика:
смотрите строки -
C++:
const byte* hello[8] = { 112, 144, 1, 2, 3, 4, 5, 6 }; // массив типа byte
// передаем массив из 8-и элементов
RF24NetworkHeader header(/*to node*/ other_node);
bool ok = network.write(header,hello,16); // 16 - УКАЗАНО В ДВА РАЗА БОЛЬШЕ ЧЕМ ПЕРЕДАВАЕМЫЙ МАССИВ

- если указать размер передаваемого массива как есть на самом деле, т.е 8, то приемник будет получать вот такое:
"Received: 112 0 144 0 1 0 2 0 0 0 0 0 0 0 0 0 "
- а если увеличить в два раза, то вот это
Received: 112 0 144 0 1 0 2 0 3 0 4 0 5 0 6 0
* Во-первых, есть странные лишние нули, а во вторых в первом случае происходит тупо обрезка - в конце не хватает данных, сплошные нули. Если указать размер в два раза больше, то приходят все данные (хотя все равно с нулями)


C++:
/* Передатчик */

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

RF24 radio(7,8);

// Network uses that radio
RF24Network network(radio);

// Address of our node
const uint16_t this_node = 1;

// Address of the other node
const uint16_t other_node = 0;
const uint16_t other_node2 = 2;

// How often to send 'hello world to the other unit
const unsigned long interval = 500; //ms

// When did we last send?
unsigned long last_sent;

void setup(void)
{
  Serial.begin(57600);

  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void loop(void)
{
  network.update();

  unsigned long now = millis();
  if ( now - last_sent > interval  )
  {
    last_sent = now;
    
    printf("Sending...\r\n");
    
    const byte* hello[8] = { 112, 144, 1, 2, 3, 4, 5, 6 }; // массив типа byte
    // передаем массив из 8-и элементов
    RF24NetworkHeader header(/*to node*/ other_node);
    bool ok = network.write(header,hello,16); // 16 - УКАЗАНО В ДВА РАЗА БОЛЬШЕ ЧЕМ ПЕРЕДАВАЕМЫЙ МАССИВ
  
    const char* hello2 = "Hello, world! 2";    // массив типа char
    RF24NetworkHeader header2(/*to node*/ other_node2);
    ok = network.write(header2,hello2,strlen(hello2));
  }

}
C++:
/* Приемник */

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

// nRF24L01(+) radio attached to SPI and pins 8 & 9
RF24 radio(7,8);

// Network uses that radio
RF24Network network(radio);

// Address of our node
const uint16_t this_node = 0;

// Address of the other node
const uint16_t other_node = 1;

void setup(void)
{
Serial.begin(57600);
Serial.println("RF24Network/examples/helloworld_rx/");

SPI.begin();
radio.begin();
network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void loop(void)
{
// Pump the network regularly
network.update();

// Is there anything ready for us?
  if ( network.available() )
   {
   // If so, grab it and print it out
      RF24NetworkHeader header;
     static byte message[16];
     network.read(header,message,sizeof(message));
     Serial.print("Received: ");
     for (byte k = 0; k<16; k++){
        Serial.print(message[k]);
        Serial.print("\t");
     }
    Serial.println("");
    }
}
Тест типа char приходит без пропусков. Думаю библа завершающий символ 0 вкрячивает в каждый элемент массива... дура.
 

Fleshdeck

★★★✩✩✩✩
19 Янв 2019
296
138
Киев
адреса нужно писать двумя цифрами, типа 00 или 01, а далее тремя 011 или 021, по крайней мере так в даташите написано, и я не видел что бы можно было массивы отправлять, я отправлял только переменные с датчиков, и делал беспроводные выключатели дальнобойные
 

Madcape

✩✩✩✩✩✩✩
22 Окт 2019
16
1
адреса нужно писать двумя цифрами, типа 00 или 01, а далее тремя 011 или 021, по крайней мере так в даташите написано, и я не видел что бы можно было массивы отправлять, я отправлял только переменные с датчиков, и делал беспроводные выключатели дальнобойные
ну отправлять просто гольные единичные переменные это для моего проекта не прокатит... ваяю "центральный пульт" управления, нужно отправлять коды команд и параметры к этим командам, чтобы приемник принял, считал код команды, запустил нужную свою функцию и подставил в нее пришедшие параметры... своего рода с ЦП будет программироваться поведение удаленных узлов... ) как-то так.
 

Madcape

✩✩✩✩✩✩✩
22 Окт 2019
16
1
адреса нужно писать двумя цифрами, типа 00 или 01, а далее тремя 011 или 021
Да особой разница нет как написать 00 или 0, 01 или 1, 02 или 2 - библа просто при разборе адреса делает битовый сдвиг. и для компилятора 00 и 0 - это одно и тоже, число с одним сегментом. если написать 10 - это уже двухсегментное число, и 000010 - тоже двухсегментное число. Я не понимаю, че авторы замудрили с описанием. Написали бы, что адресация производится побитовым сдвигом справа налево, и все... видимо что такое битвый сдвиг слишком сложно для аудитории ардуины. как-то так )
 
Последнее редактирование: