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

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

  1. ИгорьК

    ИгорьК Гуру

    1. Как Вы думаете, каков результат выражения sizeof(msg)?
    2. Если библиотека новая, то что возвращает функция radio.write ?
     
  2. Adeni

    Adeni Нуб

    1. Результат sizeof(msg) = 2
    2. Как и в предыдущем варианте библиотеки radio.write возвращает булево значение, 0 или 1.
     
  3. У тебя два модуля NRF? Или ты одним играешься?
     
  4. Adeni

    Adeni Нуб

    Два модуля, на двух UNO подключенных к одному компу. Поковырялся в примерах новой либы, немного переписал код передачи, теперь он выглядит так:
    Код (Text):
    void loop(void)
    {
        msg[0] = 111;
        radio.flush_tx();
        bool ok = radio.writeFast(&msg, 32);
        if(ok){ Serial.println("Transfer OK");
          }else { Serial.println("Transfer Fail");
          }
        delay(1000);
    }
    Строки инициализации передатчика:
    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1  = 0xe8e8f0f0a2 0xe8e8f0f0e1
    RX_ADDR_P2-5  = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR = 0xe8e8f0f0a2
    RX_PW_P0-6  = 0x20 0x20 0x00 0x00 0x00 0x00
    EN_AA = 0x3f
    EN_RXADDR  = 0x03
    RF_CH = 0x6f
    RF_SETUP  = 0x07
    CONFIG = 0x0e
    DYNPD/FEATURE  = 0x00 0x00
    Data Rate = 1MBPS
    Model = nRF24L01+
    CRC Length = 16 bits
    PA Power = PA_MAX

    Теперь в мониторе Transfer OK, но на приемнике все равно тишина.

    Код приемника:
    Код (Text):
    void loop(void)
    {
      while(radio.available()){
          Serial.println("Read");
          radio.read(&msg, 32);
       
          if (msg[0] == 111){
            delay(10);
            Serial.println(msg[0]);
          }
          else {
            Serial.println("0");
          }
          delay(10);
      }
    Строки инициализации приемника:
    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1  = 0xe8e8f0f0e1 0xe8e8f0f0a2
    RX_ADDR_P2-5  = 0xa2 0xc4 0xc5 0xc6
    TX_ADDR = 0xe8e8f0f0e1
    RX_PW_P0-6  = 0x20 0x20 0x20 0x00 0x00 0x00
    EN_AA = 0x3f
    EN_RXADDR  = 0x06
    RF_CH = 0x6f
    RF_SETUP  = 0x07
    CONFIG = 0x0e
    DYNPD/FEATURE  = 0x00 0x00
    Data Rate = 1MBPS
    Model = nRF24L01+
    CRC Length = 16 bits
    PA Power = PA_MAX
     
  5. ИгорьК

    ИгорьК Гуру

    Вы хорошо понимаете что такое указатели и на что они указывают в Вашем коде? Попробуйте поменять Ваши массивы на обычные числа int. Можно работать и с массивами, но мне кажется Вы не до конца разобрались как они связаны с указателями.
    Вместо отчета об инициализации, найдите в ветке полный код инициализации модулей - повторите его.
     
    Последнее редактирование: 7 янв 2015
  6. Adeni

    Adeni Нуб

    Я еще не очень хорошо знаю СИ, поэтому могу ошибаться. Указатель указывает на ячейку памяти, в которой хранится значение переменной. И я не совсем понимаю, что даст, если я буду передавать не массив, а число? Буфер приемника от этого разве изменится? В коде приемника while(radio.available()){} не выполняется никогда. Не зависимо от того, что я посылаю передатчиком.
     
  7. ИгорьК

    ИгорьК Гуру

    1. Я поэтому и предлагаю Вам не связываться с массивами, в данном случае. Если для Вас это принципиально - сначала капитально перечитайте что-то из учебника на эту тему - поймете что у Вас написано и удивитесь. (И поймете почему приемник Ваш никогда не поймает число 111)
    А пока сделайте как я предлагаю - замените массивы на int.
    2. Поскольку модули бывают из разных партий и вообще не понятно какие - их часто следует инициализировать полностью. Сделайте это. Я, к сожалению, с планшетика - найдите сами мой пост, где я приводил код.
     
  8. Adeni

    Adeni Нуб

    Заменил массивы на int. Инициализацию делаю по всем параметрам. Результат тот же, в приемнике тишина. Прикладываю полные коды передатчика и приемника. Может где просто тупая ошибка закралась которую я не вижу.
    Передатчик:
    Код (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;
    int msg;

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

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

    void setup(void)
    {
      Serial.begin(57600);
      StartRadio();
    }
    void loop(void)
    {
        msg = 111;
        radio.flush_tx();
        bool ok = radio.writeFast(&msg, 32);
        if(ok){ Serial.println("Transfer OK");
          }else { Serial.println("Transfer Fail");
          }
        delay(1000);
    }

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

    void printf_begin(void){
      fdevopen(&serial_putc,0)
        ;
    }
    Приемник:
    Код (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;
    int msg;


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

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

    void setup(void)
    {
      Serial.begin(57600);
      StartRadio();
    }
    void loop(void)
    {
      while(radio.available()){
          Serial.println("Read");
          radio.read(&msg, 32);
       
          if (msg == 111){
            delay(10);
            Serial.println(msg);
          }
          else {
            Serial.println("0");
          }
          delay(10);
      }
    }

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

    void printf_begin(void){
      fdevopen(&serial_putc,0)
        ;
    }
     
  9. ИгорьК

    ИгорьК Гуру

    Сложно с планшета до конца увидеть, но вроде код нормальный.
    Удалите, пожалуйста, все не связанное с передачей и приемом, все рюшечки.
    Выводите в сериал приемника чистый msg. При объявлении присвойте ему какое-то число.
    В функции чтения и передачи замените 32 на 2.
     
  10. вот

    приемник
    Код (Text):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h> // https://github.com/maniacbug/RF24

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

    RF24 radio(9, 10); // CE, CSN
     
    void setup(){
      Serial.begin(9600);
     
      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
     
          // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
          // RF24_250KBPS на nRF24L01 (без +) неработает.
          // меньше скорость, выше чувствительность приемника.
      radio.setDataRate(RF24_1MBPS);  
     
          // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
      radio.setPALevel(RF24_PA_HIGH);
       
      radio.openReadingPipe(1,pipe); // открываем первую трубу с идентификатором "pipe"
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }
    //  radio.stopListening(); // останавливает приём (нужно перед началом передачи)


    void loop()
    {
      int data;
     
      if (radio.available()){ // проверяем не пришло ли чего в буфер.
        radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
       
        Serial.print("data: ");
        Serial.println(data);
      }
    }
    передатчик

    Код (Text):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h> // https://github.com/maniacbug/RF24
     
    const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
    RF24 radio(9, 10); // CE, CSN

    void setup(){
      Serial.begin(9600);

      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
       
          // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
          // RF24_250KBPS на nRF24L01 (без +) неработает.
          // меньше скорость, выше чувствительность приемника.
      radio.setDataRate(RF24_1MBPS);
     
          // мощьность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
      radio.setPALevel(RF24_PA_HIGH);

      radio.openWritingPipe(pipe); // открываем трубу на передачу.
    }


    void loop()
    {
     
      int data = analogRead(0); // читаем значение
     
      radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет
     
      Serial.print("data: ");
      Serial.println(data);
    //  delay(1000);
    }
    если не работает, дело в железе.
     
  11. Adeni

    Adeni Нуб

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

    UPD: Проверил напряжение, UNO на которой висит приемник при подключении модуля просаживается до 2,9 вольта. Возможно в этом и есть проблема. И еще заметил, этот модуль ощутимо греется.
     
    Последнее редактирование: 7 янв 2015
  12. возможно что все 5 модулей были неправильно подключены

    да и питать их нужно строго от 3,3 вольт
     
  13. Adeni

    Adeni Нуб

    Подключено правильно:
    9 - CE
    10 - CSN
    11 - MOSI
    12 - MISO
    13 - SCK
    Запитываю от 3.3 вольтового выхода UNO.
     
  14. F0rtis

    F0rtis Нуб

    у меня тоже не работает ваш код. Не могу понять причину. Пример pingpair_dyn из http://maniacbug.github.com/RF24 библиотеки вроде бы работает. При отключении питания у принимающей стороны передатчик получает тамймаут. Странно то что это единственный код который мне удалось хоть как то устойчиво запустить что бы наверняка понять работоспособность модулей. Все остальные примеры показывают всегда разный результат и "погоду".
     
    Последнее редактирование: 10 янв 2015
  15. F0rtis

    F0rtis Нуб

    Код сканера выдает картинку что ниже. Но, у меня есть ощущение что это "погода". На такую мысль меня наталкивает следующее:
    Разбираясь, я использовал такой же код но без сканера с 11 страницы который, выдает содержимое регистров. И заметил следующее - почти каждый раз состояние регистров разное, более того явно заданные параметры при инициализации тоже могут быть какие попало. Это я так понимаю не нормально?

    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1  = 0xe7e7e7e7e7 0x42824242c2
    RX_ADDR_P2-5  = 0x38 0x38 0x1c 0xc4
    TX_ADDR = 0xe7e5e7e7e7
    RX_PW_P0-6  = 0x00 0x00 0x00 0x00 0x00 0x00
    EN_AA = 0x00
    EN_RXADDR  = 0x00
    RF_CH = 0x48
    RF_SETUP  = 0x90
    CONFIG = 0x3f
    DYNPD/FEATURE  = 0x38 0x38
    Data Rate = 1MBPS
    Model = nRF24L01
    CRC Length = 16 bits
    PA Power = PA_MIN

    Жмем Reset на ардуине и получаем:

    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1  = 0xe7e7e7e7e7 0x02020242c2
    RX_ADDR_P2-5  = 0x30 0x20 0x10 0x04
    TX_ADDR = 0xe767e6e7e7
    RX_PW_P0-6  = 0x00 0x00 0x00 0x00 0x00 0x1c
    EN_AA = 0x00
    EN_RXADDR  = 0x18
    RF_CH = 0x30
    RF_SETUP  = 0xb0
    CONFIG = 0x3f
    DYNPD/FEATURE  = 0x00 0x30
    Data Rate = 2MBPS
    Model = nRF24L01+
    CRC Length = Disabled
    PA Power = PA_MIN


    Это происходит на любом модуле (у меня их 3), с любой из 2х ардуин. Модули запитаны отдельно, связь с размером емкости не установлена. вообщем я очень озадачен.
     

    Вложения:

    • nrf24.jpg
      nrf24.jpg
      Размер файла:
      176,3 КБ
      Просмотров:
      960
  16. Все 5 модулей могут быть и не рабочими... Тем более вы заметили, что они греются.
    Жалко, что за такую цену нет аналогов....
     
  17. F0rtis

    F0rtis Нуб

    Ого! Вот это китайцы.
    У меня вроде бы более менее нормальные. На чипе наприсано NRf M F24L01+
    Вот такие http://www.ebay.com/itm/2PCS-Arduin...-Module-New-/170819064718?hash=item27c59c138e
     
  18. Adeni

    Adeni Нуб

    У меня тоже модули нормальные. Если бы они были не рабочие, то и в сканере бы ничего не выводилось, кроме нулей, правда ведь? Один из 5 точно не рабочий, т.к. не принимает никакие настроечные параметры, и в сканере все по нулям. Но почему отказываются работать между собой оставшиеся четыре, ума не приложу. Заказал ESP8266, буду экспериментировать с ними.