Рейтинг@Mail.ru
Логотип шины I2C
Логотип шины I2C

Интерфейс I2C и Arduino

В этой статье мы рассмотрим, что такое интерфейс I2C (ай-ту-си, и-два-цэ), в чём его особенности и как с ним работать.

Инструкция по использованию протокола I2C совместно с Arduino

Вам понадобится

  • Arduino;
  • цифровой потенциометр AD5171;
  • светодиод;
  • резистор на 220 Ом;
  • 2 резистора по 4,7 кОм;
  • соединительные провода.

1Описание интерфейса I2C

Последовательный протокол обмена данными IIC (также называемый I2C – Inter-Integrated Circuits, межмикросхемное соединение) использует для передачи данных две двунаправленные линии связи, которые называются шина последовательных данных SDA (Serial Data) и шина тактирования SCL (Serial Clock). Также имеются две линии для питания. Шины SDA и SCL подтягиваются к шине питания через резисторы.

В сети есть хотя бы одно ведущее устройство (Master), которое инициализирует передачу данных и генерирует сигналы синхронизации. В сети также есть ведомые устройства (Slave), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Адрес устройства указывается в паспорте (datasheet). К одной шине I2C может быть подключено до 127 устройств, в том числе несколько ведущих. К шине можно подключать устройства в процессе работы, т.е. она поддерживает «горячее подключение».

Описание интерфейса I2C
Описание интерфейса I2C

2Реализация I2Cв Arduino

Arduino использует для работы по интерфейсу I2C два порта. Например, в Arduino UNO и Arduino Nano аналоговый порт A4 соответствует SDA, аналоговый порт A5 соответствует SCL.

Реализация I2C в Arduino UNO и Nano
Реализация I2C в Arduino UNO и Nano

Для других моделей плат соответствие выводов такое:

ПлатаПин SDAПин SCL
Arduino Uno, Nano, Pro и Pro MiniA4A5
Arduino Mega2021
Arduino Leonardo23
Arduino Due20, SDA121, SCL1

3Библиотека "Wire" для работы с IIC

Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire. Она имеет следующие функции:

ФункцияНазначение
begin(address) инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация;
requestFrom()используется ведущим устройством для запроса определённого количества байтов от ведомого;
beginTransmission(address)начало передачи данных к ведомому устройству по определённому адресу;
endTransmission()прекращение передачи данных ведомому;
write()запись данных от ведомого в ответ на запрос;
available()возвращает количество байт информации, доступных для приёма от ведомого;
read()чтение байта, переданного от ведомого ведущему или от ведущего ведомому;
onReceive()указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего;
onRequest()указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого.

4Подключение I2C устройствак Arduino

Давайте посмотрим, как работать с шиной I2C с помощью Arduino.

Сначала соберём схему, как на рисунке. Будем управлять яркостью светодиода, используя цифровой 64-позиционный потенциометр AD5171, который подключается к шине I2C. Адрес, по которому мы будем обращаться к потенциометру – 0x2c (44 в десятичной системе).

Подключение цифрового потенциометра к Arduino по шине I2C
Подключение цифрового потенциометра к Arduino по шине I2C

5Управление устройством по шине IIC

Теперь откроем из примеров библиотеки "Wire" скетч: Файл Образцы Wire digital_potentiometer. Загрузим его в память Arduino.

#include <Wire.h> // подключаем библиотеку "Wire"

void setup() {
  Wire.begin();   // подключаемся к шине I2C как мастер
}

byte val = 0; // значение для передачи потенциометру

void loop() {
  Wire.beginTransmission(44); // начало передачи устройству с адресом "44" (0x2c)
  Wire.write(byte(0x00));     // посылаем байт инструкции
  Wire.write(val);            // посылаем потенциометру значение
  Wire.endTransmission();     // конец передачи

  val++;           // инкрементируем val на 1
  if (val == 64) { // по достижении максимума потенциометра
    val = 0;       // сбрасываем val до нуля
  }
  delay(500);
}

После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.

6Дополнительно о шине I2C

Доступно и интересно рассказывает о шине I2C Джереми Блюм в своём видео:

Видеоуроки по Arduino. Шина I2C
Последнее изменениеВторник, 05 Январь 2016 16:35
(3 голосов)
Прочитано 14519 раз

Поделиться

Оставить комментарий

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены