Однажды, в далекой далекой.... Завалялась у меня дома два модуля NRF24L01. Дружба с ними не заладилась как-то сразу. С тех прошло около десяти лет и вот я их снова нашел.

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

Примечание: Многие фотографии и скрины делались уже после прохождения пути.

Описание оборудования и полезная информация

Вот такой радиопередатчик

Изображение
Распиновка модуля NRF24L01
Распиновка модуля NRF24L01

Вот такая ардуино

Изображение
Arduino Nano распиновка
Arduino Nano распиновка

Вот такая схема подключения

Изображение

Вывод модуля

Вывод ардуины

Цвет провода на схеме

GND

GND

черный

VCC

3.3В

красный

CE

D9

зеленый

CSN

D10

серый

SCK

D13

желтый

MOSI

D11

синий

MISO

D12

фиолетовый

IRQ

---

---

Шаг 0. В библиотеке есть файл примера...

И называется он GettigStarted. С ним у меня вообще ничего не вышло. Совсем.

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

Собираю все на проводах, прозваниваю. Заливаю в одну ардуинку скетч передатчика, в другую скетч сканера эфира. В терминале вижу примерно следующее...

RF24/examples/scanner/

00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

01000000000000000000011211611100123555773210000100000243000100000001026800010122011000000000000122112000000000000000000000000000

01320000000000000010012102101100277668344110000000000050010000000000111200000001122000000000000111111000000000000000000000000000

А передавал-то я на частоте 0x7B....

С выключенным передатчиком картина такая же....

Думаю: ну вот, точно бракованные модули, можно спать спокойно. Но жадность взяла своё, решил их терзать дальше. Начитался про то, что все вешают конденсатор. Повесил тоже. На обе.

Шаг 2. Первые признаки жизни...

Заподозрил что проблема в питании. И решил уменьшить скорость передачи, мощность передачи и частоту посылок.

Код передатчика

Текст кода передатчика
#include <SPI.h>
#include <RF24.h>
#include "printf.h"
RF24 radio(9, 10); // порты D9, D10: CSN CE
const uint32_t pipe = 111156789; // адрес рабочей трубы; 111156789

byte data;
void setup() {
  Serial.begin(57600);
  printf_begin();
  Serial.println("TransmitterTester ON "); //Оповещаем о включении ардуины
  radio.begin();                    	// Запускаем радиомодуль
  delay(3000);												// Ждем загрузку и стабилизации его работы
  radio.setDataRate(RF24_250KBPS);  	// Скорость обмена данными RF24_1MBPS или RF24_2MBPS (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS)
  radio.setCRCLength(RF24_CRC_8);   	// Размер контрольной суммы 8 bit или 16 bit
  radio.setPALevel(RF24_PA_MIN);    	// Уровень питания усилителя RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX ((RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm).
  radio.setChannel(0x62);           	// Установка канала
  radio.setAutoAck(false);          	// Отключаем автоответ на пакеты
  radio.powerUp();                  	// Включение или пониженное потребление powerDown - powerUp
  radio.stopListening();            	// Остановить прослушивание радиоэфира
  radio.printDetails();								// Вывод текущих параметров радиомодуля
  radio.openWritingPipe(pipe);      	// открыть трубу на отправку
  Serial.println("Start send...");  	// Оповещаем о начале работы
}
void loop() {
  data = 109;
  radio.write(&data, 1);
  delay(24);
  //Serial.println("data= " + String(data));
}

Код сканера

Текст кода сканера
/*
 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 */

/**
 * Channel scanner
 *
 * Example to detect interference on the various channels available.
 * This is a good diagnostic tool to check whether you're picking a
 * good channel for your application.
 *
 * Inspired by cpixip.
 * See http://arduino.cc/forum/index.php/topic,54795.0.html
 */

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

//
// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);

//
// Channel info
//

const uint8_t num_channels = 128;
uint8_t values[num_channels];

//
// Setup
//

void setup(void)
{
  //
  // Print preamble
  //

  Serial.begin(57600);
  printf_begin();
  printf("\n\rRF24/examples/scanner/\n\r");

  //
  // Setup and configure rf radio
  //

  radio.begin();
  radio.setAutoAck(false);

  // Get into standby mode
  radio.startListening();
  radio.stopListening();

  // Print out header, high then low digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x",i>>4);
    ++i;
  }
  printf("\n\r");
  i = 0;
  while ( i < num_channels )
  {
    printf("%x",i&0xf);
    ++i;
  }
  printf("\n\r");
}

