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

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

  1. shved86

    shved86 Нуб

    Доброго дня, Подскажите. На какое расстояние можно отнести модуль от платы. Взял кусок витой пары около 30см. После подключения связи нет( Т. К. Контроллер будет стоять в металическом ящике то радиомодуль хотелось вынести на проводах
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

  3. shved86

    shved86 Нуб

    Наверно немного не так так написал. Меня интересует максимальная длина соединительных проводов между радиомодулем и arduino
     
  4. joman

    joman Гик

    Тут скорее надо копать в сторону "Длины проводов SPI".
    На пример тут: http://radiokot.ru/forum/viewtopic.php?f=61&t=90381
    Написано что ~100 метров - нормальная длина. Хотя тут от многих факторов зависит.
     
  5. wolkwww

    wolkwww Нуб

    Общее замечание: использование fdevopen приведет к включению в загрузку функций управления распределением памяти. Т.е. fdevopen неявно вызывает malloc().
    Если есть напряг с памятью, лучше работать непосредственно со структурой FILE
     
  6. wolkwww

    wolkwww Нуб

    Установите меньшую скорость SPI. Скорость передачи в SPI целиком зависит от мастера(ведущего устройства).
     
  7. stasych

    stasych Нерд

    Всем привет !
    У меня Мега 2560 и Mini Pro 328. NRF24L01 покупал эти
    http://www.aliexpress.com/item/Free...ules-1100meters-with-antenna/32448306124.html

    Каждый микроконтроллер запитан от собственного источника питания, в котором дополнительно сделал выход 3,3В на LM317.
    На каждом NRF24 напаял керамический конденсатор 0,1uF - без них по питанию творилось что-то ужасное (смотрел осциллографом). Так же на выходе каждой LM317 стоит еще 220uF (что под руку попалось).

    Скетчи для тестов брал отсюда, за что всем ОГРОМНОЕ СПАСИБО !!!
    В коде для Mini Pro использовал два инклюда:
    #include <SPI.h>
    #include <RF24.h>

    А в коде для Меги 2560 помимо этих двух еще использовал
    #include "DigitalIO.h"
    использовал SoftSPI. Потому как на "железных" SPI пинах у меня висит TFT 3,2'.
    По ходу дела нашел еще вот такой материал
    http://www.sunfounder.com/wiki/index.php?title=NRF24L01_Test_with_Arduino
    в нем NRF24L01 тоже вешается на мегу на любые ноги.

    Пробовал работу на расстоянии около 50 метров на даче без преград - работа устойчивая, без сбоев.
    В данный момент работаю над алгоритмом конкретно под свой проект.

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

    Кстати, наткнулся тут на материал по поводу специальных плат со стабилизатором и фильтром для NRF24L01
    http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
    на Али что-то не нашел. Может кто встречал их где в китае.
     
    Последнее редактирование: 28 апр 2016
  8. joman

    joman Гик

    Всё легко:
    http://ru.aliexpress.com/af/nrf24l0...0%B5%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA.html
    Выбирайте :)
     
  9. stasych

    stasych Нерд

    Вот спасиба за ссылочку ! Теперь закажу несколько штучек! Наведу с ними небольшую эстетику - уберутся напаяные кондеры и LM317 тоже можно будет убрать и запитать все от 5В.
     
  10. joman

    joman Гик

    На самом деле схема не сложная, можно самому собрать.
     
  11. webtailor

    webtailor Нуб

    У меня такой вопрос: можно ли чтобы два (или более) приемника получали команды от одного передатчика? У меня получилось так, что пока включен только один из двух приемников, все идет нормально, но если одновременно включены оба приемника они работают как то странно.
    Использую Ардуино уно...и NRF 24L01+
     
  12. Kindling

    Kindling Нерд

    По поводу адаптеров для nrf24l01+
    Купил вот такие http://roboparts.ru/products/adapter-dlya-nrf24l01 и вышел косяк: пины питания не совпадают с пинами модуля. Долго мучился, прочитал ваш форум до 20 страницы, пока с помощью вольтметра не понял, в чем проблема.
    Еще хотел бы сообщить такое наблюдение, может оно и очевидное, но не для новичка! : Многие рекомендуют питать модуль от отдельного источника питания, а не от 3,3В ардуины или 5В ардуины через стабилизатор, так я и делал. Но забыл соединить земли ардуины и отдельного блока питания. В результате постоянно получал какую-то кашу. Например, radio.printDetails() выдавала каждый раз что-то новое, так же как и скан свободных каналов. А также radio.available() всегда было true. Я чуть с ума не сошел, прочитав остальные 20 страниц. И теперь буду с вами)))
     
    ИгорьК нравится это.
  13. sergey-fedor

    sergey-fedor Нерд

    Да уж эти модули дают пищу для мозгов :))) собрал две ардуины и 2 модуля, на управление освещением на участке. Протестировал, написал программку на питоне (начав кстати его изучать) . Все замечательно работает, принимает отправляет. Собрал в коробочки для красоты. Еще раз проверил все четко! вынес один комплект на свет божий подключил на улице, второй в подвале. На пути окошко только , все в прямой видимости - ничего не работает! Принес все обратно, начал тестить - ничего не передается не принимается , ставлю другие модули NRF2401 - результат ноль. Все перепроверил все соединения. Ничего. залил простейшие скетчи - сканеры тестируют все нормально , но приемник не принимает, и местами менял и Арудино Уно менял на Ардуины про мини - результат ноль. Буду дальше капать! слава богу есть знатоки которые не бросают нас новичков и это главное !
     
  14. sergey-fedor

    sergey-fedor Нерд

    две УНО и nrf2401 , менял пины 7-8 и 9-10, напаивал и убирал 22mF 6.3 кондеры, запитывал от УНЫ и от источника через LM1117 3.3, одно и тоже! сканер тестирует показывет на некоторых каналах сигналы, но принимать отправлять никак не хочет! самый простой код и то не работает
    Radio not available
     
  15. Kindling

    Kindling Нерд

    А что показывает radio.printDetails()?
    По своему скромному опыту, если оно все время показывает что-то разное, то модуль не правильно подключен.
    Меня вообще это очень удивило, но эта команда что-то выдает, даже если модуль физически отсоединен от ардуины.
    И сканер каналов, что удивительно, тоже выдавал какой-то фарш при отключенном модуле. То полную забитость всех каналов, то отдельные единички при основной массе нулей.
    Проверял на меге.
    Немного покопавшись в библиотеке, добавил себе в сетап такой код:
    if(radio.isPVariant()==true){Serial.println("Chip is nRF24L01+ (or compatible)");}
    else {Serial.println("Chip is nRF24L01+ incompatible, or you have problems");}
    Не буду утверждать, что это панацея. Но на практике результат был "true" только при нормальном подключении модуля.
     
  16. tgwt

    tgwt Нерд

    Всем доброго времени суток! Имеется: две меги 2560, два модуля рабочих(проверил, несколько оказались нерабочими). Есть задача: организовать обмен данными между передатчиком и приемником так, чтобы передатчик, отправляя данные, допустим, с датчиков, ожидал подтверждения принятия пакета с приемника, и, получив подтверждение, знал и "был спокоен" насчет отправки данных. Перепробовав кучу примеров из "всемирной", не было достигнуто нужного результата. Получается только просто отправить данные, они приходят, но я не знаю, все ли доходит верно. Для простоты реализации, на данном этапе имеется вот такой код:

    Для приемника:

    Код (C++):
    #include <SPI.h>
    #include <RF24.h>
    // Настройка пинов для CE, CSN
    const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
    const uint64_t pipe1 = 0xF0F1F2F3F5LL;
    bool done;
    RF24 radio(40, 53); // CE, CSN

    void setup() {
      Serial.begin(57600);
      pinMode(2, OUTPUT);
      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
      radio.setAutoAck(true);
      radio.setDataRate(RF24_250KBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openReadingPipe(1, pipe); // открываем первую трубу с идентификатором "pipe"
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }

    // radio.stopListening(); // останавливает приём (нужно перед началом передачи)

    void loop()
    {
      uint32_t data;
     
      if (radio.available()) // проверяем не пришло ли чего в буфер.
      {
        done = false;
        while (!done)
        {
          done = radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
          Serial.print("data: ");
          Serial.println(data);
        }
        digitalWrite(2, HIGH);
      }
      else
      {
        digitalWrite(2, LOW);
      }
    }
    И вот такой для передатчика:

    Код (C++):
    #include <SPI.h>
    #include <RF24.h>

    const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
    const uint64_t pipe1 = 0xF0F1F2F3F5LL;

    RF24 radio(40, 53); // CE, CSN
    bool done = false;
    uint32_t message;
    uint32_t data = 1;
    void setup()
    {
      Serial.begin(57600);

      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
      radio.setAutoAck(true);
      radio.setDataRate(RF24_250KBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
    }

    void loop()
    {
      if(radio.write(&data, sizeof(data)) == true)
      {
        data++;
      }
      else
      {
        Serial.println("NOT");
      }
    }
    Коды уже тысячу раз переписывались, но начинал я примерно с такого(это для передатчика, т.к. для приемника код не так часто переписывал):

    Код (C++):
    #include <SPI.h>
    #include <RF24.h>

    const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
    const uint64_t pipe1 = 0xF0F1F2F3F5LL;

    RF24 radio(40, 53); // CE, CSN
    bool done = false;
    uint32_t message;
    uint32_t data = 1;
    void setup()
    {
      Serial.begin(57600);

      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
      radio.setAutoAck(true);
      radio.setDataRate(RF24_250KBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
    }

    void loop()
    {
      radio.write(&data, sizeof(data));
      data++;
    }
     
    Также использовал методы типа writeAckPayload и isAckPayloadAvailable и другие способы. Все равно безрезультатно.
    Прошу помощи у всех, кто разобрался, т.к. мучаюсь над этой задачей чуть больше недели, и у меня уже опустились руки. Также прошу прощения за возможные ошибки или недочеты в посте. Заранее благодарю.
     
  17. AlexVS

    AlexVS Гик

    Не понятна суть вопроса? Что беспокоит или не получается?
    Вы не уверены в том что доставленные данные верны, даже получив ОК от приемника?
    Ну так возьмите и отправьте полученный пакет назад передатчику, а там сверьте исходные данные с полученными. Или я не так понял?
     
    MickNich нравится это.
  18. tgwt

    tgwt Нерд

    Не получается именно добиться отправки подтверждающего пакета. Пробовал startListening делать в коде для передатчика и отправлять какое нибудь сообщение и stopListening, write в коде для приемника. Оно просто не доходило. Уже не знаю что и делать. Там в моем посте написано также, что пробовал методы writeAckPayload и isAckPayloadAvailable, все равно ничего не доходит/оправляется.
     
  19. ИгорьК

    ИгорьК Гуру

    Покажите, как Вы это делали.
     
  20. tgwt

    tgwt Нерд

    Я делал это в точности как написано у вас на второй странице этой темы.