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

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

  1. Oleg_7

    Oleg_7 Гик

    Игорь, мне очень приятно, что Вы мне ответили, правда. !) Но, гдеж их взять "не левые" с усилком и антеной.... все только на АлиЭкспресс... У Вас есть проверенные продавцы?
     
  2. ИгорьК

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

  3. ИгорьК

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

    Поищите, также, у sparkfun и adafruit

    Да, это будет дороже, но будет работать. Что делать - модуль такой, за качество придется переплачивать.
    Берите их сразу с запасом - если через какое-то время захотите что-то добавить - имейте резерв модулей из одной партии.

    Мне через полтора года понадобилось добавить в систему из трех модулей - четвертый, я плясал с ним дольше, чем когда начинал эту тему - месяц. Не каждый день, конечно.

    Методом инженерного тыка перебирал все возможные варианты настроек, когда заработали все модули. Плевался, забрасывал и возвращался вновь. Получилось. Но крови попрорчено немеряно.
     
  4. Oleg_7

    Oleg_7 Гик

    Спасибо!) но цена 16,5 $ за шт -это оч круто...........(
     
  5. ИгорьК

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

    "Ничто не верно само по себе, а лишь смотря по обстоятельствам". Все зависит от задачи, которую Вы решаете.
    NRFки, ИМХО, вышли из категории "поиграться" и перешли либо в "дорого", либо "по$%^%$^ться".
     
    Последнее редактирование: 22 май 2017
    Толик Иванов и NikZ нравится это.
  6. shved86

    shved86 Нуб

    Добрый день. Подскажите могут ли несколько модулей nrf слушать одну трубу одновременно и получать данные. Ну например передаю в одну трубу значение температуры и сразу (для примера) 3 модуля получают это значение
     
  7. Radius

    Radius Гик

    Да, это возможно.
     
  8. shved86

    shved86 Нуб

    у этих модулей есть контроль отправки, и возможность повторить отправку если не доставлено, в моей ситуации это работать не будет, правильно? Может получиться так, что в момент отправки сообщения кто то один из получателей получит его и ответит что получил его а другой получатель в этот момент будет чем то еще занят и не получит это сообщение.
     
  9. Radius

    Radius Гик

    Эту опцию, для вашего случая, нужно отключить.
     
  10. shved86

    shved86 Нуб

    а если я отключу это опцию отправитель будет отправлять сообщение всего один раз или setRetries будет работать?
     
  11. Radius

    Radius Гик

    Для надежности можете отправить сообщение несколько раз. Подтверждение получения данных стандартным способом, для вашего случая, работать не будет. Не могут одновременно три приемника подтвердить передатчику что все дошло. Они просто заглушат друг друга в эфире. Если вы хотите гарантированную доставку, то придется каждому приемнику открывать отдельную трубу и передавать каждому по отдельности.
     
    shved86 нравится это.
  12. sslobodyan

    sslobodyan Гик

    Не совсем. Труба это метод прозрачной для принимющей стороны адресации. То есть нрф-ка на принимающей стороне сама решает для нее пакет или нет. Но все равно прием идет внутри одного частотного канала всеми нрф-ками. Если же внутри передаваемого пакета вы сделаете свою адресацию (допустим, один байт как номер приемника), то все нрф-ки на данном частотном канале с одинаковой трубой примут пакет, дернут контроллер и уже контроллер на основе этого байта определит его ли пакет пришел. Таким образом можно преодолеть ограничение в 5 отдельно адресованных приемников, естественно, заплатив автоподтверждением приема. Но по отзывам забугорных товарищей на модулях с усилителем автоподтверждение работает плохо в силу большого времени переключения усилителя с отправки на прием, поэтому я от него отказался.
     
    MickNich нравится это.
  13. shved86

    shved86 Нуб

    Спасибо, у меня так и реализовано. у каждой принимающей стороны есть свой id с которым сравнивается id пришедший по радио.и если они совпадают то значит пакет для него.
     
  14. zaykadivan

    zaykadivan Нуб

    Я конечно не любитель отписываться на форумах, но в моем случае не смог оставаться в стороне.
    Форум перечитал от и до, и сделал все, как по букварю. Собрал на макетке - все чики-пики.
    Передатчик в изделии - порядок. Приемник - глухо. Ставлю на макет - работает, обратно -нет.
    Беру питание с изделия на макет - работает. Вот такие чудеса. Решил промерять ноги на замыкание.
    Короткого нет, но две ноги сквозили на 150кОм. Так, как изделие единичное, чтобы не травить
    плату, сделал на паечной макетке, а некоторые изолированные дорожки сделал из провода с
    витой пары интернет-кабеля. На всякий случай перемерял и еще две ноги сквозили на 1,5МОм.
    Заменил дороги и дело пошло. Все заработало.
    Но беда не приходит одна. Передатчик в глубоко спящем режиме потреблял чуть больше
    1мА, а без nRF24L01+ - 0мА. Пришлось поменять модули с приемником (благо он работает от сети),
    и опять - победа! Вот такие чудеса случаются.
     
  15. Oleg_7

    Oleg_7 Гик

  16. rkit

    rkit Гуру

    Для использования не нужны. А для теста - я не знаю, что вы там тестировать собрались.
     
  17. sslobodyan

    sslobodyan Гик

    Test whether a signal (carrier or otherwise) greater than or equal to -64dBm is present on the channel.
    Перевожу. Тестирует наличие сигнала (несущей либо любого другого), превышающего уровень -64Дбм в текущем канале.
    Поясняю :) Говорится о ЛЮБОМ сигнале, соответственно будет видеть работу вашей вайфай карты и даже радиомышки. Т.о. достаточно одной таблэтки NRFки :)
     
  18. Oleg_7

    Oleg_7 Гик

    Спасибо. тогда, придется самому процедуру писать проверки/установления силы и качества сигнала между нрфками
     
  19. Wolferio

    Wolferio Нерд

    Я вижу тут одни глухонемые, спасибо за помощь, уже все 4 модуля заработали между собой.
     
  20. Alex469

    Alex469 Нерд

    Доброго всем времени суток.
    Обращаюсь за помощью. Ветку читал, но не всю. Узнал много полезного.
    Спасибо всем за обсуждение. Возможно о моей проблеме уже писали.
    Но я к сожалению не нашел. Если так прошу прощения. Ткните пожалуйста в
    пост.

    А если никто не писал то вот проблема. Меня не устраивает частота передачи
    пакетов в паре двух NRF24L01+.

    Итак. Два одинаковых трансивера. Куплены на е-бее. Подключены к Ардуино.
    Одна к Нано. Другая Про-мини. Подключение классическое. Без прерываний.
    Библиотека RF24. Провода длинной 5 и 7 см. Скорость установлена на 250 к.
    мощность максимум. На каждом модуле 2 конденсатора 100 мкф и 0,1 мкф.
    (При работе пульсация на ножках питания не более 50 мВ).

    Пара устойчиво работает в режиме с подтверждением только если частота
    передачи пакетов (по 12 байт) не превышает 10 Гц. При этом на цикл передачи
    (опрос датчиков, кодирование и собственно передача) расходуется не более
    3-6 мс. Если цикл передачи определить менее чем 100 мс (казалось бы 94 мс
    система проставает!), начинаются пропуски (через раз). Половина пакетов не
    отправляется. ( Прекращение попыток передачи по таймауту 60 мс ).

    Если отключить автоподтверждение приема, то передатчик работает устойчиво
    тратя на передачу пакета 2-3 мс. Я уменьшал цикл передачи пакетов до нужных
    мне 10 мс. Передатчик работае без проблем. Но при этом приемник принимает
    дай Бог один пакет из 10!

    От расстояния (в пределах квартиры) ситуация не меняется. Сбрасывание буфера
    командой flush_tx() ничего не меняет.

    Вот код инициации. по моему стандартный.

    Код (C++):
    void setTransmiter(){ // Инит трансмиттера.
      delay ( 2000 ); // Перед инициализацией надо 2 секунды после подачи питания
      radio.begin();
      radio.setChannel(73); // Пусть будет так.
      radio.setDataRate(RF24_250KBPS); // скорость обмена данными (RF24_1MBPS или RF24_2MBPS)
      radio.setPALevel(RF24_PA_MAX); // Высокая мощность передачи  (RF24_PA_MIN. RF24_PA_LOW. RF24_PA_HIGH. RF24_PA_MAX.)
      radio.openWritingPipe( pipeOut );  // Канал для передачи.
      radio.openReadingPipe( 1, pipeIn ); // Канал для приема
      radio.setAutoAck(true); // Запрашивать ответ о получении
      radio.startListening();  // Слушаем канал
      } // setTransmiter
     

    А вот собственно передача.
    Код (C++):
      radio.stopListening();  // Перестать принимать
      transmitOk = 0;
      radio.flush_tx();
      if ( radio.write( t, 12 ) ) {
        transmitOk = 1;
        };  // Передача 12 байт
      radio.flush_tx();
      radio.startListening();  // Снова переключаемся на прием
      } // transmit
     
    Вопросы:
    1. Почему не получается передавать пакеты с большей частотой?
    2. Какая максимальная частота передачи пакетов (если кто измерял)?