//
// Loop
//

const int num_reps = 100;

void loop(void)
{
  // Clear measurement values
  memset(values,0,sizeof(values));

  // Scan all channels num_reps times
  int rep_counter = num_reps;
  while (rep_counter--)
  {
    int i = num_channels;
    while (i--)
    {
      // Select this channel
      radio.setChannel(i);

      // Listen for a little
      radio.startListening();
      delayMicroseconds(128);
      radio.stopListening();

      // Did we get a carrier?
      if ( radio.testCarrier() )
        ++values[i];
    }
  }

  // Print out channel measurements, clamped to a single hex digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x",min(0xf,values[i]&0xf));
    ++i;
  }
  printf("\n\r");
}

// vim:ai:cin:sts=2 sw=2 ft=cpp

Необходимый файлик printf.h

Текст внешней функции печати
/*
 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
 
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 */
 
/**
 * @file printf.h
 *
 * Setup necessary to direct stdout to the Arduino Serial library, which
 * enables 'printf'
 */

#ifndef __PRINTF_H__
#define __PRINTF_H__

int serial_putc( char c, FILE * ) 
{
  Serial.write( c );

  return c;
} 

void printf_begin(void)
{
  fdevopen( &serial_putc, 0 );
}

#endif // __PRINTF_H__

Ситуация резко изменилась...


RF24/examples/scanner/

00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

010000000000000000000112116111001235557732100001000002430001000000010268000101220110000000000001221120000001e4520000000000000000

013200000000000000100121021011002776683441100000000000500100000000001112000000011220000000000001111110000004a9100000000000000000

00200000000000000100011303201120035454455400000001000141000000100000013100000230100000000000000012221000000845300000000000000000

10210000011000000101000013102000023343245330000000000141000000000000032700000112210000000000000112112000000625600000000000000000

000000000100000000000220012210002355344432300000001003410000010000000433000001120200000000000002121120000008b7800000000000000000

1100000000000000101002220210200013322343431000000010114200100000001002330000012101000000000000020022100000045ac00000000000000000

А передавал-то я на частоте 0x7B....

Шаг 3. Попытка поймать хотя бы байт информации

Время поджимало, хотелось скорее начать использовать. Заподозрил в разности частот сами ардуины.

Одна из них была искра.

Изображение
Внешний вид Arduino Iskra
Внешний вид Arduino Iskra

И она работала на другой частоте, нежели чем обычная китайская (Atmega328P с 8Мгц у китайской против 16Мгц на Atmega328PB у искры)

Собрал на двух одинаковых - без изменений.

Заменил провода на пайку - без изменений.

Накидал свой скетч, который перебирает каналы на каждом из которых пытается получить заданное количество посылок.

Текст кода сканера
#define TryingLimitDef 60 //Колличество попыток поймать посылку на каждом из каналов
#include <SPI.h>
#include <RF24.h>
#include "printf.h"
RF24 radio(9, 10); // порты D9, D10: CSN CE

