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

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

  1. sslobodyan

    sslobodyan Гик

    Пробуйте. Когда заработает, отключите #define DEBUG_NRF24_REGISTERS что бы не компилировало лишнего отладочного кода. Напоминаю, что по-умолчанию работаем только в 0 пайпе, без подтверждения, с динамической длиной, 5-байтный адрес приемника и передатчика можно ставить одинаковый, скорость 250К, црц16. Все методы могут работать из под прерывания. Можете повесить вызов check на внешнее прерывание, куда подключен вывод IRQ модуля, а можете его постоянно проверять в главном цикле без подключения данного вывода. Назначаемые вами обработчики rx_handler и tx_handler вызываются сразу после приема и соотв. отправки пакета. Не забываем назначить свой приемный буфер через rx_buffer, встроенного буфера библиотека не имеет.
    PS библиотека писалась под точка-точка, если у вас сеть, то придется ее дорабатывать для многопайпового приема, либо в пакете сделать поле ид-адресата чтобы центральный модуль мог адресовать и разбирать принятый пакет. Если честно, то я не понял для чего нужен многопайповый обмен кроме как мерять давление в шинах, и то только для 5 колес (4+запаска). Так что в любом случае приходится добавлять в пакет собственный идентификатор модуля.
     

    Вложения:

    • NRF24_1.zip
      Размер файла:
      10,3 КБ
      Просмотров:
      428
    Последнее редактирование: 20 дек 2016
    MickNich, sergey-fedor и ИгорьК нравится это.
  2. sergey-fedor

    sergey-fedor Нерд

    Спасибо, на новогодних праздниках опробую :) К слову у меня один из передатчиков висит на улице вместе с датчиком BME280 мониторит температуру влажность и давление , сегодня -39 утром зафиксировано :) вся система работает, в том числе и китайская ардуино уно. не ожидал честно говоря - думал замерзнут ))
     
  3. sslobodyan

    sslobodyan Гик

    Сегодня пытал китайского клона (с кляксой вместо чипа). Не хотел работать, гад. Поиски решения привели на один китайский сайт, где показывали куски кода. И там я обнаружил очень интересную команду, которой нет в оригинальных модулях, но которая разрешает изменять регистры, связанные с динамической длиной пакета. Эта команда сделала мой день - китайченок заговорил :) с "нормальным" модулем. Даю обновленную библиотеку.
     

    Вложения:

    • NRF24_3.zip
      Размер файла:
      10,8 КБ
      Просмотров:
      472
  4. Oleg_7

    Oleg_7 Гик

    "Эта команда сделала мой день - китайченок заговорил" А что за команда-то?
     
  5. sslobodyan

    sslobodyan Гик

    смотри activate в моей библиотеке и ее вызов в begin
     
  6. Fasterq

    Fasterq Нуб

    Помогите с библиотекой на nrf24l01+для этого скетчав
     

    Вложения:

  7. sslobodyan

    sslobodyan Гик

    Уточните, какую помощь вы желаете. Скачать библиотеку? Так ссылки в начале темы. Или есть конкретный вопрос?
     
  8. Fasterq

    Fasterq Нуб

    Мне нужно готовую библиотеку под эти скетчи
     
  9. Fasterq

    Fasterq Нуб

    Ато у меня не выходить подобрать их там много библиотек
     
  10. sslobodyan

    sslobodyan Гик

    Тогда читаем пункт 1 страничку 1 и качаем либо от maniacbug либо от tmrh20. Дальше разбираемся с ними по примерам. Как бы не сложно :) Я тоже давал библиотеку, но она другая, к вашим скетчам напрямую не подходит.
     
    ИгорьК нравится это.
  11. ИгорьК

    ИгорьК Гуру

    В этой теме уже нет ничего нового, кроме вашей библиотеки. Все крутится по 10 разу вокруг вопросов тех, кому влом читать первые страницы.
    И с этим ничего не поделать... кроме как забить на тему. Для желающих разобраться здесь есть все. Для остальных...
     
  12. sslobodyan

    sslobodyan Гик

    Согласен, для остальных есть раздел "Закажу разработку" ;)
     
    ИгорьК нравится это.
  13. ИгорьК

    ИгорьК Гуру

    И для тех, кто, не поблинкав светодиодом, берется за этот модуль, очень непростой, работающий по SPI и еще поддельно-глючный.
     
  14. Oleg_7

    Oleg_7 Гик

    Товарищи - С Новым Годом! ))) Всем - хороших и работающих модулей!
     
  15. Fasterq

    Fasterq Нуб

    А библиотеку nRF24L01+ надо в Arduino заливать или как ?Или на Arduino только скетч заливать на приемник и передатчик?
     
  16. Oleg_7

    Oleg_7 Гик

    - Это самый "шикарный" вопрос в этой ветке ..))
     
    ИгорьК нравится это.
  17. ИгорьК

    ИгорьК Гуру

    Думаю, вопрос поставил в тупик многих...
     
  18. Delta36652

    Delta36652 Нуб

    Доброго времени суток! Собственно, начал работать с этим модулем(NRF24L01+ PA LNA http://www.ebay.com/itm/400673455926?_trksid=p2057872.m2749.l2649&ssPageName=STRK:MEBIDX:IT). Воспользовался данной темой, очень помогла. Законнектил модули в полнодуплексном режиме(сильно модифицированный pingpair). Связь есть, все хорошо, но одно "но". Модули отказываются работать с повышение мощности(на PA_MIN работает без проблем, на PA_MAX потери пакетов 100%, расстояние между нрфками 70 см).
    Библиотека от tmrh20.
    Получается такая картина:
    • 250 kbps, PA_MIN
      Работает безупречно под любыми углами антенн. 200-300м.
    • 250 kbps, PA_LOW
      Работает со сбоями(до 30-50% пакетов теряется). Однако поворот антенн под «правильными» углами радикально улучшает связь.
    • 250 kbps, PA_HIGH
      Еще хуже, чем PA_LOW, снова нужно ловить «правильные» углы антенн, если коснуться в некотороых местах антенны или платы, то ситуация резко улучшается.
    • 250 kbps, PA_MAX
      Не работает, кроме как если взяться двумя руками за металлические основания двух антенн.
    • 1 mbps, PA_MIN
      Работает безупречно под любыми углами антенн.
    • 1 mbps, PA_LOW
      Работает со сбоями(до 30-50% пакетов теряется). Однако поворот антенн под «правильными» углами радикально улучшает связь.
    • 1 mbps, PA_HIGH
      Практически не работает. Хватание за антенны мало помогает.
    • 1 mbps, PA_MAX
      Не работает. Совсем.
    • 2 mbps, PA_MIN
      Работает безупречно под любыми углами антенн.
    • 2 mbps, PA_LOW
      Работает безупречно под любыми углами антенн.
    • 2 mbps, PA_HIGH
      Работает со сбоями(до 30-50% пакетов теряется). Однако поворот антенн под «правильными» углами радикально улучшает связь.
    • 2 mbps, PA_MAX
      Работает плохо. Ситуацию можно улучшить, подобрав «правильные» углы антенн или взявшись за антенну руками.
    Питаются оба модуля от самодельных преобразователей на ams1117-3.3. На входе у преобразователя керамика 100нф. На выходе керамика 100 нф и электролит 220 мкф. Все сигнальные(НЕ питание) провода припаяны к модулям и ардуинам.
    Скетч для одной ардуины:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include "printf.h"

    RF24 radio(9,10);

    const uint64_t pipe[] = {0x10203040A0LL, 0x10203040B0LL};

    void setup() {
        delay(2000);
        Serial.begin(38400);
        printf_begin();

        radio.begin();
        radio.setAutoAck(1);
        radio.setRetries(5,15);
        radio.setPayloadSize(4);

        radio.setPALevel(RF24_PA_MAX);
        radio.setDataRate(RF24_2MBPS);
        radio.setCRCLength(RF24_CRC_8);

        radio.setChannel(120);

        radio.openWritingPipe(pipe[1]);
        radio.openReadingPipe(1, pipe[0]);
        radio.printDetails();
        //radio.powerUp();
        radio.startListening();
    }

    uint32_t myTime;
    uint32_t lastTime;

    void loop() {
      if(radio.available())
      {
        lastTime = myTime;
       
        radio.read(&myTime, sizeof(uint32_t));
         
        Serial.print("Delta time is ");
        delay(2);
        Serial.println(myTime - lastTime - 5000);

        radio.stopListening();
        radio.flush_tx();
       
        if(radio.write(&myTime, sizeof(uint32_t)))
        {
          Serial.println("Sended back!");
        }
        //else
          //Serial.println("Some error!");
        radio.startListening();
      }
    }
    И для второй(здесь присутствует индикация на светодиодах)
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include "printf.h"

    RF24 radio(9,10);

    const uint64_t pipe[] = {0x10203040A0LL, 0x10203040B0LL};

    const int pin_30ms = 4;
    const int pin_60ms = 5;
    const int pin_timeout = 6;

    void indicate(uint32_t deltaTime);

    void setup() {
        delay(2000);
       
        pinMode(pin_30ms, OUTPUT);
        pinMode(pin_60ms, OUTPUT);
        pinMode(pin_timeout, OUTPUT);

        Serial.begin(38400);
        printf_begin();

        radio.begin();
        radio.setAutoAck(1);
        radio.setRetries(5,15);
        radio.setPayloadSize(4);

        radio.setPALevel(RF24_PA_MAX);
        radio.setDataRate(RF24_2MBPS);
        radio.setCRCLength(RF24_CRC_8);

        radio.setChannel(120);

        radio.openWritingPipe(pipe[0]);
        radio.openReadingPipe(1, pipe[1]);
        radio.printDetails();
        //radio.powerUp();
        radio.startListening();
    }

    uint32_t received;
    uint32_t myTime;

    void loop() {
        myTime = micros();
       
        radio.stopListening();
        radio.flush_tx();
       
        if(radio.write(&myTime, sizeof(uint32_t)))
        {
          Serial.print("Sended time ");
          Serial.println(myTime);
        }
        else
          Serial.println("Not sended!");
        radio.startListening();

        uint32_t startTimeout = millis();
        uint32_t timeout = 80;
        while( !radio.available() && ( millis() - startTimeout < timeout ) )
          delayMicroseconds(500);

        if( !(millis() - startTimeout < timeout) )
        {
          Serial.println("Timeout!");
          indicate((uint32_t)100000);
        }
        else
        {
          radio.read(&received, sizeof(uint32_t));

          uint32_t delta = micros() - received;
          Serial.print("Delta time is ");
          Serial.println(delta);
          indicate(delta);
        }
    }

    void indicate(uint32_t deltaTime)
    {
      if(deltaTime < 30000)
      {
        digitalWrite(pin_30ms, HIGH);
        digitalWrite(pin_60ms, LOW);
        digitalWrite(pin_timeout, LOW);
        return;
      }
      else if(deltaTime < 60000)
      {
        digitalWrite(pin_30ms, HIGH);
        digitalWrite(pin_60ms, HIGH);
        digitalWrite(pin_timeout, LOW);
        return;
      }
      else
      {
        digitalWrite(pin_30ms, HIGH);
        digitalWrite(pin_60ms, HIGH);
        digitalWrite(pin_timeout, HIGH);
        return;
      }
    }
     
    Канал вроде как чистый.
    Собственно, проблема в том, как заставить это все дело работать на 250 kbps, PA_MAX?
    PS. Можно ли разобрать антенны, которое идут к этим модулям(стандартные)? Если да, то как?
     
  19. ИгорьК

    ИгорьК Гуру

    По пробегавшей здесь и в иных местах информации, левые модули работают преимущественно на 1 Мбт.
    Если Вам не удается заставить работать - значит и не удастся.
     
  20. sslobodyan

    sslobodyan Гик

    Не, там дело не в левости модулей. Где-то я видел, что модули с усилителями не надо настраивать на максимальную силу. Просто стоящий дальше усилитель оглушается нрфкой. Но сам я практически это не проверял. И да, антенны разборные и очень желательно пропаять у них противовес (гильзу).