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

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

  1. Megawollt

    Megawollt Нуб

    А я не разобрался. Помогите мне :) двухсторонняя связь удавалась кому?
     
  2. Sabantyi

    Sabantyi Нуб


    тут погляди видео, есть примеры может чем поможет
     
  3. Aler

    Aler Нерд

    Спасибо всем за эту тему. Благодаря ей завел свои модули.
    А теперь к проблеме: модули с антенной и усилителем, на температуре около 0 модули отказываются работать, хотя микросхема до - 20, кварц точно рабочий, а больше мерзнуть, вроде как, нечему. Может кто-то сталкивался с такой проблемой и имеет решение?
     
  4. Carrot

    Carrot Нуб

    Питание могло уплыть?
     
  5. Aler

    Aler Нерд

    На первом конденсаторе было все нормально, смотрел осциллографом, на ноге микросхемы, к сожалению, не посмотрел. Хотел сегодня все запитать от лабораторных источников, но что-то пошло не так и теперь модуль в статусе про себя пишет какую-то ахинею.
     
  6. AlexVS

    AlexVS Гик

    Попробуйте дополнительно к библиотеки RF24 подключить библиотеку RF24Network http://tmrh20.github.io/RF24Network_Dev/Tuning.html
    Там двухсторонняя связь - вообще элементарно организуется.
     
  7. Aler

    Aler Нерд

    Весь день морозил модуль спец жидкостью. Понапридумывал себе всякого, а потом зацепил электролит и сдернул его, решил заменить на тантал, т.к. он разместится более аккуратно. Все проблемы с температурой ушли.
    НЕ СТАВЬТЕ КАКОЙ ПОПАЛО КОНДЕНСАТОР! Мой был родом с какой-то китайской поделки.
     
    Последнее редактирование: 15 фев 2016
  8. TEXTRON

    TEXTRON Нерд

    Всем привет. Почитал форум, завел модули, ура!!! Огромное спасибо пытливым умам форумчан. Но есть некоторые мелкие вопросы, на которые у меня в голове так и осталась неясность:
    1) как формируется адрес трубы? (Пример: const uint64_t pipe = ... Тут можно написать 12345678...? где диапазон адресов посмотреть?)
    2) Частота приема сообщений: передатчик отсылает сообщений штук 10 за секунду, приемник получает где-то 2 сообщения за секунду (примерно). Проверял через Serial.print... Из-за этого дуэт сервопривод-джостик работает с рывками. Ставлю скорость с 250KBPS на 2MBPS - количество принимаемых сообщений увеличилось, но всеравно колич отправленных != получаемых. Как исправить это? (нужно для плавности работы сервы)
    3) Несколько приемников. Задача - отправить сигнал и принять его на 20 приемниках. Здесь мне ведь не надо по разным трубам все раздавать? Настроить приемники на одну трубу и слушать ее всеми 20 приемниками. Я не ошибаюсь?
    4) Чистить буфер сообщения через flush обязательно? Это профилактика?

    Простите, если вопросы глупые)))
     
  9. versoul

    versoul Нерд

    эээх не успел овтетить точно такая же петрушка была с заморозкой модулей в холодильнике, исправил добавлением второго конденсатора. Так и не понял какой именно ИДЕАЛЬНО нужно скармливать этому модулю у меня стоит 2 (ECAP (К50-35), 10 мкФ, 25 В, 105°C, TK 5X11, TKR100M1ED11, Конденсатор электролитический алюминиевый) один на плате и один напрямую напаян на модуль
     
  10. Aler

    Aler Нерд

    Убрать из кода Serial.print, т.к. эта операция занимет время. У меня в тестовом проекте 1000 сообщений по 32 байта с подтверждением отправляются менее 2с.
    У меня на одном стоит тантал 10мкФ, на втором 22мкФ. Ставятся очень аккуратно и крепко сбоку от разъема.
    UPD Тантал на 22мкФ работал не стабильно, заменил на керамику 10мкФ, теперь все хорошо. От души залил фризером, передача не остановилась, даже потери пакетов не было.
     
    Последнее редактирование: 16 фев 2016
    FigaroVL нравится это.
  11. TEXTRON

    TEXTRON Нерд

    Хм... Тогда и на передатчике Serial тормозить отправку должен, а в мониторе порта сообщения так и сыплются, чего не скажешь о приемнике... Тем не менее спасибо, вечером попробую)

    Опробовал!!! Помогло))) Serial-соединение тормозило.
     
    Последнее редактирование: 17 фев 2016
    FigaroVL нравится это.
  12. Aler

    Aler Нерд

    Потестил дальность. Местность - тротуар рядом с дорогой. На линию видимости иногда попадали автомобили. За основу был взят скетч Transfer.ino из примеров библиотеки RF24. Отсылалась 1000 пакетов по 32 байта с автоподтверждением с 2-мя повторами через 15мс. Максимальный уровень мощности, 250кб/с. До 300м посылка занимала до 2500мс с 100% доставкой. Дальше время увеличивалось и качество слегка кменьшалось. На 800 метрах 4000-8000мс с 80-90%. Дальше просто не было возможности отдаляться.
     
    FigaroVL, shpock, BGreen и ещё 1-му нравится это.
  13. Aler

    Aler Нерд

    В Ардуино вообще почти все функции написаны так, чтобы любой новичок быстро научился мигать светодиодом, но как следствие - большой объем занимаемой памяти и низкая скорость выполнения.
    Вот пример
     
  14. DimiDr0l

    DimiDr0l Нуб

    народ выручайте пожалуйста! при отправки строки параметров даты - ардуино получатель должен отправить "ок" но при этом виснет, если же отправлять другие данные то все норм, или если убрать подтверждение отправки "ок" то тоже работает, не знаю в чем дело
    передатчик:
    Код (C++):
    #include <SPI.h>
    #include "RF24.h"

    #define ch_len 32
    //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino (Mega)
    //SCK -> 52
    //MISO -> 50
    //MOSI -> 51
    //CSN -> 53
    //CE -> 9

    RF24 radio(9, 10);
    const uint64_t pipe = 0xF0F0F0F000LL;// адреса каналов приема и передачи

    long timer = 0;
    byte ii = 0;
    int ji = 0;
    char data[ch_len];

    void setup()
    {
      Serial.begin(115200);      // для дебага
      radio.begin();
      delay(2);
      radio.setDataRate(RF24_250KBPS); // Скорость передачи
      radio.setChannel(0x66); // Номер канала от 0 до 127
      radio.setPALevel(RF24_PA_MAX);
      radio.setRetries(15, 15); // Кол-во попыток и время между попытками
      radio.openReadingPipe(1, pipe); // Открываем один из 6-ти каналов приема
      radio.startListening(); // Начинаем слушать эфир
      Serial.println("start");
    }


    void loop()
    {
      if (millis() - timer > 3000) {
        timer = millis();
        if (ii >= 2) {
          SendData ("sndpar");
          ii = 0;
        }
        else if (ji >= 7) {
          SendData ("sndtime");
          ji = 0;
        }
        ii++;
        ji++;
      }
      if (radio.available()) {
        radio.read(&data, ch_len);
        Serial.print("recive ");
        Serial.println(data);
      }
    }

    void SendData(String cmd) {
      radio.stopListening();
      radio.openWritingPipe(pipe);
      const char *buffer = "";
      String buf = "";
      if (cmd == "sndpar") {
        buf = "sndpar," + String(73.4) + "," + String(50.0) + "," + String(24.6);
        buffer = buf.c_str();
        radio.write(buffer, ch_len);
        Serial.println("sndpar");
      }
      else if (cmd == "sndtime") {
        buf = "sndtime," + String(2016) + "," + String(02) + "," + String(20) + "," + String(12) + "," + String(57);
        buffer = buf.c_str();
        radio.write(buffer, ch_len);

        Serial.print("Date Time: ");
        Serial.println(buffer);
      }
      radio.startListening();
      //delay(40);
    }
    Приёмник:
    Код (C++):
    #include <SPI.h>
    #include "RF24.h"

    //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino (nano)
    //SCK -> 13
    //MISO -> 12
    //MOSI -> 11
    //CSN -> 10
    //CE -> 9
    #define ch_len 32

    RF24 radio(9, 10);

    //пины куда подключены светодиоды или другая слаботочка

    char comand[7];
    char datahg[6], dataha[6], datata[6], Y[5], M[3], D[3], H[3], Mn[3];
    char data[ch_len];

    const uint64_t pipe = 0xF0F0F0F000LL;// адреса каналов приема и передачи

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

      radio.begin();
      delay(2);
      radio.setDataRate(RF24_250KBPS); // Скорость передачи
      radio.setChannel(0x66); // Номер канала от 0 до 127
      radio.setPALevel(RF24_PA_MAX);
      radio.setRetries(15, 15); // Кол-во попыток и время между попытками
      radio.openReadingPipe(1, pipe); // Открываем один из 6-ти каналов приема
      radio.startListening(); // Начинаем слушать эфир
      Serial.print("start recive");

    }

    void loop() {
      if (radio.available()) {
        radio.read(&data, ch_len); //принимаем пакет с Arduino Mega

        sscanf(data, "%[^',']", &comand);
        if (String(comand) == "sndpar") {
          sscanf(data, "%[^','],%[^','],%[^','],%s", &comand, &datahg, &dataha, &datata);
          Serial.println("-----------------------");
          Serial.print("comand ");
          Serial.println(comand);
          Serial.print("datahg ");
          Serial.println(datahg);
          Serial.print("dataha ");
          Serial.println(dataha);
          Serial.print("datata ");
          Serial.println(datata);
          Serial.println("-----------------------");
        }
        else if (String(comand) == "sndtime") {
          sscanf(data, "%[^','],%[^','],%[^','],%[^','],%[^','],%s", &comand, &Y, &M, &D, &H, &Mn);
          Serial.println("-----------------------");
          Serial.print("comand ");
          Serial.println(comand);
          Serial.print(Y);
          Serial.print("-");
          Serial.print(M);
          Serial.print("-");
          Serial.print(D);
          Serial.print(" ");
          Serial.print(H);
          Serial.print(":");
          Serial.println(Mn);
          Serial.println("-----------------------");
        }


        radio.stopListening();
        radio.openWritingPipe(pipe);
        //const char *buffer = "";
        //String buf = "";

        //buf = "ok";
        //buffer = buf.c_str();
        delay(40);
        radio.flush_tx();
        radio.write("ok", ch_len);
        radio.startListening();
        //Serial.print("data ");


      }
    }
     
  15. shpock

    shpock Гик

    поместите ОК в переменную data, и отправляйте с указанием реальной величины отправляемого.

    radio.write( &data, sizeof(&data) )
     
  16. Многоуважаемый ИгорьК. Беспокоит новичок в этой области. Прошу ответить на глупый для Вас, наверное, вопрос. Несколько дней изучаю эту тему. Всё, вроде, понятно. Но всё, да не всё. Залил первый скетч.
    В порту вот чего.
    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 = 0x03
    RF_CH = 0x4c
    RF_SETUP = 0x07
    CONFIG = 0x0f
    DYNPD/FEATURE = 0x00 0x00
    Data Rate = 1MBPS
    Model = nRF24L01+
    CRC Length = 16 bits
    PA Power = PA_HIGH

    МОЗГИ НАБЕКРЕНЬ стали. Запутался с тем, что Вы написали:
    const uint64_t pipe00 = 0xE8E8F0F0E1LL; - следующее, что нужно сделать, создать константу pipe00. Pipe - это труба с адресом из пяти байтов. В "трубы" мы передаем, трубы мы слушаем. Причем труба - это не номер канала передачи. Это идентификатор принимающего/передающего устройства на рабочем канале.
    Их можно организовать еще пять. Но есть ограничение: может различаться лишь последний значащий байт. Например, вот что еще можно определить:
    const uint64_t pipe01 = 0xE8E8F0F0E2LL;
    const uint64_t pipe02 = 0xE8E8F0F0A2LL;
    const uint64_t pipe03 = 0xE8E8F0F0D1LL;
    const uint64_t pipe04 = 0xE8E8F0F0C3LL;
    const uint64_t pipe05 = 0xE8E8F0F0E7LL;

    Меняем только последний байт!

    У каждой nrf-ки что-ли должен быть свой идентификатор? Их придумывать надо? Или они строго те, которые указаны. Откуда берётся последний значащий байт? В моём случае, Какие адреса мне надо будет указывать в своих скетчах; например, если один ведущий, а пять ведомых? В конце "LL" что это.
    Помогииите, пожалуйста. Башку сломал на хрен. Спасибо.
     
  17. ИгорьК

    ИгорьК Оракул Модератор

    У каждой - свой канал. Чтобы модули связались - они должны быть настроены на один КАНАЛ.
    Речь о трубах. Можете сами придумать, можете эти взять. Модули устанавливают связь не в трубах, а на каналах. Связавшись на канале, они отправляют друг другу сообщения. У каждого сообщения - бирка (труба). Таких бирок может быть максимум шесть.
    Бирки-трубы - это цифры. Все шесть бирок должны отличаться лишь в последнем байте. Вы сами его придумывайте.
    Адресов - 127 штук. Для всех устройств указывайте одинаковые, если они связываются между собой.
    Адрес - несущая частота. Труба - бирка к сообщению, которое пойдет на этой частоте.
     
    pin01 нравится это.
  18. Я дико извиняюсь, но код инициализации не то, что не работает, а даже не компилируется. "Ошибка компиляции" и всё.
     
  19. shpock

    shpock Гик

    А на что ругается? Какие ошибки выдает при компиляции?
     
  20. ИгорьК

    ИгорьК Оракул Модератор

    И что же нам всем теперь делать? Выход один: Вы все исправите и перепишете тему заново :)
     
    shpock и Кирилл_К нравится это.