const uint32_t pipe = 111156789; // адрес рабочей трубы;
byte data[1];
int scn;  //счетчик циклов прослушивания эфира
int sg;  //счетчик числа принятых пакетов с передатчика
int CHStart = 94; //С какого канала начинать
int CHto = 7; //Сколько каналов щелкать
int CH = CHStart; 
int TryingLimit = TryingLimitDef;
int CountOfTrying = 0;
int ArrPck[TryingLimitDef]; //Массив для вывода статистики по пакетам
int ArrName[TryingLimitDef]; //Массив с именами просканированных каналов
int ArrCarrier[TryingLimitDef]; //Массив значений анализа параметра Carrier
int ArrRPD[TryingLimitDef]; //Массив значений анализа параметра RDR
void setup() {
  Serial.begin(57600);
  printf_begin();
  Serial.println("ReceiverTester ON");
  Serial.println("Start Module ");
  radio.begin();
  delay(2000);
  Serial.println("Run... ");
  delay(500);
}
void loop() {
  Serial.print ("CH:"); Serial.print("\t");
  for (int i = 0; i <= CHto ; i++){
    ReSetupRF(CH);//Вызов перенастройки модуля
    CH++;
    CountOfTrying++;
    delay(850);
  }
  //Вывод результатов
  Serial.println ("");
  Serial.print ("PCG:"); Serial.print("\t");
  for (int i = 0; i <= CHto ; i++){
      Serial.print (String(ArrPck[i])); Serial.print("\t"); Serial.print("\t");
      ArrPck[i] = 0;
  }
  Serial.print(" of " + String(TryingLimit));
  Serial.println ("");
  Serial.print ("CRR:"); Serial.print("\t");
  for (int i = 0; i <= CHto ; i++){
      Serial.print (String(ArrCarrier[i])); Serial.print("\t"); Serial.print("\t");
      ArrCarrier[i] = 0;
  }
  Serial.print(" of " + String(TryingLimit));
  Serial.println ("");  
  Serial.print ("RPD:"); Serial.print("\t");
  for (int i = 0; i <= CHto ; i++){
      Serial.print (String(ArrRPD[i])); Serial.print("\t"); Serial.print("\t");
      ArrRPD[i] = 0;
  }
  Serial.print(" of " + String(TryingLimit));
  Serial.println ("");  Serial.println ("");
  //Сброс счетчиков
  CountOfTrying = 0;
  CH = CHStart;
}
void ReSetupRF(int CH){
  //Serial.println("ReSetup Run....");
  //radio.begin();
  //Serial.println("Set Speed ");
  radio.stopListening();
  radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
  //Serial.println("Set CRC ");
  radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit 
  //Serial.print("Curr CH ");  Serial.println(CH, HEX);
  radio.setChannel(CH);         // установка канала
  //Serial.println("Set Ack ");
  radio.setAutoAck(false);       // автоответ
  // Serial.println("PW ");
  //radio.powerUp(); 
  //Serial.println("STOP "); 
  //radio.stopListening();  //delay(2000);
  //Serial.println("GET INFO "); 
  //radio.printDetails();
  //delay(2000);
  //Serial.println("DONE GET INFO ");
  //delay(1000);
  //Serial.println("Open Pipe ");
  radio.openReadingPipe(1, pipe); // открыть трубу на приём
  //Serial.println("Start Listening ");
  radio.startListening();        // приём
  delay(1000);
  PckCatch(); //Начать анализ эфира
}
void PckCatch(){
  //Serial.println("Start Catch...");
  //Вывести название анализируемого канала
  if(CH < 16){
    Serial.print("0x0");  Serial.print(CH, HEX); Serial.print("\t"); Serial.print("\t");
  }else{
    Serial.print("0x");   Serial.print(CH, HEX); Serial.print("\t"); Serial.print("\t");
  }
  //Очистка буферов радиомодуля, избавление от переходных процессов при перенастройки частоты
  for (int x = 0; x < 35 ; x++){    // прослушивание эфира, очистка буфера перед чистовым
    if (radio.available())
    {
      radio.read(data, 1);    }
    delay(5);
  }
  //Накопление информации
  for (int x = 0; x < TryingLimit ; x++){
// прослушивание эфира на несущую
if ( radio.testCarrier() ){
    ArrCarrier[CountOfTrying]++;
}

// прослушивание эфира на сигнал мощнее -64dBm
if ( radio.testRPD() ){
    ArrRPD[CountOfTrying]++;
}    

// прослушивание эфира на посылки
if (radio.available())
{
    radio.read(data, 1);           
    if (data[0] == 109) {
      sg++;
      //Serial.print("*"); 
    }else{
      //Serial.print("+"); 
    }
}
else{
  //Serial.print("."); 
}
delay(50);

  }
  //Serial.println("");
  if(sg > 0){
      //Serial.print("FOUND " + String(sg) + " of " + String(TryingLimit) + " ON CH:"); 
    if(CH < 16){
      //Serial.print("0x0"); Serial.println(CH, HEX); 
    }else{
      //Serial.print("0x"); Serial.println(CH, HEX);
    }
    //Serial.println("");
    delay(300);
  }else{
    //Serial.println("");
    //Serial.println("");
  }
  //Запись в массивы, сброс переменных
  ArrPck[CountOfTrying] = sg;
  ArrName[CountOfTrying] = CH;
  sg = 0;
  scn = 0;
  delay(700);
 }

Краткое пояснение:

TryingLimitDef - задает колличество поппыток анализа выбранной частоты

CHStart - задает с какого канала начинать поиск. Для удобства преобразования данных с простого сканера использовал перевод через калькулятор windows.

CHto - задает количество анализируемых каналов

Краткий алгоритм действий:

Описание

Включил передатчик. Нашел общим сканером.

например, возле этой частоты появились какие-то цифры.

0x2A перевожу в десятичную

Загружаю вместо сканера свой. Задаю CHStart 38 (на четыре меньше, чем где увидел сигнал) и ставлю искать на 10 каналов.

