Skip to main content

Промышленные протоколы (CAN/Ethernet/Modbus)

CAN, Ethernet и Modbus: когда робот становится серьезным

Когда ваш робот перестает быть “игрушкой на столе” и начинает делать что-то важное — переносить грузы, работать в цеху или ездить по настоящей местности — нужны другие способы связи. Быстрые, надежные и работающие в сложных условиях.


Сравнение промышленных протоколов

ПротоколМакс. скоростьМакс. расстояниеПомехо-устойчивостьГде используется
CAN Bus1 Мбит/с1000 м★★★★★Автомобили, промышленные роботы
Ethernet1 Гбит/с100 м★★★☆☆Камеры, лидары, ROS 2
RS-485/Modbus10 Мбит/с1200 м★★★★☆Заводы, манипуляторы

1. CAN Bus — для автомобилей и серьезных роботов

Как работает: Как совещание в компании, где все умеют слушать.

Главные принципы:

Дифференциальная пара:

Обычный сигнал:       CAN:
    [Провод]  [Сигнал]     [CAN_H]  [Разница] [CAN_L]
        │          │           │         │         │
  5V ───┼───────┐  │    3.5V ──┼─────────┼─────────┼── 1.5V
        │       │  │           │         │   2V разницы
  0V ───┼───────┘  │    2.5V ──┼─────────┼─────────┼── 2.5V
        │          │           │         │   0V разницы
  [Шум] │          ▼           │         │         │
        └──> Сигнал испорчен   └──> Шум на оба провода →
                                       Разница не изменилась!

Арбитраж (кто говорит первым):

Датчик мотора: "Я говорю! (ID=0x100)"
Датчик температуры: "И я тоже! (ID=0x200)"
    CAN сравнивает ID бит за битом
    ID 0x100 (меньше) побеждает
    ID 0x200 молчит и ждет своей очереди

Практический пример: Робот-манипулятор с 6 моторами

Архитектура:
• Главный контроллер (Raspberry Pi)
• 6 моторных контроллеров (например, ODrive)
• Все на одной CAN-шине

Как общаются:
1. Raspberry Pi: "Мотор1, крутись со скоростью 1000 об/мин (ID=0x01)"
2. Мотор1: "Понял" → начинает крутиться
3. Мотор2: "Я перегреваюсь! (ID=0x02, срочное сообщение)"
   (Это сообщение приоритетнее, даже если другие говорят)

Подключение к Arduino:

// Используем модуль MCP2515
#include <SPI.h>
#include <mcp2515.h>

MCP2515 mcp2515(10); // CS на пине 10

struct can_frame canMsg;

void setup() {
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS); // Скорость
  mcp2515.setNormalMode();
  
  // Отправка сообщения
  canMsg.can_id = 0x100; // ID сообщения
  canMsg.can_dlc = 2;    // Длина данных
  canMsg.data[0] = 0xAB; // Данные
  canMsg.data[1] = 0xCD;
  
  mcp2515.sendMessage(&canMsg);
}

Плюсы CAN:

  • Невероятно надежный (используется в самолетах)
  • Если сломался один мотор — остальные продолжают работать
  • Можно добавлять новые устройства без изменения программы

Минусы:

  • Сложнее, чем I2C/UART
  • Нужны специальные модули
  • Нужны терминаторы (120 Ом резисторы на концах линии)

2. Ethernet — для видео и больших данных

Как работает: Как интернет дома, только внутри робота.

Зачем роботу обычный сетевой кабель?

  1. Скорость:

    UART: 115200 бит/с → 1 секунда на маленькую картинку
    Ethernet: 1000000000 бит/с → 0.001 секунды на ту же картинку
    
  2. Стандартизация:

    • Можно использовать обычные роутеры
    • Работает с любым компьютером
    • Есть готовые библиотеки
  3. ROS 2: Современная операционная система для роботов использует Ethernet как основную магистраль.

Пример: Робот с камерой и лидаром

Компоненты:
• Jetson Nano (обработка камеры)
• Raspberry Pi (управление моторами)
• Лидар (RPLidar A1)
• Все соединены через Ethernet-свич

Поток данных:
Камера (HD) → Jetson → Ethernet → Raspberry Pi → Моторы
Лидар → Raspberry Pi → Ethernet → Jetson (для навигации)

Использование модуля W5500 (Ethernet для Arduino):

#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 177); // IP робота
EthernetUDP Udp;

void setup() {
  Ethernet.begin(mac, ip);
  Udp.begin(8888); // Порт для приема команд
}

