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

I2C

Робот подключает несколько модулей к общей шине I2C

I2C удобен, когда к одному контроллеру нужно подключить несколько небольших устройств: датчик давления BME280, дисплей OLED, часы реального времени DS3231, расширитель портов. Все они делят две сигнальные линии, а контроллер выбирает нужный модуль по адресу.

Коротко

I2C — синхронная адресная шина. SDA передаёт данные, SCL задаёт такт. Обе линии обычно требуют подтягивающих резисторов к логическому питанию шины. Устройства подключаются параллельно и отвечают только на свой адрес.

Общая шина I2C с подписанными линиями SDA, SCL, GND, VCC и подтягивающими резисторами

Зачем это нужно

В роботе часто много медленных датчиков. Если каждому выделять отдельные пины, выводы контроллера быстро закончатся. I2C позволяет подключить несколько устройств на одни и те же SDA и SCL.

Но простота имеет цену: нужно следить за адресами, подтяжками, уровнем питания и длиной проводов. Два устройства с одинаковым адресом на одной шине обычно будут конфликтовать.

Главная идея

Контроллер начинает обмен, формирует START, отправляет адрес устройства, передаёт или читает байты и завершает транзакцию STOP. Каждый принятый байт подтверждается сигналом ACK.

Чтение регистра датчика по I2C

Линии SDA и SCL устроены не как обычные выходы, которые активно выдают 0 и 1. Участники шины тянут линию вниз для нуля и отпускают её для единицы. Высокий уровень создаёт подтягивающий резистор.

Провода и сигналы

ЛинияНазначениеЧто важно
SDAданные и адресадвунаправленная линия, нужна подтяжка
SCLтактовый сигналобычно задаётся контроллером, тоже нужна подтяжка
GNDобщий нольобязателен для всех участников
VCCпитание модулей и логическая подтяжканапряжение выбирают по самому чувствительному устройству

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

Где находятся пины

ПлатаПины I2CКомментарий
Arduino UnoA4/SDA, A5/SCL; на Uno R3 есть отдельные подписи SDA и SCLэто те же линии I2C
Arduino NanoA4/SDA, A5/SCLкак у Uno, но физическое расположение другое
Arduino Mega20/SDA, 21/SCLне совпадает с Uno
ESP32 DevKitчасто GPIO21/SDA, GPIO22/SCLв Arduino core пины можно переназначить
ESP8266часто GPIO4/SDA, GPIO5/SCL в учебных примерахзависит от платы и ядра

Перед разводкой платы или пайкой шлейфа всегда открывают pinout конкретной платы. Название I2C не гарантирует одинаковые номера выводов.

Подключение устройства к Arduino Uno: BME280

BME280 подключён к Arduino Uno по I2C

BME280 измеряет температуру, давление и влажность. Многие готовые модули имеют выводы VCC, GND, SCL, SDA.

Контакт BME280-модуляArduino UnoЧто проверить
SDAA4/SDAне перепутать с SCL
SCLA5/SCLлиния такта
GNDGNDобщий ноль
VCC3.3V или 5V по модулюголый чип BME280 рассчитан на 3,3 В; готовый модуль может иметь стабилизатор

После подключения удобно запустить I2C-сканер. Он покажет адрес, на котором модуль отвечает, например 0x76 или 0x77. Сканер подтверждает наличие ответа, но не доказывает, что датчик правильно измеряет.

Пример с несколькими Arduino

Несколько Arduino на одной шине I2C

Одна Arduino может быть контроллером шины, а другие Arduino — адресуемыми устройствами. Это полезная лабораторная работа: становится видно, что адрес выбирает участника, а SDA и SCL остаются общими.

СоединениеArduino-контроллерАдресуемая Arduino
данныеA4/SDAA4/SDA
тактA5/SCLA5/SCL
земляGNDGND

Скетч адресуемой платы задаёт адрес:

#include <Wire.h>

void setup() {
Wire.begin(0x12);
Wire.onRequest(sendValue);
}

void loop() {
}

void sendValue() {
Wire.write(42);
}

Скетч контроллера запрашивает один байт:

#include <Wire.h>

void setup() {
Serial.begin(9600);
Wire.begin();
}

void loop() {
Wire.requestFrom(0x12, 1);
if (Wire.available()) {
Serial.println(Wire.read());
}
delay(1000);
}

В реальном проекте вместо числа 42 передают осмысленные данные: состояние датчика, заряд батареи или команду для адресуемого узла.

Частые ошибки

ОшибкаЧто произойдёт
перепутали SDA и SCLустройство не отвечает
нет общего GNDуровни не имеют общего отсчёта
нет подтяжеклинии не возвращаются в высокий уровень
подтяжки к 5 В при модуле 3,3 Ввход модуля можно повредить
два устройства с одним адресомответы конфликтуют
слишком длинные проводафронты становятся медленными, появляются ошибки

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

  • I2C использует две сигнальные линии: SDA и SCL.
  • Устройства сидят на общей шине и различаются адресами.
  • Для SDA и SCL нужны корректные подтяжки.
  • На Arduino Uno I2C находится на A4/A5.
  • На ESP32 пины часто можно переназначить, но типовой учебный вариант — GPIO21/GPIO22.

Практика

  1. Нарисуйте Arduino Uno, BME280 и OLED на общей шине I2C.
  2. Подпишите SDA, SCL, GND, VCC и две подтяжки.
  3. Проверьте адрес BME280 сканером.
  4. Подключите вторую Arduino как устройство с адресом 0x12.

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

  1. Почему SDA и SCL требуют подтяжек?
  2. Чем адрес I2C отличается от пина CS в SPI?
  3. Где находятся линии I2C на Arduino Uno?
  4. Почему два одинаковых датчика с одним адресом могут мешать друг другу?
Ориентиры для самопроверки

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

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

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

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

  • I2C — синхронная адресная шина с линиями данных SDA и такта SCL.
  • Контроллер шины — участник, который начинает транзакцию и формирует такт.
  • Адресуемое устройство — участник, который отвечает на свой адрес.
  • ACK — подтверждение приёма байта.
  • Подтягивающий резистор — резистор, возвращающий открытую линию в высокий уровень.

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

  • UART — прямой поток байтов между двумя устройствами.
  • 1-Wire — одна сигнальная линия и уникальные ROM-коды.
  • SPI — быстрый синхронный обмен с отдельным выбором устройства.
  • Сравнение протоколов — когда какой интерфейс удобнее.
  • Отладка обмена — как искать ошибки питания, проводки и адресов.

Источники