Вопросы по NRF24L01

Pasha_N

✩✩✩✩✩✩✩
27 Сен 2018
9
0
Да, нашёл информацию, что у нас в Украине на частотах с 2510-2545 МГц работает "МТС 4G". За совет спасибо, вздрючить могут :) По поводу библиотеки, имеешь ввиду nrf24-master или NRF24V?

Хорошо, допустим в библиотеке я поменяю этот канал. Но, чисто теоретически, возможно как-то загнать его в открытый код, на подобии того, что скинул выше или из-за такого глюка это бесполезно? Просто даже для того, если роутер или блютуз будут на этом канале работать, чтоб можно было перескочить на соседний. Может у кого ещё какие идею будут или варианты реализации.
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Для изменения канала надо остановить передачу, изменить канал, начать передачу. Делал для себя пульт управления на NRF, я там могу менять все настройки передатчика.
 
  • Лойс +1
Реакции: Pasha_N

Pasha_N

✩✩✩✩✩✩✩
27 Сен 2018
9
0
Да это понятно, но у меня только через библиотеку получается менять канал, в файле RF24.CPP. В том то и дело, что у меня есть и энкодер, и TM1637, но у меня через открытый код не меняется. А как передачу остановить то, не отключая питание? Вот это я не шарю, вообще
 

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

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

C++:
void start_NRF()
{
  // rcOptions.Profile.NRFOptions
  rcOptions.BadData = 0;
  rcOptions.GoodData = 0;
  RC_Pult.setAutoAck(rcOptions.Profile.NRFOptions.autoAck);
  RC_Pult.setChannel(rcOptions.Profile.NRFOptions.Channel);
  RC_Pult.setDataRate(rcOptions.Profile.NRFOptions.dataRate );
  RC_Pult.setPALevel(rcOptions.Profile.NRFOptions.Level);
  RC_Pult.openWritingPipe(rcOptions.Profile.NRFOptions.Pipe);
  RC_Pult.powerUp();
}

void stop_NRF()
{
  RC_Pult.powerDown();
}
У меня на пульте реализовано меню, где есть пункт запуска. Когда захожу вызывается старт, по выходу - стоп.
В других пунктах меняю параметры.

Главно , что я уяснил при работе с : NRF, SIM, WIFI , думаю сюда можно bluetush приплести, так то, что нужно хорошее, стабильное питание! С плохим питанием что то может работать криво или от случая к случаю, или не работать вообще. И бывает, что то, что работает на одной частоте отказывается работать на другой.
 

Pasha_N

✩✩✩✩✩✩✩
27 Сен 2018
9
0
Главно , что я уяснил при работе с : NRF, SIM, WIFI , думаю сюда можно bluetush приплести, так то, что нужно хорошее, стабильное питание! С плохим питанием что то может работать криво или от случая к случаю, или не работать вообще. И бывает, что то, что работает на одной частоте отказывается работать на другой.
Да питание стабильное, причём в моей системе, куда подключён nrf, каждому модулю "присвоен" свой отдельный стабилизатор. А по поводу каналов - пока не понятно, почему через прошивку они не меняются. Пробовал менять с 76-го в библиотеке на 0-й, 10-й и 80-й - всё тоже самое, даже скорость менял - бесполезно.
 

Владислав3637

✩✩✩✩✩✩✩
19 Янв 2021
3
0
В общем и целом есть х2 ардуино нано и х2 nrf24l01+. Джамперы я не особо люблю, тем более при работе с радиомодулями, по этому всё припаял намертво. В правильности подключении и в питании всё отлично, проверял 7 раз как в поговорке. Проверял модули через скетч nrf listen air, модули в норме, ардуинки распознали их. Но на практике загрузил скетчи TX_time и RX_time то нифига. Они не захотели подружится. Используя весь массив своих знаний и умений поискать решение в интэрнэте не увинчалось успехом. Кто уже побывал в этом кругу ада, и может накинуть вариантик я буду очень рад услышать вас.
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
180
52
на амперке ИгорьК разжевал эту тему досконально.
почитайте.
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
180
52
bort707, ну когда новичёк дорастёт до ИгряК тогда сам и сделает выводы)))))
Игорь и еспехи на луа программирует.... и что , про с++ забыть ?
нрф работает и имеет место жить.
у меня во многих проектах дубасит себе по несколько лет.
захочется связь организовать на других - будем разбираться, ковыряться и запускать))))

тс попросил помощи по нрф - я дал ссылку.

ваши знания и компетентность под сомнение не ставлю.
 

Владислав3637

✩✩✩✩✩✩✩
19 Янв 2021
3
0
Всё заработало. Оказалось, дело в библиотеке rf24. Програмировал с телефона(программа arduino droid), и штатная библиотека rf24 не подошла. Заменил, загрузил, заработало.
 

MustDIEmaniak

✩✩✩✩✩✩✩
24 Янв 2021
4
3
Здравствуйте!
Хочется внести ясность в вопрос возможности "подружить" модули на базе ESP8266 с приемопередатчиками nRF24L01.

