Вопросы по NRF24L01

PiratFox

★★★★★✩✩
13 Фев 2020
1,694
472
Тогда разъёмы мозги е... , парят в общем. У меня похожее было, пока провода не припаял. А запитывать nrf через нану - плохая идея. Там стабилизатор дохлый.
 

Fendragon

✩✩✩✩✩✩✩
30 Мар 2019
20
0
Я решил запитать нанку от лбп после того ,как я замерил напряжение на ней. Там было 4.65 В. Но после подключения лбп она все равно не работает. Провода припаяны (фотографии выше).
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
Послушайте, перед тем как в принципе пробовать что-то связывать модулями nrf24l01, запустите на нем пример из библиотеки, который читает регистры. Если все прошло удачно, это ещё не есть положительный результат, но хотя бы будете уверены что провода не попутали. Я с парочкой неделю сношался, сотню страниц в интернете прочитал, - так и не запустил. Оказались модули с фейковым чипом. Купил на Amazon.es восем штук от испанского поставщика - заработали сразу, без кондюков, переходников и т.п. просто навесил проводами на Ардуино, и даже запитав от нее же.

Я уже давно понял - искать дёшево на Али - бяда, дорого покупать - то же не решение. Стараюсь брать у серьезных торгашей, типа Вавгад.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,694
472
Попробуйте на переходник навесить электролит на 220 мкф по питанию, и керамику от 0,1 мкф.
 

Fendragon

✩✩✩✩✩✩✩
30 Мар 2019
20
0
@kostyamat Да, я с вами согласен, но все от напряжения до чипа в порядке.
@PiratFox Ну можно попробовать, но пульсаций там таких нет(проверял на dso138).
Блин,я в первые с такой волшебной штукой сталкиваюсь (все в порядке, но не работает).
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
Да, я с вами согласен, но все от напряжения до чипа в порядке.
Да как же в порядке то, если у вас все прочитанные (или таки непрочитанные?) регистры в ноль или FF? Судя по вашему же скрыну с инфо по чипу. Это первое, что говорит - пациент скорее мертв, чем жив? Проверяйте соединения пин в пин, выбросьте переходники, посмотрите дефайны в скетче - те ли ноги используются, что припаяны у вас.

Вот так, приблизительно, должны отображаться регистры, не обязательно в точности, но не в 0, все. ;)
 

Вложения

Изменено:

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
А ещё, бывают фейковые чипы (а есть ещё клоны, которые работают, но дерьмово или странно), я уже писал, регистры читаются, а связи нет. Эфир сканируется вроде, но выглядит абсолютно чистым, так не бывает. Купил другие - заработало сразу (не обязательно ваш случай, просто предупреждаю).
 

Fendragon

✩✩✩✩✩✩✩
30 Мар 2019
20
0
Ну я про напряжение и радиодетали говорил. А как выглядит рабочий вариант я знаю (один из двух переходников рабочий, но он к уно припаян). С нерабочем переходником модуль выдает, все каналы засраны.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,694
472
@Fendragon, тогда предложу ещё вариант. Попробуйте убрать переходник, ведь в нём только стабилизатор 3,3В, да конденсаторы фильтра. Подайте на nrf те же 3,3В с какого-нибудь блока питания с выходным током не менее 1А. Ну и о фильтрации питающего напряжения не забывайте, навесьте фильтрующие конденсаторы прямо на nrf.
 
Изменено:

Fendragon

✩✩✩✩✩✩✩
30 Мар 2019
20
0
Перепробовал все что вы советовали (подключал отдельно питание 3.3В, амперметр вообще никаких токов не зафиксировал ), но все равно не заработал.
 

Kimper44

