Как использовать связь I2C на Arduino? Arduino I2C Tutorial
В этом руководстве мы увидим, как настроить и использовать связь I2C на Arduino. В этом руководстве по Arduino I2C объясняются выводы I2C в Arduino, настройка главного и подчиненного устройств и, наконец, простая демонстрация, в которой две платы Arduino UNO обмениваются данными через I2C.
Схема
Что такое I2C?
I2C или I 2 C — это сокращение от Inter-Integrated Circuit, протокола синхронной последовательной связи, разработанного Phillips для связи между быстрым микроконтроллером и относительно медленными периферийными устройствами (такими как память или датчики) с использованием всего двух проводов. Следовательно, его иногда также называют TWI (двухпроводной интерфейс).
Используя I2C, вы можете передавать данные со скоростью 100 кбит/с (тактовая частота 100 кГц — стандартный режим), 400 кбит/с (тактовая частота 400 кГц — быстрый режим), 1 Мбит/с (тактовая частота 1 МГц — быстрый режим Plus) и 3,4 Мбит/с (тактовая частота 3,4 МГц — режим высокой скорости).
Это может показаться немного, но этого достаточно для сопряжения датчиков, памяти и дисплеев на небольших расстояниях.
Шина I2C
Шина I2C состоит из двух проводов, называемых последовательными данными (SDA) и последовательными часами (SCL). Данные передаются по линии SDA, а линия SCL используется для синхронизации устройств с тактовым сигналом.
Обе эти линии шины являются драйверами с открытым стоком, и поэтому вы должны использовать подтягивающие резисторы, чтобы поддерживать их ВЫСОКИЙ уровень.
Существует два типа устройств, которые подключаются к шине I2C: Master и Slave. Мастера шины отвечают за отправку и получение данных на ведомые устройства и с них. Тактовый сигнал также подается мастером.
Сеть I2C поддерживает несколько мастеров и несколько ведомых (но обычно мы видим одного ведущего и несколько ведомых). Каждое ведомое устройство, подключенное к шине I2C, имеет уникальный 7-битный адрес.
Используя этот адрес, ведущее устройство выбирает конкретное ведомое устройство для передачи данных (отправки или получения), и выбранное ведомое устройство отвечает в соответствии с запросом.
Я сделал подробное руководство по основам I 2 C Связь. Для получения дополнительной информации посетите « Основы связи I2C ».
I2C в Arduino
Arduino поддерживает связь I2C. Если вы посмотрите на распиновку Arduino UNO из руководства « ARDUINO UNO PINOUT », вы увидите, что контакты аналогового входа A4 и A5 имеют альтернативную функцию I2C.
Контакт A4 действует как SDA, а контакт A5 действует как SCL. В R3 оригинальной Arduino UNO есть еще два контакта рядом с выводом 13 цифрового ввода-вывода (рядом с разъемом USB), предназначенными для SDA и SCL.
Если вы используете любую другую плату, вам будет полезна следующая таблица, так как в ней описаны выводы I2C на всех популярных платах Arduino.
Доска | Контакты SDA и SCL |
Ардуино УНО | А4 и А5 |
Ардуино Нано | А4 и А5 |
Ардуино Мега 2560 | 20 и 21 |
Ардуино Микро | 2 и 3 |
Ардуино Леонардо | 2 и 3 |
Микроконтроллер ATmega328P, используемый в Arduino UNO и Nano, поддерживает скорость передачи данных I2C до 400 кГц.
Как использовать интерфейс Arduino I2C?
Чтобы продемонстрировать работу I2C в Arduino, давайте создадим небольшую схему. В этой демонстрации я соединил две платы Arduino UNO для связи по шине I2C. Чтобы сделать все интереснее и на самом деле увидеть связь, я добавил пару светодиодов и потенциометров (по одному набору для каждой платы UNO).
Потенциометры подключены к соответствующим контактам аналогового входа (A0), а светодиоды подключены к контакту цифрового ввода-вывода с ШИМ (контакт 9). Одна плата UNO настроена как ведущая шина I2C, а другая UNO настроена как ведомое устройство.
Когда я настраиваю потенциометр, подключенный к Master Arduino UNO, он захватывает аналоговое показание с POT, преобразует его в цифровое значение (в диапазоне 0–1023), сопоставляет его с правильным значением ШИМ (в диапазон от 0 до 255) и передает это значение на ведомое устройство Arduino по шине I2C.
Подчиненное устройство Arduino, получив значение ШИМ, регулирует яркость своего светодиода. Кроме того, ведомая плата Arduino отправляет значение собственного потенциометра, преобразованное в число ШИМ, в ведущую плату Arduino (по запросу ведущей).
Мастер Arduino затем считывает значение ШИМ с ведомого устройства Arduino и регулирует яркость своего светодиода в соответствии с этим значением. Эта связь продолжается и беспрепятственно повторяется по шине I2C.
Это простая схема для понимания коммуникации Arduino I2C. Вы можете изменить схему, чтобы создать сложную шинную сеть I2C с различными ведомыми устройствами, такими как ЖК-дисплей I2C, микросхема EEPROM, датчик атмосферного давления BMP180 и т. д. (метеостанция с регистрацией данных).
Необходимые компоненты
- Arduino UNO x 2
- Потенциометр 10 кОм x 2
- Светодиод 5 мм x 2
- Резистор 330 Ом x 2
- Макет
- Соединительные провода
- Блок питания макетной платы (дополнительно)
Принципиальная схема
На следующем изображении показана принципиальная схема для демонстрации Arduino I2C между двумя платами Arduino UNO.
Код
Чтобы запрограммировать периферийное устройство I2C в Arduino, вам необходимо разобраться в библиотеке Wire. Это основная библиотека, которая позволяет вам взаимодействовать с устройствами I2C или TWI через шину I2C (линии SDA и SCL).
Wire Library
Он поставляется с Arduino IDE, и вам не нужно ничего загружать дополнительно. Все, что вам нужно сделать, это включить библиотеку Wire для работы с I2C в Arduino.
#include
Библиотека Wire предоставляет вам 10 функций для разработки приложений, связанных с I2C. Это:
- Wire.begin()
- Wire.requestFrom()
- Wire.beginTransmission()
- Wire.endTransmission()
- Wire.write()
- Провод.доступный()
- Wire.
read()
- Wire.SetClock()
- Wire.onReceive()
- Wire.onRequest()
Теперь давайте подробно рассмотрим некоторые важные функции Wire Library.
Функции библиотеки проводов
Wire.begin()
Используйте эту функцию для запуска связи I2C. Если вы передадите 7-битный адрес устройства в качестве аргумента этой функции, то устройство присоединится к шине I2C как ведомое, иначе оно присоединится как ведущее.
- Wire.begin() — Мастер
- Wire.begin(адрес) – Ведомый
Используйте эту функцию, чтобы начать передачу данных на ведомое устройство с указанным адресом.
Wire.write()
Как только вы начнете передачу с помощью вышеуказанной функции, вы можете начать отправку фактических данных с помощью функции Wire. write().
Вы также можете использовать эту функцию для записи данных от ведомого устройства к ведущему, когда ведущее устройство использует функцию Wire.RequestFrom().
- Wire.write(value) — Отправить однобайтовое значение
- Wire.write(string) — Отправить серию байтов в виде строки
- Wire.write(data, length) — Отправить массив данных указанной длины
Wire.endTransmission()
Чтобы завершить передачу данных I2C, используйте функцию Wire.endTransmission().
Wire.read()
Используйте эту функцию для чтения байта данных, которые были переданы от ведущего к ведомому или от ведомого к ведущему, когда мастер вызывает функцию Wire.requestFrom().
Wire.requestFrom()
Ведущее устройство I2C использует эту функцию для запроса байтов данных от ведомого устройства. Используйте функцию Wire.read() для получения данных.
- Wire.requestFrom(адрес, количество) – Запрос количества байтов данных, указанных количеством, от ведомого устройства с адресом, указанным в поле адреса.
Wire.onReceive()
Это функция-обработчик, используемая для определения функции, которая вызывается, когда ведомое устройство получает данные от ведущего устройства.
Wire.onRequest()
Это функция-обработчик, используемая для определения функции, которая вызывается, когда мастер запрашивает данные у ведомого.
Master Code
Используя вышеупомянутые функции, я написал простой код для Master Arduino, чтобы отправить значение PWM, а также запросить байт данных от Slave.
Код ведомого устройства
В коде ведомого устройства Arduino я определил адрес ведомого устройства как 0x14. Это может быть любое значение меньше 128. Важно отметить, что в ArduinoI2C Wire Library I используется 7-битный адрес I2C без бита чтения/записи.
Итак, если у вас есть 8-битный адрес (который включает в себя бит R/W), сдвиньте адрес вправо на 1 и затем используйте его в Wire Library. Библиотека автоматически изменит адрес в зависимости от операции чтения или записи.
Кроме того, убедитесь, что адрес ведомого устройства уникален и никакие два ведомых устройства не должны иметь одинаковый адрес.
Возвращаясь к коду, я объявил две функции «DataReceive» и «DataRequest», которые будут вызываться при получении данных ведомым устройством или при запросе данных от ведомого устройства. Данные, полученные Ведомым в функции DataReceive, содержат значение ШИМ, отправленное Ведущим.
Данные, которые должны быть переданы через функцию DataRequest, представляют собой значение ШИМ от ведомого к ведущему.
Заключение
В этом руководстве демонстрируется простая двусторонняя связь между двумя платами Arduino с использованием связи I2C. Вы узнали о периферийном устройстве Arduino I2C, нескольких важных основах связи I2C, библиотеке проводов, а также о том, как настроить и использовать связь Arduino I2c.
AW9523B I2C на Arduino Nano
Задавать вопрос
спросил
Изменено 1 год, 6 месяцев назад
Просмотрено 157 раз
Я тестирую расширитель ввода-вывода AW9523B с Arduino Nano. У меня не получается распознать устройство.
Использование сканера I2C для поиска всех подключенных устройств I2C.
Я подключил AW9523B к правильным выводам к контактам SDA/SCL Arduino с подтяжкой 5K. INTN подключен к GND.
EEPROM также подключен к шине. EEPROM распознается на шине. Я поменял местами контакты SDA/SCL, чтобы убедиться, но AW9523B по-прежнему не был обнаружен на шине.
Я пробовал менять контакты AD0 и AD1, но безрезультатно.
У меня есть конденсатор 22 мкФ на VCC.
Изменение вывода AD0 изменяет состояние подключенного светодиода по умолчанию, поэтому я вполне уверен, что микросхема не умерла.
Я также попробовал два скетча из примера:
https://github.com/mrmx/AW9523B
Любопытно, удалось ли кому-нибудь заставить работать AW9523B.
Обновленная рабочая схема
- ардуино-нано
- i2c
6
Расшифровка и добавление к ответу из комментариев.
AW9523B имеет контакт 23 сброса (RSTN), на который внутренне подается низкий уровень резистором 100 кОм (т. е. по умолчанию = сброс). @Majenko предлагает подключить подтягивающий резистор 10 кОм к + 5 В (т. Е. Без сброса), чтобы включить чип.
Схемы листа данных и раздел, описывающий функцию сброса (стр. 14), по-видимому, предполагают, что контакт RSTN будет подключен к контакту MCU GPO, используемому для динамического управления функцией сброса.