Идея: некий набор датчиков, присоединенных к Nano вне пределов действия WiFi сети, но в зоне досягаемости nRF24L01 посылает данные на ESP8266, который выводит показания на дисплей, а также при получении определенных показателей дополнительно шлет их через "вафлю" на электронную почту, либо включает/выключает что-то в доме.

Прежде чем городить еще больший огород, решил проверить возможность связи, "допилив" немного скетчи Алекса.

C++:
/* БИБЛИОТЕКИ */
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

/* ЖЕЛЕЗО */
RF24 radio(9, 10); // для Уно, Нано
//RF24 radio(2, 15); // для ESP8266

/* ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ И КОНСТАНТЫ */
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
const uint32_t id = 111;

/* СТАРТОВАЯ НАСТРОЙКА */
void setup()
{
  Serial.begin(9600); // открываем порт связи с компьютером на скорости 9600 бод
  radioSetup(); // настройка модуля nRF24L01.
}

/* НЕПРЕРЫВНЫЙ ЦИКЛ */
void loop()
{
  radio.writeFast(&id, sizeof(id)); // передаем в эфир константу id
  delay(5); // перерыв на 5 миллисекунд
}

void radioSetup()
{
  radio.begin(); //активировать модуль
  radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 0); //(время между попыткой достучаться, число попыток)
  radio.setPayloadSize(32); //размер пакета, в байтах

  // radio.openWritingPipe(0xAFCD9FBB01LL); // присваиваем номер и имя трубе
  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x70);  //выбираем канал (в котором нет шумов!)
  radio.setPALevel (RF24_PA_MIN); // Ставим максимальную мощность, либо RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); // Ставим минимальную скорость передачи данных, либо RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}
и
C++:
/* БИБЛИОТЕКИ */
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <GyverOLED.h>

/* ЖЕЛЕЗО */
//RF24 radio(9, 10); // пины CE и SS для Уно, Нано
RF24 radio(2, 15); // пины CE и SS для ESP8266

GyverOLED<SSD1306_128x32, OLED_BUFFER> oled; // Экран размерностью 128 на 32 пикселя
// с использованием буфера

/* ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ И КОНСТАНТЫ */
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
uint32_t gotData; // Переменная, куда будет помещать полученные данные приемник
uint32_t id;


/* СТАРТОВАЯ НАСТРОЙКА */
void setup()
{
  Serial.begin(9600); // открываем порт связи с компьютером на скорости 9600 бод
  radioSetup(); // настройка модуля nRF24L01.
  oled.init();
  radio.printDetails();
}

/* НЕПРЕРЫВНЫЙ ЦИКЛ */
void loop()
{
  uint8_t c = 0; // локальная переменная - счётчик. Обнуляем
  uint8_t r = 0;
  volatile long timer = millis(); // локальная переменная таймера, т.е. опорной точки
  //для расчета периода времени. Присваиваем текущее значение внутреннего счётчика
  do
  {
    radio.read(&gotData, sizeof(gotData)); // читаем данные (если данные есть, то пишем в переменную; данные размером в 4 байта)
    id = gotData;
    if (id == 111)
    {
      c++; // увеличиваем переменную счетчика на 1
    }
    else
    {
      r++;
    }
  } while (millis() - timer < 1000); // в течение 1 секунды (1000 миллисекунд)
  // по истечении 1 секунды
  oled.clear(); // очищаем дисплей
  oled.setScale(1); // выставляем размер шрифта
  oled.setCursor(0, 0); //указываем начальное положение курсора по ширине и высоте
  oled.println("Получено за секунду: "); //Выводим текст и переходим на следующую строку
  oled.print(c); // Выводим данные переменной-счётчика
  oled.println(" пакетов"); // выводим после цифры
  oled.print(r);
  oled.print(" мусора");
  oled.update(); // передаем на дисплей
  Serial.print("Получено пакетов:");
  Serial.println(c);
  Serial.print("Получено мусора:");
  Serial.println(r);
}

void radioSetup()
{
  radio.begin(); //активировать модуль
  radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 0); //(время между попыткой достучаться, число попыток)
  radio.setPayloadSize(32); //размер пакета, в байтах

  //  radio.openReadingPipe(1, 0xAFCD9FBB01LL); // присваиваем номер и имя трубе
  radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0
  radio.setChannel(0x70);  //выбираем канал (в котором нет шумов!)
  radio.setPALevel (RF24_PA_MIN); // Ставим минимальную мощность, либо RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); // Ставим минимальную скорость передачи данных, либо RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  radio.powerUp(); //начать работу
  radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
}

Оба кода нормально работают на паре Nano+Nano, однако, при подключении ESP8266 в качестве приемника, выводится только "мусор", что подталкивает к мысли о конфликте ESP и nRF в части SPI. Ибо мне кажется, что nRF просто игнорируется, а в качестве приемника включается модуль WiFi, который и фиксирует "мусор" от роутеров и прочих WiFi устройств.
Пробовал подключить библиотеку WiFi, но от команды WiFi.forceSleepBegin() в setup() нет никакого толку.
Пробовал менять пины, но также без видимого эффекта.

