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

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

  1. Потанцевал я с бубном и написал функцию, которая каждую секунду смотрит, не отрублено ли питание. В библиотеке сделайте публичной функцию get_status(). Вообщем работает эта хрень и код работает параллельно. Можно выставить частоту опроса. Если модуль отключился, а потом включился,поднимаем его функцией powerUP() и устанавливаем опять настройки. По питанию определился, меня это устраивает, дальше буду обрабатывать передачу radio.write(&svalue,sizeof(svalue)); Так как код тоже зависает если не может передать.

    Код (Text):
    //-------------------------------------------------------------------------------------------------

    //Подключение библиотек
    //-------------------------------------------------------------------------------------------------
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>
    //---------------------------------------------------------------------------------------------------------------
    //Константы для обработки беспроводных датчиков
    //---------------------------------------------------------------------------------------------------------------
    #define CE_PIN 9    
    #define CSN_PIN 10

    const uint64_t NRF = 0xE8E8F0F0E1LL;
    const uint64_t NRF1 = 0xE8E8F0F0A2LL;

    //Выставляем пины на модель NRF2401+
    RF24 radio(CE_PIN, CSN_PIN);

    //-------------------------------------------------------------------------------------------------
    //Переменные программы
    //-------------------------------------------------------------------------------------------------
    unsigned long MessageNRF; //Сообщение на прием / передачу
    int SensorCounter=0; //Счетчик прохода позиций

    int NRFOnlineStatus; //Статус модуля

    //Если радио включено значение переменной true
    boolean NRFOnlineValue=false;

    //Счетчики
    unsigned long NRFOnlineCounter=0; //Счетчик времени в OffLine (NRFOnlineDelay)

    unsigned long NRFOnlineTimer=millis(); //Таймер проверки питания
    unsigned long NRFOnlineDelay=1000; //Задержка проверки в миллисекундах

    unsigned long UpdateSensorTimer=millis();
    unsigned long UpdateSensorDelay=100;

    //-------------------------------------------------------------------------------------------------
    //Функция инициализации NRF
    //-------------------------------------------------------------------------------------------------
    void StartRadio(void)
    {
      radio.begin();        
    delay(2000);      
      radio.setChannel(2);            
      radio.setRetries(10,10);        
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_MAX);
      radio.openReadingPipe(1,NRF1);
      radio.setPayloadSize(32);
      radio.startListening();
      radio.powerUP();
      NRFOnlineStatus=radio.get_status(); //Стату NRF модуля при старте
    }

    //---------------------------------------------------------------------------------------------
    //Функция проверки Radio (Online)
    //---------------------------------------------------------------------------------------------

    void RadioOnline(void)
    {
      if(millis() - NRFOnlineTimer > NRFOnlineDelay)
      {
        NRFOnlineTimer=millis();

        //Получаем текущее состояние
        int CurrentStatus=radio.get_status(); //Текущее состояние модуля

        //Если текущее состояниеравно предыдущем то
        if (CurrentStatus==NRFOnlineStatus)
        {
          //Когда остановится счетчик на проверку то поднимаем радио заново
          if (NRFOnlineCounter>1)
          {
            radio.powerUp();
            StartRadio();
            NRFOnlineCounter=0;
          }
          NRFOnlineValue=true;
        }
        else
        {
          NRFOnlineValue=false;
          NRFOnlineCounter++;
        }
      }
    }


    //---------------------------------------------------------------------------------------------
    //Функция отправки команды передатчику
    //---------------------------------------------------------------------------------------------
    void send_answer(unsigned long svalue,uint64_t p)
    {
      radio.stopListening();  //Перестаем слушать
      radio.openWritingPipe(p); //Открывем трубу для отправки
      radio.flush_tx();
      radio.write(&svalue,sizeof(svalue)); // Отправляем ответ
      radio.startListening();

    }
    //-------------------------------------------------------------------------------------------------
    //Функция обработки сенсора для других устройств
    //-------------------------------------------------------------------------------------------------
    void UpdateSensor()
    {
      if(millis() - UpdateSensorTimer > UpdateSensorDelay)
      {
        SensorCounter++;
        UpdateSensorTimer = millis();
      }

      if(SensorCounter > 10)
      {
        SensorCounter=0;
        if (NRFOnlineValue)
        {
          send_answer(100,NRF);
        }
      }
    }

    //-------------------------------------------------------------------------------------------------
    //Функция прослушки радиоканала
    //-------------------------------------------------------------------------------------------------
    void RadioRead(void)
    {
      if (radio.available())
      {
        radio.read(&MessageNRF,sizeof(MessageNRF));
        Serial.println(MessageNRF);
      }
    }

    //-------------------------------------------------------------------------------------------------
    //Установки Arduino
    //-------------------------------------------------------------------------------------------------
    void setup()
    {
      Serial.begin(57600);
      StartRadio();
    }

    void loop()
    {
      UpdateSensor();
      RadioOnline(); //Проверка радио на отключение питания

      //Если есть питание на модуле, то слушаем Radio
      if (NRFOnlineValue) { RadioRead(); }
    }
     
    Если есть желание у магистров, то могут улучшить функцию. Я и другие танцоры будут очень рады



    Важное замечание, статус появляется только тогда, когда после radio.begin() пройдет около 2-3 секунд. Иначе статус будет не определен.
     
    Последнее редактирование: 15 дек 2014
    magic21 нравится это.
  2. magic21

    magic21 Нерд

    А эту функцию не пробовали?

    bool RF24::isPVariant(void )
    Determine whether the hardware is an nRF24L01+ or not.
    Returns True if the hardware is nRF24L01+ (or compatible) and false if its not.

    Возможно, тоже будет возвращать false, если не обнаружит NRF....

    Я предполагаю)
     
  3. Andy-K

    Andy-K Нуб

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

    Одно дело у нас была бы нужда в горячей замене модуля, то да, а так в реальной жизни не понимаю пока где применять такую вот защиту. Но разумеется, любое наблюдение всегда будет полезным, чтобы знать на будущее где и как себя ведут модули, так что за труды +
     
  4. Сейчас попробую, отпишусь. Спасибо
     
  5. Попробовал на VCC++ и GROUND не работает.... И пару ног еще дернул... Потестю в сободное время. Может она в другом режиме работает.
     
  6. magic21

    magic21 Нерд

    Показывает, что модуль есть?
     
  7. Да показывает true
     
  8. Кстати, попробовали тест с фольгой опять. Модуль поднялся....

    И добавил условие к функции if (radio.write(&svalue,sizeof(svalue))) { //Serial.println("Success"); }

    Передача перестала зависать. Буду все ночь тестить, отпишусь про зависоны.
     
  9. magic21

    magic21 Нерд

    А до этого передача не восстанавливалась? Просто я когда экспериментировал у меня бывало, что сообщение переставало доставляться, хотя код при этом работал (в мониторе порта отслеживал)... помогал ресет и доставка возобновлялась... т.е. если взять за основу ваш код, то можно добиться того, чтобы в случае чего не ресетить в ручную?
     
  10. Да можно взять код, чтобы не ресетить вручную. он PowerUp делает. И причем если не сделать эту функцию, настройки не восстанавливаются. Вообще в библиотеке много delay стоит. Может они вешают еще. Надо бы millis() переписать. Я вчера смотрел примеры, как ребята с spi работают. Можно вообще не использовать библиотеку RF. Или написать свою, которая работает. Мы уже неделю не можем из-за глюков, управлять моторами.
     
  11. UdAvSt

    UdAvSt Нуб

    Столкнулся с проблемой. Собрал платку, отсылает метеоданные на narodmon. Плата 28J60, такая.
    У платы CS на 10 выводе, тк использую библиотеку ethercard, поправил в ней csPin 8 на csPin 10, всё работает.
    Подключаю nrf24l01. MOSI, MISO, SCK у них параллельны. CS и CE подключаю на D7, D8 (пробовал на 4,5 - одинаково). В GettingStarted прописываю RF24 radio(7,8).
    В итоге при запуске GettingStarted выводятся одни нули, везде. Отключаю 28J60 - всё начинает работать. Не пойму, чем они друг другу мешают. Выводы прозвонил, с 28j60 действительно выходят только D10,D11,D12,D13 (D8 пустой), т.е. физически платы не пересекаются. Перестаёт работать только nrf24l01, EthernetShield работает как ни в чём не бывало. Подскажите, куда копать.
    ------------------------------Может кому пригодиться----------------------------------------------
    PS Всё, нашёл. Оказывается такая плата ethernet-shield'а, с грехом. А именно у неё на 12 вывод (MISO) включен буфер на 74HCT08 у которого выход не бывает в высокоимпедансном состоянии, те фактически эта плата MISO берёт на себя, и остальным не даёт пользоваться. Припаял MISO IRF'ки не на D12, а на 5 контакт 74HCT08 (вход буфера). Всё заработало.
     
    Последнее редактирование: 22 дек 2014
  12. Adeni

    Adeni Нуб

    Доброго всем дня и с Новым Годом!
    Коллеги. Где-то пол года назад пытался разобраться с этим модулем, но так ничего и не получилось, в итоге руки опустились я и забросил это дело. Сейчас вот решил снова попробовать побороть это модуль, и опять не получается. Уже скачал новую библиотеку https://github.com/tmrh20/RF24, пример Scanner работает, а вот нарпример GetStarted ни в какую не хочет (( Пробовал и с припаянными конденсаторами, и без них, результат одинаковый.
     
  13. Код (Text):
    //-------------------------------------------------------------------------------------------------

    //Подключение библиотек
    //-------------------------------------------------------------------------------------------------
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>
    //---------------------------------------------------------------------------------------------------------------
    //Константы для обработки беспроводных датчиков
    //---------------------------------------------------------------------------------------------------------------
    #define CE_PIN 9
    #define CSN_PIN 10

    const uint64_t NRF = 0xE8E8F0F0E1LL;
    const uint64_t NRF1 = 0xE8E8F0F0A2LL;

    //Выставляем пины на модель NRF2401+
    RF24 radio(CE_PIN, CSN_PIN);

    //-------------------------------------------------------------------------------------------------
    //Функция инициализации NRF
    //-------------------------------------------------------------------------------------------------
    void StartRadio(void)
    {
      printf_begin();
      radio.begin();    
      delay(2000);  
      radio.setChannel(2);        
      radio.setRetries(10,10);    
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_MAX);
      radio.openReadingPipe(1,NRF1);
      radio.setPayloadSize(32);
      radio.startListening();
      radio.printDetails();
    }

    void setup(void)
    {
      Serial.begin(57600);
      StartRadio();
    }
    void loop(void)
    {
    }

     
    Попробуй вот этот код, если работает то все ок. Если нет попробуй палец прислонить, и подергать контакты. Если все по нулям то модуль нерабочий
     
  14. есть у меня один модуль, он отвечает на все регистры, показывает инфу о себе, но в сканере все нули и его некто не видит и он нечего не слышит.
     
  15. Вывод, модуль нерабочий
     
  16. Я прихожу к выводу, что нужно покупать подороже, но постабильнее.
     
  17. врядли в китае 20 заводов по их производству, что качество зависит от цены.

    скорее сам его поджарил неправильным подключением или еще чем, я к тому, что полезно пробовать на разных модулях, ибо можно попортить радиотракт, что оно будет на все откликаться, но при этом нечего работать не будет.
     
  18. Adeni

    Adeni Нуб

    Попробовал, выдало следующее:
    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1  = 0x65646f4e31 0xe8e8f0f0a2
    RX_ADDR_P2-5  = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR = 0x65646f4e31
    RX_PW_P0-6  = 0x20 0x20 0x00 0x00 0x00 0x00
    EN_AA = 0x3f
    EN_RXADDR  = 0x02
    RF_CH = 0x02
    RF_SETUP  = 0x07
    CONFIG = 0x0f
    DYNPD/FEATURE  = 0x00 0x00
    Data Rate = 1MBPS
    Model = nRF24L01+
    CRC Length = 16 bits
    PA Power = PA_MAX
     
  19. Ну супер, теперь смотри ветку обсуждений там есть два кода для приемника и передатчика.
     
  20. Adeni

    Adeni Нуб

    Пробовал разные варианты из этой ветки, не работает. Со стороны передатчика может и уходит сигнал, а вот со стороны приемника дальше условие If (radio.available()) код не выполняется.

    UPD: Добавил проверку отправки данных, все-таки они не отправляются. Отправка и проверка происходит следующим образом:
    Код (Text):
    void loop(void)
    {
        msg[0] = 111;
        radio.stopListening();
        bool ok = radio.write(msg, sizeof(msg));
        if(ok){ Serial.println("Transfer OK");
          }else { Serial.println("Transfer Fail");
          }
        radio.startListening();
        delay(1000);
    }
    }
    В итоге в порт выводится "Transfer Fail"
     
    Последнее редактирование: 6 янв 2015