✩✩✩✩✩✩✩
13 Апр 2020
1
0
Здравствуйте, подскажите пожалуйста как лучше реализовать подпрограмму для того, чтобы она могла выводить в Serial порт строчку когда какой нибудь модуль не отвечает, пример: 3 Ардуино, один приемник 2 передатчика. Я хочу чтобы если я отключу один из передатчиков от питания в порт приемника выводилось сообщение о потери сигнала, но как только модуль появится в сети в порт было выведено сообщение о том что сигнал восстановлен. Я пытался сделать подобное, но не вышло...
Приводите примеры, заранее спасибо!!
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Если бы было наоборот, то можно было бы использовать ответ приемника, а так только разработать режим в котором передатчик будет с заданной частотой (раз в секунду, в 5, в 10) будет отправлять пустую команду, типа я тут. Как только спустя 2 заданых интервала подряд эта команда не пришла, то приемник в аут.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
это называется пинг
приемник посылает запрос и передатчик должен ответить в установленное время
если нет ответа, то приемник и выводит сообщение о потери связи
 

SashaPetrov

✩✩✩✩✩✩✩
22 Май 2019
54
5
if (OUTflag) {
OUTflag = 0;
radio.powerUp();
if (radio.write(&OUT, sizeof(OUT)))
uart.println("Данные были корректно приняты приёмником");
else {
uart.println("Данные не приняты или дошли с ошибкой CRC");
uart.print(OUT[0]);
uart.print('\t');
uart.print(OUT[1]);
uart.print('\t');
uart.println(OUT[2]);
}
 

poty

★★★★★★✩
19 Фев 2020
2,956
886
Ничего не понимаю. Если все три Ардуино под контролем, то передача осуществляется по определенному протоколу, почему в этот протокол не добавить keep alive, если долгое время не требуется передавать активных данных? Какие примеры здесь нужны? Весь необходимый инструментарий у Вас уже есть!
 

DJTroll

✩✩✩✩✩✩✩
11 Июн 2020
10
1
Доброго времени суток. Есть ардуино Нано к ней подключен модуль беспроводной связи nRF24l01+ и 4 светодиода. И есть еще 4 ардуино нано с модулями связи. Смісл тот что при нажатии на каждом передатчике на прийомнике загорается светодиод и срабатівает сигнал. столкнулся с проблемой, работает только тот модуль который стоит на 1 месте в коде, остальные не работают
 

Вложения

  • 3.8 KB Просмотры: 3
  • 3.5 KB Просмотры: 3

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Помимо ранее отмеченного косяка в логике добавлю:
То что передается
byte transmit_data[1]; // массив, хранящий передаваемые данные
передается 1 байт!
То что читается
byte recieved_data[3]; // массив принятых данных 3 байта!
Как будет себя вести приемник при получении 1 байта и попытке считать 3 я не знаю. Но фиг с ним.

В приложении два скетча, которые работают на прием передачу (приемник слушает 5 труб, передатчики передают по 1)
В скетчах минимальные настройки + добавлен ответ передатчику о нормальной доставке.
Сразу скажу , что ответ не всегда работает корректно - зависит от эфитра. У меня на 2мбит работае 100% на 1 мбит 80 (все на одном канале) . На 250кбит подтверждение не работает. И еще у меня бывают глюки при установке максимальной мощности передатчика - для более надежного соединения приходиться уменьшать.
Но эти скетчи 100% рабочие. Надо подобрать наилучший канал и мощность для выбранной скорости. И потом уже менять что то.
Настройки пинов тоже стандартные 9 и 10.

C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24     radio(9, 10);
byte transmit_data[3];
uint8_t  pipe;

void setup()
{
  radio.begin();
  radio.setChannel(120);
  radio.setDataRate(RF24_2MBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.openReadingPipe (1, 0xAABBCCDD11LL);
  radio.setAutoAck(1, true);
  radio.openReadingPipe (2, 0xAABBCCDD22LL);
  radio.setAutoAck(2, true);
  radio.openReadingPipe (3, 0xAABBCCDD33LL);
  radio.setAutoAck(3, true);
  radio.openReadingPipe (4, 0xAABBCCDD44LL);
  radio.setAutoAck(4, true);
  radio.openReadingPipe (5, 0xAABBCCDD55LL);
  radio.setAutoAck(5, true);

  radio.startListening();

  Serial.begin(115200);
  Serial.println("Start..");
}


void loop()
{
  if (radio.available(&pipe))
  {
    Serial.print("Got from..");
    radio.read( &transmit_data, sizeof(transmit_data) );

    if (pipe == 1)
    {
      Serial.println("Pipe 1");
    }
    if (pipe == 2)
    {
      Serial.println("Pipe 2");
    }
    if (pipe == 3)
    {
      Serial.println("Pipe 3");
    }
    if (pipe == 4)
    {
      Serial.println("Pipe 4");
    }
    if (pipe == 5)
    {
      Serial.println("Pipe 5");
    }   

  }
}

C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10);

byte transmit_data[3];

void setup() {
  Serial.begin(115200);
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.setDataRate (RF24_2MBPS);
  radio.setPALevel (RF24_PA_MAX);
  radio.openWritingPipe(0xAABBCCDD11LL);
//  radio.openWritingPipe(0xAABBCCDD22LL);
//  radio.openWritingPipe(0xAABBCCDD33LL);
//  radio.openWritingPipe(0xAABBCCDD44LL);
//  radio.openWritingPipe(0xAABBCCDD55LL);

  radio.powerUp();
}

void loop() {
  Serial.print("sent..");
  if (radio.write(&transmit_data, sizeof(transmit_data))) Serial.println("Ok");
  else Serial.println("bad");
  delay(2000);
}
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Всем привет! Столкнулся с проблемой того что модуль имеет всего 6 каналов для связи. Погуглил и нашел несколько схем решения. RF network не рассматриваю так как велик шанс отказа системы в любом узле. Другие схемы тож отмёл осталась идеальная для моей цели. Финт заключается в том что база знает адреса всех "датчиков" и периодически с ними связывается, назовём это штатной работой и также параллельно штатной работе мы держим еще две трубы для чего-то важного например тревог или регистрации нового датчика для системы. Пока что только начал реализовывать и сразу проблема =) вообщем:
Код передатчика ("датчика"):
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#define key 201
byte id_sensor = 0;
byte type_sensor = 1;
RF24 radio(9, 10);
byte sent = key;
struct message {
  byte id;
  byte type;
  byte data;
};
message send_data;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
void setup() {
 // Serial.begin(9600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.openReadingPipe(2, address[1]);
  radio.setChannel(0x60);
  radio.powerUp();
  radio.startListening();
  delay(100);
  if (id_sensor == 0) {
    //Serial.println("Sensor null!!!");
    radio.stopListening();
    delay(10);
    //Start send te reg message
    radio.openWritingPipe(address[1]);
    delay(10);
    boolean send_status = false;
    int i = 0;
    //Serial.println("Start sending reg packet!");
    while (!send_status && i < 600) {
      send_status = radio.write(&sent, sizeof(sent));
      delay(100);
      i++;
      //Serial.println(".");
    }
    //Serial.println("Sended!");
    radio.startListening();
    delay(10);
    //Serial.println("Starting reciving");
    while (!radio.available()) {
      delay(50);
    }
    //Data recived!
    //Serial.println("DATA OK");
    radio.read(&sent, sizeof(sent));
    delay(10);
    id_sensor = sent;
    radio.closeReadingPipe(2);
    delay(10);
    radio.stopListening();
    delay(10);
    radio.openWritingPipe(address[0]);
    delay(10);
    radio.startListening();
    delay(10);
    //Serial.println("All start ok!");
  }
}
void loop() {
  if ( radio.available() ) {
    byte keyy = 0;
    radio.read(&keyy, sizeof(keyy));
    if (keyy == key) {
      //Serial.println("KEY OK");
      radio.stopListening();
      send_data.id = id_sensor;
      send_data.type = type_sensor;
      send_data.data = random(5, 31);
      radio.write(&send_data, sizeof(send_data));
      delay(10);
      radio.startListening();
    }
  }
}
Код приемника (базы):
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#define key 201
struct message {
  byte id;
  byte type;
  byte data;
};
byte pipe = 0;
message rx_data;
RF24 radio(D4, D8);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.openReadingPipe(2, address[1]);
  radio.setChannel(0x60);
  //radio.setRetries(5,10);
  radio.powerUp();
  radio.startListening();
}
boolean send_request(byte addr) {
  radio.stopListening();
  delay(10);
  radio.openWritingPipe(address[addr]);
  delay(10);
  byte data = key;
  byte i = 0;
  boolean status_ = false;
  while (!status_ && i < 5) {
    status_ = radio.write(&data, sizeof(data));
    i++;
    delay(1);
  }
  if (status_) {
    Serial.print("Request ok, retries: ");
    Serial.println(i);
    return true;
  }
  else {
    Serial.println("Request error");
    return false;
  }
}
void loop() {
  if (Serial.available() > 0) {
    String bufer = Serial.readString();
    if (bufer == "tx") {
      byte sensor = 0;
      Serial.println("Sending....");
      send_request(sensor);
      radio.startListening();
    }
  }
  if ( radio.available(&pipe) ) {
    if (pipe == 2) {
      byte reg = 0;
      radio.read(&reg, sizeof(reg));
      Serial.println("New module start register!");
      radio.stopListening();
      delay(10);
      radio.openWritingPipe(address[1]);//New pipe for send packet register to arduino
      delay(10);
      if (reg == key) {
        Serial.println("Yeah he wont register!");
        byte sent_id = 201;
        boolean send_status = false;
        int i = 0;
        while (!send_status && i < 100) {
          send_status = radio.write(&sent_id, sizeof(sent_id));
          delay(50);
          i++;
        }
        if (send_status) {
          Serial.println("REG OK");
        }
        else {
          Serial.println("REG ERR");
        }
        delay(50);
      }
      radio.startListening();
    }
    else {
      radio.read(&rx_data, sizeof(rx_data));
      delay(10);
      Serial.print("Resived data from:");
      Serial.print(rx_data.id);
      Serial.print("with message:");
      Serial.print(rx_data.data);
      Serial.println("");
    }
  }
}
Это одна из версий да написано коряво были более красивые) но не рабочие так что пока так потом сделаю по красивее =)
Ну а теперь проблема )
Проблема:
В сериал порте базы наблюдаем такую картину:
19:17:03.579 -> Sending....
19:17:03.850 -> Request error
19:17:24.041 -> Sending....
19:17:24.312 -> Request error
19:17:40.655 -> New module start register!
19:17:40.655 -> Yeah he wont register!
19:17:40.788 -> REG OK
19:18:51.323 -> Sending....
19:18:51.358 -> Request ok, retries: 1
19:18:51.358 -> Resived data from:201with message:16
19:19:10.308 -> Sending....
19:19:10.341 -> Request ok, retries: 1
19:19:10.341 -> Resived data from:201with message:22
19:19:16.805 -> Sending....
19:19:16.852 -> Request ok, retries: 1
19:19:16.852 -> Resived data from:201with message:10
Где-то здесь я выключил датчик и самое интересно что база не написала что датчик зарегался в системе (тип как-будто новый датчик) а после одного пакета
начинает работать так как нужно) хотя по идеи база даже не знает что он уже "в сети"
19:20:37.765 -> Sending....
19:20:37.798 -> Request ok, retries: 1
19:20:46.813 -> Sending....
19:20:46.847 -> Request ok, retries: 1
19:20:46.847 -> Resived data from:201with message:16
19:21:00.771 -> Sending....
19:21:00.818 -> Request ok, retries: 1
19:21:00.818 -> Resived data from:201with message:22
21:12:00.233 -> Sending....
21:12:00.267 -> Request ok, retries: 1
21:12:04.989 -> Sending....
21:12:05.022 -> Request ok, retries: 1
21:12:05.022 -> Resived data from:201with message:16
Я уверен что ошибка в коде но просто я раза три его переписывал, а реакция точно такая же, а бывает наоборот что прекрасно работает раза три точно (подряд) регался все было видно на базе и работало все дальше безупречно ( то есть не было этого пустого ответа )

