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

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

  1. sslobodyan

    sslobodyan Гик

    Включено автоподтверждение. Там есть количество повторов и интервал повтора. Перемножьте и получите примерно максимальное время передачи одного пакета. А модули с усилителем?
     
  2. Alex469

    Alex469 Нерд

    Да.
    от 3 до 7 мс. Соответственно до 97 мс к трансиверу обращений нет. Это если частота
    передачи пакетов 10 Гц.
    Нет. Самый простой.
    http://www.ebay.com/itm/141975887566

    Вчера обратил внимание. Если ставлю частоту передачи пакетов выше 10 Гц (скажем 50 Гц),
    то первые несколько пакетов (3-10) после начала обмена проходят нормально. Каждый за 2-5 мс.
    Потом время передачи одного пакета начинает расти и дело кончается пропусками. В конце
    концов проходит один пакет из 10. Иногда возобновляется на короткое время (5-10 пакетов)
    хорошая передача. Потом снова ерунда. Оба трансивера лежат на одном столе. Запуск
    Сканера показывает что я выбрал канал в пустом месте.

    В общем устойчивый режим это 10 посылок в секунду. Не густо.

    Сегодня посмотрел народ на этих трансиверах рации собирает. Обрадовался. Думаю: дай
    гляну как ребята задачу решили? А там библиотека уже написана. RF24V. И все у нее внутри. :)
     
  3. sslobodyan

    sslobodyan Гик

    На самом деле интервал повтора до 4мс и количество повторов до 15, то есть 15*4=60мс может быть в наихудшем случае. Да, это не 100мс, но учитывать тоже надо.
    А попробуйте принимать на канале +-1 от канала передатчика. Возможно, при малом межпакетном интервале у передатчика уходит частота синтезатора. Или передатчик запустите на постоянную передачу с интервалом 10мс а на приемнике запустите сканер и посмотрите на каком канале наибольшее число попаданий на несущую.
    И если хотите получить быстрый обмен, то обязательно пользуйтесь ногой прерывания, не занимайтесь постоянным опросом статуса, особенно на приемной стороне.
     
  4. Alex469

    Alex469 Нерд

    Тоже подумал об этом. Нет. Не принимает. Хотя прикосновение к кварцу на модуле
    вышибает его с канала напрочь! :)
    А вот сканер показывает активность на своем канале + на канале ниже. Т.е. если передача на 73-ем, то макимум у сканера на 73-тем и поменьше на 72-ом.
    Согласен. Потери времени есть. Но не такие же дикие! Тут что-то другое.
    Заказал 10 штук трансиверов. Жду когда придут и пытаюсь найти людей
    которые через это проходили. Пока не нашел. В проектах скорость обмена
    маленькая.

    Правда вот нашел такую статью. http://habrahabr.ru/post/245671/
    Где автор говорит что^
    Может в этом дело? Но с другой стороны: а как ребята звук передают? Там ведь приличный поток получается.
     
  5. sslobodyan

    sslobodyan Гик

    На счет PLL. В даташите есть временные графики. Да, PLL перезапускается вновь при каждой передаче. Требует аж 130 микросекунд на каждую посылку, включая ретрансмит.
     
    Последнее редактирование: 10 июн 2017
  6. Alex469

    Alex469 Нерд

    Ну это не время. :) Тут что-то другое. Буду искать.
     
  7. Alex469

    Alex469 Нерд

    Проблема решена. Надо непосредственно перед передачей снова установить номер канала.
    Вот так:
    Код (C++):
    //******************
    //  Передать кадр
    //******************
    void transmit(){
      transmitOk = 0;
      radio.stopListening();  // Перестать принимать
      radio.setChannel( nCanal ); // !!!!!!!!!!!!!!!!!!
      if ( radio.write( &kadr, 12 ) ) transmitOk = 1; // Передача 12 байт
      radio.startListening();  // Снова переключаемся на прием
      } // transmit
     
    Нашел вот тут: http://aterlux.ru/article/nrf24l01p такие слова:
    RF_CH - это номер канала. И тут у меня что-то щелкнуло. Иногда первые 15 пакетов (или меньше), посылаемые с высокой частотой, доходили без сбоев. Попробовал записывать номер канала перед передачей чтобы этот регистр обнулить. В результате удача. Посылки идут с частотой 200 Гц и все работает без ошибок. :)
     
    shpock, sslobodyan и ИгорьК нравится это.
  8. sslobodyan

    sslobodyan Гик

    Ценная находка. В документации об этом сказано вскользь. Типа счетчик превышения ретрансмита, но не более 15. А как себя ведет модуль при 15 - ни слова. Будем считать, что это фича такая - раз плохой радиообмен, значит канал зашумленный и надо постоянно гнать максимальные ретрансмиты до смены канала.
     
    shpock и Alex469 нравится это.
  9. parovoZZ

    parovoZZ Гуру

    Народ! А у кого какая дальность nrf24? У меня дальность в квартире на прямой видимости не больше 5 метров(( И то приходится очень четко ориентировать антенны.
    Кто скажет про версию с усилителем и антенной - надо плату экранировать или нет? Кондер припаян и на передатчике и на приемнике. Вроде слышит дальше (на передачу не включал пока). Схемы нет ни у кого - как ВЧ усилитель запитан - засыпает вместе с чипом или постоянно включен?
     
  10. Radius

    Radius Гик

    У меня nrf24 без усилителя, но с внешней антенной, на скорости 250 кбит/с с автоподтверждением, пробивает в помещении около 30 м.
     
  11. parovoZZ

    parovoZZ Гуру

    Хм, на 250 у меня тоже не фонтан(( На метр...может...но не 30(( А с внешней антенной где покупали?

    И ещё вопрос. Приёмник физически выключен, передатчик включен. Включаю приёмник и вижу:
    Код (C++):
    Fri Jun 16 22:09:49 2017
    0=de, 1=a7, 2=0, 3=c0, 4=da, 5=64, 6=38, 7=1, 8=5, 9=f, 10=a7
    id=222, temperature=10.437500, error=167

    Fri Jun 16 22:09:59 2017
    0=de, 1=a7, 2=0, 3=c0, 4=da, 5=64, 6=38, 7=1, 8=5, 9=f, 10=a7
    id=222, temperature=10.437500, error=167

    Fri Jun 16 22:10:09 2017
    0=de, 1=a5, 2=0, 3=c0, 4=da, 5=64, 6=38, 7=1, 8=5, 9=f, 10=a5
    id=222, temperature=10.312500, error=165

    Fri Jun 16 22:10:19 2017
    0=de, 1=1e, 2=1, 3=c0, 4=da, 5=64, 6=38, 7=1, 8=5, 9=f, 10=ca
    id=222, temperature=17.875000, error=202

    Fri Jun 16 22:10:29 2017
    0=de, 1=1e, 2=1, 3=c0, 4=da, 5=64, 6=38, 7=1, 8=5, 9=f, 10=ca
    id=222, temperature=17.875000, error=202


     
    Температура 10 градусов - это вчера ночью перед выключением приемника (на малинке).
    Т.е первые три посылки сохранились в nrf24? И только после них пошли нынешние. Знаю, что в модуле есть 3 буфера по 32 байта. Но как его обнулить и получить текущую, а не с ожиданием через 3?
     
  12. sslobodyan

    sslobodyan Гик

    flush_rx()
     
  13. Radius

    Radius Гик

    Данные модули покупались очень давно (лет 10 назад), на них стоит SMA-разъем к которому прикручиваю антенну от Wi-Fi - маршрутизатора.
     
  14. Oleg_7

    Oleg_7 Гик

    Всем добрый день! Вот решил сделать авто определение свободной частоты. Из rRF24/examples/scanner в void setup(void) будет запускаться ф-ция, на 40сек, и будет из строки браться номер канала, который "0" и чтобы справа и слева от него тоже все были "0" на 10 позиций. Затем при первой передаче новый номер частоты будет рассылаться "абонентам", те эту частоту перзаписываются в eeprom, => автоперезагрузка(только в случае если записываемые данные номера канала отличались от там имеющихся ), и дальше все устройства начинают работать на новом чистом канале. Автоматически. Как вам такая идея?
     
  15. mcureenab

    mcureenab Гуру

    К чему жадность?

    Если какой то модуль не отработает запрос нс смену частоты, что будем делать?
     
  16. Oleg_7

    Oleg_7 Гик

    думаю,если не получен ответ-подтверждение, то периодически долбить его на старой частоте с посылкой с "новой частотой". Самонастраивающаяся система. Ведь в идеале именно так и должно быть. Буду рад любым идеям...
     
  17. mcureenab

    mcureenab Гуру

    Непослушный молуль может никогда не ответить. Может он сдох. Или сигнал помеха давит.

    В принципе, если модули могут договориться на старой частоте, то какой смысл её менять?

    Такого рода системы ведут статистику ошибок. Возможно, что следует циклически менять частоты сразу всем модулям, собирать статистику ошибок и по мере выявления ненадёжных частот понижать их приоритет в ротации.
     
  18. Oleg_7

    Oleg_7 Гик

    Про статистику ошибок - согласен !, например раз в сутки ночью, запускается ф-ция сканирования частот. Расставляется оценки приоритетов (0-10 например). Договориться модули может и могут, но помехи могут = терять пакеты. Синхронную смену частот вижу пока так: ГлавныйМодуль определяет "хорошую частоту" => пересылает ее остальным (с автоподтверждением! приема ! ) =>те ее сохраняют в eeprom => автоперезагрузка модулей => новая частота читается из eeprom при старте => все работают на новой частоте. Т.е. если какой-то модуль не подтвердил получение новой частоты, ему ГУ стучит на старой - мол вот тебе новая частота, получи и распишись!) Мож кто уже делал на практике что то подобное??
     
  19. mcureenab

    mcureenab Гуру

    А днём заработает микроволновка, роутеры и все замеры пойдут лесом.
    Нужно установить временнОй регламент обмена пакетами. Положим, каждую секунду должен приходить пакет с данным, а если данных нет, то пустой пакет.

    Если модуль видит, что потери пакетов превышают порог, он переключается на запасную частоту. Другие модули на старой частоте теперь не принимают пакеты и так же переключаются на запасную частоту. Эту частоту нужно сохранять до определенного момента, чтобы все модули успели переключиться и получить или не получить пакеты.

    Для такого алгоритма не требуется ни централизованное управление ни наличие связи. Требуется синхронизация часов, иначе модули будут произвольно блуждать по частотам.

    Возможно есть смысл иногда принудительно менять частоту, чтобы иметь статистику для разных каналов.
     
  20. Oleg_7

    Oleg_7 Гик

    так синхронизировать у меня не получится, модулей часов на каждом модуле нет, вести отсчеты времени от старта тоже не вариант, у них в скетче есть ф-ция автоперезагрузги. а про "А днём заработает микроволновка" - я забыл ))