Конфликт I2C в ArduPilot: диагностика и решение

Конфликт I2C — это проблема общей шины, а не только случай «GPS с компасом мешает барометру». Два устройства могут мешать друг другу из-за одинакового аппаратного адреса, неисправной проводки, питания или неверной электрической нагрузки на SDA/SCL.

Ниже — безопасный алгоритм диагностики для ArduPilot и Mission Planner. Он помогает сначала локализовать физическую причину, а уже потом менять параметры или оборудование.

Схема ниже показывает причинную цепочку: общая I2C-шина → тип конфликта → симптом в Mission Planner → следующий диагностический шаг.

Как устроен конфликт I2CИнженерная схема: общая шина I2C, адресный и электрический конфликт, симптомы в Mission Planner и порядок диагностики.Как устроен конфликт I2CСначала причина — потом параметры1. Одна шина — несколько устройствArduPilotSDASCLКомпас0x1EБаро0x76Норма:устройства на общей шине имеют разные адреса.2. Два разных класса проблемАдресный конфликтДва устройства отвечают на один адрес.0x1E + 0x1E → конфликтЭлектрическая проблемаПитание, КЗ, плохой контакт или pull-upмогут сорвать работу всей шины.Y-splitter не создаёт вторую I2C-шину.3. Что показывает Mission PlannerGPS: 3D Fix / OKCompass 2: not healthyBaro: not healthyPreArm: sensor not healthyMission Planner показывает следствие:какой датчик пропал или стал unhealthy.4. Диагностика по порядку1Вернуть рабочую конфигурацию2Подключать устройства по одному3Проверить: одна физическая шина?4Сверить реальные аппаратные адреса5Проверить SDA, SCL, GND, питание, pull-upЕсли адреса совпали:другая шина / смена адреса / замена устройства
Схема диагностики I2C: сначала отделяем адресный конфликт от проблем проводки, питания и подтяжек.

Ключевой тест: если устройство 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, чтобы назначить периферии другой аппаратный адрес.

Алгоритм диагностики: от симптома к причине

  1. Сохраните параметры и снимите пропеллеры. Не отключайте PreArm-проверки ради скрытия ошибки.
  2. Верните рабочую базовую конфигурацию. Отключите новый модуль, полностью перезапустите контроллер и убедитесь, что исходные датчики снова стабильны.
  3. Подключайте устройства по одному. После каждого изменения делайте полный перезапуск и записывайте, какие сенсоры появились или исчезли.
  4. Определите физическую I2C-шину. Два разъёма на плате могут быть параллельными выводами одних SDA/SCL, а могут относиться к разным шинам.
  5. Сверьте аппаратные адреса. Берите их из документации конкретных сенсоров и модулей.
  6. Проверьте SDA, SCL, GND и питание. Не ориентируйтесь только на цвета проводов; сверяйте распиновку обоих устройств.
  7. Проверьте pull-up. Подтяжки могут уже находиться на полётном контроллере и на периферии. ArduPilot отдельно предупреждает, что наличие и требуемая схема подтяжек зависят от платы и устройств.
  8. После исправления повторите несколько холодных запусков. Набор обнаруженных сенсоров и PreArm-состояние должны быть воспроизводимыми.

Диагностический маршрут

  1. Зафиксировать симптом в Mission Planner.
  2. Вернуть базовую рабочую конфигурацию.
  3. Проверить устройство A отдельно.
  4. Проверить устройство B отдельно.
  5. Подключить A + B.
  6. Если проблема появляется только вместе — проверить общую шину, адреса и электрическую часть.

Если адреса действительно совпадают

Развести устройства по независимым 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 → только после этого менять расширенные параметры или железо.

Что читать дальше

Официальная документация

Номера I2C-шин, доступность внешних портов, pull-up и набор поддерживаемых сенсоров зависят от конкретного полётного контроллера и версии ArduPilot. Для финальной схемы всегда сверяйтесь с документацией своей платы.

Прокрутить вверх
На связи