Долгосрочная стабильность соединения Bluetooth

У меня есть две платы Arduino Mega с HC-05 на Serial1, подключенные к Raspberry Pi 3b+ через Bluetooth, с использованием HC-05 и встроенного Bluetooth RPi, а также библиотеки pySerialTransfer Python для создания связи.

По причинам, которые я все еще пытаюсь выяснить, соединение Bluetooth обрывается несколько раз в час. В идеале у меня было бы от нескольких часов до суток между разорванными соединениями; это реальная цель?

Мое тестирование в течение нескольких дней показало:

  1. Средняя продолжительность соединения Mega#1 – 10 минут. Максимальная продолжительность 88 минут; 25 байт, отправляемых RPi->Arduino и Arduino->RPi каждые 0,2 секунды
  2. Средняя продолжительность подключения к Mega#2 – 38 минут. максимальная продолжительность 153 минуты; 4 байта отправляются RPi->Arduino и Arduino->RPi каждые 0,2 секунды

Во время этого тестирования они полностью неподвижны в пределах примерно 12 дюймов друг от друга, поэтому расстояние не должно быть проблемой.

Мой код RPi обнаруживает потерю соединения из-за невозможности получить сообщение в течение 5 секунд и пытается восстановить соединение, что успешно примерно в 80% случаев. У меня есть второй уровень восстановления потерянного соединения — сброс HC-05 через полевой МОП-транзистор, запускаемый Arduino — если сообщение не получено Arduino в течение ~ 20 секунд, это работает в остальных случаях, поэтому я В конечном итоге я могу систематически восстанавливаться максимум за 30 секунд. Однако эта потеря соединения примерно на 10–30 секунд каждые 10–60 минут приводит к ухудшению работы с моими пультами дистанционного управления.

Ошибки Python, указанные примерно для 95% сбоев, связаны с отсутствием получения сообщения пульса от Arduino к python RPi; около 5% дают неспецифическую ошибку [Errno 5] Ошибка ввода/вывода.

Пока я проверяю несколько теорий с помощью однодневных тестов стабильности (более длинные передачи байтов более подвержены ошибкам? в моем коде Arduino есть ошибка, вызывающая сбои, поэтому удалите всю логику, кроме кода отправки/получения для тестирования?) , я прочитал несколько сообщений о том, как привередливые & хрупкий bluetooth может быть, и поэтому мне любопытны некоторые мысли об общей цели / попытке получить долгосрочное (от часов до дня или более) соединение.

Удалось ли людям добиться этого с помощью HC-05 на Arduino? Или обрыв соединения каждые 10-60 минут — это просто то, с чем нужно иметь дело с помощью надежного кода? Спасибо.

, 👍0

Обсуждение

Говоря только о своем личном опыте, я обнаружил, что реализация Bluetooth на RPi (в частности, 3B+) практически бесполезна. Я потратил часы на устранение неполадок, но это никогда не было надежным, а во многих случаях вообще не подключалось. Прочитав другие вопросы на [RPi SE](https://raspberrypi.stackexchange.com/), я пришел к выводу, что у других был подобный опыт. Кроме того, я думаю, что это правда, что RPi 3B+ имеет только одну антенну для WiFi и BT, что, конечно, усложняет задачу, если вам нужны они оба., @Seamus


2 ответа


Лучший ответ:

0

В конце концов я нашел решение, но для пользы других хотел поделиться тестами, которые также не оказались плодотворными. TL;DR: уменьшение скорости передачи сообщений с Arduino на RPi решило проблему.

Мои гипотезы для проверки:

  1. Гипотеза: неверный код Arduino, написанный мной. Тест: удалить всю логику, кроме чтения/записи.
  2. Гипотеза: что-то связанное с размером сообщения. Тест: добавьте произвольные дополнительные 80 байтов к сообщению Mega#1.
  3. Гипотеза: слишком много мелких сообщений для RPi. Тест: уменьшите частоту сообщений.
  4. Гипотеза: проблема синхронизации или другая ошибка HC-05, предложенная @stefan-wyss. Тест: поменяйте местами модули с третьим.
  5. Гипотеза: неверный код Python для RPi, написанный мной. Тест: вернитесь к базовой тестовой программе Python, которая ничего не делает, кроме обмена сообщениями Bluetooth.

Гипотезы №1 и amp; № 2 не привел к заметной разнице в частоте отказов или характере отказа.

Тем не менее, гипотеза № 3 оказалась победителем: обе платы Arduino работали более 12 часов без разрывов связи. (Поэтому я не удосужился проверить #4 и #5).

В частности, в исходном "проблемном коде" каждую секунду отправлялось 20 сообщений (и 40 попыток чтения; я "разогнал" прием по отношению к отправке, убедитесь, что буферы не переполняются из-за незначительных вариаций в часах RPi и Arduino):

  • 5 отправок по 25 байт от Mega#1 в RPi в секунду
  • 5 отправок по 25 байт по RPi в Mega#1 в секунду
  • 5 отправок по 4 байта Mega#2 в RPi в секунду
  • 5 отправок по 4 байта по RPi в Mega#2 в секунду

Некоторым из них на самом деле не нужна была такая частота для достижения моих целей дизайна; поэтому я изменил на:

  • 1 отправляет 25 байтов от Mega#1 на RPi каждые 2 секунды
  • 5 отправок по 25 байт по RPi в Mega#1 в секунду
  • 1 отправляет 4 байта Mega#2 на RPi каждые 2 секунды
  • 5 отправок по 4 байта по RPi в Mega#2 в секунду

Итак, теперь вместо 10x в секунду RPi получает 1x в секунду. (Он по-прежнему пытается считывать 10 раз в секунду на каждом из двух Arduino, чтобы минимизировать задержку, но большинство из них не возвращают никаких данных). RPI по-прежнему должен отправлять 10x в секунду (5x на каждый из двух ардуино).

Это простое изменение решило проблему. Я не понимаю, почему RPi не может справиться с более высокой скоростью получения сообщений; некоторые тесты моего кода Python показали, что обработка полученных сообщений пульса не является узким местом. Но важная часть, по крайней мере для меня & проекта, заключается в том, что проблема решена.

,

0

Связь по Bluetooth работает с фиксированными временными интервалами, которые должны быть согласованы обоими партнерами на этапах рекламы и подключения. Таким соглашением может быть: «Пока на связи, давайте встречаться каждую секунду. Если кто-то не появится в течение 3-х встреч, давайте выйдем из состояния соединения».

Из этого видно, что синхронизация — очень важный фактор в Bluetooth-коммуникациях. Поэтому обоим партнерам по общению нужны очень точные часы. Не бывает двух часов с одинаковой скоростью, одни всегда отстают от других.

Возможно, один или несколько часов вашего HC-05 имеют слишком большой дрейф часов, поэтому соединение будет потеряно. Максимальное отклонение часов, допустимое для часов Bluetooth, составляет ±40 частей на миллион (то есть ±40 частей на миллион!) во всем диапазоне температур.

Вы можете проверить эту теорию на нескольких HC-05. Если отдельные модули приводят к разным длинам соединений, это может быть вашей проблемой.

,

Спасибо, Стефан - я добавлю это в список тестов и сообщу (даже если поделиться еще неизвестным) через несколько дней после того, как я проведу каждый тест в течение дня или около того. Ценить это., @David W

Вы также можете измерить часы непосредственно на кристалле, если у вас есть доступ к устройству измерения таймера/счетчика и пробнику с низкой емкостью (<1 пФ)., @Stefan Wyss