Извиняюсь, не точно выразился. Вообщем если отключить датчик и заново включить, с какой-то вероятностью в ком порте базы не будет не малейшего намека на то что она нашла новое устройство, но грубо говоря если слать пакеты в слепую то датчик отвечает тоесть он дошел до void loop но как)))) если база вроде как не получала от него пакета регистрации
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Для NRF очень , даже ОЧЕНЬ , важно качественное подключение. у меня на плате есть передатчик, а на макетке есть приемник. Все ГАРАНТИРОВАННО ПРАВИЛЬНО собрано, но даже при этом бывают сбои. Приходиться шаманить с поджимом проводов на макетке. Хорошо хоть передатчик запаял и забыл.
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Для NRF очень , даже ОЧЕНЬ , важно качественное подключение. у меня на плате есть передатчик, а на макетке есть приемник. Все ГАРАНТИРОВАННО ПРАВИЛЬНО собрано, но даже при этом бывают сбои. Приходиться шаманить с поджимом проводов на макетке. Хорошо хоть передатчик запаял и забыл.
Передатчик у меня паяный, база на макетке ввиду того что модули подключенные к базе могут меняется. Но по вашему совету базу спаяю. Важно другое) код у меня правильный ?)
 
Изменено:

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Вообщем всю ночь думал) таки ошибку одну нашел, на передатчике мы не проверяем что данные пришли во вторую трубу и берем любой байт соответственно когда мы слали запрос на получение инфы то отсылали байт, и передатчик его брал за ответ и дальше продолжал работу. Теперь вопрос остался почему тогда база не отвечает на его пакеты......
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
первое что увидел, так то, что передатчик слушает эфир
radio.startListening();
второе , на 250кб не работает подтверждение приема. на 1 и 2 мбит.
я наверное не очень понимаю, что ты хочешь сделать в передатчике..
На всякий прикрепил ниже свой пример работы с одним приемником и несколькими передатчиками. До 5 штук. всего в сети 6 NRF может быть. Посмотри код, он с подтверждениями работает
 

