Перейти к основному содержимому

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

Одноплатный компьютер и микроконтроллер совместно управляют приводом

Одноплатный компьютер хорошо обрабатывает камеры, сеть, карту и сложную логику. Микроконтроллер лучше обслуживает энкодеры, быстрые датчики, 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 В, нужен подходящий преобразователь уровней.

Канал связи, USB-UART и структура безопасного кадра

Питание и двигатели

Связь данных не заменяет силовую схему. У робота обычно есть отдельные пути:

ПутьЧто питает
аккумулятор → стабилизатор 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. Если время ожидания превышено, он переходит в безопасное состояние.

Типовое поведение при потере связи:

  1. сбросить разрешение движения;
  2. задать нулевую или заранее безопасную команду приводу;
  3. сохранить причину ошибки;
  4. ждать нового согласования, а не повторять старую скорость.

После переподключения компьютер не должен сразу восстанавливать движение. Сначала стороны проверяют версию протокола, состояние контроллера и явное разрешение.

Что проверить перед запуском

ПроверкаЗачем она нужна
Канал определён точноUSB CDC, UART, RS-485 и CAN требуют разной схемы.
Уровни совместимы5 В UART может повредить GPIO 3,3 В.
Постоянное имя порта/dev/ttyUSB0 или /dev/ttyACM0 могут поменяться.
Есть границы кадраПотерянный байт не должен сдвигать все команды.
Есть тайм-аутСтарая команда не остаётся активной навсегда.
MCU останавливает привод самБезопасность не зависит только от Linux-процесса.
Питание проверено под нагрузкойМоторы не должны перезапускать SBC или MCU.

Практика

Опишите кадр команды движения с полями начала, версии, типа, номера, длины, двух скоростей и CRC. Затем разберите три случая: потерян один байт, дважды пришёл один номер кадра, heartbeat отсутствует дольше тайм-аута. Для каждого случая запишите реакцию микроконтроллера.

Результат считается безопасным, если при повреждённом кадре команда не выполняется, повтор обнаруживается, а при тайм-ауте микроконтроллер сам отключает движение и не возобновляет его без нового разрешения.

Проверьте себя

  1. Почему камеру удобно оставить SBC, а управление мотором — MCU?
  2. Какие линии нужны для прямого UART?
  3. Чем USB CDC отличается от USB-UART адаптера?
  4. Зачем кадру нужны начало, длина и CRC?
  5. Что обнаруживает номер последовательности?
  6. Кто должен остановить моторы при зависании Linux?
  7. Почему после переподключения нельзя сразу продолжать старую команду?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Кадр — сообщение с определёнными границами и набором полей.
  • CRC — контрольное значение для обнаружения случайного повреждения данных.
  • Номер последовательности — счётчик, помогающий увидеть повтор или потерю кадра.
  • Heartbeat — регулярное короткое сообщение о том, что связь продолжает работать.
  • Failsafe — переход в безопасное состояние при отказе или тайм-ауте.

Связанные темы

Источники