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

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

  1. BGreen

    BGreen Нерд

    Если вы используете Ардуино (AVR), то забудьте про float! Только int, uint 8, 16, 32, 64 (продуманный выбор).
    Для сенсоров я использую uint16_t. Диапазон измерений сдвигаю в положительную область. Т.е. делаю нормализацию, на базе обратно преобразую в человеко-удобный вариант для отображения на экране.

    Вообще, передавать через NRF лучше массив конкретного типа - размер заранее известен, баги легко отловить. У меня массив 7*2 байта.
     
  2. BGreen

    BGreen Нерд

    CRC вычислять на AVR накладно, разве что простейшие варианты.
    В самом NRF есть CRC и возможность вкл\выкл его.
     
  3. BGreen

    BGreen Нерд

    У меня дичайшие китайские Nano, Pro mini 5V, 3.3V, Duemilanove, Mega 2560 с Алиэкспресса, как и случайные NRF, которые высылаются горстью в пакет.
    Всё работает отлично. Я питаю их от выделенных линейных LM, AMS или DC_DC импульсных преобразователей. Кондеры керамика 22пФ + 1мкФ + тантал 50мкФ или электролит 330мкФ low ESR максимально вблизи NRF. Ну и рядом с БП поставил дроссель на ферритовом торе, электролит 1000мкФ и пару керамики пФ.
    С таким питанием NRF работает как провод. Разве что накопятся ошибки внутри самого кристалла.

    Кроме того, вся схема это винегрет: Mega 2560, TFT 2.2", SD, GSM, RTC, AT24C32, NRF.
    Все работает нормально, просадка 0.05В, пульсации очень малы.
     
    RMS нравится это.
  4. avgaz

    avgaz Нерд

    и все же почему во в этом коде передатчика при добавлении delay(1000); приемник перестает принимать данные, без задержки все нормально при этом?
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h> // https://github.com/maniacbug/RF24

    const uint64_t pipe = 0xF0F1F2F3F4LL;
    RF24 radio(8, 10); // CE, CSN
    void setup(){
      radio.begin();
      delay(2);
      radio.setChannel(45);
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openWritingPipe(pipe);
    }


    void loop()
    {
      int data[3];
          data[0] = 10000; // заполняем массив
          data[1] = 200;
          data[2] = 500;
          radio.write(&data, sizeof(data));
          delay(1000);
    }
     
    приемник
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h> // https://github.com/maniacbug/RF24

    const uint64_t pipe = 0xF0F1F2F3F4LL;
    RF24 radio(8, 10); // CE, CSN

    void setup(){
      Serial.begin(9600);
      radio.begin();
      delay(2);
      radio.setChannel(45);
      radio.setDataRate(RF24_1MBPS);  
      radio.setPALevel(RF24_PA_HIGH);
      radio.openReadingPipe(1,pipe);
      radio.startListening();
    }
    void loop()
    {
      int data[3];
      if (radio.available()){
        radio.read(&data, sizeof(data));
          Serial.println(data[1]);
          Serial.println(data[0]);
           Serial.println(data[2]);
        }
     
    }
     
  5. avgaz

    avgaz Нерд

    примечательно ещё то что если отключить проводок CE на передатчике то delay(1000); нормально начинает приемник принимать, в чем хоть прикол то?
     
    Последнее редактирование: 11 янв 2016
  6. avgaz

    avgaz Нерд

    не знаю правильно или нет но вот так вот решило проблему
    Код (C++):
       radio.powerUp();
       delay(2);
      radio.write(&data, sizeof(data));
      delay(1500);
    Остается интересным почему при отключенном контакте CE работает?
     
  7. BGreen

    BGreen Нерд

    CE: Chip Enable. Зависит от режима работы.

    Если чип сконфигурен как приемник, то высокий (HIGH) уровень на CE позволяет чипу мониторить среду и получать пакеты. Низкий (LOW) уровень переводит чип в Standby-I и такая возможность становится уже недоступна.

    Если чип настроен на передачу, CE всегда держится на низком уровне. В этом случае для передачи данных нужно положить их в очередь FIFO и дернуть CE минимум на 10мкс (LOW->HIGH, 10мкс, HIGH->LOW).
     
  8. Okmor

    Okmor Нерд

    Относительно работы с Arduino UNO.
    Припаял конденсатор 220Мф и все заработало стабильно.
     
    Последнее редактирование: 12 янв 2016
  9. avgaz

    avgaz Нерд

    Ну что разобрались, а то у меня тоже отказываются вместе работать TFT на Ucglib либе
    хотя здесь вроде как у человека работает вместе http://arduino.ru/forum/proekty/kontrol-vlazhnosti-podvala-arduino-pro-mini
     
    Последнее редактирование: 12 янв 2016
  10. BGreen

    BGreen Нерд

    Я тупо перенес TFT на software SPI. https://github.com/adafruit/Adafruit_ILI9341
    Указал любые свободные пины и подцепил TFT. А NRF стал единственным на железном SPI, поскольку радиообмен важнее визуализации.

    У меня SD, TFT, NRF на разных SPI, для каждого своя. Иначе конфликты: настройки SPI (mode 1, 3 CPOL и т.д.) и неправильные состояния ног (SD держит MOSI, а NRF ждет отпуска MOSI бесконечно).

    Если уж цеплять все устройства на железный SPI, то надо руками писать всё, без библиотек. И "вредные" устройства через буфер цеплять с инвертированным OE, который на SS подключать. SS=0 => стартует устройство и его буфер. SS=1 буфер переходит в Z-состояние и не мешает другим. А за буфер устройство пусть делает со своими ногами что-угодно.
     
    Последнее редактирование: 13 янв 2016
  11. Gurf

    Gurf Нуб

    Здравствуйте, уважаемые бойцы nrf-фронта! В вашем полку прибыло:) Прочитал многое из этой ветки, очень мне помогло. Но осталась проблема такая: три передатчика по команде с кнопки отсылают сигнал на приемник. Принимающая сторона включает-выключает те,или иные светодиоды - в зависимости от того, с какого передатчика пришел сигнал. Все работает неплохо, но несколько раз в день приходится перезагружать приемники и передатчики - предположительно, по причине наводок слетают настройки у модулей. На контакты питания модулей напаяны по 2 конденсатора параллельно - керамика на 0,47 мкФ и электролит на 2,2 мкФ. Нужен совет - можно ли уйти от необходимости перезагрузок путем переноса (или дублирования) блока команд, инициализирующих модули nrf из раздела setup в раздел loop?
    Код инициализации передатчика:
    Код (C++):
    delay(2000);
    radio.begin();
    delay(2);
    radio.setDataRate(RF24_250KBPS);
    radio.setChannel(111);
    radio.setPALevel(RF24_PA_MAX);
    radio.setRetries(15,15);
    radio.openWritingPipe(pipes[1]);
    код для инициализации приемника:
    Код (C++):
    delay (2000);
    radio.begin();
    delay(2);
    radio.setDataRate(RF24_250KBPS);
    radio.setChannel(111);
    radio.setPALevel(RF24_PA_MAX);
    radio.setRetries(15,15);
    //Открываем 3 трубы на прием
    radio.openReadingPipe(1, pipes[1]);
    radio.openReadingPipe(2, pipes[2]);
    radio.openReadingPipe(3, pipes[3]);
    radio.startListening();
     
    Последнее редактирование: 13 янв 2016
  12. kstg

    kstg Нуб

    Добрый день . У меня вопрос (если не в тему поправьте) кто нибудь изучал модуль
    (Nrf24l01 + ATMEGA48 + беспроводной щит модуль SPI для IIC I2C TWI интерфейс для Arduino) его плюсы и минусы. Заманчиво что 2 провода только.
    http://www.aliexpress.com/snapshot/7128702965.html?orderId=71151822599373
     
  13. BGreen

    BGreen Нерд

    Лучше сделать счетчик в LOOP, чтобы каждые ХХ millis запускал инициализацию. Например, каждые 5 минут.
    Я доделываю свою систему, пока не могу проверять сутками. Если что - испытаю инициализацию NRF каждые * минут.
     
  14. BGreen

    BGreen Нерд

    Это беспроводной удлинитель i2c?
    Тогда передавать массивы и тонко настраивать NRF в лоб не получится.
    Там можно мощность и настройки NRF менять?
    Через i2c байты удобно дергать или датчик подключить. Для массивов придется свой протокол городить, стоп\старт биты, delimiter между блоками в посылке.

    Вот можно связать 2 Ардуино и моргать https://www.arduino.cc/en/Tutorial/MasterWriter
     
  15. Gurf

    Gurf Нуб

    Спасибо! Пробуя провести инициализацию в лупе заметил, что команда radio.begin() в лупе не воспринимается - она обязательно должна присутствовать в setup-блоке. (Просто проверил ее переносом в луп - передача не происходила, а если оставить в сетапе только radio.begin() а остальные настройки инициализации перенести в loop то все пашет). Отсюда новый вопрос: а будет ли в таком случае после сбоя корректно работать модуль - ведь пакет инициализации из loop будет без radio.begin()?
     
  16. Terecon

    Terecon Нуб

     
  17. Terecon

    Terecon Нуб

    Заранее извиняюсь, буду иногда задавать глупые вопросы. Вставил измененный скетч, но компилироваться он не хочет пишет вот чего: "
    C:\Users\d\Documents\Arduino\dorabotan\dorabotan.ino: In function 'void loop()':
    dorabotan:48: error: 'I' was not declared in this scope
    ++values;
    ^
    In file included from sketch\dorabotan.ino.cpp:1:0:
    dorabotan:53: error: 'I' was not declared in this scope
    printf("%x",min(0xf,values&0xf));
    ^
    D:\дима\ардуино\проги\arduino-nightly-windows\arduino-nightly\hardware\arduino\avr\cores\arduino/Arduino.h:84:24: note: in definition of macro 'min'
    #define min(a,b) ((a)<(b)?(a):(b))
    ^
    exit status 1
    'I' was not declared in this scope

    это он про эту строку "printf("%x",min(0xf,values&0xf));" нужно подключить библиотеку printf.h
    На скетч который по ссылке тоже ругается. Добавил в библиотеку RF24-master файл printf.h не помогло, стал ругаться еще больше
    original:2: error: stray '\224' in program
    original:2: error: stray '\320' in program
    . Пробовал через другие библиотеки данные есть но после нажатия Т передача не начинается картинку прилагаю. Примеры многие не работают scaner, WProgram.h просят я вычитал что нужно в библиотеках
    сделать замену строк, библиотеку SPI не могу найти, а RF уже заменено, подскажите пожалуйста. Спасибо.

     

    Вложения:

  18. BGreen

    BGreen Нерд

    Написано русским по белому: в строке 48 ошибка, переменная "I" не определена в коде. Ищем ее и исправляем.

    Если вы не научитесь отлаживать программу и читать ошибки, то заниматься программированием - не ваша стезя.
     
  19. ИгорьК

    ИгорьК Гуру

    Забавно.
    В скетче в дух местах маленькая буква i (переменная счетчика) оказалась замененной на прописную I.
    Скетч действительно не компилируется.
    В моем скетче, который болтается на компьютере, все нормально. И раньше никто не жаловался.
    Сейчас поправлю.
     
  20. Gurf

    Gurf Нуб

    Все-таки повторю вопрос знатокам энэрэфки! - как правильно перезагрузить модуль в лупе программно? Простой дубляж блока инициализации из сетапа подойдет?