I2C (Inter-Integrated Circuit), двухпроводной интерфейс, представляет собой последовательный интерфейс, используемый для быстрого подключения нескольких устройств к контроллерам и процессорам, таким как Omega2. Примеры I2C- устройств:
- Датчики температуры, влажности, тока
- Различные приводы, например, звонок или лампочка
- Контроллеры, например, реле или моторчик
Связь осуществляется по 2 линиям связи, каждая из которых имеет свой вывод на Omega2:
- Clock (SCL) – сигнализирует о передаче данных
- Data (SDA) - переносит данные
Шина I2C использует архитектуру «ведущий-ведомый», что означает следующее:
- Ведущие - устройства, которые контролируют, когда и кому они отправляют и получают данные.
- Ведущий посылает команды, которые включают адрес ведомого, который должен его получить.
- При использовании I2C, Omega2 сконфигурирован единственный ведущий.
- Ведомые - устройства, которые реагируют на ведущих, когда они получают команду, адресованную им.
- Каждый ведомый идентифицируется шестнадцатеричным адресом (например, 0x27).
- Ведомые игнорируют команды, адресованные не им.
- Ведущие и ведомые работают в двух режимах:
- transmit - отправка данных
- receive - прием данных
Для получения дополнительной информации см. статью на Википедии о I2C.
Omega и I2C
Все взаимодействия I2C на Omega2 выполняются с использованием файла виртуального устройства /dev/i2c-0. Это стало возможным благодаря sysfs, псевдо-файловой системе, которая в файлах содержит информацию об аппаратном обеспечении Omega и позволяет пользователю управлять оборудованием, редактируя файлы.
На аппаратном обеспечении
Выводы I2C (SCL и SDA) на Omega2 и на док-станции расширения выделены ниже.


Примечание. На некоторых старых док-станциях SCL обозначается как контакт 20, а SDA обозначается как контакт 21.
Управление I2C-устройствами из командной строки
Для работы с устройствами I2C используют две утилиты командной строки, i2cget и i2cset. Эти инструменты работают путем доступа к данным, хранящимся в регистрах на устройстве. Регистр - это место в памяти устройства. При чтении/записи на устройство I2C вам необходимо указать регистр на устройстве, к которому вы хотите получить доступ.
Чтение байта
Команда i2cget используется для чтения значения определенного регистра на устройстве I2C.
Пример использования команды:
i2cget -y 0
Параметры команды описаны ниже:
- -y – пропустить подтверждение команды i2cget
- 0 - использовать шину I2C. Omega2 имеет одну шину I2C, обозначенную как шина 0.
- адрес ведомого устройства, например, 0x40 - регистр на ведомом устройстве, откуда считывать, например, 0x00
Например, допустим, у нас есть датчик температуры I2C по адресу 0x40, действующий как ведомый со следующими регистрами:
- 0x00 - сохраняет температуру в градусах Фаренгейта
- 0x01 - сохраняет температуру в градусах Цельсия
Допустим, нам интересно считать температуру в градусах Фаренгейта. Делаем это, используя следующую команду:
i2cget -y 0 0x40 0x00
Результат 0x48, что равно 72 в десятичном исчислении (22 градуса по Цельсию).
Запись байта
i2cset позволяет установить значение регистра на целевом устройстве I2C. Типичная команда:
i2cset -y 0
Параметры команды описаны ниже:
- -y - пропустить подтверждение команды i2cset
- 0 - использовать шину I2C. Omega2 имеет одну шину I2C, обозначенную как шина 0.
- адрес ведомого устройства, например, 0x27 - регистр на ведомом устройстве, который должен быть записан, например, 0x00 - значение для записи, например, 0x33
Предположим, у нас есть контроллер освещенности в помещении I2C по адресу 0x27, действующий как ведомый со следующими регистрами:
- 0x00 - гостиная, 0 – выкл., 1 – вкл.
- 0x01 - кухня
- 0x02 - спальня
Например, чтобы включить свет в гостиной, и выключить на кухне, запустим следующие команды:
i2cset -y 0 0x27 0x00 0x01 # вкл. в гостинной
i2cset -y 0 0x27 0x01 0x00 # выкл. на кухне
Расширения Omega
Некоторые расширения используют I2C для связи с Omega. Чтобы узнать больше о том, как с ними работать, ознакомьтесь с руководствами:
- Relay Expansion (реле)
- PWM Expansion (широтно-импульсная модуляция)
- OLED Expansion (OLED – дисплей)
Перемещение за пределы командной строки
I2C с использованием Python
Разработан модуль I2C Python, который вы можете импортировать в свое приложение. Все подробности см. в I2C Python Module.
Пример. Управление I2C - ЖК-дисплеем.
Это пособие приводят Мэтью Огборн и Дэвид Стайн.
Сначала найдите или купите I2C ЖК-дисплей. Их можно найти в Интернете на Amazon или Ebay.
Установите на свой Omega2 следующие пакеты:
opkg update
opkg install git git-http python pyOnionI2C
Затем установите библиотеку (от Дэвида) для ЖК-дисплея:
cd /root
git clone https://bitbucket.org/fires/fireonion_i2c_lcd
Подключите ваш ЖК-дисплей, как показано ниже:

Если вы задумались, «подождите, этот дисплей 5В, а Omega - 3,3 В, как это будет работать?», вы очень внимательны! Что случится, если мы будем использовать 5В на док-станции для питания дисплея, а затем управлять дисплеем с помощью I2C-сигналов Omega с напряжением 3.3В? Это безопасно для Omega, поскольку на GPIO не будет 5В на входе, если мы не пытаемся выполнить I2C-считывание (предполагается, что большинство экранов не поддерживают считывание значения регистров). ЖК-дисплей способен считывать команды от Omega, поскольку логический максимум 3,3В больше, чем логический максимум порогового напряжения на большинстве TTL-схем, используемых в дисплеях.
Перейдите в каталог src:
cd fireonion_i2c_lcd/src
Для использования библиотеки вы можете использовать параметры командной строки:
Наберите:
python lcd.py –help
На выходе:
Usage: lcd.py [options]
Options:
-h, --help show this help message and exit
-a ADDRESS, --address=ADDRESS
I2C Adress
-p, --persistent -p = do not clear display before new write (не очищать дисплей перед новой записью)
--line1=LINE1 text to line 1 (текст на 1 линии)
--line2=LINE2 text to line 2
--line3=LINE3 text to line 3
--line4=LINE4 text to line 4
--backlight-off Turn off backlight (выкл. подсветку)
Пример:
root@Omega-1CD7:~/fires-fireonion_i2c_lcd/src# python lcd.py -a 0x3f --line1="Onion LCD LIB" --line2="--davidstein.cz--"
Теперь вы должны увидеть образец текста на ЖК-дисплее. Вы можете отредактировать lcd.py, чтобы изменить отображаемый текст. Также можете импортировать всю библиотеку в свой проект Python!

Дополнительная информация в блоге Дэвида.
I2C с использованием C/C ++
Также разработана библиотеку I2C для C и C ++. Все подробности см. в «Библиотеке I2C C»