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
Сравнительная таблица (что выбрать?)
| Критерий | UART | I2C | SPI | CAN |
|---|---|---|---|---|
| Скорость | 115 кбит/с | 400 кбит/с | 10+ Мбит/с | 1 Мбит/с |
| Расстояние | 1-2 м | 0.5 м | 0.3 м | 1000 м |
| Устройств | 2 | 128 | 8-10 | 110 |
| Проводов | 2 | 2 | 3+N | 2 |
| Сложность | ★☆☆☆☆ | ★★☆☆☆ | ★★★☆☆ | ★★★★☆ |
| Надежность | Низкая | Средняя | Высокая | Максимальная |
Практические примеры для школьных проектов
Проект 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 (гироскоп + акселерометр)
- Провода
Шаги:
Подключите по I2C:
Arduino → MPU6050 5V → VCC GND → GND A4 → SDA A5 → SCLУстановите библиотеку
WireиMPU6050Загрузите пример:
#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); }Откройте Serial Monitor → увидите данные с датчика!
Проверь себя
✅ Смогу ли я:
- Подключить датчик температуры по I2C к Arduino?
- Объяснить, зачем в SPI нужен провод CS?
- Соединить два Arduino для обмена данными?
- Выбрать протокол для подключения 10 датчиков в большой робот?
Если на все вопросы можете ответить — вы разбираетесь в протоколах связи!
Что дальше?
Освоили базовые протоколы? Теперь можно:
- Беспроводная связь — Wi-Fi, Bluetooth, LoRa
- Промышленные сети — Ethernet, Modbus
- Паттерны проектирования — как правильно организовать код для работы с разными протоколами
Совет: Сделайте стенд-тренажер: Arduino, макетная плата, и несколько устройств с разными протоколами (I2C датчик, SPI дисплей, UART модуль). Подключайте по одному, изучайте, как работают.
