Skip to main content

UART, I2C, SPI, CAN. Главные способы общения в роботе

Когда вы подключаете датчик к Arduino или Raspberry Pi, вы выбираете “язык общения”. Вот четыре основных языка, которые должен знать каждый робототехник.


1. UART (Serial) — самый простой

Как работает: Как двое разговаривают по рации.

  • Один говорит, другой слушает
  • Потом меняются
  • Договорились о скорости заранее

Провода:

  • TX (передача) → RX (прием) другого устройства
  • RX (прием) ← TX (передача) другого устройства
  • GND (общая земля)

Наглядная схема:

Arduino1           Arduino2
   TX ────────────> RX
   RX <──────────── TX
   GND ──────────── GND

Плюсы:

  • Проще некуда (в коде: Serial.begin(9600);)
  • Отладка через Serial Monitor
  • Подходит для GPS, Bluetooth, связи с компьютером

Минусы:

  • Только между двумя устройствами
  • Недалеко (1-2 метра)

Пример кода:

// Отправка данных
Serial.print("Температура: ");
Serial.println(temperature);

// Получение данных
if (Serial.available()) {
  char command = Serial.read();
  if (command == 'F') goForward();
}

2. I2C — для многих датчиков

Как работает: Как учитель в классе.

  • Учитель спрашивает: “Вася, 0x68, какая температура?”
  • Вася (адрес 0x68) отвечает: “25”
  • Учитель: “Петя, 0x77, какое давление?”
  • Петя (адрес 0x77) отвечает: “760”

Провода:

  • SDA (данные) — одна линия для всех
  • SCL (часы) — общий тактовый сигнал
  • VCC и GND

Схема подключения:

        Arduino (Master)
       SDA ┼───┬───┬───┐
       SCL ┼───┼───┼───┼───
           │   │   │   │
        [0x68] [0x77] [0x...]
       Датчик Датчик Еще
       MPU6050 BMP280 датчик

Плюсы:

  • Много устройств на двух проводах (до 128)
  • Стандарт для датчиков
  • Встроен в большинство контроллеров

Минусы:

  • Медленнее, чем SPI
  • Чувствителен к длине проводов (максимум ~50 см)
  • Нужны подтягивающие резисторы (обычно 4.7 кОм)

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

  • IMU (MPU6050, MPU9250)
  • Датчики температуры/давления (BMP280, BME280)
  • OLED дисплеи (SSD1306)
  • Расширители портов (PCF8574)

3. SPI — самый быстрый

Как работает: Как конвейер на заводе.

  • Начальник дает команду по громкой связи
  • Каждый рабочий слышит, но реагирует только если назвали его номер (CS)
  • Все работают синхронно по такту

Провода (минимум 4):

  • MOSI (данные от главного к устройству)
  • MISO (данные от устройства к главному)
  • SCK (тактовый сигнал)
  • CS (выбор устройства) — отдельный провод для каждого!

Схема подключения:

          Arduino (Master)
   SCK ───────┼──────┐
   MOSI ──────┼──────┼─────┐
   MISO ──────┼──────┼─────┼─────
              │      │     │
           CS1┤   CS2┤  CS3┤
              ▼      ▼     ▼
          [SD карта][Дисплей][NRF24]

Плюсы:

  • Самый быстрый (в 10-100 раз быстрее I2C)
  • Полнодуплексный (одновременно прием и передача)
  • Простой протокол на аппаратном уровне

Минусы:

  • Много проводов (3 + N устройств)
  • Сложнее развести на плате
  • Больше потребление

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

  • TFT дисплеи
  • SD-карты
  • Радиомодули (NRF24L01, LoRa)
  • Ethernet модули (W5500)

4. CAN — для надежных систем

Как работает: Как совещание в компании.

  • Любой может начать говорить
  • Все слышат всех
  • Если двое начали одновременно — у кого важнее сообщение (ID), тот говорит
  • Очень устойчив к помехам