Как писал в теме Особенности esp8266 , интернет дает 2 варианта решения:
1. Использовать пины 2 и 15, что у меня не работает;
2. Раскомментировать SOFTSPI в библиотеке RF24 + догрузить библиотеку DigitalIO. Здесь вариант интереснее - код просто не компилируется. Пишет ошибку компиляции для D1 mini (как, в прочем, для Generic ESP8266 и D1 mini Pro)

Параллельно с мытарствами нашел особенность, что, если код в строках 36-48 передатчика заменить на

C++:
while (millis() - timer < 2000) {
    while( radio.available(&pipeNo)){    // слушаем эфир со всех труб
      radio.read( &gotByte, 1 );         // чиатем входящий сигнал
      count++;
    } 
  }
или схожий, то ESP сваливается в постоянный ребут по watchdog. Столкнувшись, набрёл на такую статью
 
  • Лойс +1
Реакции: Havidzer

MustDIEmaniak

✩✩✩✩✩✩✩
24 Янв 2021
4
3
Может wifi-часть esp даёт наводку на nrf?
Что выдаёт
C++:
radio.printdetails();
//в setup после begin
Выдает ff и нули, а также disable.
Но при этом определяет, что это модуль nRF24L01

ADD:
20:21:19.827 -> 0⸮~?⸮4⸮!⸮⸮⸮⸮OAqE⸮SPI Speedz = 10 Mhz
20:21:19.966 -> STATUS = 0x00 RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=0 TX_FULL=0
20:21:20.013 -> RX_ADDR_P0-1 = 0x0000000000 0x0000000000
20:21:20.060 -> RX_ADDR_P2-5 = 0x00 0x00 0x00 0x00
20:21:20.107 -> TX_ADDR = 0x0000000000
20:21:20.107 -> RX_PW_P0-6 = 0x00 0x00 0x00 0x00 0x00 0x00
20:21:20.153 -> EN_AA = 0x00
20:21:20.199 -> EN_RXADDR = 0x00
20:21:20.199 -> RF_CH = 0x00
20:21:20.199 -> RF_SETUP = 0x00
20:21:20.245 -> CONFIG = 0x00
20:21:20.245 -> DYNPD/FEATURE = 0x00 0x00
20:21:20.292 -> Data Rate = 1 MBPS
20:21:20.292 -> Model = nRF24L01+
20:21:20.338 -> CRC Length = Disabled
20:21:20.338 -> PA Power = PA_MIN
20:21:20.385 -> ARC = 0
20:21:21.410 -> Получено пакетов:0
20:21:21.458 -> Получено мусора:14
0xff были, видимо с ESP-WROOM-32.

Вот так подключено.
 

Вложения

Изменено:
  • Лойс +1
Реакции: Havidzer

MustDIEmaniak

✩✩✩✩✩✩✩
24 Янв 2021
4
3
@IamNikolay, в таком сочетании ни к чему не приводит, а именно, эта скотина безрогая IDE выдает ошибку, что невозможно скомпилировать код. Никаких иных строк не показывает, хотя у меня стоит подробный вывод.
Попробую поискать другие библиотеки для программной организации SPI.

Пока делаю связку Nano+NRF+GyverBUS+ESP
Очень не хочется умножать "сущности", но увы и ах.
 
  • Лойс +1
Реакции: Havidzer

SashaPetrov

✩✩✩✩✩✩✩
22 Май 2019
54
5
Проблемы с nRF24L01 SMD - купил уже 3 модуля у разных продавцов. Измерять шум на каналах удаётся без проблем, а когда дело доходит до передачи данных, ничего не работает. При этом обычные модули nRF работают, иногда даже стабильно.

понижающий преобразователь - ams1117-3.3
конденсатор присутствует.

Что может вызвать такую проблему?
 

Bass

✩✩✩✩✩✩✩
29 Ноя 2020
6
0
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
объясните пожалуйста. как выбрать этот самый канал, при проверке нрф у меня получается как на скрине. не могу понять как правильно изменить канал :(
 

Вложения

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Приветствую. Нужен такой совет, не знаю, сможет ли кто помочь:

Есть LoRa модуль, а также NRF24L01, которые оба подключаются по SPI шине.
Необходимо подключить оба этих модуля на Arduino Nano и заставить их работать одновременно.

Проблема, собственно, такова - предварительно почитал интернет, и народ пишет, что NRF часто конфликтует с другими модулями. Притом также писали, что на Uno-подобных платах нельзя подключать SPI устройства на 10-й пин.

Собственно, может ли кто-то дать совет, в каком направлении идти дальше?

Если кратко, то концепция такова:
LoRa принимает пакет, на основе одной половины данных генерирует ШИМ (это будет радиоуправление), а другую половину пакета передаёт на NRF который шлёт его дальше.
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
@Эдуард Анисимов,
А код сам будет "определять" в какой момент какое устройство задействовать или же это надо задавать самому как-то?
По логике, модуль LoRa имеет высокий приоритет - его надо опрашивать постоянно, не пришел ли новый пакет, дабы его не пропустить. Но вместе с этим надо успевать как-то принятый пакет обрабатывать и отправлять в NRF24.
В программировании и электронике не силён и ума не приложу, как задать последовательность опроса и приоритет...