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

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

  1. sergey-fedor

    sergey-fedor Нерд

    Повезло как то чтоли, открываю деревянную дверь в баню - сигнал есть - закрываю - нет сигнала :)
     
  2. vlad123419

    vlad123419 Нерд

    Здравствуйте! Победил модуль, вылечилось установкой конденсатора на 25v 470мкф)
     
  3. Mishytka

    Mishytka Нуб

    к сообщению #824.
    Подключал ардуины через юсб порт и внешний бп(каждый по 0.7А)+ кондеры на питании по 10мкф(25в и 16в)
    Мусор идет все так-же.

    Дайте хотя бы намек на то,куда копать,что делать?
    Может ли вай-фай мешать передаче модулей?
    Или надо БП на 5А(для примера значение взял)?
     
  4. ИгорьК

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

    0. Проверка соединения.
    1. Качественное питание: отсутствие пульсаций на БП и непросадка при работе. Сколько надо тока? Не знаю. Чем больше тем лучше. Но 5 А - это перебор. Хотя хуже не будет.
    2. Напайка керамических конденсаторов.
    3. Полная инициализация.
    4. Отключение AСK.
    Код (C++):
    setAutoAck(false);
    Или наоборот включение
    Код (C++):
    setAutoAck(true);
    которое на самом деле выключает. Все зависит от конкретного модуля и подбирается методом инженерного тыка.

    Не помогло? - выбрасывать.
     
    Последнее редактирование: 28 май 2016
  5. webtailor

    webtailor Нуб

    Подскажите почему так происходит?
    Передатчик передает команды на включение и выключение светодиодов под музыку. Имеется два приемника. Если включен только один из приемников, то светодиоды мигают почти без сбоев. Но если включить оба приемника, то возникают частые сбои и светодиоды мигают как попало.
    Заранее спасибо!
     
  6. ИгорьК

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

    Отключите AСK: setAutoAck(false);
    Посмотрите что будет.
     
  7. webtailor

    webtailor Нуб

    Отключил.. Стало еще хуже. Теперь даже если включен только один приемник светодиоды мигают невпопад
     
  8. ИгорьК

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

    Тогда смотрите мое сообщение чуть выше. Там перечислены все проблемы.
    Что касается вашей ещё какие мысли.
    Раз по одному работают два приёмника а вместе нет - значит они мешают друг другу. Простая логика.
    Мешать приёмники могут только тем, что ОТПРАВЛЯЮТ что-то. Иначе они молчат и не могут мешать друг другу.
    Это что-то - АСК. Передача извещения о приеме. В моем видео с первой страницы эта опция отключена. У меня также работают два приёмника на один передатчик. С отключением этой опции.
    Дело ещё и в том что у левых модулей, А ОНИ ВСЕ ЛЕВЫЕ, там все перепутано. Поэтому отключение АСК может быть по факту наоборот - программное ВКЛЮЧЕНИЕ его. Надо перебирать варианты.
    Причём в одном модуле это включение а в другом - выключение.
     
    Последнее редактирование: 16 сен 2017
    MickNich нравится это.
  9. webtailor

    webtailor Нуб

    Спасибо за рекомендации! Буду искать причину и информировать о резульатах
     
  10. AnatoliyM

    AnatoliyM Нуб

    Всем привет.Скажите это нормально? конфиг.JPG
     
  11. webtailor

    webtailor Нуб

    Это удивительно, но все так и есть.
    ВКЛЮЧИЛ на всех модулях АСК и все заработало))
    Спасибо большое!! Сам бы я не догадался))
     
  12. ИгорьК

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

    Приложите код инициализации.
     
  13. ИгорьК

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

    А мне когда-то подсказать было не кому... :)
     
  14. AnatoliyM

    AnatoliyM Нуб

    Код (C++):
    /*
    Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    version 2 as published by the Free Software Foundation.
    */


    /**
    * Example for Getting Started with nRF24L01+ radios.
    *
    * This is an example of how to use the RF24 class.  Write this sketch to two
    * different nodes.  Put one of the nodes into 'transmit' mode by connecting
    * with the serial monitor and sending a 'T'.  The ping node sends the current
    * time to the pong node, which responds by sending the value back.  The ping
    * node can then see how long the whole cycle took.
    */


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

    //
    // Hardware configuration
    //

    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10

    RF24 radio(9,10);

    //
    // Topology
    //

    // Radio pipe addresses for the 2 nodes to communicate.
    const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

    //
    // Role management
    //
    // Set up role.  This sketch uses the same software for all the nodes
    // in this system.  Doing so greatly simplifies testing.
    //

    // The various roles supported by this sketch
    typedef enum { role_ping_out = 1, role_pong_back } role_e;

    // The debug-friendly names of those roles
    const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};

    // The role of the current running sketch
    role_e role = role_pong_back;

    void setup(void)
    {
      //
      // Print preamble
      //

      Serial.begin(57600);
      printf_begin();
      printf("\n\rRF24/examples/GettingStarted/\n\r");
      printf("ROLE: %s\n\r",role_friendly_name[role]);
      printf("*** PRESS 'T' to begin transmitting to the other node\n\r");

      //
      // Setup and configure rf radio
      //

      radio.begin();

      // optionally, increase the delay between retries & # of retries
      radio.setRetries(15,15);

      // optionally, reduce the payload size.  seems to
      // improve reliability
      //radio.setPayloadSize(8);

      //
      // Open pipes to other nodes for communication
      //

      // This simple sketch opens two pipes for these two nodes to communicate
      // back and forth.
      // Open 'our' pipe for writing
      // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)

      //if ( role == role_ping_out )
      {
        //radio.openWritingPipe(pipes[0]);
        radio.openReadingPipe(1,pipes[1]);
      }
      //else
      {
        //radio.openWritingPipe(pipes[1]);
        //radio.openReadingPipe(1,pipes[0]);
      }

      //
      // Start listening
      //

      radio.startListening();

      //
      // Dump the configuration of the rf unit for debugging
      //

      radio.printDetails();
    }

    void loop(void)
    {
      //
      // Ping out role.  Repeatedly send the current time
      //

      if (role == role_ping_out)
      {
        // First, stop listening so we can talk.
        radio.stopListening();

        // Take the time, and send it.  This will block until complete
        unsigned long time = millis();
        printf("Now sending %lu...",time);
        bool ok = radio.write( &time, sizeof(unsigned long) );
       
        if (ok)
          printf("ok...");
        else
          printf("failed.\n\r");

        // Now, continue listening
        radio.startListening();

        // Wait here until we get a response, or timeout (250ms)
        unsigned long started_waiting_at = millis();
        bool timeout = false;
        while ( ! radio.available() && ! timeout )
          if (millis() - started_waiting_at > 200 )
            timeout = true;

        // Describe the results
        if ( timeout )
        {
          printf("Failed, response timed out.\n\r");
        }
        else
        {
          // Grab the response, compare, and send to debugging spew
          unsigned long got_time;
          radio.read( &got_time, sizeof(unsigned long) );

          // Spew it
          printf("Got response %lu, round-trip delay: %lu\n\r",got_time,millis()-got_time);
        }

        // Try again 1s later
        delay(1000);
      }

      //
      // Pong back role.  Receive each packet, dump it out, and send it back
      //

      if ( role == role_pong_back )
      {
        // if there is data ready
        if ( radio.available() )
        {
          // Dump the payloads until we've gotten everything
          unsigned long got_time;
          bool done = false;
          while (!done)
          {
            // Fetch the payload, and see if this was the last one.
            done = radio.read( &got_time, sizeof(unsigned long) );

            // Spew it
            printf("Got payload %lu...",got_time);

        // Delay just a little bit to let the other unit
        // make the transition to receiver
        delay(20);
          }

          // First, stop listening so we can talk
          radio.stopListening();

          // Send the final one back.
          radio.write( &got_time, sizeof(unsigned long) );
          printf("Sent response.\n\r");

          // Now, resume listening so we catch the next packets.
          radio.startListening();
        }
      }

      //
      // Change roles
      //

      if ( Serial.available() )
      {
        char c = toupper(Serial.read());
        if ( c == 'T' && role == role_pong_back )
        {
          printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r");

          // Become the primary transmitter (ping out)
          role = role_ping_out;
          radio.openWritingPipe(pipes[0]);
          radio.openReadingPipe(1,pipes[1]);
        }
        else if ( c == 'R' && role == role_ping_out )
        {
          printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r");
         
          // Become the primary receiver (pong back)
          role = role_pong_back;
          radio.openWritingPipe(pipes[1]);
          radio.openReadingPipe(1,pipes[0]);
        }
      }
    }
    // vim:cin:ai:sts=2 sw=2 ft=cpp
     
  15. ИгорьК

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

    Улыбнуло... Вот, пожалуйста, посмотрите на свой код инициализации, определите значение труб, которые Вы назначаете модулю и найдите их на своем снимке. Найдете - все хорошо, не найдете - ищите ошибки в соединении. Или меняйте модуль.
     
  16. AnatoliyM

    AnatoliyM Нуб

    Связался с этим модулем недавно.Увидел статью про RC пульт на NRF и заморочился. Купил два модуля:один с антенной,второй с печатной антенной на плате. На втором модуле получается изменить настройки мощности,минимальной скорости...а на том что с антенной ничего не выходит. Я с ардуино средой тоже только знакомлюсь.Может подскажите с чего начать проверку модуля?питание в норме.
     
  17. ИгорьК

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

    Если питание в норме, и если один модуль Вас слушается, то второй или ошибки в соединении или он не исправен.
    Учтите, Вы сами сказали что питание в норме.
    Что касается Вашей картинки, то на ней данные о первой и второй трубе одинаковые. В скетче Вы их устанавливается другими.
    Вывод: соединение или неисправность модуля.
    Я бы сюда в первую очередь поставил питание, но Вы говорите что все нормально....
     
  18. webtailor

    webtailor Нуб

    Рано я обрадовался(
    То что вчера вечером работало стабильно, сегодня стабильно работать уже не хочет. Хотя ни чего не менял. Даже не знаю, что и думать...
     
  19. AnatoliyM

    AnatoliyM Нуб

    Кондер по питанию стоял смд керамика 0.1 мкф и 10v на 100мкф. На другом сайте посоветовали.Но я оставил только керамику т.к. хоть что то показывает сом порт. Модуль NRF24L01+PA+LNA
     
  20. ИгорьК

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

    Кроме конденсатора есть ещё сам источник питания. И что это?