Плюсы:

  • Невероятно надежный (машины, самолеты)
  • Очень далеко (до 1 км)
  • Много устройств на одной линии

Минусы:

  • Сложный для начинающих
  • Нужны преобразователи (CAN-модули)
  • Дороже

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

  • Автомобили (бортовая сеть)
  • Промышленные роботы
  • Большие БПЛА
  • Роботы Boston Dynamics

Сравнительная таблица (что выбрать?)

КритерийUARTI2CSPICAN
Скорость115 кбит/с400 кбит/с10+ Мбит/с1 Мбит/с
Расстояние1-2 м0.5 м0.3 м1000 м
Устройств21288-10110
Проводов223+N2
Сложность★☆☆☆☆★★☆☆☆★★★☆☆★★★★☆
НадежностьНизкаяСредняяВысокаяМаксимальная

Практические примеры для школьных проектов

Проект 1: Метеостанция

Датчики:
• DHT22 → Цифровой пин (свой протокол)
• BMP280 → I2C
• Датчик освещенности → Аналоговый пин

Вывод:
• OLED дисплей 128x64 → I2C
• Или TFT дисплей 2.4" → SPI

Проект 2: Робот с камерой

Компоненты:
• Raspberry Pi (камера) ↔ ESP32 → UART
• ESP32 ↔ Датчики (IMU, дальномер) → I2C
• ESP32 ↔ TFT дисплей для отладки → SPI
• ESP32 ↔ Моторы → ШИМ

Частые ошибки и решения

Ошибка 1: “I2C не видит устройства”

Причина: Нет подтягивающих резисторов
Решение: Добавить 4.7 кОм между SDA и VCC, SCL и VCC

Причина: Адреса устройств совпадают
Решение: Проверить адреса (скетч I2C scanner)

Ошибка 2: “SPI работает, но медленно”

Причина: Программная реализация вместо аппаратной
Решение: Использовать аппаратный SPI (конкретные пины)

Ошибка 3: “UART мусорит в мониторе порта”

Причина: Разная скорость на передаче и приеме
Решение: Проверить Serial.begin(скорость) на обоих устройствах

Ошибка 4: “CAN вообще не работает”

Причина: Нет терминаторов на концах линии
Решение: Добавить резисторы 120 Ом между CAN_H и CAN_L

Эксперимент: Подключи свой первый датчик

Что нужно:

  • Arduino Uno
  • Датчик MPU6050 (гироскоп + акселерометр)
  • Провода

Шаги:

  1. Подключите по I2C:

    Arduino → MPU6050
    5V → VCC
    GND → GND
    A4 → SDA
    A5 → SCL
    
  2. Установите библиотеку Wire и MPU6050

  3. Загрузите пример:

    #include <Wire.h>
    #include <MPU6050.h>
    
    MPU6050 mpu;
    
    void setup() {
      Serial.begin(9600);
      Wire.begin();
      mpu.initialize();
    }
    
    void loop() {
      int16_t ax, ay, az;
      mpu.getAcceleration(&ax, &ay, &az);
      Serial.print("X: "); Serial.print(ax);
      Serial.print(" Y: "); Serial.print(ay);
      Serial.print(" Z: "); Serial.println(az);
      delay(100);
    }
    
  4. Откройте Serial Monitor → увидите данные с датчика!


Проверь себя

Смогу ли я:

  1. Подключить датчик температуры по I2C к Arduino?
  2. Объяснить, зачем в SPI нужен провод CS?
  3. Соединить два Arduino для обмена данными?
  4. Выбрать протокол для подключения 10 датчиков в большой робот?

Если на все вопросы можете ответить — вы разбираетесь в протоколах связи!


Что дальше?

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

Совет: Сделайте стенд-тренажер: Arduino, макетная плата, и несколько устройств с разными протоколами (I2C датчик, SPI дисплей, UART модуль). Подключайте по одному, изучайте, как работают.