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

Сравнение протоколов

Робот сравнивает несколько способов обмена данными с модулями

UART, I2C, 1-Wire и SPI решают похожую задачу: передают цифровые данные между платами и модулями. Но подключаются они по-разному. Поэтому протокол выбирают не по названию, а по задаче: сколько устройств, сколько доступно пинов, какая нужна скорость и как далеко идут провода.

Коротко

Универсально лучшего протокола нет. Для сервисного порта удобен UART, для набора небольших датчиков часто подходит I2C, для нескольких DS18B20 — 1-Wire, для дисплеев и памяти — SPI. Финальный выбор всегда проверяют на конкретных платах, пинах и модулях.

Сравнение топологий UART, I2C, 1-Wire и SPI

Главная идея

Протокол описывает не только байты, но и способ соединения:

провода и уровни -> правила обмена -> команды конкретного устройства

Например, SPI говорит, где такт и где данные, но не говорит, какую команду отправить TFT-дисплею. I2C говорит, как отправить адрес, но сам адрес зависит от микросхемы и перемычек модуля.

Сравнение по проводам

ПризнакUARTI2C1-WireSPI
Основные сигналыTX, RXSDA, SCLDQSCK, MOSI, MISO, CS
Общий GNDнуженнуженнуженнужен
Несколько устройствнеудобно без доп. схемыудобно по адресамудобно по ROM-кодамудобно, но нужен отдельный CS
Тактнет отдельной линииSCLвременные слотыSCK
Типичная задачаконсоль, Bluetooth, GPSдатчики, OLED, RTCDS18B20дисплей, память, быстрый датчик

Фразы вроде «двухпроводная шина» обычно считают только сигнальные линии. Питание и GND всё равно нужны, если устройство не получает их другим предусмотренным способом.

Где искать пины на платах

Типовые пины протоколов на Arduino Uno и ESP32

На Arduino Uno многие пины запоминаются быстро: UART на D0/D1, I2C на A4/A5, SPI на D10-D13. Но на Arduino Mega, ESP32, ESP8266 и других платах номера могут отличаться.

ПротоколArduino UnoESP32 DevKit в Arduino core
UARTD0/RX, D1/TXUART0 обычно связан с USB; дополнительные UART можно назначать на GPIO
I2CA4/SDA, A5/SCLчасто GPIO21/SDA, GPIO22/SCL, но можно переназначать
1-Wireлюбой свободный цифровой пин, часто D2свободный GPIO, например GPIO4
SPID13/SCK, D11/MOSI, D12/MISO, D10/SSчасто VSPI: 18/SCK, 23/MOSI, 19/MISO, 5/SS

Если плата не Uno, не стоит переносить схему «по памяти». Открывают pinout именно этой платы и проверяют, не занят ли выбранный вывод загрузкой, USB, flash-памятью или другим модулем.

Как выбирать

Последовательность выбора протокола

  1. Определите участников обмена: одна плата и один модуль или целая группа устройств.
  2. Посчитайте доступные пины: хватит ли отдельных CS, нужны ли SDA/SCL, есть ли свободный UART.
  3. Проверьте уровни: 5 В, 3,3 В, необходимость преобразователя.
  4. Оцените объём данных: один байт состояния, строка команд, поток пикселей или блок памяти.
  5. Соберите короткий тест и проверьте сигнал логическим анализатором.

Быстрый выбор для робота

ЗадачаОбычно удобноПочему
отправить команды с Bluetooth HC-06UARTмодуль уже отдаёт TX/RX
подключить BME280 и OLEDI2Cдва сигнальных провода на несколько адресов
поставить несколько датчиков температуры DS18B201-Wireодна линия данных и уникальные ROM-коды
обновлять TFT-дисплейSPIвыше скорость и явный выбор устройства
связать Arduino с компьютером через адаптерUART через USB-TTLпростой поток байтов для отладки

Что может испортить выбор

ПроблемаГде часто встречается
не хватает пиновSPI с несколькими устройствами
одинаковые адресаI2C-модули одной модели
длинные провода и медленный фронтI2C и 1-Wire
занятые D0/D1UART на Arduino Uno
неверный режим тактаSPI
разные логические уровнилюбые протоколы между 5 В и 3,3 В

Что запомнить

  • UART прост для прямого обмена, но не адресует много устройств сам по себе.
  • I2C экономит пины, но требует адресов и подтяжек.
  • 1-Wire удобен для нескольких простых датчиков на одной линии.
  • SPI быстрый, но требует больше сигнальных линий.
  • Реальная надёжность зависит от схемы, проводов, питания и настроек.

Практика

  1. Для робота с дисплеем, BME280, DS18B20 и Bluetooth-модулем выберите протокол для каждого устройства.
  2. Нарисуйте схему соединений и подпишите каждый провод.
  3. Отдельно отметьте, где нужны подтяжки, а где отдельный CS.
  4. Для выбранной платы найдите реальные номера пинов в pinout.

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

  1. Почему нельзя выбрать протокол только по максимальной скорости?
  2. Чем адрес I2C отличается от линии CS в SPI?
  3. Какой протокол удобен для нескольких DS18B20?
  4. Почему для UART на Arduino Uno часто возникают конфликты с USB?
Ориентиры для самопроверки

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

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

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

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

  • Протокол — правила формирования и обмена сообщениями.
  • Топология — способ соединения участников и линий связи.
  • Адрес — число, по которому контроллер выбирает устройство на общей шине.
  • Пропускная способность — объём данных, который канал передаёт за единицу времени.
  • Логический уровень — диапазон напряжения, который вход распознаёт как LOW или HIGH.

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

  • UART — линии TX/RX, HC-06 и обмен между Arduino.
  • I2CSDA/SCL, подтяжки и адреса.
  • 1-WireDQ, ROM-коды и DS18B20.
  • SPISCK, COPI, CIPO, CS и старые обозначения линий.
  • Отладка обмена — как проверять выбранный интерфейс.

Источники