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

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

  1. Oleg_7

    Oleg_7 Гик

    Смотря какая школа. И факт остается фактом: С керамической антеной на морозе работает без проблем, проверенно личным проектом. Пакеты не терялись. Проверял и внутри дома: на 1ом этаже ставил транслятор, на 4ом этаже приемник, 100% пакетов доходило. Перекрытия межэтажные - Ж/б.
    И пожалуй, самое главное их отличие от обычных антен: не зависит от ориентации модуля в пространстве!
    (хотя это вроде обсуждалось уже в этой теме ранее....)
     
  2. MickNich

    MickNich Нуб

    На выходных собрал макет - UNO, GPS NEO M8N и nRF24L01+.
    Проверил еще раз "сканер" - всё ок. Данные от ЖПСа тоже приходят, пример из библио TinyGPS+ нормально пашет, дальность до Лондона считает )))
    Вот такою структуру забил данными
    typedef struct{ // ------ пакет пресылки -------- старт
    float GPS_Latitude; // широта со спутника
    float GPS_Longitude; // долгота со спутника
    float GPS_course; // курс - понять размерность
    float GPS_speed; // скорость - понять размерность
    int GPS_distance; // дальность - в метрах
    // float GPG_cardinal; // шось - понять размерность - TinyGPSPlus::cardinal(gps.course.deg())
    } type_RFdata;
    type_RFdata RFdata; // ------ пакет пресылки -------- финиш
    и решил пробовать передать на вторую UNO и nRF24L01+.
    Да, два кондёра напаяны. Питание брал от UNO.
    Скетч зависает сразу-же при radio.write( &RFdata, sizeof(RFdata) ); убедился принтлнами, наставленными после каждой строки.
    Вспомнил о delay при переключениях между приемом и передачей.
    Даже пару циклов прошло, и снова затык.
    Перевёл модуль в radio.setPALevel(RF24_PA_MIN); с десяток циклов пролезло.
    Выводы - мало питания для передачи, городить доп питание ?
    Или еще какие есть камни подводные ?
     
  3. parovoZZ

    parovoZZ Гуру

    Модуль из одной антенны состоит? Больше ничего нет?
    ДН антенны в курсе что такое? Причем здесь керамика - не керамика.
     
  4. void Tanya();

    void Tanya(); Нуб

    Привет, гуру!
    Чекая всю тему вдоль и поперек,перепробовав все,что уже можно, видимо, окончательно добила свои NRF.
    Идея: Передатчик - пульт с кнопкой и нрф,на нем больше ничего нет. В зависимости от состояния кнопки,на приемнике горит/не горит диод и вкл/выкл реле. Эта установка,своего рода, должна когда-нибудь превратиться в систему аварийной остановки - кнопку нажал, все остановлено(для простоты сейчас - гаснет диод,выключается реле). Сначала все было нормально, приемник принимал сигналы 1 или 2 от пульта и вырубал все как надо. А потом...потом я начала прописывать потерю связи. Теперь полный оврал, не работают стырые скетчки, эти тоже дичь творят. Причем пульт вроде как все правильно пишет,но вот приемнике либо 0(и то редкие),либо он попадает в else'ы. Я уже хз в чем проблема, все же работало более-менее,может,кто-то из вас подскажет :С
    Пульт:
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    RF24 radio(9, 10); // CE, CSN
    int CHECK;

    void setup() {
    pinMode(A5, INPUT);//ob knopki  
      Serial.begin(9600);
      radio.begin();
      radio.setChannel(5);                                       // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
      radio.setDataRate     (RF24_1MBPS);
      radio.openWritingPipe(0xAABBCCDD11LL);
      radio.setPALevel(RF24_PA_HIGH);
    // radio.stopListening();
    }
    void loop() {
     
      boolean button=!digitalRead(A5);
      if(button==1){
      CHECK=1;
        radio.flush_tx();
      radio.write(&CHECK, sizeof(CHECK));
      Serial.print("Sostoyanie knopki on:");
      Serial.println(CHECK);
      delay(1000);
      }
      else{
      CHECK=2;
      radio.flush_tx();
      radio.write(&CHECK, sizeof(CHECK));
      Serial.print("Sostoyanie knopki off:");
      Serial.println(CHECK);
      delay(1000);
        }
    }
    Приемник:

    Код (C++):
    #include <SPI.h>
    #include <RF24.h>
    #define PIN_RELAY 5 // Определяем пин, используемый для подключения реле
    RF24 radio(9, 10); // CE, CSN
    int led = 4;//nomer porta na borde
    uint8_t        pipe;


    void setup() {
      pinMode(led, OUTPUT);
      pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход
      Serial.begin(9600);
      radio.begin();
      radio.setChannel(5);                                       // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
      radio.setDataRate     (RF24_1MBPS);
      radio.openReadingPipe(0, 0xAABBCCDD11LL);
      radio.setPALevel(RF24_PA_HIGH);
      radio.startListening();
     
    }
    void loop() {  
    if(radio.available()){
    Serial.print("PRISHLO:  ");
    int CHECK;
         radio.read(&CHECK, sizeof(CHECK));
          Serial.println(CHECK);
          delay(1000);
          //постоянно получаемый сигнал,который говорит что кнопку не нажимали
          if(CHECK==1){
          ON();
            }
          //кнопка нажатa,отваливаемся
         if(CHECK==2){
          OFF();
          exit(0);//супер-межгалактический аварийный краш
       }
       else{
       Serial.println("Eto ne signal knopki");
      digitalWrite(led, HIGH);//для наглядности
      digitalWrite(PIN_RELAY,HIGH);
      delay(1000);
        }
     
    }
    else{
      Serial.println("Svyazi net");
      digitalWrite(led, HIGH);//для наглядности
      digitalWrite(PIN_RELAY,HIGH);
      delay(1000);

    }
    }  
    void ON()
    {
    digitalWrite(led, HIGH);
    digitalWrite(PIN_RELAY, LOW);
    }

    void OFF()
    {
    digitalWrite(led, LOW);
    digitalWrite(PIN_RELAY,HIGH);
    }

     
    Спасибо за помощь заранее
     

    Вложения:

    • dlyaamp.png
      dlyaamp.png
      Размер файла:
      139,3 КБ
      Просмотров:
      781
  5. parovoZZ

    parovoZZ Гуру

    Делэи в приемнике зачем? Цепляй пин МК к прерыванию NRF и работай по прерыванию.
     
  6. void Tanya();

    void Tanya(); Нуб

    пин МК?
     
  7. parovoZZ

    parovoZZ Гуру

    Пин IRQ на модуле соединяй с пином МК, который умеет прерывания (практически любой пин, обозначенный PCINT). 2-3 секунды (или сколько у тебя?) без прерываний = потеря связи.
     
  8. parovoZZ

    parovoZZ Гуру

    А что за датчик, который работает только от пяти вольт?
     
  9. Megawollt

    Megawollt Нуб

    Товарищи, подскажите, как воспользоваться функцией radio.isAckPayloadAvailable(), если два приемника шлют обратный пакет передатчику.
    Трубы я указал разные, но обратный пакет принимается только с одного
     
  10. Anton.M

    Anton.M Нуб

    Тыкните пожалуйста, где я неправильно сделал процедуру отправки? По идее, при поступающем числе с serial'а Дуина должна ОДИН раз отправить ее на удаленную ПЛИС. А эта гадина запускается, тишина. Но при первой же отправкe значения начинает "спамить" почти каждую миллисекунду без остановки.
    Код приёмника/передатчика ниже.
    Код (C++):

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

    RF24 radio(7,8);
    byte addresses[][6] = {"1Node","2Node"};

    void setup() {
      Serial.begin(115200);
      Serial.println(F("Start"));
      radio.begin();
      radio.setPALevel(RF24_PA_MAX);
      radio.setChannel(110);
      radio.setDataRate( RF24_250KBPS ) ;
      radio.openWritingPipe(addresses[0]);           //для приемника
      radio.openReadingPipe(1,addresses[1]);
    //  radio.openWritingPipe(addresses[1]);           //для передатчика
    //  radio.openReadingPipe(1,addresses[0]);


      radio.startListening();
    }

    void loop() {
    if (Serial.available())  {   //если в порте что-то есть, то отправляем
        radio.stopListening();
        unsigned long transive=Serial.read();
        radio.write(&transive,sizeof(unsigned long));
        Serial.println("Transive...");
        radio.startListening();
        Serial.flush();
      }
       else {                    //иначе ждём и читаем что пришло
        unsigned long receive;
        if( radio.available()){
                                                                   
          while (radio.available()) {                            
            radio.read( &receive, sizeof(unsigned long) );      
          }
          Serial.println(receive);
        }
    }
    }
     
    Последнее редактирование: 28 мар 2018
  11. Anton.M

    Anton.M Нуб

    Проблема решена добавлением "нулевого" символа - sizeof(unsigned long)+1
    Код (C++):

    if (Serial.available())  {   //если в порте что-то есть, то отправляем
        radio.stopListening();
        unsigned long transive=Serial.read();
        radio.write(&transive,sizeof(unsigned long)+1);
        Serial.println("Transive...");
        radio.startListening();
        Serial.flush();
      }
     
     
  12. Sanek.M

    Sanek.M Нуб

    Всем привет, nRF24L01+ это основное что меня интересует в ардуинках, искал способ как к 1 ардуинке подключить несколько OLED 1.3, благодаря нрф-кам узнал, только экранчики надо будет купить SPI а не I2C как у меня 2, попробовал подключить 2 нрф-ки к 1 ардуинке, параллельно, только SS на разных пинах, эти 2 нрф-ки имеют разные трубы с идентификаторами, шлют числа с разными диапазонами, на второй ардуинке 3-я нрф-ка их принимает, всё ок, даже не пришлось делать как везде пишут что когда обращаешься к одному из устройств на SPI, надо его SS делать на землю, остальные на +. У меня вот какая проблема, только когда нрф-ка с антенной и только когда она в качестве передатчика, она пол минуты поработает а потом пропадает связь, независимо от расстояния, подносишь палец к нрф-ке на расстоянии 3 мм и она начинает ловить, убираеш палец - перестаёт, у меня их 12, у всех одинаково, на некоторых припаян кондёр на 100 мкф, c base модулем получше но все равно происходит, это наверное что-то связано со статическим электричеством, как от этого избавиться? Спасибо.
     
  13. b707

    b707 Гуру

    не хватает питания, однозначно.
    3.3в для НРФ как получаете - с ардуины ? Этого недостаточно.
    Попробуйте отдельный БП

    2 НРФ к одной ардуине? зачем? Наверно потому, что труб в НРФ только 6, а модулей у вас 12? - открою секрет, все НРФ легко могут работать в одной трубе.
     
    MickNich нравится это.
  14. parovoZZ

    parovoZZ Гуру

    купил брак. Срыв ФАПЧ.
    зачем так много? Конденсатор должен быть либо ВЧ, либо low esr. Желательно через резистор.
    а это здесь причем?
     
  15. parovoZZ

    parovoZZ Гуру

    ЗАЧЕМ???
     
  16. Sanek.M

    Sanek.M Нуб

    Зачем 2 нрфки к 1 ардуинке, просто эксперимент, искал способы подключения нескольких OLED 128x64 экранчиков к 1 ардуине, c I2C всё понятно но есть такая проблема, надо чтоб у устройств адрес был разный, а он у экранчиков одинаковый, они бывают с I2C и с SPI, с SPI у меня пока нету, и вообще у меня щас кроме нрфок модулей с SPI пока нету, вот и решил попробовать с несколькими нрфками, теперь буду знать как легко подключаются несколько устройств по SPI. Зачем кондёр на 100 мкф, других не было. Насчёт купил брак, сомневаюсь что все 12 брак, они ведут себя так только в режиме передатчика, в режиме приёмника ничего подобного не происходит. Насчёт питания, у меня NANO от RobotDyn, там 3,3 в так же как и 5 в даёт 800 мА, пробовал и от 5 в через base модуль, пробовал и через NANO-нрф шилд, от разетки блок питания 9 в к шилду а он там 3,3 в делает, в сетапе ставлю RF24_PA_MAX, RF24_250KBPS. Насчёт причём здесь статическое электричество, объясните неучу что это за чудо происходит когда подносишь палец даже не прикасаясь, и главное как от этого чуда избавиться.
     
  17. parovoZZ

    parovoZZ Гуру

    ты же только что писал
    если в одном месте и в китае - легко. У меня из Питерского лабаза - проблем с ними вообще нет.
    нрфки по даташиту кушают в импульсе что-то не более 100 мА (лень смотреть). Развязка по питанию обязательна. Обязательно прямо на ноги ВЧ или LowESR конденсатор.
    а всё, что угодно - начиная от наводки, заканчивая искажением параметров АФУ емкостью своего тела.
     
  18. Sanek.M

    Sanek.M Нуб

    я имел ввиду подносишь палец и её сигнал начинают ловить принимающие нрфки, брал на али, магазин Great Wall, 1390 отзывов, ни одного плохого, у меня когда передатчик не глючит, пробивают несколько кирпичных стен, в несколько раз результат лучше чем у нрфок без антенны, а вот когда глючит то рядом на столе нрфка лежит не ловит, много где читал что модуль капризный, разобраться бы с ним раз и навсегда, хорошая штука, ну что ж, буду пробовать разных типов конденсаторы и знакомиться с "развязкой по питанию", спасибо.
     
  19. parovoZZ

    parovoZZ Гуру

    таких нет. Без антенны не возможно излучение в пространство.
    херня. Капризный заменить на бракованный.
     
  20. forfrends

    forfrends Нерд

    Всем привет! Приобрел я себе парочку модулей с усилителем и антеной:
    https://www.ebay.com/itm/2-4G-NRF24...e=STRK:MEBIDX:IT&_trksid=p2057872.m2749.l2649
    А не получается их сконектить! Не передают и все. Двое суток с ними провозился... Принимать данные принимают (пробовал конектить с обычными модулями), но не передают!
    Конденсаторы напаяны, питание мощное - 3.3в, 3А, еще пару конденсаторов кинул на БП.
    В инициализации прописал все что только возможно - "0" реакции. Только прием, передачи нет. Пробовал все "хитрости" что здесь описаны, и напряжение нонижал, и с AutoAck игрался, и т.д. Но ничего не помогло. Слышат, но не передают.
    От Ардуино до модуля идет шлейф, 8 жил, примерно 7 см. длинной.
    Во время очередных тестов взял шлейф в руки и... О чудо! Модуль стал передавать!!! Отпустил шлейф - не передает. Опять слегка дотронулся - есть передача, убрал руку - сигнал пропал.
    И я в ступоре... что это? помехи? Первый раз такое вижу. Уже, наверное, с 20 штук модулей использовал в радиоуправлении, таких проблем не было.
    Что можете посоветовать? Как добиться стабильной работы и убрать этот "глюк"?