Конфликт I2C в ArduPilot: диагностика и решение
Конфликт I2C — это проблема общей шины, а не только случай «GPS с компасом мешает барометру». Два устройства могут мешать друг другу из-за одинакового аппаратного адреса, неисправной проводки, питания или неверной электрической нагрузки на SDA/SCL.
Ниже — безопасный алгоритм диагностики для ArduPilot и Mission Planner. Он помогает сначала локализовать физическую причину, а уже потом менять параметры или оборудование.
Схема ниже показывает причинную цепочку: общая I2C-шина → тип конфликта → симптом в Mission Planner → следующий диагностический шаг.
Ключевой тест: если устройство A работает отдельно, устройство B работает отдельно, а вместе они пропадают или становятся нестабильными, сначала выясните, действительно ли они находятся на одной физической I2C-шине. Затем проверяйте адреса, проводку, питание и pull-up. Пассивный splitter адресный конфликт не устраняет.
Что именно конфликтует в I2C
Адресный конфликт
Два устройства на одной физической шине отвечают на один и тот же I2C-адрес. Контроллер не может однозначно работать с ними как с двумя независимыми устройствами.
Характерный признак: каждый модуль по отдельности работает, а при совместном подключении один или оба перестают определяться либо становятся нестабильными.
Электрическая проблема шины
Неисправный модуль, перепутанные линии, короткое замыкание, плохой контакт или некорректные подтяжки могут нарушить уровни SDA/SCL. Тогда после подключения одного устройства может исчезнуть сразу несколько датчиков.
I2C использует общие линии SDA для данных и SCL для тактирования. Несколько устройств подключаются параллельно и различаются по адресам. У конкретной платы нужно отдельно проверить, являются ли разные разъёмы независимыми шинами или лишь параллельными выводами одной и той же SDA/SCL. Документация ArduPilot по входам/выходам автопилота.
Какие устройства могут конфликтовать
- внешние компасы и магнитометры;
- внешние барометры;
- некоторые цифровые датчики воздушной скорости;
- некоторые дальномеры;
- другая внешняя I2C-периферия;
- несколько модулей одного типа.
Не любой пропавший барометр означает I2C-конфликт. Внутренний барометр на многих контроллерах работает по SPI. Если такой датчик пропал после подключения внешнего I2C-модуля, одинаковый I2C-адрес с ним невозможен: проверяйте питание, короткое замыкание, разъём и разводку конкретной платы.
Как проблема выглядит в Mission Planner
Mission Planner обычно показывает не причину «I2C address conflict», а следствие: конкретный датчик не обнаружен, перестал обновляться или стал unhealthy.
GPS: 3D Fix / OK
Compass 2: not healthy
Baro: not healthy
PreArm: Compass 2 not healthy
PreArm: Baro: not healthy
Что проверять в интерфейсе
- PreArm / HUD. Зафиксируйте первое конкретное сообщение, а не отключайте проверку ради армирования.
- Compass Setup. Смотрите, исчез ли ранее рабочий внешний компас после подключения нового модуля и стабилен ли список после перезагрузки.
- Full Parameter Tree / List. Сравнивайте идентификаторы обнаруженных устройств до и после изменения конфигурации.
DEV_ID — не «чистый I2C-адрес». Это сформированный ArduPilot идентификатор устройства. Не пытайтесь вручную менять COMPASS_DEV_ID* или BARO*_DEVID, чтобы назначить периферии другой аппаратный адрес.
Алгоритм диагностики: от симптома к причине
- Сохраните параметры и снимите пропеллеры. Не отключайте PreArm-проверки ради скрытия ошибки.
- Верните рабочую базовую конфигурацию. Отключите новый модуль, полностью перезапустите контроллер и убедитесь, что исходные датчики снова стабильны.
- Подключайте устройства по одному. После каждого изменения делайте полный перезапуск и записывайте, какие сенсоры появились или исчезли.
- Определите физическую I2C-шину. Два разъёма на плате могут быть параллельными выводами одних SDA/SCL, а могут относиться к разным шинам.
- Сверьте аппаратные адреса. Берите их из документации конкретных сенсоров и модулей.
- Проверьте SDA, SCL, GND и питание. Не ориентируйтесь только на цвета проводов; сверяйте распиновку обоих устройств.
- Проверьте pull-up. Подтяжки могут уже находиться на полётном контроллере и на периферии. ArduPilot отдельно предупреждает, что наличие и требуемая схема подтяжек зависят от платы и устройств.
- После исправления повторите несколько холодных запусков. Набор обнаруженных сенсоров и PreArm-состояние должны быть воспроизводимыми.
Диагностический маршрут
- Зафиксировать симптом в Mission Planner.
- Вернуть базовую рабочую конфигурацию.
- Проверить устройство A отдельно.
- Проверить устройство B отдельно.
- Подключить A + B.
- Если проблема появляется только вместе — проверить общую шину, адреса и электрическую часть.
Если адреса действительно совпадают
Развести устройства по независимым I2C-шинам
Это прямое решение, если конкретный полётный контроллер действительно имеет несколько независимых шин, доступных для нужной периферии.
Изменить аппаратный адрес
Некоторые сенсоры позволяют выбрать адрес перемычкой, выводом ADDR/SA0 или другой схемой, предусмотренной производителем. Используйте только метод из документации конкретного модуля.
Использовать поддерживаемый мультиплексор
I2C-мультиплексор подходит только для архитектур, где выбранное устройство и программная схема действительно поддерживаются. Не считайте его универсальной заменой второй аппаратной шины.
Заменить один модуль
Для полётной системы это часто проще и надёжнее, чем усложнять проводку ради двух устройств с одинаковыми фиксированными адресами.
Пассивный Y-splitter не создаёт вторую I2C-шину. Он лишь подключает дополнительные разъёмы к тем же SDA и SCL. Если два устройства имеют одинаковый фиксированный адрес, splitter адреса не разделит.
Частный случай: GPS + компас
В комбинированном модуле GPS + compass часто одновременно используются два разных интерфейса: GPS-приёмник работает по UART, а компас — по I2C. Питание и корпус при этом могут быть общими. Поэтому наличие 3D Fix подтверждает работу GPS-части, но ничего не доказывает о состоянии I2C-компаса. Схема типичных подключений ArduPilot.
- GPS: UART, TX/RX;
- компас: I2C, SDA/SCL;
- питание и земля: могут быть общими;
- диагностировать интерфейсы нужно раздельно.
Практический тест: если конструкция разъёма позволяет сделать это безопасно, оставьте питание и UART GPS, но временно исключите SDA/SCL компаса. Если GPS продолжает работать, а другой I2C-датчик возвращается, проблема локализована в I2C-ветке компаса либо в электрическом влиянии этого модуля.
Какие параметры полезны при диагностике
Параметры не исправляют физический адресный конфликт. Их задача здесь — помочь понять, какие устройства ArduPilot обнаружил и какой экземпляр использует.
COMPASS_DEV_ID*иCOMPASS_PRIO*_ID— помогают сравнить состав обнаруженных компасов и их приоритет.BARO*_DEVID— помогает идентифицировать обнаруженные экземпляры барометра.BARO_PRIMARY— выбирает основной экземпляр среди уже обнаруженных барометров; физическую неисправность шины не устраняет.
Расширенные параметры probe/bus и driver-mask зависят от версии ArduPilot и конкретной платы. Не меняйте их как универсальный «фикс I2C». Сначала подтвердите топологию шины и аппаратную причину, затем сверяйтесь с актуальным списком параметров.
Что не нужно делать
- отключать PreArm вместо устранения причины;
- считать любой пропавший датчик адресным конфликтом;
- менять
DEV_IDвручную ради смены аппаратного адреса; - считать пассивный splitter независимой шиной;
- добавлять pull-up наугад;
- менять сразу много параметров;
- путать напряжение питания разъёма с логическим уровнем SDA/SCL;
- доверять цветам проводов без проверки распиновки.
Быстрое дерево решений
A работает, B работает, A + B не работают
Проверьте: одна ли это физическая шина → совпадают ли аппаратные адреса → корректна ли электрическая часть и pull-up.
После подключения одного модуля исчезают сразу несколько датчиков
Сначала ищите электрическую проблему: распиновку, короткое замыкание, зависшую SDA/SCL, питание и землю.
GPS работает, а компас из того же корпуса — нет
Диагностируйте UART GPS и I2C-компас раздельно.
Внутренний SPI-барометр пропал после подключения I2C-модуля
Совпадение I2C-адресов с этим внутренним SPI-датчиком исключается. Проверяйте питание, замыкание и разводку платы.
Итоговый порядок: симптом в Mission Planner → определить пропавший датчик → вернуть рабочую базовую конфигурацию → подключать устройства по одному → определить физическую I2C-шину → сверить аппаратные адреса → проверить SDA/SCL, питание и pull-up → только после этого менять расширенные параметры или железо.
Что читать дальше
- Раздел ArduPilot — настройка, интеграция и диагностика.
- Инструменты ArduPilot — Mission Planner, WebTools и анализ.
- Инженерный workflow — baseline → проверка → лог → изменение → подтверждение.
Официальная документация
- Advanced Compass Setup
- Pre-Arm Safety Checks
- Autopilot Inputs and Outputs / I2C
- External Barometer
- Complete Parameter List
Номера I2C-шин, доступность внешних портов, pull-up и набор поддерживаемых сенсоров зависят от конкретного полётного контроллера и версии ArduPilot. Для финальной схемы всегда сверяйтесь с документацией своей платы.