void loop() {
  // Прием команды
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    char command = Udp.read();
    if (command == 'F') goForward();
  }
  
  // Отправка телеметрии
  String telemetry = "Temp:" + String(readTemp());
  Udp.beginPacket("192.168.1.100", 8888); // Адрес компьютера
  Udp.write(telemetry.c_str());
  Udp.endPacket();
}

Плюсы Ethernet:

  • Супер-быстро (видео в реальном времени)
  • Можно управлять через веб-интерфейс
  • Поддержка ROS 2

Минусы:

  • Нужен свич/роутер
  • Кабель толще и менее гибкий
  • Больше потребление

3. RS-485 / Modbus — для заводских роботов

Как работает: Как CAN, но проще и дешевле.

Особенности:

  • Очень далеко (до 1.2 км!)
  • Тоже дифференциальная пара (помехоустойчивость)
  • Часто используется в паре с Modbus (протоколом обмена)

Практический пример: Школа с несколькими учебными роботами

Задача: Учитель с компьютера управляет 10 манипуляторами

Решение:
• Компьютер → RS-485 преобразователь
• Каждый робот (Arduino + MAX485 модуль) на одной линии

Команды:
"Робот1, открой захват"
"Робот5, подними руку на 30°"

Код для Arduino с MAX485:

#include <ModbusRtu.h>

Modbus slave(1, 2, 3); // ID=1, пины RX/TX

void setup() {
  Serial.begin(9600);
  slave.start();
}

void loop() {
  slave.poll(); // Ждет команды
  
  // Если получил команду "записать в регистр 0"
  if (slave.getInCnt() > 0) {
    int command = slave.getReg(0);
    if (command == 1) openGripper();
    if (command == 2) closeGripper();
  }
}

Где используется:

  • Роботы Dynamixel (сервоприводы для манипуляторов)
  • Промышленные датчики (температуры, давления)
  • CNC станки, 3D-принтеры

Когда что использовать в школьном проекте?

Проект 1: Мобильная платформа для исследований

Если: Нужно передавать видео с камеры, использовать ROS
Выбор: Ethernet (Raspberry Pi + Ethernet свич)

Проект 2: Манипулятор с точными моторами

Если: Много моторов, нужна надежность, есть помехи
Выбор: CAN Bus (ODrive контроллеры + CAN шина)

Проект 3: Учебный класс роботов

Если: Много одинаковых роботов, управление с одного ПК
Выбор: RS-485/Modbus (просто и дешево)

Частые проблемы и решения

Проблема 1: “CAN ничего не передает”

Решение:
1. Проверить терминаторы (120 Ом на концах)
2. Проверить скорость (одинаковая на всех устройствах)
3. Проверить полярность CAN_H/CAN_L

Проблема 2: “Ethernet робота не видно в сети”

Решение:
1. Проверить кабель (должен гореть индикатор)
2. Проверить IP-адрес (не должен совпадать с другими)
3. Для Wi-Fi: проверить мощность сигнала

Проблема 3: “RS-485 работает только на 10 метрах”

Решение:
1. Убедиться, что это витая пара
2. Добавить терминаторы (120-150 Ом)
3. Проверить заземление

Эксперимент: Попробуй Modbus в классе

Что нужно:

  • 2 Arduino Uno
  • 2 модуля MAX485
  • 4 провода

Шаги:

  1. Подключите модули:

    Arduino1 → MAX4851 → провода → MAX4852 → Arduino2
    RO→RX    A───┐          ┌───A    RO→RX
    DE→2     │   ├── A линии├───┤    DE→2
    DI→TX    B───┘          └───B    DI→TX
    VCC→5V                  VCC→5V
    GND→GND                 GND→GND
    
  2. Настройте один Arduino как ведущий (Master), другой как ведомый (Slave)

  3. Ведущий может включать светодиод на ведомом по команде

Вывод: Вы создали простую промышленную сеть!


Проверь себя

Смогу ли я:

  1. Объяснить, почему CAN надежнее I2C в роботе с моторами?
  2. Выбрать протокол для робота с 4K камерой?
  3. Подключить два Arduino через RS-485?
  4. Объяснить, зачем в CAN нужны терминаторы?

Если на все вопросы можете ответить — вы понимаете промышленные протоколы!


Что дальше?

Освоили промышленные протоколы? Теперь можно:

Совет: Начните с простого — соберите два Arduino с CAN или RS-485. Сделайте передачу простых команд. Потом добавьте помехи (включите мотор рядом) — увидите, как промышленные протоколы справляются с ними лучше обычных.