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

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

  1. Kot26ru

    Kot26ru Гик

    Все равно очень сложно. Вроде комментарии везде, но понимания как это применять все равно нет. Помогите без использования регистров. Я пробовал код со 2 страницы темы - не работает. Почему нет ответа от приемника после принятия данных - я не понимаю...
     
  2. Un_ka

    Un_ka Гуру

    То есть с использованием библиотек, где использование регистров спрятано за методами классов. Зато с ООП код выглядит, конечно, привлекательней. ;) Но нужны ли классы и их методы там, где больше одного модуля никогда не будет?
     
  3. parovoZZ

    parovoZZ Гуру

    все популярные стеки и операционные системы написаны на ... сях. На кой хер дурина тянет в массы си++ да и ещё и ООП - ни разу не в разумею.
     
  4. parovoZZ

    parovoZZ Гуру

    то, что я напишу за пару часов в обнимку с даташитом и парой апноутов, я буду неделю ковырять корявую библиотеку (которая реализует всего 25% потенциала обсуждаемой микросхемы) в поисках решения. Ну вот и на кой оно мне???
     
  5. Kot26ru

    Kot26ru Гик

    модуль приемника перестал проходить проверку на запуск
    Код (C++):
    radio.begin();                      // Старт RF24
    delay (300);
    //radio.printDetails();
    if (!radio.begin()) {               // если радиомодуль не запустился
      Serial.println(F("Радиомодуль не отвечает"));
     
      while (1) {
        lcd.print("RADIO OFF");
        delay (100);
        lcd.clear();
        delay (100);
        }                       // ждем когда запустится радиомодуль
    Проверил все соединения, наличие питания на модуле - все нормально. Не пойму, что случилось.....:(
    Заменил модуль на другой - тот же результат. Что делать, помогите...
     
  6. parovoZZ

    parovoZZ Гуру

    метод begin возвращает что-то?
     
  7. Kot26ru

    Kot26ru Гик

    я не знаю, где это посмотреть. Я специально завел сообщение об ошибке на жки, чтобы если что видеть, что модуль не заводится. И вот после включения приемника с модулем, в сериал вываливается "Радиомодуль не отвечает" и на жки крутится в цикле "RADIO OFF".
    Полный код приемника выглядит так:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include "printf.h"

    #include <Wire.h>                 // Библиотека для работы с шиной 1-Wire
    #include <LiquidCrystal_I2C.h>    // Библиотека для работы с ЖКИ

    #define NumArt 4                    // количество артов

    #define PIN_CE 9                   // Номер пина Arduino, к которому подключен вывод CE радиомодуля
    #define PIN_CSN 10                   // Номер пина Arduino, к которому подключен вывод CSN радиомодуля

    struct ArtMessage{                  // структура данных посылки
    uint8_t id;
    int32_t Lat;
    int32_t Long;
    };  

    ArtMessage art[NumArt], tx_send;             // создаем массив артов

    // вывод на ЖКИ
    #define lsd_Art() \
    lcd.setCursor(0,0); \
    lcd.print("ART["); \
    lcd.print(art[i].id); \
    lcd.print("]="); \
    lcd.setCursor(0,1); \
    lcd.print(art[i].Lat); \
    lcd.print(", ");\
    lcd.print(art[i].Long); \
    lcd.clear();


    LiquidCrystal_I2C lcd(0x27,16,2);       // создаем ЖКИ

    RF24 radio(PIN_CE, PIN_CSN);            // Создаём объект radio с указанием выводов CE и CSN

    //const uint64_t pipe_Write = 0xE8E8F0F0ABLL;   // адрес трубы для передачи
    const uint64_t pipe_Read = 0x7878787878LL;    // адрес трубы для приема

    ArtMessage receivArtMessage() {         // получить сообщение по RF24
    radio.read(&tx_send,sizeof(tx_send));        // получаем пакет
    delay (20);
    bool rx_respond = true;                      // сообщение ответа передатчику
    radio.writeAckPayload( 1, &rx_respond, sizeof(rx_respond) );  // Грузим сообщение для автоотправки
    delay (20);
    return tx_send;
    }

    void setup(){
    Serial.begin(9600);                           // Инициализация серийного порта для отладки

    lcd.init();
    lcd.clear();
    lcd.backlight();                    // Включаем подсветку


    radio.begin();                      // Старт RF24
    delay (300);
    //radio.printDetails();
    if (!radio.begin()) {               // если радиомодуль не запустился
      Serial.println(F("Радиомодуль не отвечает"));
     
      while (1) {
        lcd.print("RADIO OFF");
        delay (100);
        lcd.clear();
        delay (100);
        }                       // ждем когда запустится радиомодуль
    }
       
    radio.setPayloadSize(10);           // задаем объем посылки в байтах
    radio.setChannel(5);                // Обмен данными будет вестись на пятом канале (2,405 ГГц)
    radio.setRetries(0,5);              // Кол-во попыток отправить данные
    radio.setDataRate (RF24_1MBPS);     // Скорость обмена данными 1 Мбит/сек
    radio.setPALevel(RF24_PA_HIGH);     // Выбираем высокую мощность передатчика (-6dBm)
    radio.setCRCLength(RF24_CRC_8);              
    radio.enableAckPayload();
    //radio.openWritingPipe(pipe_Write);            // открываем трубу передачи
    radio.openReadingPipe(1,pipe_Read);           // открываем трубу приема
    radio.startListening();                       // включаем режим приёма
    }

    void loop(){
    Serial.println(F("старт"));
    if ( radio.available()) {
    Serial.println(F("Пришла посылка"));  
    for (uint8_t i=0; i<4; i++) {
       art[i] = receivArtMessage();      // заполняем арт из принятой посылки
       lsd_Art();                        // выводим на ЖКИ
       delay (500);
    }
    }
    }
     
  8. Kot26ru

    Kot26ru Гик

    добавил bool result = radio.begin(); Вернулся 0
     
  9. parovoZZ

    parovoZZ Гуру

    в библиотеке. У маньякбурга метод void, т.е. ничего не возвращает. Оно и понятно - у nrf24 нет регистров, извещающих о текущем состоянии.
     
  10. Kot26ru

    Kot26ru Гик

    нет ли какого нибудь отладочного кода, чтобы залить его в приемник и выдать в сериал инфу о причине сбоя?
     
  11. parovoZZ

    parovoZZ Гуру

    Записать все регистры и потом считать их. Если какие-то не совпадают, то:
    1. nRF24 не проснулась
    2. nRF24 заснула навсегда)
     
    Un_ka нравится это.
  12. Un_ka

    Un_ka Гуру

    Тут?
    Интересная идея, надо попробовать.
     
  13. Kot26ru

    Kot26ru Гик

    записал в приемник скетч сканера из примера. Выдает в порт следующее:
    upload_2021-3-10_19-9-40.png
     
  14. Un_ka

    Un_ka Гуру

    Плохо. Прозвоните все контакты.
     
  15. Kot26ru

    Kot26ru Гик

    буду проверять
     
  16. parovoZZ

    parovoZZ Гуру

    Моси и мисо перепутаны скорее всего.
     
  17. Kot26ru

    Kot26ru Гик

    чип на приемнике потрогал - горячий. Может это быть причиной отказа?
     
  18. NightBiker

    NightBiker Нуб

    Всем привет. Хотелось бы поделиться своим опытом.
    В наличии имеются 2 шт. nRF24l01+. Первый в SMD исполнении, с маркировкой nRF - выступает в роли приемника(ПРИ), подключен к Arduino Pro mini, работает от отдельного питания 3V3 (AMS1117). Второй "полный китай", без надписей на чипе, работает в связке BME280, ATtiny85, CR2032, передает метеоданные из-за окна, раз в пять минут(ПЕР). Использую библиотеку NRFLite, https://github.com/dparson55/NRFLite.

    Изначально модули nRF проверял на работоспособность на Arduino Nano с помощью сканера из библиотеки, скаченной с этого раздела форума.
    В данных каналов модуля ПРИ, serial port показывал нули, модуль ПЕР адекватно показал зашумленность от домашнего WIFi, при этом с библиотекой NRFLite ПРИ принимал данные с ПЕР.

    Первый вариант метеодатчика работал на частоте attiny 8МГц с настройками nRF по дефолту библиотеки. В такой конфигурации через +- сутки данные переставали приходить. Частоту контроллера понизил до 1МГц, а скорость передачи до 1МB. На данный момент связка работает стабильно.
     
    Последнее редактирование: 11 мар 2021
  19. Un_ka

    Un_ka Гуру

    Да. Наверное 5 вольт не туда подали.
     
  20. Kot26ru

    Kot26ru Гик

    я про ардуинку. На ней греется, но работает.