Долгосрочная стабильность соединения Bluetooth
У меня есть две платы Arduino Mega с HC-05 на Serial1, подключенные к Raspberry Pi 3b+ через Bluetooth, с использованием HC-05 и встроенного Bluetooth RPi, а также библиотеки pySerialTransfer
Python для создания связи.
По причинам, которые я все еще пытаюсь выяснить, соединение Bluetooth обрывается несколько раз в час. В идеале у меня было бы от нескольких часов до суток между разорванными соединениями; это реальная цель?
Мое тестирование в течение нескольких дней показало:
- Средняя продолжительность соединения Mega#1 – 10 минут. Максимальная продолжительность 88 минут; 25 байт, отправляемых RPi->Arduino и Arduino->RPi каждые 0,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 минут — это просто то, с чем нужно иметь дело с помощью надежного кода? Спасибо.
@David W, 👍0
Обсуждение2 ответа
Лучший ответ:
В конце концов я нашел решение, но для пользы других хотел поделиться тестами, которые также не оказались плодотворными. TL;DR: уменьшение скорости передачи сообщений с Arduino на RPi решило проблему.
Мои гипотезы для проверки:
- Гипотеза: неверный код Arduino, написанный мной. Тест: удалить всю логику, кроме чтения/записи.
- Гипотеза: что-то связанное с размером сообщения. Тест: добавьте произвольные дополнительные 80 байтов к сообщению Mega#1.
- Гипотеза: слишком много мелких сообщений для RPi. Тест: уменьшите частоту сообщений.
- Гипотеза: проблема синхронизации или другая ошибка HC-05, предложенная @stefan-wyss. Тест: поменяйте местами модули с третьим.
- Гипотеза: неверный код 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 показали, что обработка полученных сообщений пульса не является узким местом. Но важная часть, по крайней мере для меня & проекта, заключается в том, что проблема решена.
Связь по Bluetooth работает с фиксированными временными интервалами, которые должны быть согласованы обоими партнерами на этапах рекламы и подключения. Таким соглашением может быть: «Пока на связи, давайте встречаться каждую секунду. Если кто-то не появится в течение 3-х встреч, давайте выйдем из состояния соединения».
Из этого видно, что синхронизация — очень важный фактор в Bluetooth-коммуникациях. Поэтому обоим партнерам по общению нужны очень точные часы. Не бывает двух часов с одинаковой скоростью, одни всегда отстают от других.
Возможно, один или несколько часов вашего HC-05 имеют слишком большой дрейф часов, поэтому соединение будет потеряно. Максимальное отклонение часов, допустимое для часов Bluetooth, составляет ±40 частей на миллион (то есть ±40 частей на миллион!) во всем диапазоне температур.
Вы можете проверить эту теорию на нескольких HC-05. Если отдельные модули приводят к разным длинам соединений, это может быть вашей проблемой.
Спасибо, Стефан - я добавлю это в список тестов и сообщу (даже если поделиться еще неизвестным) через несколько дней после того, как я проведу каждый тест в течение дня или около того. Ценить это., @David W
Вы также можете измерить часы непосредственно на кристалле, если у вас есть доступ к устройству измерения таймера/счетчика и пробнику с низкой емкостью (<1 пФ)., @Stefan Wyss
- Как подключить arduino к raspberry pi через модуль Bluetooth HC 05 и передавать данные?
- Проблемы с надежным подключением с использованием HC-05 в качестве ведущего устройства Bluetooth
- Bluetooth-модуль HC-05 неправильно считывает данные с моего телефона Android
- Мой модуль Bluetooth HC-05 не работает
- Проблемы с последовательной связью от Arduino к Bluetooth HC-05
- Соединение Bluetooth с HC-05 сопряжено, но не подключено (в Linux)
- Не удается вручную подключить ведущий HC-05 к подчиненному.
- Модуль HC-05 не получает команд и не спаривается
Говоря только о своем личном опыте, я обнаружил, что реализация Bluetooth на RPi (в частности, 3B+) практически бесполезна. Я потратил часы на устранение неполадок, но это никогда не было надежным, а во многих случаях вообще не подключалось. Прочитав другие вопросы на [RPi SE](https://raspberrypi.stackexchange.com/), я пришел к выводу, что у других был подобный опыт. Кроме того, я думаю, что это правда, что RPi 3B+ имеет только одну антенну для WiFi и BT, что, конечно, усложняет задачу, если вам нужны они оба., @Seamus