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

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

  1. ИгорьК

    ИгорьК Гуру

    На счет будет - не знаю, но паять можно и 10. :)
     
  2. BGreen

    BGreen Нерд

    Я осциллографом смотрел питание NRF с 1мкФ пленочным конденсатором SMD. Амплитуда до 0.1В с высокой переменной частотой. У меня осцилл до 250МГц, синус квадратный был. То есть, по питанию, наверное, ГГц лезут..
    По-идее, поставить бы керамику *пФ для гашения ВЧ и что-то ёмкое типа тантала *мкФ для сглаживания просадок.
     
    ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Гуру

    У меня и это напаяно. Правда фотки нет. Все верно.
     
  4. nifigasebe

    nifigasebe Нуб

    Итого:

    Если Uno - принимает, LeonardoETH - передает, то все работает. А если, как мне собственно и нужно, наоборот, то полная тишина, все плохо и не работает ничто.

    Купил еще два новых модуля в другом магазе. Вроде немного отличаются от первых. С ними такая же ситуация. В одну сторону работают, в другую нет.

    Припаял к первым модулям по конденсатору 10 мкФ и ВСЕ РАБОТАЕТ отлично и как нужно.

    Еще раз большое спасибо за помощь :)
     
  5. M.a.x

    M.a.x Нуб

    Огромное Вам спасибо!!!
    Очень много полезной информации нашел для себя!
     
  6. Lagvin

    Lagvin Нерд

    Добрый день, всех поздравляю с Новым годом и Рождеством!
    В праздники делать нечего и я собрался на рыбалку, но тут "обламинго".
    Собрал сигнализатор поклевки и пейджер.Все на nRF24L01+
    и выскочила проблема в пейджере не очищается буфер.
    Если при первой передаче все нормально, то вторая передача сопровождается данными первой и т.д. Может кто знает в чем проблема?

    if (radio.available()) {
    radio.read(msg,1);
    switch (msg[0]) {

    case 12:
    digitalWrite(LEDpin1,HIGH);
    s=true;
    fg=true;
    break;
    case 34:
    digitalWrite(LEDpin2,HIGH);
    s2=true;
    fg=true;
    break;
    case 56:
    digitalWrite(LEDpin3,HIGH);
    s3=true;
    fg=true;
    break;
    case 78:
    digitalWrite(LEDpin4,HIGH);
    s4=true;
    fg=true;
    break;

    }
    }
     
  7. zaynus

    zaynus Нерд

    Попр чистить f1f0 при передаче.
    На библе от maniacbug можно использовать radio.stopListening
     
    Lagvin нравится это.
  8. Lagvin

    Lagvin Нерд

    Да, действительно помогло. спасибо!
    сделал так:
    case 12:
    radio.stopListening();
    digitalWrite(LEDpin1,HIGH);
    s=true;
    fg=true;
    radio.startListening();
    break;

     
  9. avgaz

    avgaz Нерд

    Подскажите в чем прикол, оба кода работают нормально но как только в передатчике ставлю delay(1000); приемник перестает принимать. И ещё вопрос можно ли использовать +5в на эти модули, а то на каждый паять конденсатор муторно, а без него от пина 3.3 не работает, а от пина 5в нормально работает и без конденсатора и вроде не греется не чего.
     
  10. BGreen

    BGreen Нерд

    Прикол в том, что вам нужно прочитать 28 страниц темы. И использовать вылизанный проверенный код, особенно, для инициализации.

    На модуль можно максимум 3.6В по питанию + кондер. IO толерантны к 5 В, питание - нет. Остальные варианты - для желающих извращенного секса с NRF.
    -------

    Столкнулся со странностью: 1 приемник слушает 5 труб, 5 передатчиков на трубах 1..5. Труба 0 - системная и не используется. Я сделал массив[5] для хранения принятых данных, мол, датчиков-то 5. Но при получении данных сохранял их в массив под номером трубы. Массив[5] 0..4, а трубы[5] 1..5.
    Когда приходили данные от сенсора в 5й трубе, то массив переполнялся и система ломалась! Долго ломал голову, пока понял. Не повторяйте ошибок.
     
  11. avgaz

    avgaz Нерд

    Да уже перепробовал много всего остановился на либе RadioHead она вроде работает стабильно
    есть ли у неё минусы?
    По питанию то же не понятно если максимум можно 3.6В то как за час не сгорел от 5В ? причем от 3.3 без кондера не хочет работать, а от 5В работает нормально
     
  12. BGreen

    BGreen Нерд

    Насчет RadioHead не знаю, я использую http://tmrh20.github.io/RF24/classRF24.html, библиотека работает на столе. Осталось проверить ее в режиме 5 сенсоров и в течении нескольких месяцев.

    От 5В может работать, кто знает этих китайцев. У них часто клоны более кондовые, чем оригинал. Но вылавливать глюки или поломки от перенапряжения неохота.
     
  13. avgaz

    avgaz Нерд

    столкнулся с проблемой в RadioHead как передавать данные с датчиков например с dht22 которые в float
    отправка там такая
    Код (C++):
    uint8_t data[] = "Hello World!";
    nrf24.send(data, sizeof(data));
    nrf24.waitPacketSent();
    нужно отправить
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    подскажите плиз?
     
  14. ИгорьК

    ИгорьК Гуру

    Чтобы сохранить десятые или сотые? Проще всего умножьте на 10 или 100 и превратите в int. На приёмнике проведите обратное действо.
     
    Последнее редактирование: 10 янв 2016
    MickNich и BGreen нравится это.
  15. geher

    geher Гуру

    Раз на два не приходится. Я периодически ошибаюсь и запитываю эти модули от +5. Все из одной партии. Пока сгорел только один, причем сразу. Остальные благополучно пережили.
    "От 3.3 без кондера не хочет работать" - это проблема качества источника питания 3.3 В и чувствительности модуля к ухудшению этого качества. Зависит от конкретного экземпляра ардуины (если питание с ее регулятора) или иного источника напряжения 3.3 В, источника питания самой ардуины и конкретного экземпляра (конкретной партии?) радиомодулей. Проблема может обуславливаться сильными пульсациями на линии питания 3.3 В или проседанием напряжения 3.3 В в момент начала передачи.
    У меня все имеющиеся в наличии 4 модуля нормально работают от 3.3 В выхода меги без конденсаторов.
     
  16. geher

    geher Гуру

    Код (Text):

    nrf24.send((uint8_t*)&h, sizeof(h));
    nrf24.send((uint8_t*)&t, sizeof(t));
     
    Можно вообще все в одну структуру затолкать, да еще какой-нибудь контроль добавить:
    Код (Text):

    struct _meteodata {
      float h;
      float t;
      int crc;
    } meteodata;
      meteodata.h = dht.readHumidity();
      meteodata.t = dht.readTemperature();
      crc=meteodata.h+meteodata.t; // или использовать правильное вычисление какой-нибудь стандартной контрольной суммы
      nrf24.send((uint8_t*)&meteodata, sizeof(struct _meteodata));
     
    avgaz нравится это.
  17. avgaz

    avgaz Нерд

    попробовал пока вот так
    Код (C++):
      float h = 26.7;
     
      nrf24.send((uint8_t*)&h, sizeof(h));
     
      nrf24.waitPacketSent();
    А не подскажите как на принимающей стороне быть? там при этом лезут корякули такого вида
    љ™ХAхх
    Ж
    Ж
    вот код приемника
    Код (C++):
    if (nrf24.available())
      {
        // Should be a message for us now
        uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
        uint8_t len = sizeof(buf);
        if (nrf24.recv(buf, &len))
        {
    //      NRF24::printBuffer("request: ", buf, len);
          Serial.print("got request: ");
          Serial.println((char*)buf);

        }
        else
        {
          Serial.println("recv failed");
        }
      }
     
     
  18. geher

    geher Гуру

    Естественно, будет ерунда, поскольку данные передаются в бинарном виде, а трактуются при приеме как текст.
    Навскидку правильный вариант не нарисую, но для одиночного float и грубо в качестве отправной точки на приемнике получается примерно так:
    Код (Text):
    if (nrf24.available())
      {
        // Should be a message for us now
        float buf;
        uint8_t len = sizeof(buf);
        if (nrf24.recv((uint8_t*) &buf, &len))
        {
          Serial.print("got request: ");
          Serial.println(buf,4);

        }
        else
        {
          Serial.println("recv failed");
        }
      }
     
    Есть различные нюансы, связанные с размером пакета, включением режима переменного размера пакета, синхронизацией передачи (заметными задержками между пакетами, маркерами начала пакета), которые неплохо было бы учесть и, возможно, использовать.

    Можно также вернуться к передаче текста (более затратно, сложности с восстановлением значений из текста, потеря точности при переводе float в текст).
    Тогда на передатчике примерно так:
    Код (Text):

    float h = 26.7;
    String data;
    data=String(h,4);
    nrf24.send(data.c_str(), data.length()+1); // строка с нулем после последнего символа.
    nrf24.waitPacketSent();
     
     
    BGreen нравится это.
  19. avgaz

    avgaz Нерд

    а если данные перевести в текст с начало и отправить как текст?
    так ошибку выдает
     
  20. Okmor

    Okmor Нерд

    Всем привет.
    Мучаю эти модули и даже что то получается.
    Столкнулся с следующей проблемой.
    Два идентичных модуля при двух одинаковых arduino NANO работают более-менее стабильно.
    Если один из модулей переношу на arduino UNO, то на ней возникают проблемы с приемом. Тоесть его нет вообще.
    Я вищу, что nifigasebe столкнулся с подобной проблемой.
    Прошу помощи.
    Код (C++):
    #include<SPI.h>
    #include<nRF24L01.h>
    #include<RF24.h>
    const uint64_t pipe = {0xF0F0F0F0E1LL};
    RF24 radio(9,10);
    int message = 55;
    int red;
    unsigned long CTime01;
    unsigned long LTime01;
    void setup()
    {
      Serial.begin(9600);
      radio.begin();
      delay(100);
      radio.enableDynamicPayloads();
      radio.openReadingPipe(1,pipe);
      radio.openWritingPipe(pipe);
      radio.stopListening();

    }
    void loop()
    {
      if ( radio.available() ) {
           radio.read( &red,sizeof(red) );
           Serial.println(red);
          };

        CTime01 = millis();
        if (CTime01 >= (LTime01 +300))
        {
        Serial.println("----------write------------");
        radio.stopListening();
        radio.write( &message, sizeof( message ) );
        radio.startListening();
        LTime01 = CTime01;
        }
    }
    Вот так все выглядит в консоли. Если обе ардуинки NANO, то консоли идентичны.
    Питание проверял 3,3в, но мерял цифровым тормозом (осциллографа нет).
    [​IMG]
     
    Последнее редактирование: 11 янв 2016