Sda scl arduino nano: SDA and SCL on Arduino Nano — connecting I2C devices to Arduino Nano

Как использовать связь 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.beginTransmission(address)

Используйте эту функцию, чтобы начать передачу данных на ведомое устройство с указанным адресом.

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, используемому для динамического управления функцией сброса.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *