nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. parovoZZ

    parovoZZ Гуру

    разумеется. Для согласования с антенной 50 Ом в даташите приведен расчет тракта. Если антенна имеет входное сопротивление отличное от 50 Ом, то её необходимо согласовать.
     
  2. Neon_1

    Neon_1 Нерд

    вот с такой антенной , там есть еще и другой вариант антенны
     

    Вложения:

    • nrf24.jpg
      nrf24.jpg
      Размер файла:
      151,4 КБ
      Просмотров:
      106
  3. parovoZZ

    parovoZZ Гуру

    ну вот китайцы выбрали другой дизайн платы. Видимо, из-за размеров.
     
  4. prohor-nastya

    prohor-nastya Нерд

    всем привет, столкнулись с такой проблемой:
    NRF 24L01 Нормально работает с Ардуино нано и Ардуино Уно,
    а с Ардуино Микро при сканировании каналов выдает сплошником одни четверки.
    в radio.Printdetails() не выводит ничего.
    питание радио отдельное, конденсатор стоит, пины пробовали менять на 2,3
    Почему с микро проблема может кто знает?
     
  5. prohor-nastya

    prohor-nastya Нерд

    И снова здравствуйте!
    как оказалось у микро выводы SPI не подключены ни к каким цифровым вход/выходам, как на Arduino Uno, они доступны только на соединителе ICSP и ближайших выводах, маркированных MISO, MOSI и SCK.
    подключив NRF на соответствующие пины она стала видеть каналы. Но информация о настройках модуля все равно не выводится....
    может нужно на других пинах инициализировать?
    используем следующий код.
    Код (C++):

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

    RF24 radio(9,10); // инициализировать модуль на пинах 9 и 10 Для Уно
    //RF24 radio(9,53);// Для Меги

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

    void setup(void)
    {
      Serial.begin(9600);
      printf_begin();
      radio.begin();
      radio.setAutoAck(false);
      radio.startListening();

      radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
      delay(5000);              // И посмотрим на это пять секунд.

      radio.stopListening();
      int i = 0;    // А это напечатает нам заголовки всех 127 каналов
      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");
    }
    const int num_reps = 100;

    void loop(void)
    {
      memset(values,0,sizeof(values));
      int rep_counter = num_reps;
      while (rep_counter--) {
        int i = num_channels;
        while (i--) {
          radio.setChannel(i);
          radio.startListening();
          delayMicroseconds(128);
          radio.stopListening();
          if ( radio.testCarrier() )
            ++values[i];
        }
      }
      int i = 0;
      while ( i < num_channels ) {
        printf("%x",min(0xf,values[i]&0xf));
        ++i;
      }
      printf("\n\r");
    }
    int serial_putc( char c, FILE * ) {
      Serial.write( c );
      return c;
    }

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

    Neon_1 Нерд

    а вообще монитор работает? может проверить на другом скетче

    возможно это связано с тем, что на микро немного по другому передается информация в комп


    Связь
    Micro
    имеет несколько средств для связи с компьютером, другим Arduino, или иными микроконтроллерами. Контроллер ATmega32U4 предоставляет UART TTL (5V) для последовательной связи, доступный на цифровых выводах 0 (RX) и 1 (TX). Также 32U4 разрешает последовательный обмен (CDC) через USB и появляется для компьютерного программного обеспечения как виртуальный COM-порт. Кроме того, кристалл работает как «full speed» USB устройство при использовании стандартных драйверов USB COM. Для Windows требуется .inf файл (смотри пункт 4 для Arduino Uno). Программное обеспечение Arduino включает монитор последовательной шины (Serial monitor), позволяющий принимать и посылать с платы Arduino простые текстовые данные. Светодиоды RX и TX на плате будут вспыхивать при передаче данных через USB соединение с компьютером (но не при последовательной связи через выводы 0 и 1) В библиотеке SoftwareSerial предусмотрена последовательная связь через любой из цифровых выводов Micro.

    http://arduino.ru/Hardware/ArduinoMicro

    кстати это там тоже есть
    SPI: на разъеме ICSP. Данные выводы поддерживают связь по SPI с использованием библиотеки SPI. Обратите внимание, что выводы SPI не подключены ни к каким цифровым вход/выходам, как на Arduino Uno, они доступны только на соединителе ICSP и ближайших выводах, маркированных MISO, MOSI и SCK.
     
  7. prohor-nastya

    prohor-nastya Нерд

    Здравствуйте!
    Так вот номера каналов и зашоренность каналов выводятся в порт, а данные о модуле не выводятся...
    Короче не понятно что делать...
    Библиотеки ставить код дописывать подключение менять?
     
  8. Neon_1

    Neon_1 Нерд

    На приемнике можно как либо узнать были ли повторные попытки передачи пакета?

    autoAck включен
     
  9. parovoZZ

    parovoZZ Гуру

    Слишком много хочешь от такой простой финтифлюшки. Если всё-таки хочется знать, дошла ли квитанция о принятом пакете до передатчика, то обмен необходимо написать вручную. Нет ничего сложного в этом.

    Про структуру пакета:
    Взято отсюда
    https://aterlux.ru/article/nrf24l01p
    Крайне рекомендуется к прочтению.
     
  10. Neon_1

    Neon_1 Нерд

    Спасибо, да, я читал там инфу и понял, что приемник считает попытки передач

    Думал, может он автоматически передает эту инфу преемнику
     
    Последнее редактирование: 21 янв 2020
  11. forfrends

    forfrends Нерд

    Всем привет!
    Делаю радиоуправление на базе Ардуино и модулей nrf24l01+pa+lna. Столкнулся с проблемой очень маленькой дальности работы. На передатчике стоит модуль с антенной. Если на приемнике установить обычный модуль (без антенны) то дальность составляет всего 1-2 метра. Если же на приемник поставить модуль с усилителем (с антенной) то дальность уже достигает всего 10 метров. Все модули куплены в разное время у разных продавцов.
    Проблема похоже в передатчике.
    Код инициализации (в приемнике и в передатчике они одинаковы):

    Код (C++):
    radio.begin();
    delay(2000);
    radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
    radio.setCRCLength(RF24_CRC_8);
    radio.setPALevel(RF24_PA_MIN);
    radio.setChannel(102);
    radio.setAutoAck(false);
    radio.powerUp();
    radio.openWritingPipe(pipe); // открыть канал на отправку
    delay(2);
    radio.stopListening();
    delay(2);
    С питанием как в приемнике, так и в передатчике проблем нет. Стабилизаторы мощные, брал с большим запасом. Стабильные 3.3 без пульсаций. Проверял осциллографом. По крайней мере, если пульсации и есть, то они столь мизерны, что не видны за фоновым шумом осциллографа. На модулях напаяны конденсаторы по питанию (электролиты и керамика). Понятия не имею что ему еще нужно.
    Единственное что заметил - на разные настройки модули с антенной реагируют по-разному. Так, на пример, если поставить уровень усиления RF24_PA_MAX то модуль nrf24l01+pa+lna может перестать что-либо слышать или передавать. А может работать как обычно....
    Может у вас есть идеи?
     
  12. parovoZZ

    parovoZZ Гуру

    И не увидишь. Они идут на частоте 2.4ГГц. Маловероятно, что у осцилла такое разрешение.

    У меня порядка 4-х метров. Глупо ждать больше.

    Записывать абсолютно все регистры, включая преамбулу и адрес труб, а не надеяться на их дефолтные значения.
     
  13. forfrends

    forfrends Нерд

    Я писал выше, что в передатчике у меня стоит модуль с антенной, то есть с усилителем. Дальность по любому должна быть больше чем 100 метров (по прямой). Передача идет только в одном направлении, от передатчика до приемника. В сети видел массу примеров связки передатчика с усилителем и обычного приемника. Дальность везде выше 100 метров. В моем случае два модуля с усилителями и максимальная дальность - всего 10-12 метров! А передатчик с усилителем + обычный модуль = всего 2(!!!) метра! Это не нормально даже для обычных модулей.
    Ослик у меня простой. DSO180.
    По поводу регистров. Я выше давал пример моей инициализации. Какие регистры я не учел, можете подсказать?
     
  14. parovoZZ

    parovoZZ Гуру

    а где это написано?

    На оригинальных комплектующих возможно и так. На непонятно каких с алеши - непонятно как и работает.
     
    KindMan нравится это.
  15. forfrends

    forfrends Нерд

    Вот, то что у меня в приемнике:
    Код (C++):
    radio.begin(); //активировать модуль
        delay(1000);
        radio.setAutoAck(0);         //режим подтверждения приёма, 1 вкл 0 выкл
        radio.setChannel(102);
        radio.setCRCLength(RF24_CRC_16); // длинна контрольной суммы 8-bit or 16-bit
        radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
        radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
        radio.powerUp(); //начать работу
        delay(2);
        radio.openReadingPipe(1, pipe);
        delay(2);
        radio.startListening();
        delay(2);
    Вот то, что в передатчике:
    Код (C++):
     radio.begin();
        delay(2000);
        radio.setAutoAck(false);
        radio.setChannel(102);              //   устанавливаете любой канал который вам нужно
        radio.setCRCLength(RF24_CRC_16);     // длинна контрольной суммы 8-bit or 16-bit
        radio.setPALevel(RF24_PA_MAX);      //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
        radio.setDataRate(RF24_250KBPS);    //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
        radio.powerUp();
        delay(2);
        radio.openWritingPipe(pipe); // открыть канал на отправку
        delay(2);
        radio.stopListening();
        delay(2);
    Какие настройки я не учел?
    На всякий, прикрепляю файлы проекта (приемника и передатчика)
     

    Вложения:

    • Pereda4a.ino
      Размер файла:
      6,8 КБ
      Просмотров:
      118
    • Priyom.ino
      Размер файла:
      18,5 КБ
      Просмотров:
      131
  16. forfrends

    forfrends Нерд

    Игры с настройками ни на что не повлияли. Стал проводить эксперименты с антенной. Когда я взял антенну в руку то сигнал стал более устойчивый (антенна сверху покрыта пластиком, по этому электрического контакта не было). Обмотал фольгой антенну - это дало такой же результат. Стал рыться в "запасах". Нашел несколько антенн. Некоторые были от роутеров, другие не понятно от чего. Стал их тестировать. На одной антенне появился стабильный сигнал. Дальность немного упала, примерно до 8 метров :(
    Но стала стабильнее.
    Исходя из всех экспериментов могу сказать что дело не в настройках, а в качестве самих модулей. Хоть они и с антенной, но реально добавляют всего + 2 +3 метра, по сравнению с обычными модулями :(
    И встает резонный вопрос: где купить оригинальные модули?
     
    Последнее редактирование: 29 янв 2020
  17. parovoZZ

    parovoZZ Гуру

  18. ИгорьК

    ИгорьК Гуру

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

    Но именно благодаря им я занялся ESP-8266. Так что - большое спасибо :)
     
    Последнее редактирование: 29 янв 2020
  19. parovoZZ

    parovoZZ Гуру

    Я подозреваю, что кварц кривой, но может быть кривым все, что угодно)
     
  20. ИгорьК

    ИгорьК Гуру

    Ну да. Кроме... все жду, когда форум переименуют в вашу честь. Ибо каждое слово - золото и бездонная кладезь мудрости.
     
    DetSimen и SergeiL нравится это.