В этом руководстве мы увидим, как настроить и использовать связь I2C на Arduino. В этом руководстве по Arduino I2C объясняются выводы I2C в Arduino, настройка главного и подчиненного устройств и, наконец, простая демонстрация, в которой две платы Arduino UNO обмениваются данными через I2C.
Схема
I2C или I 2 C — это сокращение от Inter-Integrated Circuit, протокола синхронной последовательной связи, разработанного Phillips для связи между быстрым микроконтроллером и относительно медленными периферийными устройствами (такими как память или датчики) с использованием всего двух проводов. Следовательно, его иногда также называют TWI (двухпроводной интерфейс).
Используя I2C, вы можете передавать данные со скоростью 100 кбит/с (тактовая частота 100 кГц — стандартный режим), 400 кбит/с (тактовая частота 400 кГц — быстрый режим), 1 Мбит/с (тактовая частота 1 МГц — быстрый режим Plus) и 3,4 Мбит/с (тактовая частота 3,4 МГц — режим высокой скорости).
Это может показаться немного, но этого достаточно для сопряжения датчиков, памяти и дисплеев на небольших расстояниях.
Шина I2C состоит из двух проводов, называемых последовательными данными (SDA) и последовательными часами (SCL). Данные передаются по линии SDA, а линия SCL используется для синхронизации устройств с тактовым сигналом.
Обе эти линии шины являются драйверами с открытым стоком, и поэтому вы должны использовать подтягивающие резисторы, чтобы поддерживать их ВЫСОКИЙ уровень.
Существует два типа устройств, которые подключаются к шине I2C: Master и Slave. Мастера шины отвечают за отправку и получение данных на ведомые устройства и с них. Тактовый сигнал также подается мастером.
Сеть I2C поддерживает несколько мастеров и несколько ведомых (но обычно мы видим одного ведущего и несколько ведомых). Каждое ведомое устройство, подключенное к шине I2C, имеет уникальный 7-битный адрес.
Используя этот адрес, ведущее устройство выбирает конкретное ведомое устройство для передачи данных (отправки или получения), и выбранное ведомое устройство отвечает в соответствии с запросом.
Я сделал подробное руководство по основам I 2 C Связь. Для получения дополнительной информации посетите « Основы связи I2C ».
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 кГц.
Чтобы продемонстрировать работу 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 I2C между двумя платами Arduino UNO.
Чтобы запрограммировать периферийное устройство I2C в Arduino, вам необходимо разобраться в библиотеке Wire. Это основная библиотека, которая позволяет вам взаимодействовать с устройствами I2C или TWI через шину I2C (линии SDA и SCL).
Он поставляется с Arduino IDE, и вам не нужно ничего загружать дополнительно. Все, что вам нужно сделать, это включить библиотеку Wire для работы с I2C в Arduino.
#include
Библиотека Wire предоставляет вам 10 функций для разработки приложений, связанных с I2C. Это:
Теперь давайте подробно рассмотрим некоторые важные функции Wire Library.
Wire.begin()
Используйте эту функцию для запуска связи I2C. Если вы передадите 7-битный адрес устройства в качестве аргумента этой функции, то устройство присоединится к шине I2C как ведомое, иначе оно присоединится как ведущее.
Wire.beginTransmission(address)
Используйте эту функцию, чтобы начать передачу данных на ведомое устройство с указанным адресом.
Wire.write()
Как только вы начнете передачу с помощью вышеуказанной функции, вы можете начать отправку фактических данных с помощью функции Wire. write().
Вы также можете использовать эту функцию для записи данных от ведомого устройства к ведущему, когда ведущее устройство использует функцию Wire.RequestFrom().
Чтобы завершить передачу данных I2C, используйте функцию Wire.endTransmission().
Wire.read()
Используйте эту функцию для чтения байта данных, которые были переданы от ведущего к ведомому или от ведомого к ведущему, когда мастер вызывает функцию Wire.requestFrom().
Wire.requestFrom()
Ведущее устройство I2C использует эту функцию для запроса байтов данных от ведомого устройства. Используйте функцию Wire.read() для получения данных.
Wire.onReceive()
Это функция-обработчик, используемая для определения функции, которая вызывается, когда ведомое устройство получает данные от ведущего устройства.
Wire.onRequest()
Это функция-обработчик, используемая для определения функции, которая вызывается, когда мастер запрашивает данные у ведомого.
Используя вышеупомянутые функции, я написал простой код для 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.
Следующие библиотеки включены в программное обеспечение Wiring. Есть Основные библиотеки , которые зависят от платформы, и Кросс-платформенные библиотеки , которые не зависят от платформы. Чтобы добавить его в проект, выберите его имя в опции «Импортировать библиотеку…» в меню «Эскиз». Эти библиотеки с открытым исходным кодом; код распространяется с Wiring.
Плата ввода/вывода Basic Wiring, внутренняя библиотека управления EEPROM/
Библиотека управления переменными EEPROM.
Базовая библиотека управления кодировщиком.
Ханса-Кристофа Штайнера и поддерживается Паулем Стоффрегеном. Общий протокол, предназначенный для связи с Wiring из программного обеспечения на хост-компьютере.
Базовая библиотека управления жидкокристаллическим дисплеем (ЖКД) (параллельная связь, 8 бит).
Базовая библиотека управления светодиодной матрицей с использованием контроллеров MAX LED Matrix.
Микал Харт. Поддерживает связь между проводкой и внешним оборудованием через программные последовательные порты.
Майкл Марголис. Библиотека управления серводвигателями.
Поддерживает связь между Wiring и внешним оборудованием через программные последовательные порты.
Двухпроводной интерфейс для отправки и получения данных по сети устройств или датчиков.
Шина последовательного периферийного интерфейса или шина SPI для отправки и получения данных в режиме ведущий/ведомый.
Библиотека аппаратных абстракций для кнопок. Это обеспечивает простой способ обработки кнопок.
Простой способ создания переменных с ограничениями.
Библиотека, обеспечивающая свободный API для печати.
Обеспечивает простой способ создания конечных автоматов.
Реализация структуры данных Hash Map для платформы Wiring.
Эта библиотека предоставляет простой интерфейс для использования матричных клавиатур.
Это библиотека аппаратных абстракций для светодиодов. Обеспечьте простой способ обработки светодиодов в коде.
Обеспечивают простой способ создания меню.
Томаса Уэлле Фредерикса. Messenger — это «инструментарий», облегчающий анализ сообщений ASCII. Также на французском языке. Главный сайт.
от Maarten Lamers. Библиотека для удобного декодирования данных GPS на оборудовании Wiring и Arduino. Главный сайт.
Базовая библиотека OSC (Open Sound Control).
Библиотека для простой обработки паролей.
Это библиотека аппаратных абстракций для потенциометров. Предоставьте простой способ изготовления/использования потенциометров.
Обеспечивает простой способ планирования вызовов функций в будущем.
Упростите плавную интерполяцию от x до y с шагом z (между каждым значением).
Контролирует набор правил, которые автоматически запускают обработчик при нарушении правила.
Базовая библиотека обработки спрайтов изображений для использования в анимации со светодиодной матрицей.
Базовая библиотека управления шаговым двигателем.
Обеспечивает простой способ запуска функций с заданным интервалом.
Эта библиотека позволяет управлять платой Wiring I/O из Processing без написания кода в Wiring IDE. Он использует протокол Firmata.
Эта библиотека позволяет управлять платой Wiring I/O из Openframeworks без написания кода в Wiring IDE. Он использует протокол Firmata.
Кристоф Вартманн и Этьен Рибейро Библиотека находится на ранней стадии, но уже полезна для небольших приложений в Processing. Соединяйте датчики и двигатели без необходимости программирования в Wiring, непосредственно в Processing или JAVA!.
Дополнительные библиотеки, если они стандартные (стиль библиотек проводки), необходимо загрузить отдельно и поместить в папку «библиотеки» вашего альбома для рисования проводки или следовать инструкциям на соответствующем сайте. Чтобы найти местонахождение альбома для рисования проводки на вашем компьютере, откройте окно «Настройки» в приложении «Связь» и найдите элемент «Местоположение альбома для эскизов» вверху. Скопируйте папку предоставленной библиотеки в папку «libraries» в этом месте. Вам нужно будет создать папку «libraries», если это ваша первая добавленная библиотека . Перейдите по ссылкам ниже для получения дополнительной информации о каждой библиотеке.