Работа с CAN на роботе
На платформе BRover E5 используется шина CAN (Controller Area Network) — промышленный протокол обмена данными между устройствами в реальном времени. Он широко применяется в робототехнике, автомобилях и встраиваемых системах благодаря своей надёжности, устойчивости к помехам и детерминированному поведению.
CAN позволяет объединять контроллеры, датчики и исполнительные устройства в единую сеть, где каждое устройство может передавать и принимать сообщения без центрального управляющего узла.
CAN-интерфейсы на роботе
На Raspberry Pi, установленной в BRover E5, доступны два CAN-интерфейса:
can0 — системный интерфейс
Интерфейс can0 используется внутренними компонентами робота:
- связь с драйверами моторов
- обмен данными с контроллерами платформы
- управление движением и телеметрией
can1 — пользовательский интерфейс
Интерфейс can1 предназначен для подключения внешних устройств и разработки собственных решений.
Через него можно:
- подключать датчики и микроконтроллеры
- отправлять и принимать CAN-сообщения
- интегрировать CAN с ROS 2 (через ноды-посредники)
- реализовывать собственные протоколы обмена
Этот интерфейс полностью изолирован от системного (can0) и безопасен для экспериментов.
Параметры CAN-шины
На роботе используется расширенный режим CAN FD (Flexible Data-rate), который позволяет передавать больше данных за одно сообщение по сравнению с классическим CAN.
Основные параметры:
- Тип: CAN FD
- Bitrate (арбитражная скорость): 1 000 000 бит/с
- Dbitrate (скорость передачи данных): 8 000 000 бит/с
Интерфейсы обычно запускаются автоматически при загрузке системы.
Ручное управление интерфейсом
Если необходимо вручную включить интерфейс can1:
sudo ip link set can1 up txqueuelen 65535 type can bitrate 1000000 dbitrate 8000000 fd on
Пояснение параметров:
bitrate— скорость арбитража (основной канал управления)dbitrate— скорость передачи данных в режиме CAN FDfd on— включает режим CAN FD
Отключение интерфейса:
sudo ifconfig can1 down
Утилиты для работы с CAN
В системе предустановлен пакет can-utils — стандартный набор инструментов для диагностики и работы с CAN.
Отправка сообщений
cansend can1 <ID>#<DATA>
<ID>— идентификатор сообщения (в hex)<DATA>— полезная нагрузка
Используется расширенный 29-битный идентификатор, поэтому ID обычно задаётся 8 hex-символами.
Пример:
cansend can1 00000012#DEADBEEF
Прослушивание шины
Чтобы увидеть все сообщения:
candump can1
Фильтрация по ID:
candump can1,0x12:7ff
Это полезно при отладке, когда необходимо отслеживать конкретные сообщения.
Проверка состояния интерфейса
ip -details link show can1
Команда выводит:
- текущее состояние интерфейса
- режим работы (включён ли CAN FD)
- статистику передачи
- счётчики ошибок
Если система работает корректно — счётчики ошибок будут равны 0.

Как правильно тестировать CAN
Работа CAN-шины имеет важную особенность: сообщение считается доставленным только при наличии подтверждения (ACK) от другого устройства.
❌ Неправильный способ
Отправка и приём на одном интерфейсе:
cansend can1 00000012#DEADBEEF
candump can1
В этом случае вы можете увидеть сообщение, но это не гарантирует, что оно действительно прошло по шине.
Причина — механизм loopback (эхо), при котором драйвер может отразить отправленный кадр обратно.
✅ Правильные способы
Вариант 1: два интерфейса (временно)
Соедините can0 и can1 физически:
- CAN_H → CAN_H
- CAN_L → CAN_L
И выполните:
- отправка в
can1 - приём в
can0
Вариант 2: внешнее устройство
Подключите отдельный CAN-узел:
- микроконтроллер
- CAN-модуль
- другое устройство
Если сообщения успешно принимаются другим устройством — шина работает корректно.
Практические рекомендации
- всегда используйте
can1для пользовательских задач - проверяйте параметры шины перед подключением устройств
- избегайте работы с CAN без второго узла (это даёт ложные результаты)
- при интеграции с ROS 2 используйте отдельные ноды для преобразования CAN ↔ ROS