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

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

  1. ИгорьК

    ИгорьК Гуру

     

    Вложения:

    • EEPROM.zip
      Размер файла:
      12,2 КБ
      Просмотров:
      201
  2. forfrends

    forfrends Нерд

    Олег, пожалуйста напишите подробно как у вас получилось подключить к Due: какая версия IDE Ардуино, где качали библиотеки, что делали для настройки на Due? К каким пинам подключали? И т.д. У меня получилось на Due лишь принимать, но не передавать...
     
  3. forfrends

    forfrends Нерд

    Haradnur, можете привести пример настроек которые вы применяли?
     
  4. Oleg_7

    Oleg_7 Гик

    Игорь, версия была 1.6.5 , Дуйка определилась сама, даже настраивать ничего не пришлось, все скетчи без проблем грузились и работают. Проблема только с этой библиотекой. вернее ее просто нет в папке и в списке примеров. Поменял на 1.6.11, результат тот же......( "fatal error: EEPROM.h: No such file or directory"
     
  5. Oleg_7

    Oleg_7 Гик

    Установил Вашу либу в папке с остальными библиотеками, ...выдает ту же ошибку . может эту либу надо в какую то другую папку ставить?.... (
    WARNING: library EEPROM claims to run on [avr] architecture(s) and may be incompatible with your current board which runs on [sam] architecture(s).

    In file included from eeprom_clear.ino:11:0:
    C:\Users\Oleg\Documents\Arduino\libraries\EEPROM/EEPROM.h:25:24: fatal error: avr/eeprom.h: No such file or directory
    #include <avr/eeprom.h>
    )
     
  6. Oleg_7

    Oleg_7 Гик

    ошибка долько с Дуйкой, с Уной все компилируется. Отправляюсь за поисками либы для Due....... ((
     
  7. forfrends

    forfrends Нерд

    Вот моя либа EEPROM, была по адресу: c:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\
     
  8. forfrends

    forfrends Нерд

    переименуй в EEPROM.RAR
     

    Вложения:

    • EEPROM.txt
      Размер файла:
      10,1 КБ
      Просмотров:
      189
  9. Denis_

    Denis_ Нуб

    Плюнул на спящий режим. Привязал питание модуля к ножке контроллера.
    Код (C++):
    #include <avr/sleep.h>
    #include <avr/power.h>
    #include <avr/wdt.h>
    #include <SPI.h>
    #include <Wire.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>
    #include <SparkFunBME280.h>
    #define chclient 1
    #define sleep_bod_disable()

    #define RF_PIN 5

    BME280 bme;

    volatile int f_wdt = 1;
    int counter = 0;

    RF24 radio(9,10);


    typedef struct{        
      byte identifier;
      int temperature_Sensor;
    }

    B_t;
    B_t clientnf;

    void counterHandler()
    {

      counter++;
     
      if(counter == 1) {  
       
        counter = 0;

            power_all_enable();

            PORTD |= 5 << RF_PIN;
       
            radio.powerUp();
       
        delay(2);
     
      } else {
       
        enterSleep();
     
      }

    }

    void enterSleep()
    {

      f_wdt = 0;
     
        PORTD &= ~(5 << RF_PIN);
     
        sleep_enable();
        sleep_mode();
        sleep_disable();
        counterHandler();
    }

    ISR(WDT_vect)
    {
      f_wdt = 1;
    }

    void setupWDT()
    {
        MCUSR &= ~(1<<WDRF);
        WDTCSR |= (1<<WDCE) | (1<<WDE);
        WDTCSR = 1<<WDP0 | 1<<WDP3;
        WDTCSR |= _BV(WDIE);
    }

    void setup()
    {

        sleep_bod_disable();
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
        setupWDT();
     
        ADCSRA = 0;

        DDRD |= 5 << RF_PIN;
     
      }

    void loop()
    {

    radio.begin();

        radio.setDataRate(RF24_2MBPS);
        radio.setPALevel (RF24_PA_HIGH);
        radio.setAutoAck(false);
        radio.setCRCLength(RF24_CRC_16);
        radio.setChannel(1);
        radio.setRetries(15,15);
        clientnf.identifier = chclient;
        radio.openWritingPipe(1);

    bme.begin();
     
        bme.settings.commInterface = I2C_MODE;
        bme.settings.I2CAddress = 0x76;
        bme.settings.runMode = 1;
        bme.settings.tStandby = 0;
        bme.settings.filter = 0;
        bme.settings.tempOverSample = 1;
        bme.settings.pressOverSample = 0;
        bme.settings.humidOverSample = 0;
     
    int t = bme.readTempC()*10;

    delay(20);

      clientnf.identifier = 1;
      clientnf.temperature_Sensor = t;
      radio.openWritingPipe(0xF0F0F0F0E1LL);
      radio.write(&clientnf, sizeof(clientnf));
     
      enterSleep();
    }
     
  10. Oleg_7

    Oleg_7 Гик

    Спасибо!, работает, го только с Уно и Нано. с Due вообще не хочет..... когда выбераю плату Дуя то в скетче подсветка либы вообще меняется с желтого цвета на серый......
     
  11. forfrends

    forfrends Нерд

    Добрый день! Нужна ваша помощь! Что-то я сделал с модулем, теперь не конектится. Модуль был подключен к SPI Меги8 на те же пины что и для прошивки МК. Я не отключал модуль, прошивал как есть. Пока настраивал, после н-ной прошивки модуль перестал ловить связь. Тестер выдает следующее:
    TATUS = 0x41 RX_DR=1 TX_DS=0 MAX_RT=0 RX_P_NO=0 TX_FULL=1
    RX_ADDR_P0-1 = 0xc1c3877ffc 0xc1c3877ffe
    RX_ADDR_P2-5 = 0xff 0xff 0xff 0x7f
    TX_ADDR = 0x60c0c1c3bf
    RX_PW_P0-6 = 0xff 0xff 0xff 0xff 0xff 0xbf
    EN_AA = 0xff
    EN_RXADDR = 0xff
    RF_CH = 0xff
    RF_SETUP = 0xff
    CONFIG = 0xff
    DYNPD/FEATURE = 0xff 0xff
    Data Rate = 1MBPS
    Model = nRF24L01
    CRC Length = 16 bits
    PA Power = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

    1cdee2a7d9afb69abe99eec0e003e4a5efbc7badcabbdaecbbd2e859e62c79b8ec28e9da2709cc08bb9ffb2ebe2872a63de94b17b9e052cd22852bb1a23bcd9c

    98c585bb9aab3d5377bd3fac8f229ee49727ab745ca8b410396e132db900250fb82a8969c7a5e8345804e0823a6c2593f3a214f066788ca73a7783aa9bea82fb
    ... и так далее... мусор
    а должен выдавать следующие настройки:
    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1 = 0xe7e7e7e7e7 0xc2c2c2c2c2
    RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR = 0xe7e7e7e7e7
    RX_PW_P0-6 = 0x00 0x00 0x00 0x00 0x00 0x00
    EN_AA = 0x00
    EN_RXADDR = 0x02
    RF_CH = 0x4c
    RF_SETUP = 0x07
    CONFIG = 0x0f
    DYNPD/FEATURE = 0x00 0x00
    Data Rate = 1MBPS
    Model = nRF24L01+
    CRC Length = 16 bits
    PA Power = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

    00000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000000000110000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    Как его оживить?
     
  12. forfrends

    forfrends Нерд

    После некоторых "ковыряний" модель выдал следующее:
    STATUS = 0x00 RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=0 TX_FULL=0
    RX_ADDR_P0-1 = 0x0000000000 0x0000000000
    RX_ADDR_P2-5 = 0x00 0x00 0x00 0x00
    TX_ADDR = 0x0000000000
    RX_PW_P0-6 = 0x00 0x00 0x00 0x00 0x00 0x00
    EN_AA = 0x00
    EN_RXADDR = 0x00
    RF_CH = 0x00
    RF_SETUP = 0x00
    CONFIG = 0x00
    DYNPD/FEATURE = 0x00 0x00
    Data Rate = 1MBPS
    Model = nRF24L01
    CRC Length = Disabled
    PA Power = PA_MIN

    Пожалуйста, подскажите все возможные настройка конфигурации, а то я почти наугад все делаю...
     
  13. ИгорьК

    ИгорьК Гуру

    Здесь несколько участников показывали свой код. Поищите.
     
  14. forfrends

    forfrends Нерд

    Пробовал так:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    RF24 radio(9,10); // Для Уно
    //RF24 radio(9,53);// Для Меги
    const uint8_t num_channels = 128;
    uint8_t values[num_channels];
    void setup(void)
    {
      Serial.begin(57600);
      delay(2000);
      printf_begin();
      radio.begin();
      radio.powerUp();
      radio.setPALevel(RF24_PA_MAX) ;
      radio.setPALevel(RF24_PA_MAX);
      radio.enableDynamicPayloads();
      radio.enableAckPayload();
      radio.setDataRate(RF24_250KBPS);
      //radio.setChannel(0);
      radio.setRetries(15,15);
      radio.setAutoAck(false);
      radio.startListening();
      radio.setChannel(74);
      radio.setCRCLength(RF24_CRC_16);
       radio.setPALevel(RF24_PA_MAX);
       //radio.write_register( NRF_CONFIG, 0b00001100 ) ;
      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) {
      #if !defined(__arm__)
      fdevopen( &serial_putc, 0 );
      #endif
    }
     
    Результат тот же:
    STATUS = 0x00 RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=0 TX_FULL=0
    RX_ADDR_P0-1 = 0x0000000000 0x0000000000
    RX_ADDR_P2-5 = 0x00 0x00 0x00 0x00
    TX_ADDR = 0x0000000000
    RX_PW_P0-6 = 0x00 0x00 0x00 0x00 0x00 0x00
    EN_AA = 0x00
    EN_RXADDR = 0x00
    RF_CH = 0x00
    RF_SETUP = 0x00
    CONFIG = 0x00
    DYNPD/FEATURE = 0x00 0x00
    Data Rate = 1MBPS
    Model = nRF24L01
    CRC Length = Disabled
    PA Power = PA_MIN

    Что еще можно сделать?
     
  15. ИгорьК

    ИгорьК Гуру

    Проверить соединения и питание.
     
  16. forfrends

    forfrends Нерд

    После нескольких попыток заработало! Вот код:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    RF24 radio(9,53); // Для Уно
    //RF24 radio(9,53);// Для Меги
    const uint8_t num_channels = 128;
    uint8_t values[num_channels];
    void setup(void)
    {
      Serial.begin(57600);
     
      printf_begin();
      radio.begin();
      delay(2000);
      radio.enableDynamicPayloads();
      radio.enableAckPayload();
      radio.setDataRate(RF24_250KBPS);
      //radio.setChannel(0);
      radio.setRetries(15,15);
      radio.setAutoAck(false);
      radio.startListening();
      radio.setChannel(74);
      radio.setCRCLength(RF24_CRC_16);
      radio.setPALevel(RF24_PA_MAX);
      radio.powerUp();
       //radio.write_register( NRF_CONFIG, 0b00001100 ) ;
      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) {
      #if !defined(__arm__)
      fdevopen( &serial_putc, 0 );
      #endif
    }
     
     
  17. forfrends

    forfrends Нерд

    Всем добрый день! Купил (по не знанию) десяток вот таких штук:
    [​IMG]
    результат тестирования:
    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1 = 0x7041882046 0xc2c2c2c2c2
    RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR = 0x7041882046
    RX_PW_P0-6 = 0x00 0x00 0x00 0x00 0x00 0x00
    EN_AA = 0x00
    EN_RXADDR = 0x02
    RF_CH = 0x4a
    RF_SETUP = 0x67
    CONFIG = 0x0f
    DYNPD/FEATURE = 0x3f 0x06
    Data Rate = 250KBPS
    Model = nRF24L01+
    CRC Length = 16 bits
    PA Power = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777
    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444

    при сканировании пространства выдает только 4-ки и все... правда я тестировал только 1 модуль. Может бракованный?
    isPVariant() возвращает значение TRUE. Конденсаторы припаяны. Распиновку брал такую:
    [​IMG]
    Что можете сказать по поводу чтения эфира?
    Можно что-то попробовать или выбрасывать? Жалко...
     
  18. ИгорьК

    ИгорьК Гуру

    Не спешите. Проверьте соединение. Проверьте другие модули.
    Убедитесь, что чтение и запись по SPI идет успешно. В любой библиотеке есть команды на чтение и запись в ячейки памяти модуля. Поработайте с ними в ручном режиме. Если чтение и запись идет успешно, а картина все равно та же, тогда уже под пресс.
     
  19. forfrends

    forfrends Нерд

    Я не совсем знаю как проверить чтение и запись по SPI. Точнее не знаю какие это команды (пока еще не нашел). Некоторые манипуляции привели к неожиданным результатам:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    RF24 radio(9,10); // Для Уно
    //RF24 radio(9,53);// Для Меги
    const uint8_t num_channels = 128;
    uint8_t values[num_channels];
    const uint64_t readingPipe = 0xE8E8F0F0AALL;
    const uint64_t writingPipe = 0xE8E8F0F0ABLL;
    byte x;

    void setup(void)
    {
      Serial.begin(57600);
      printf_begin();
      radio.begin();
      delay(2000);
      radio.setChannel(0);
      radio.setRetries(15,15);
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_MAX);
      radio.setAutoAck(false);
      radio.openWritingPipe(writingPipe);     // Активация данных для отправки
      radio.openReadingPipe(1,readingPipe);   // Активация данных для чтения
      radio.enableDynamicPayloads();
      radio.enableAckPayload();
      radio.startListening();
      radio.setCRCLength(RF24_CRC_16);
      radio.powerUp();
      x = radio.isPVariant();
      radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
      Serial.print("Hardware is nRF24L01+ = ");
      Serial.println(x);
      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) {
      #if !defined(__arm__)
      fdevopen( &serial_putc, 0 );
      #endif
    }
     
    Если прописать в инициализации openWritingPipe(writingPipe) и openReadingPipe(1,readingPipe) то модуль оживает, и идет чтение эфира:
    STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1 = 0xe8e8f0f0ab 0xe8e8e8e8e8
    RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR = 0xe8e8f0f0ab
    RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
    EN_AA = 0x00
    EN_RXADDR = 0x02
    RF_CH = 0x00
    RF_SETUP = 0x47
    CONFIG = 0x0f
    DYNPD/FEATURE = 0x3f 0x06
    Data Rate = 1MBPS
    Model = nRF24L01+
    CRC Length = 16 bits
    PA Power = PA_MAX
    Hardware is nRF24L01+ = 1
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777
    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    только мне не понятно, разве writingPipe и readingPipe не должны иметь один и тот же адрес?
    Так же можете подсказать что это за параметр и где он настраивается: RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
     
  20. ИгорьК

    ИгорьК Гуру

    Получается, эти результаты неожиданны лишь для Вас.
    Они должны иметь разные адреса. В один поток " вещаем", другой - слушаем. Как назначим, так и будет.
    Не знаю. Не встречался. Может кто другой знает.
    Забейте. Все работает.