Проверяю на каких каналах есть посылки, если они есть.

Получил примерно следующее:

ReceiverTester ON
Start Module 
Run... 
CH:		0x78		0x79		0x7A		0x7B		0x7C		0x7D		0x7E		0x7F		
PCG:	8				19				1				1				5				1				0				0		 of 60
CRR:	34			59				35			65			55			8				0				0		 of 60
RPD:	23			59				23			21			55			2				0				0		 of 60

CH - канал, на котором проводилось измерение и захват посылок

PCG - колличество удачных попыток найти с верной CRC.

CRR - колличество удачных обнаружений несущей на выбранном канале

RPD - колличество удачных обнаружений несущей с уровнем сигнала выше -64Дбм

А передавал-то я на частоте 0x7B.... Но информация идёт!

При этом, если повысить мощность, то пакетов ловилось меньше. Если повысить скорость общения (1Мбит/с и выше), то сигнал исчезает полностью.

После этого совсем недоумевая я решил таки проверить питание.

Шаг 4. Все было очень просто...

Приложил мультиметр. Да не простой, а поверенный и даже не очень китайский. И увидел 3,3В

Решил подключить осциллограф и на разных частотах проверить всякие пульсации...

Фото осциллограммы
Пульсации по напряжению при передачи посылки
Пульсации по напряжению при передачи посылки

Но как же так! Ведь был установлен электролит на 100мкФ и 20В.

Посмотрел параметры преобразователя из 5В в 3,3В.

График зависимости напряжения от тока
Описание падения напряжения от тока согласно  тех. документации на AMS1117
Описание падения напряжения от тока согласно тех. документации на AMS1117

Посмотрел на потребляемый ток у модуля

Требуемое напряжение питания и типовой потребляемый ток
Заявленное потребление питания
Заявленное потребление питания
Заявленные токи питания
Заявленные токи питания

Ну и наконец решил радикально отфильтровать питание.

Фильтрация по питанию
Вольная импровизация на тему схемотехники
Вольная импровизация на тему схемотехники

Напряжение, приходящее на модуль радиопередатчика упало с 3,3В до 3,1В.

Зато исчезла пульсация.

Итог

Получил вот такую статистику

Статистика получения пакетов
Статистика получения пакетов

Теперь работает на всех скоростях и на всех мощностях. Платы ардуино перестали грется. На дальность не проверял, но по комнате около 10 метров со стальными стелажами ловит уверенно. На действительное потребление тоже не проверял.

Всем спасибо за внимание и успехов во всех начинаниях.

Список источников:

NRF24L01 datasheet

AMS1117 datasheet

Статья про подключение

Статья про подключение

