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

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

  1. gonzales

    gonzales Гик

    сегодня припаяю, проверю
     
  2. AlexVS

    AlexVS Гик

    Насколько необходима команда SPI.begin(), перед radio.begn()?
    В каких то примерах она есть, в других ее нет.
     
  3. ИгорьК

    ИгорьК Гуру

    Раз нет - значит не обязательно. Да Вы попробуйте в своем скетче и поймете. Или работает или нет.
     
  4. AlexVS

    AlexVS Гик

    Уже второй раз за месяц теряется связь между 2мя модулями, находящимися в разных комнатах (разделены 1 бетонной стеной). Я и каналы пробовал менять и скорость понижать и конденсаторы паял (правда только электролиты, а не керамику) - не помогает. В пределах одной комнаты работает, выносишь в коридор - работает, переношу в другую комнату - связи нет. Хотя только час назад все было ОК!
    На следующий день, снова разношу их по комнатам и все работает как ни в чем не бывало.
    Вот такая засада.
    Думаю добавить еще 1 модуль - ретранслятор и активировать работу через него в случае отсутствия связи напрямую.

    PS речь идет об обычных nRF24L01+
     
  5. ИгорьК

    ИгорьК Гуру

    1. Припаяйте керамику - лень мешает? ;) В Вашем случае вообще все просто. Если рядом работает - значит работает. Мешают лишь внешние и внутренние помехи. Вот с ними и боритесь.
    2. Посмотрите на то, что окружает модуль. Еще раз привожу картинку - у меня в 3 метрах прямой видимости не работало при монтаже вместе модуля и исполнительных устройств. Видите как пришлось разнести:
    [​IMG]
     
  6. AlexVS

    AlexVS Гик

    В одном углу, серверный угол :), находятся UPS, дисковая полка (qnap), роутер с вай-фаем, свич (хаб) ну и серверная часть проекта в виде iBoard.
    Интересно почему работает, работает дней 10, а потом бац, и вторая смена :(
     
  7. McArrow

    McArrow Нуб

    Можно, пожалуйста немного информации, что это за свойства. Они у меня на каждом модуле отличаются. Какие из них должны совпадать полностью для приемника и передатчика?
     
  8. ИгорьК

    ИгорьК Гуру

    Об этом, собственно, вся ветка. В постах я пытался объяснить как передать и принять информацию, стоит ли разъяснять все заново? В модулях есть ряд описанных здесь параметров - поймите назначение каждого из них и вопросы пропадут.
    Если коротко - все параметры должны совпадать, кроме того, что значение openWritingPipe для передатчика равно значению openReadingPipe для приемника.
     
  9. McArrow

    McArrow Нуб

    я не зря ссылался на пост про скетч сканера каналов с выдаваемой диагностической информацией в начале. И вопрос задавал именно про результаты скетча (например, RX_PW_PO-6).

    Читать даташит оригинальной платы мне может и поможет, но модули у меня чистокровные китайцы (38р за штуку с ибея), потому больше надежд что упру где-нибудь осциллограф.

    На сегодня у меня:
    6 модулей nRF24L01+ (2 с одной партии, 4 с другой)
    подключаются к ардуино UNO, Pro mini, Nano (тоже китайцы)
    керамика на 10 мкФ напаяна (параллельно паять электролит надо?)
    питание происходит через адаптер такой
    Скетч сканера каналов выдает похожую на вашу картинку засоренности канала в районе 40-4f на уровне до 8, но при нескольких запусках писал откровенную пургу: ряд замеров практически без помех, затем помехи во всех каналах (почти вся строка)
    Скетчи простейшего пинга от RF24, MiRF, RF24Network не работают: отправка проходит, получения - нет.
     
  10. ИгорьК

    ИгорьК Гуру

    Читать все равно придется, если хотите понять что значат эти вещи. Модуль то один и тот же.
    Но для Вашего случая я бы действовал следующим образом.
    1. 10 мкф - это много. Для некоторых блоков питания это может уже быть небольшим КЗ, которое просаживает питание как раз во время инициализации модуля. И по картинке или описанию это не понять.
    Керамику лично я никогда не паял, работало без нее. Но на зарубежных форумах видел и такие вещи.
    2. Вот Вам код инициализации, который работает у меня:
    Код (C):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>

    #define CE_PIN 9    //!!!!!!!!!!! Для Уно. Здесь установить для ваших плат!              
    #define CSN_PIN 10  //!!!!!!!!!!! Для Уно. Здесь установить для ваших плат!
    const uint64_t readingPipe = 0xE8E8F0F0AALL;
    const uint64_t writingPipe = 0xE8E8F0F0ABLL;

    RF24 radio(CE_PIN, CSN_PIN);

    void setup() {

        /*************************                Модуль NRF24                **********************/
        //delay(2000);                          // Пусть зарядится конденсатор
        radio.begin();                          // Включение модуля;
        radio.setChannel(0);                    // Установка канала вещания;
        radio.setRetries(15,15);                // Установка интервала и количества попыток "дозвона" до приемника;
        radio.setDataRate(RF24_250KBPS);        // Установка минимальной скорости;
        radio.setPALevel(RF24_PA_MAX);          // Установка максимальной мощности;
        radio.setAutoAck(1);                    // Установка режима подтверждения приема;
        radio.openWritingPipe(writingPipe);     // Активация данных для отправки
        radio.openReadingPipe(1,readingPipe);   // Активация данных для чтения
        radio.startListening();                 // Слушаем эфир.
    }
    Это рабочий код 100%. Я им инициализирую модули, купленные в разных местах, и недалече как вчера соединил Arduino Yun и Arduino Uno.
    Можете попробовать в сетапе первой строкой поставить тупую задержку в пару секунд - может быть блоку питания надо "успокоиться" по раскачке конденсатора. Читал и о таких вещах.
    3. Если не работает - "проблема в контактах". Проверяйте правильность, качество соединений и ошибки в них.
    4. ... Значит модули нерабочие.
    Но будьте внимательны - проверяйте все на простейшие ошибки. Вчера минут сорок убивался и правил некоторый скрипт - не работает и все, а проблема была в ошибке в его имени - скетч вызывал не его .
     
    Последнее редактирование: 23 сен 2014
  11. McArrow

    McArrow Нуб

    Спасибо за ответ. Все стало на много лучше!
    1. Вероятно, именно напаянные 10мкФ мешали двум модулям работать. Напаял керамику того же номинала, что были электролиты на макетке, но видимо внутреннее сопротивление или другие параметры керамики отличаются. Вчера напаял на остальные модули керамику 100 нФ (104) и два из 4 точно заработали. Сегодня перепаял первые два на 100нФ и буду проверять.
    2. Как и у коллеги вот тут, один из модулей явно не рабочий, поэтому крайне важно при работе найти пару гарантированной рабочих.
    3. Источники 3.3v также были не совсем живы. Возможно моих рук дело, но запустить пинг удалось только после перехода на питание от такой платки.

    Еще раз спасибо.
     
  12. Galy4a

    Galy4a Нуб

    Добрый день!
    Начал знакомство с данными радиомодулями.
    Скетч-тест прошел гладко. А вот когда попытался переслать значение от одной ардуинке к другой - возникли проблемы.

    Код для передатчика:
    Код (Text):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>



    RF24 radio(9,10);
    const uint64_t pipe00 = 0xE8E8F0F0E1LL;
    int out = 556;

    void setup()
    {
    radio.begin();
    radio.setChannel(0x22);
    radio.openWritingPipe(pipe00);
    }

    void loop()
    {
    radio.write( &out, sizeof(out) );
    delay(1000);
    }
    Код для приемника:
    Код (Text):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>



    RF24 radio(9,10);
    const uint64_t pipe01 = 0xE8E8F0F0E2LL;
    int in;

    void setup()
    {
    Serial.begin(9600);
    radio.begin();
    radio.setChannel(0x22);
    radio.openReadingPipe(1,pipe01);
    radio.startListening();
    }

    void loop()
    {
    radio.read( &in, sizeof(in) );
    delay(1000);
    Serial.println(in);
    }
    На порте получаю нули. Уверен, что что-то понял не так. Не подскажете, где я допускаю ошибку?
     
  13. geher

    geher Гуру

    1. Адрес для чтения у приемника и адрес для записи у передатчика вроде должны совпадать (значения pipe00 и pipe01).
    2. Лучше перед чтением проверять доступность данных при помощи
    radio.available().
     
  14. Galy4a

    Galy4a Нуб

    1. Попробовал выставить значения pipe, не помогло.
    2. Поясните необходимость, пожалуйста. Для того, что-бы не исполнять основной код, пока нет данных или из каких-то других соображений? Что может означать недоступность данных?
     
  15. ИгорьК

    ИгорьК Гуру

    1. Значение "трубы" передатчика и приемника ОБЯЗАНЫ быть одинаковыми.
    Несколькими постами выше я давал полный код инициализации. Используйте его. Не исключаю, что модули при включении могут инициализироваться по- разному. Поэтому желательно задавать все стартовые значения.
    2. Вот как. Собственно, это полный код организации приема. Моя недоработка, новичкам это, возможно, неочевидно:
    Код (C):
    bool done = false;                             //Вспомогательная переменная;
    if ( radio.available() ){
        while (!done) {                            // Упираемся и
            done = radio.read( &in, sizeof(in) );  // по адресу переменной in функция записывает принятые данные;
        }
    }
     
    Последнее редактирование: 27 сен 2014
  16. Galy4a

    Galy4a Нуб

    Я правильно понял, что если я указываю для передатчика: constuint64_t writingPipe = 0xE8E8F0F0ABLL, то для приемника должен указать: readingPipe = 0xE8E8F0F0AВLL?
    Использовал приведенную вами инициализацию, выставил одинаковые трубы, приемник все-равно выдает нули(а при добавлении условия radio.available просто молчит, что логично). Проверил правильность соединения, напоял конденсаторы, пока результата ноль.
     
  17. geher

    geher Гуру

    Можно попробовать поменять канал (в radio.setChannel(0x22); и у приемника, и у передатчика заменить на другое допустимое значение, естественно, одно и то же для приемника и передатчика), что может позволить исключить или подтвердить помехи на канале как причину проблемы.
     
  18. Galy4a

    Galy4a Нуб

    Сложилась интересная картина: добился приема, когда случайно положил палец на контакты земли и +3.3V, подключенные к модулю. Долго с этим, разумеется, играться не стал, но пока они соединены некоторым сопротивлением, то прием идет, снимаю палец - опять приемник выдает в порт нули.
    Коды сейчас такие:
    Прием:
    Код (Text):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>

    #define CE_PIN 9        
    #define CSN_PIN 10
    const uint64_t readingPipe = 0xE8E8F0F0AALL;
    int in;

    RF24 radio(CE_PIN, CSN_PIN);

    void setup() {

       
        delay(2000);                  
        Serial.begin(9600);
        radio.begin();                    
        radio.setChannel(5);                
        radio.setRetries(15,15);            
        radio.setDataRate(RF24_250KBPS);    
        radio.setPALevel(RF24_PA_MAX);      
        radio.setAutoAck(1);                
         
        radio.openReadingPipe(1,readingPipe);
        radio.startListening();              
    }

    void loop()
    {
    radio.read( &in, sizeof(in) );
    delay(1000);
    Serial.println(in);
    }
    Передача:
    Код (Text):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>

    #define CE_PIN 9          
    #define CSN_PIN 10
    const uint64_t writingPipe = 0xE8E8F0F0AALL;
    int out = 556;

    RF24 radio(CE_PIN, CSN_PIN);

    void setup() {

       
        delay(2000);                      
        radio.begin();                      
        radio.setChannel(5);                  
        radio.setRetries(15,15);              
        radio.setDataRate(RF24_250KBPS);    
        radio.setPALevel(RF24_PA_MAX);      
        radio.setAutoAck(1);                
        radio.openWritingPipe(writingPipe);  
         
                 
    }

    void loop()
    {
    radio.write( &out, sizeof(out) );
    delay(1000);
    }
     
  19. ИгорьК

    ИгорьК Гуру

    Палец - это цепочка конденсатор и сопротивление.
     
  20. Galy4a

    Galy4a Нуб

    Подпаял выводы понадежнее, теперь пересылка проходит только сразу после нажатия reset на ардуинке-передатчике, потом три посылки пропускается(дает ноль в порт), потом еще раз принимает и снова нули. Но и так получается не всегда. Причем первая посылка проходит непосредственно во время сброса, вторая - после инициализации.
     
    Последнее редактирование: 29 сен 2014