Связь с микроконтроллером

Одноплатный компьютер хорошо обрабатывает камеры, сеть, карту и сложную логику. Микроконтроллер лучше обслуживает энкодеры, быстрые датчики, PWM, аварийные входы и драйверы моторов. Между ними нужен понятный канал связи и протокол.
Компьютер отвечает за «куда ехать», микроконтроллер — за «как безопасно выполнить команду сейчас». Потеря связи должна обнаруживаться микроконтроллером, а не только программой на Linux.
Разделение ролей
| Задача | Одноплатный компьютер | Микроконтроллер |
|---|---|---|
| Камера и нейросеть | основная роль | обычно не выполняет |
| Карта и веб-интерфейс | основная роль | не требуется |
| Энкодеры | получает готовые данные | считает импульсы локально |
| Регулятор скорости | задаёт целевую скорость | выдерживает период и формирует PWM |
| Аварийный вход | отображает состояние | реагирует без ожидания Linux |
| Тайм-аут команд | ведёт журнал | обязан остановить привод |
| Телеметрия | сохраняет и показывает | отправляет компактный статус |
Если приложение на SBC зависло, перезапустилось или потеряло камеру, микроконтроллер не должен продолжать последнюю скорость бесконечно.
Каналы связи
| Канал | Преимущества | Ограничения | Когда выбирать |
|---|---|---|---|
| USB CDC ACM | один USB-кабель, в Linux виден как последовательный порт | имя устройства нужно закрепить, некоторые платы сбрасываются при открытии | платы находятся рядом, нужен простой старт |
| UART по GPIO | простой обмен байтами без USB-стека | нужны TX/RX/GND, уровни 3,3 В и короткое соединение | связь внутри корпуса |
| USB-UART адаптер | удобно для MCU без собственного USB CDC | нужно проверить уровень адаптера и постоянное имя | отладка или простая связь с UART |
| RS-485 | дифференциальная линия лучше переносит длинный кабель и помехи | нужны трансиверы и управление направлением | крупный робот или удалённый модуль |
| CAN | несколько узлов и диагностика ошибок на шине | нужны CAN-контроллеры, трансиверы и протокол верхнего уровня | распределённая система |
Для прямого UART нужны три обязательные связи: SBC TX -> MCU RX, SBC RX <- MCU TX, SBC GND <-> MCU GND. Если одна сторона работает на 5 В, а другая на 3,3 В, нужен подходящий преобразователь уровней.

Питание и двигатели
Связь данных не заменяет силовую схему. У робота обычно есть отдельные пути:
| Путь | Что питает |
|---|---|
| аккумулятор → стабилизатор SBC | одноплатный компьютер и его USB-устройства |
| аккумулятор → стабилизатор MCU | микроконтроллер и логика |
| аккумулятор → драйвер моторов | силовая часть привода |
| SBC ↔ MCU | команды и телеметрия |
| MCU → драйвер | PWM, направление, enable |
Силовой ток мотора не должен идти через GPIO, USB-порт или тонкую сигнальную землю. При общем аккумуляторе нужна правильная общая точка земли, фильтрация и проверка просадок при старте моторов.
Протокол сообщений
Строка вроде MOTOR 120 120 удобна для ручной отладки, но для движущегося робота лучше задать кадр с границами, длиной, номером и проверкой ошибки.
| Поле | Зачем нужно |
|---|---|
SOF | найти начало кадра в потоке байтов |
VERSION | отличить версии протокола |
TYPE | понять тип команды или телеметрии |
SEQ | заметить повтор, потерю или запаздывание |
LEN | знать длину полезной нагрузки |
PAYLOAD | передать скорость, режим или статус |
CRC | обнаружить случайное повреждение кадра |
CRC не защищает от злоумышленника и не шифрует данные. Он нужен для обнаружения случайной ошибки передачи. Если робот управляется по недоверенной сети, безопасность проектируют отдельно.
Heartbeat и failsafe
Heartbeat — короткое регулярное сообщение «связь жива». Микроконтроллер хранит время последней корректной команды или heartbeat. Если время ожидания превышено, он переходит в безопасное состояние.
Типовое поведение при потере связи:
- сбросить разрешение движения;
- задать нулевую или заранее безопасную команду приводу;
- сохранить причину ошибки;
- ждать нового согласования, а не повторять старую скорость.
После переподключения компьютер не должен сразу восстанавливать движение. Сначала стороны проверяют версию протокола, состояние контроллера и явное разрешение.
Что проверить перед запуском
| Проверка | Зачем она нужна |
|---|---|
| Канал определён точно | USB CDC, UART, RS-485 и CAN требуют разной схемы. |
| Уровни совместимы | 5 В UART может повредить GPIO 3,3 В. |
| Постоянное имя порта | /dev/ttyUSB0 или /dev/ttyACM0 могут поменяться. |
| Есть границы кадра | Потерянный байт не должен сдвигать все команды. |
| Есть тайм-аут | Старая команда не остаётся активной навсегда. |
| MCU останавливает привод сам | Безопасность не зависит только от Linux-процесса. |
| Питание проверено под нагрузкой | Моторы не должны перезапускать SBC или MCU. |
Практика
Опишите кадр команды движения с полями начала, версии, типа, номера, длины, двух скоростей и CRC. Затем разберите три случая: потерян один байт, дважды пришёл один номер кадра, heartbeat отсутствует дольше тайм-аута. Для каждого случая запишите реакцию микроконтроллера.
Результат считается безопасным, если при повреждённом кадре команда не выполняется, повтор обнаруживается, а при тайм-ауте микроконтроллер сам отключает движение и не возобновляет его без нового разрешения.
Проверьте себя
- Почему камеру удобно оставить SBC, а управление мотором — MCU?
- Какие линии нужны для прямого UART?
- Чем USB CDC отличается от USB-UART адаптера?
- Зачем кадру нужны начало, длина и CRC?
- Что обнаруживает номер последовательности?
- Кто должен остановить моторы при зависании Linux?
- Почему после переподключения нельзя сразу продолжать старую команду?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- Кадр — сообщение с определёнными границами и набором полей.
- CRC — контрольное значение для обнаружения случайного повреждения данных.
- Номер последовательности — счётчик, помогающий увидеть повтор или потерю кадра.
- Heartbeat — регулярное короткое сообщение о том, что связь продолжает работать.
- Failsafe — переход в безопасное состояние при отказе или тайм-ауте.