Урок 10 из 18 · Модуль 3. DroneCAN на практике: устройства и настройка в ArduPilot
Протоколы в БАС: полный курс · Урок 10 из 18 · Модуль 3. Шины датчиков: I²C, SPI, CAN
Что реально подключают по DroneCAN: ESC, GPS, датчики воздушной скорости, модули питания — и как это настраивается в ArduPilot.
Все узлы шины должны работать на одной скорости (обычно 1 Мбит/с) и иметь уникальные node ID. Потеря терминатора проявляется нестабильной работой шины, а не полным обрывом.
Содержание
1. Цели урока
После этого урока вы сможете:
- перечислять устройства DroneCAN и их преимущества по сравнению с классическим подключением;
- объяснять, что такое node ID и как его назначают;
- включать и настраивать DroneCAN в ArduPilot:
CAN_P1_DRIVER,CAN_D1_PROTOCOL; - работать с узлами в Mission Planner: Setup → Optional Hardware → DroneCAN/UAVCAN;
- диагностировать типовые ошибки настройки DroneCAN.
2. DroneCAN на практике
DroneCAN (до 2022 года — UAVCAN v0) — открытый прикладной протокол поверх CAN-шины, разработанный специально для БпЛА. Он определяет стандартные типы сообщений: команды газа для ESC, координаты GPS, данные барометра, состояние батареи и многое другое. Именно благодаря стандартизации оборудование разных производителей (Holybro, CUAV, Zubax, Matek) работает на одной шине без дополнительных адаптеров.
DroneCAN: что реально подключают
Проводное подключение DroneCAN-регуляторов к шине CAN (схема из официальной документации ArduPilot). Каждый ESC — узел шины со своим node ID: провода CAN_H и CAN_L идут последовательно от устройства к устройству, терминаторы — на концах. Один и тот же жгут обслуживает и управление моторами, и телеметрию (обороты, ток, температуру).
| Устройство | Примеры | Что даёт по сравнению с «обычным» подключением |
|---|---|---|
| ESC | Holybro Kotleta20, CUAV, Vimdrones S50, Zubax Myxa | управление + телеметрия (обороты/ток/температура) по одной паре проводов; индивидуальный контроль и диагностика каждого ESC |
| GPS/ГЛОНАСС | Holybro H-RTK F9P CAN, Matek M10-CAN | RTK-приёмники с точностью до сантиметра; питание и данные по одному жгуту вместо отдельных UART и питания |
| Датчик воздушной скорости | Holybro DroneCAN Airspeed, Matek ASPD-CAN | трубка Пито для самолётов и VTOL; цифровой сигнал вместо аналогового, без дрейфа нуля |
| Модуль питания | Holybro DroneCAN Power Module, CUAV CAN PMU | напряжение и ток батареи цифрой вместо аналоговых делителей — точнее и без калибровки под конкретный экземпляр |
| Сервоприводы | DroneCAN Servo Node, Volz DA 22 | сервы в хвосте самолёта — без метровых PWM-проводов через весь фюзеляж; обратная связь по положению |
| Дальномеры | DroneCAN Rangefinder, Lightware SF45 | лидар для точной посадки и облёта препятствий; цифровой интерфейс без аналоговых искажений |
Топология шины: как выглядит реальный жгут
DroneCAN использует топологию «цепочка» (daisy chain): устройства подключаются последовательно, провода CAN_H и CAN_L идут от одного узла к следующему. Терминаторы по 120 Ом устанавливаются только на крайних узлах — полётном контроллере и последнем устройстве в цепочке.
VCC — CAN_H — CAN_L — GND.Node ID: адресация узлов
Каждый узел на шине DroneCAN должен иметь уникальный node ID — целое число от 1 до 127. Node ID 0 зарезервирован (используется при динамическом назначении). Node ID 127 традиционно резервируется для наземных инструментов (ноутбук с DroneCAN GUI Tool).
Существует два способа назначения node ID:
1. Статическое назначение (вручную). Node ID прошивается в память устройства через его конфигуратор или через Mission Planner. Рекомендуется для производственных аппаратов: после настройки ID не меняется при перезагрузке.
2. Динамическое назначение (DNA — Dynamic Node ID Allocation). Устройство включается без node ID, отправляет запрос на шину. ArduPilot (или другой allocator) назначает ему свободный ID и запоминает его по hardware ID устройства. При следующем включении устройство получит тот же ID автоматически. Это удобно при первом подключении нового оборудования.
После подключения нового устройства откройте Mission Planner → Setup → Optional Hardware → DroneCAN/UAVCAN и нажмите SLCan Mode CAN1. Через несколько секунд в списке появятся все узлы шины с их node ID, hardware ID и версией прошивки. Здесь же можно назначить node ID вручную и обновить прошивку узла.
Настройка в ArduPilot
Настройка выполняется через Mission Planner → Config → Full Parameter List. Все параметры CAN применяются после перезагрузки полётного контроллера.
-
Включить драйвер CAN-порта.
CAN_P1_DRIVER = 1— активирует первый CAN-порт. Если на ФК два порта CAN и нужно использовать оба:CAN_P2_DRIVER = 1. Значение 0 означает «порт отключён».
-
Выбрать протокол.
CAN_D1_PROTOCOL = 1— протокол DroneCAN на первом порту. Значение 8 — UAVCAN v1 (Cyphal, новая версия протокола, пока редко встречается в серийном оборудовании). -
Проверить скорость шины.
CAN_D1_BAUDRATE = 1000000— стандартная скорость 1 Мбит/с. Все устройства на шине должны работать на одной скорости. Если хотя бы одно устройство настроено на другую скорость — шина не будет работать. -
Для CAN-GPS.
GPS1_TYPE = 9— указывает ArduPilot искать GPS-данные по DroneCAN. При наличии двух GPS-модулей:GPS2_TYPE = 9. Дополнительно убедитесь, что у каждого GPS-модуля уникальный node ID.
Параметр GPS_TYPE существовал в ArduPilot до версии 4.5 включительно и был удалён в 4.6. В версии 4.7 используется только GPS1_TYPE и GPS2_TYPE -
Для CAN-ESC.
CAN_D1_UC_ESC_BM— битовая маска, указывающая какие моторы управляются через DroneCAN. Например, для четырёх моторов:15(двоичное0b00001111). Каждый бит соответствует номеру мотора. -
Перезагрузить ФК и проверить узлы.
Mission Planner → Setup → Optional Hardware → DroneCAN/UAVCAN → SLCan Mode CAN1. В таблице должны появиться все подключённые устройства.
Типовые ошибки настройки и их устранение
| Симптом | Вероятная причина | Способ устранения |
|---|---|---|
| Узлы не появляются в DroneCAN/UAVCAN после перезагрузки | CAN_P1_DRIVER = 0 (порт не активирован); протокол не выбран; неверная скорость шины |
проверить CAN_P1_DRIVER = 1 и CAN_D1_PROTOCOL = 1; убедиться что все устройства на 1 Мбит/с; перезагрузить ФК |
| Узлы видны, но GPS не появляется в статусе | GPS1_TYPE не установлен в 9; node ID GPS конфликтует с другим устройством |
установить GPS1_TYPE = 9; проверить уникальность node ID через DroneCAN/UAVCAN инспектор |
| ESC виден на шине, но моторы не реагируют | неверная маска CAN_D1_UC_ESC_BM; node ID ESC не совпадает с номером мотора |
установить корректную маску; назначить ESC node ID равный номеру мотора (мотор 1 → node ID 1 и т.д.) |
| Два узла конфликтуют (один или оба не отвечают) | одинаковый node ID | в DroneCAN/UAVCAN инспекторе выбрать конфликтующий узел, назначить новый уникальный node ID; перезагрузить устройство |
| Узлы периодически пропадают из инспектора | отсутствует один терминатор (120 Ом вместо 60 Ом); плохой контакт в разъёмах | замерить сопротивление CAN_H–CAN_L при отключённом питании: должно быть 60 Ом; проверить разъёмы JST-GH |
| Все узлы пропали после подключения нового устройства | новое устройство настроено на другую скорость шины (например, 500 кбит/с вместо 1 Мбит/с) | подключить новое устройство отдельно, выставить скорость 1 Мбит/с через его конфигуратор, затем подключить к шине |
💻 Для программиста
Для работы с DroneCAN есть два основных инструмента:
- libcanard (C99) — минималистичная библиотека, используемая в ArduPilot и PX4. Работает без ОС, подходит для встраиваемых систем. Реализует сериализацию/десериализацию DSDL-сообщений и базовый транспортный уровень.
- pycyphal (Python) — удобна для наземных стендов, тестовых скриптов и диагностических инструментов. Подключаете USB-CAN адаптер (например, Zubax Babel или SLCAN-совместимый), слушаете трафик на шине, отправляете команды — принципы DroneCAN становятся наглядными без написания прошивки.
Типы сообщений описаны в DSDL-файлах (Data Structure Description Language) — по аналогии с IDL в других протоколах. Примеры: uavcan.equipment.esc.RPMCommand (команда оборотов), uavcan.equipment.gnss.Fix2 (координаты GPS), uavcan.equipment.power.BatteryInfo (состояние батареи). Все типы открыты и задокументированы в репозитории DSDL на GitHub.
3. Чек-лист самопроверки
Урок освоен, если каждый пункт выполнен на практике:
- Подключил CAN-GPS (
GPS1_TYPE = 9) и увидел фикс в Mission Planner - Открыл DroneCAN/UAVCAN инспектор и вижу все узлы с их node ID
- Знаю, где менять node ID и обновлять прошивки узлов
- Могу объяснить разницу между статическим и динамическим назначением node ID
- Понимаю, чем DroneCAN-ESC лучше PWM/DShot на больших аппаратах
4. Что дальше
- Предыдущий урок: Урок 9. CAN: физика шины и арбитраж
- Следующий урок: Урок 11. PWM: сервы и классические ESC
- Полный перечень тем — в статье «Содержание курса».
Сводка актуальных параметров для ArduPilot 4.6+
| Старый параметр (≤4.5) | Новый параметр (4.6+) | Значение для DroneCAN |
|---|---|---|
| GPS_TYPE | GPS1_TYPE | 9 |
| GPS_TYPE2 | GPS2_TYPE | 9 |
| GPS_DELAY_MS | GPS1_DELAY_MS | — |
| GPS_POS1_X | GPS1_POS_X | — |


