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

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

  1. Coolblaster

    Coolblaster Нерд

    Можно заменить на усиленные NRFки с антеннами, я брал такие на али. Пробивают нормально и стабильно, 1100м конечно это вранье, но полкилометра вполне берет. Я такие поставил в гараж, он примерно в полукилометре от дома, вижу все параметры, можно мониторить температуру и влажность например, включать отопление,вентиляцию если надо и т.п Пробовал их на работе прострелить, дело было зимой, одни после 600м затыкались, другие до 800м хорошо шли, видимо разные партии, подробней сказать не могу. В общем пробуйте, по стоимости 120р за штуку по мне так нормально.
     
  2. filin

    filin Нуб

    Подскажите вот такой момент.

    Есть, например 5 модулей RF24L01 приемников, с разными pipe. Если на каждый из них одновременно будут вещать передатчики. Данные будут приняты или они взаимно создадут помеху ?
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Если одновременно то конечно забьют друг друга.Попробуйте нажать одновременно на кнопки двух брелков автосигнализаций (радиорозеток)ни одна не сработает.
     
  4. filin

    filin Нуб

    А зачем тогда у модуля есть возможность приема аж на 5(6) pipe ? Раз хоть так, хоть так одновременно нельзя их использовать.
     
  5. rkit

    rkit Гуру

    Вас ничто не заставляет отправлять пакеты по всем трубам одновременно
     
  6. NikitOS

    NikitOS Король шутов Администратор

    Ну хотя-бы для того чтобы arduino(или что у вас) могла переключится с передачи данных для одного устройста на другое посредством смены трубы
     
  7. parovoZZ

    parovoZZ Гуру

    Если в пространстве разнесены приемники, то можно попробовать. А что мешает вещать на разных частотах? Трубы исключительно софтовые. Если изучите внимательно даташит, то увидите, что адрес трубы вместе с данными и контрольной суммой помещается в пакет передачи.
     
  8. parovoZZ

    parovoZZ Гуру

    Для простейшей идентификации каналов.
     
  9. filin

    filin Нуб

    Ну для этого максимум две трубы достаточно.

    Вопрос чисто теоретический. Хочу понять, как при условиях множества радиопередатчиков слать на приемник. Читая про nrf24l01 я так понял, что 5 одновременных приема он поддерживает, чтобы 20 передатчиков одновременно поддерживать можно поставить 4 приемника (5 передатчиков на каждый приемник). Но вот оказалось и тут не всё так просто. Опрос передатчиков не предлагать. Предполагается, что они на батарейном питании.

    Ну это как раз и дало повод, что проблем с одновременной передачей на разные трубы нет.
     
  10. rkit

    rkit Гуру

    Берете и шлете. Никакого секрета тут нет. Вы разберитесь в том, как эти модули работают, прежде чем выдумывать непонятно что.
     
  11. filin

    filin Нуб

    Вот я и хочу точно разобраться. Как уже ответили, одновременно нескольким слать на приемник нельзя. Я не говорю о последовательной передачи, речь идет о одновременной.
     
  12. rkit

    rkit Гуру

    Вам зачем это делать одновременно? Это надо специально синхронизировать, чтобы все передатчики сработали одновременно. Не делайте этого и проблемы не будет.
     
  13. filin

    filin Нуб

    Не зачем. Я написал, это вопрос теоретический, чтобы понять, как вы и сказали "Вы разберитесь в том, как эти модули работают".

    В теории, если датчиков много, одновременная посылка очень даже может случится. Я пытаюсь понять, как в этом случае поступают. Изначально я полагал, что 5 труб спасут, но оказывается в этом деле они бесполезны.
     
  14. rkit

    rkit Гуру

    Откройте даташит, там есть замечательные диаграммы по времени. Посчитайте для своего пакета, умножьте на количество передатчиков. А потом уже рассуждайте об "очень даже может". Не очень.
    Отправляют следующую посылку
     
  15. А я вот делаю проект с автоматизированной дверью и у меня вопрос: может ли этот передатчик послать сигнал через закрытую дверь? Если нет, то подскажите чем можно дешево его заменить
     
  16. parovoZZ

    parovoZZ Гуру

    . Если передача ведётся постоянно и на одной частоте, то применяется метод согласованной фильтрации (кодовый доступ). Яркий пример - спутниковая навигация, а также сотовая связь стандартов CDMA2000 и UMTS.. Но это очень сложно и дорого. В остальных случаях применяют пространственное разнесение + разнос по времени и частоте. Яркий пример - мобильная связь стандарта GSM. Если передатчики выходят на связь раз в десять минут, то здесь боятся нечего. Если раз в секунду, то через какое- т о время вполне возможна одновременная передача. Но раз в секунду это очень часто и поэтому потерянный пакет скомпенсируется через секунду. А вообще, можно передавать несколько пакетов за один сеанс. Но надо комбинировать длительность промежутка между посылками у разных передатчиков. К примеру, вторая посылка у первого передатчика через 10 тактов, у второго через 16. Третья посылка у первого передатчика через 17 тактов после второй, у второго передатчика - через 9 тактов и т д. Т. Е. Внести псевдослучайность в алгоритм.
     
  17. parovoZZ

    parovoZZ Гуру

    Через стальную - нет. Как собственно и любой другой)))
     
  18. Glyk5

    Glyk5 Нуб

    Здравствуйте, скажите в чем проблема?
    вот скетч:
    Код (C++):
    //-------------------------------------------------
    //    ПЕРЕДАТЧИК
    //-------------------------------------------------

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>

    RF24 radio(9,10);
    int  data[1];
    byte button = 5;  // кнопка
    byte led = 6;  // светодиод

    void setup()
    {
      data[0] = 123;
      delay(2000);   // Пусть зарядится конденсатор
      pinMode(button, INPUT_PULLUP);
      pinMode(led, OUTPUT);
      digitalWrite(led, LOW);
      radio.begin();                          // Включение модуля;
      delay(50);                          
      radio.setChannel(22);                   // Установка канала вещания;
      radio.setRetries(3,3);                  // Установка интервала и количества попыток "дозвона" до приемника;
      radio.setDataRate(RF24_1MBPS);          // Установка минимальной скорости;
      radio.setPALevel (RF24_PA_HIGH);        // Установка максимальной мощности RF24_PA_MAX;
      radio.setAutoAck(1);                    // Установка режима подтверждения приема;
      radio.openWritingPipe(0x1234567890LL);  // Активация данных для отправки
      //radio.openReadingPipe(1,readingPipe); // Активация данных для чтения
      //radio.startListening();               // Слушаем эфир.
    }

    void loop()
    {
      //data[0] = !digitalRead(button);

      if(!digitalRead(button))
      {
        while(!digitalRead(button)) {}
        //radio.write(data, sizeof(data));
        radio.write(data, sizeof(data));
        digitalWrite(led, HIGH);
      }
      delay(50);
      digitalWrite(led, LOW);
    }
    По нажатию кнопки идет передача. Беда в том, что если передача идет один раз(radio.write(data, sizeof(data))), то ничего не принимается, а если два раза подряд, то принимается один раз.

    PS. Очень долго думал почему не работает, пока случайно не вставил отправку два раза.
     
  19. Glyk5

    Glyk5 Нуб

    Забыл вставить приемник:
    Код (C++):
    //-------------------------------------------------
    //    ПРИЕМНИК
    //-------------------------------------------------

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>

    RF24 radio(9,10);
    byte led = 6;  // светодиод
    int data[1];

    void setup()
    {
     
      delay(2000);   // Пусть зарядится конденсатор
      pinMode(led, OUTPUT);
      digitalWrite(led, LOW);
      radio.begin();
      radio.setChannel(22);
      //radio.setPayloadSize(8);
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel (RF24_PA_HIGH);
      radio.openReadingPipe(1, 0x1234567890LL);
      radio.startListening();
    }

    void loop()
    {
      if(radio.available())
      {
        //digitalWrite(led, HIGH);
        radio.read(&data, sizeof(data));
        if (data[0]==123)
        {
          digitalWrite(led, HIGH);
        }
        else
        {
          digitalWrite(led, LOW);
        }  
      }
      //digitalWrite(led, LOW);
    }
     
  20. parovoZZ

    parovoZZ Гуру

    В коде приемника после приема данных надо вставить:
    Код (C++):
    radio.Stop listening;
    radio.Start listening;