Вложения

  • 1.2 KB Просмотры: 30
  • 710 байт Просмотры: 33
Изменено:
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
первое что увидел, так то, что передатчик слушает эфир
radio.startListening();
второе , на 250кб не работает подтверждение приема. на 1 и 2 мбит.
я наверное не очень понимаю, что ты хочешь сделать в передатчике..
На всякий прикрепил ниже свой пример работы с одним приемником и несколькими передатчиками. До 5 штук. всего в сети 6 NRF может быть. Посмотри код, он с подтверждениями работает
Я щас проверить не смогу, то попозже обезательно проверю. Суть моего кода это обход ограничения на 6 модулей в системе. Тоесть передатчик у меня должен все время ждать запрос от базы а потом кидать ей ответ а в ответе вся инфа тип температуры и тд. У базы есть напр массив адресов по которым она проходит и отслилает пакет, потом ждёт ответа себе где-то пишет и закрывает эту трубу открывает другую и так далее.
Поэтому передатчик должен слушать, а потом переключатся и отвечать. Отвечает он ПРЕКРАСНО, и вроде пакет приёма работает у меня. Тоесть я проверял
C++:
radio.write();
- возвращает false если датчик в отключке. Самая важная проблема почему он не всегда проходит регистрацию, тобиж кто то кого-то игнорит) а кто что почему, я не знаю:cry:
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
он может ответить пакетом данных,но функция write может возвращать тру только при 1 и 2 мбитах передачи. в доках так написано

а что будет если регистрация пойдет в момент когда база сама передает ? как ты эти коллизии пытаешься разрулить?
 
  • Красота! +2
Реакции: Evgeniy2020