Комментарии (31)


  1. Javian
    25.08.2021 09:01
    +3

    офф. Недавно для себя открыл, что в сгоревшей светодиодной лампе можно поживиться мощным дросселем 5мГн (c сопротивлением 9 Ом). Как раз для фильтрования питания таких самоделок. С ним должно фильтроваться питание еще лучше, чем RC.


  1. Ivanii
    25.08.2021 09:06
    +1

    Если у NRF24L01 + PA/LNA антенна подключена напрямую без провода то она может сама себя "глушить".

    Простые NRF24L01 с нормальным питанием AMS1117-3.3 + 2*10 мкФ керамики ин/оут работают без проблем.


    1. Odmino
      25.08.2021 15:31

      Лет 6 назад именно керамика и помогла завести модули. На счёт антенны не понял, не раскроете тему?


      1. Ivanii
        25.08.2021 17:20

        Модуль NRF24L01 + PA/LNA на пластиковом корпусе и если к нему напрямую прикручена штатная антена работает нестабильно, иногда работает, иногда не работает, если антенна вынесена или корпус металлический то работает нормально.


        1. andrewoficial Автор
          26.08.2021 11:51

          такая антенна. Работает не стабильно. Что можно изменить? При подключении другой антенны стабильнее, но дальность сильно меньше.


          1. Ivanii
            26.08.2021 13:27

            Сколько нужно дальности?


            1. andrewoficial Автор
              30.08.2021 20:35

              Чем больше тем лучше. Пробовал другую антенну (разъем мама вместо папы) работает более стабильно, но расстояние значительно меньше.


              1. Ivanii
                30.08.2021 22:35

                Чем больше тем лучше - лучше ЛоРа использовать, а для небольших цехов/складов вполне металлического корпуса достаточно.


  1. igrushkin
    25.08.2021 09:51
    +2

    смысл в сабже в 2021 году? если только валяется бесхозный? а так оптимально на Lora такие вещи делать


    1. Ivanii
      25.08.2021 09:58

      У LoRa скорость очень очень очень низкая и цена в 10 раз выше


      1. igrushkin
        25.08.2021 10:03
        +2

        В 10 раз это 15₽ и 150₽? Формально, это 10 раз. Но в бытовом плане — одинаково.

        Если запускать промышленную партию, то такая разница это космос. Но мы то говорим о 2-3-5 экземплярах максимум.

        Про скорость тоже спорно. Для чего скорость? Что за критическая телеметрия реального времени? А передать Т в теплице за 15мс или за 1мс разницы нет никакой. А скорость да, в 15 (!!) раз выше :-)


        1. Ivanii
          25.08.2021 12:48

          60 р и 2 Мбит/с + MySensors против 600 р и 50 Кбит/с, если дальности хватает то за что платить больше?


          1. igrushkin
            25.08.2021 12:53
            +2

            Ну какие 600₽, о чем вы? Глянул сейчас, Lora от моего любимого Ebyte стоит 270₽.

            И какой у вас пейлоад, что нужно 2мбит? Кроме того, я ОЧЕНЬ сомневаюсь, что nrf24 будет надёжен на дальности 600м.

            и кстати, Lora тоже давно поддерживается mysensor’ами


    1. sav13
      25.08.2021 21:10

      Ну беспроводные мышки Logitech до сих пор на данном сабже делают )))


      1. igrushkin
        25.08.2021 21:13

        Там не 600м расстояние :-)) и вот там как раз каждый цент стоимости важен


  1. belav
    25.08.2021 10:50
    +5

    Как говорят, день дебага и отладки экономят час чтения документации.


  1. VolodjaT
    25.08.2021 10:56
    +1

    RC цепочка для питания? Очень странное решение


  1. sami777
    25.08.2021 12:22
    +1

    У вас схемка нарисована неправильно!

    1. GND на "+" никак не может идти.

    2. Фильтровать питание с помощью ограничительного резистора мягко говоря идея плохая.


    1. serafims
      25.08.2021 13:14

      По идее резистор - чтобы не спалить выход преобразователя Nano, в момень зарядки конденсатора. Но вряд ли в ней ц стоит такой чувствительный стабилизатор без защиты от превыш. тока.


    1. andrewoficial Автор
      25.08.2021 15:36

      Я обновил схему. А в чем ошибка? ну кроме потери на резисторе.


    1. nop0x90
      25.08.2021 16:45

      Как раз очень правильное решение, использование low pass фильтра в цепи питания! Развелись ардуинщики...


      1. dcoder_mm
        25.08.2021 17:16

        использование low pass фильтра в цепи питания

        С резистором?


      1. VolodjaT
        08.09.2021 18:25

        Греть резистором атмосферу? Вызывая еще большие просадки питания? Может дроссель надо?

        RC фильтр только для сигналов подходит, а не для питания. А еще ардуинщиками других обзываете...


  1. sav13
    25.08.2021 21:07
    +2

    Как то у вас очень все сложно


    Обычные NRF24 с керамикой и электролитом всегда заводились нормально.

    Частота контроллера не должна влиять, так как для NRF используется SPI, а у него для ведомого внешнее тактирование.

    Логику желательно делать 3.3V (чего у ардуин с питанием 5В такой нету) При 5-вольтовой логике мало того что может не работать, так еще и входы NRF перестают в режиме сна переходить в высокоимпедансное состояние и минимальное потребление NRF получается 1-2мА, что плохо для работы от батареи

    В наше время пора уже работать с NRF52, если уж сильно нужно 2.4Гц и совместимость с NRF24. Там уже все в одном флаконе - и контроллер и модем, да и мощнее они.

    Ну если нужно 600м, то лучше субгигагерцовый диапазон и нормальные антеннки. Тот же 868 менее всего загажен пока, идеально - LoRa со своей модуляцией.


    1. igrushkin
      25.08.2021 21:16
      +1

      Подпишусь под каждым словом


    1. zeblong
      26.08.2021 12:37

      Расскажите пожалуйста подробнее про не переход в высокоимпедансное состояние. Использую адруины Pro Mini 8Мгц и питяю все от литиевых аккумуляторов т.е 4 Вольта в заряженном состоянии. При этом часто вижу что во сне модуль NRF потребляет миллиамперы, обычно 3-7 иногда 10. И выхожу из этой ситуации подбором модуля. Прямо перебираю их десяток (валяется у меня их много) и какой то в данном конкретном устройстве вдруг вместо миллиампер начинает спать с микроамперами. Собственно что я делаю не так? Как заставить его спать полноценно?


      1. sav13
        26.08.2021 13:27

        Выстрадано опытным путем:

        Берется нулевый модуль NRF24. (Впрочем как и NRF52). В режиме сна МК с ним, питаясь от 3В батарейки потребляет несколько uA

        Затем подключаем модуль у 5В ардуине (несмотря на питание модуля 3.3В) или даже просто программируем контроллер UART с 5В логикой и все - в режиме сна меньше 1-2мА потребление не полчить

        Причем даже если от NRF24 отключить питание, то все равно ток утекает через выводы SPI. Такой модуль на батареечные устройства больше не гожиться, хотя работать на прием/передачу продолжает без проблем

        Так несколько штук испортил, пока не допер в чем проблема.

        Потом встретил описание этой проблемы у Нордика в техподдержке. Там какие-то защитные феты стоят, которые при 5В накрываются.


        1. dcoder_mm
          26.08.2021 21:08

          А разве это не паразитное питание через защитные диоды на входах? Вы его без преобразователя уровней подключали? А если во сне выходы МК, которые подключены к модулю переводить в hi-z?


  1. DesertFlow
    26.08.2021 03:57
    +2

    Вот поэтому вместо NRF24L01 (хотя у меня они с припаянными 10uF конденсаторами, RF24_250KBPS и RF24_PA_LOW нормально работают, запитываясь от штатного 3.3V пина с Arduino Nano) я уже давно использую ESP8266. При сравнимой стоимости (100 руб против 60 руб), тот же диапазон 2.4ГГц и сравнимая дальность. Если нужно радиоуправление только в одну сторону, то достаточно по UART напрямую соединять ESP8266 с Rx пином у Arduino Nano, так как ардуинка на чтение прекрасно работает с 3.3V, а обратно 5V от ардуинки на ESP не попадает. Хотя саму ESP8266 приходится питать от 5V пина ардуино через AMS1117, т.к. 3.3V пин от ардуино не потянет нужные ей 300-400 мА в пике, а пин 5V выдает не менее 500 мА.

    А если нужна обратная/двухсторонняя связь, то есть прикольный трюк с I2C: в штатной библиотеке Wire.h в Arduino можно закомментировать включение подтягивающих встроенных резисторов до 5V, и использовать ESP8266 как мастер со своими встроенными подтягивающими резисторами. Тогда обе линии SDA и SCL будут 3.3V от ESP8266. И поэтому ESP8266 и Arduino можно напрямую соединять двумя проводами, вообще без конвертора уровней (и плюс общая GND, конечно). I2C устроена так, что оба устройства просто закорачивают в 0 линии, когда хотят что-то передать. Поэтому 5V от ардуинки на ESP8266 тоже никак не попадает. НО! Штатная библиотека Wire.h включает подтягивающие резисторы, делающие на SDA и SCL пинах 5V, даже если arduino работает как slave. Поэтому приходится это комментировать и/или сохранять ее как альтернативную библиотеку. Бонусом, на ESP8266 удобно вести отладку с телефона, да и просто использовать телефон как пульт управления, вместо второй пары arduino+NRF24L01.


    1. sav13
      26.08.2021 07:49
      +1

      А если убрать Arduino Nano и программировать напрямую ESP, то не нужно никакого геморроя с сопряжением.

      Правда лучше сразу на ESP32 переходить. Он менее глючный и по периферии побогаче.

      Но все равно это не замена NRF24. Ни один ESP не проработает от CR2032/CR2450


  1. AlexWels
    26.08.2021 11:58
    +3

    Это статья, пример того когда лень почитать датшит, и взять штатную библиотеку от Нордиков, которая очень и очень понятно написана.

    1. NRF24L01 первично не очень заточена на питание от сетевого источника питания, так как она lowenergy решение, может год работать от батарейки cr2032. Прочтение датшита раскрывает эти тайны, и прекрасно решает проблему с танцами и бубном.

    2. Момент с задаванием адреса и команд, в коде куча ошибок, да у Нордиков не самые понятные организации посылок и инициализации их радио трактов, но опять таки все описано даташите к чипу.

    3. Вывод: Не повторяйте ошибок автора, не тыкайте в непонятное палочкой, читайте инструкцию.