Как соединить две платы Arduino с помощью I2C

Таким образом, чтобы разрешить передачу данных между двумя микроконтроллерами, необходимо установить протокол связи, такой как CAN, SPI, I2C или UART.

В этом руководстве будут рассмотрены основы работы I2C, аппаратные соединения и программная реализация, необходимая для настройки двух плат Arduino в качестве ведущего и ведомого I2C.

Что такое I2C?

Inter-Integrated Circuit (I2C) — это протокол связи, широко используемый во встроенных системах и микроконтроллерах для обеспечения передачи данных между электронными устройствами. В отличие от SPI (последовательный периферийный интерфейс), I2C позволяет подключать несколько ведущих устройств к шине с одним или несколькими подчиненными устройствами. Впервые он был использован Philips и также известен как протокол связи Two Wire Interface (TWI).

Как работает связь I2C?

I2C использует две двунаправленные линии: последовательные данные (SDA) и последовательные часы (SCL) для передачи данных и синхронизации связи между устройствами. Каждое устройство, подключенное к шине I2C, имеет уникальный адрес, который идентифицирует его во время связи. Протокол I2C позволяет нескольким устройствам использовать одну и ту же шину, и каждое устройство может выступать в качестве ведущего или ведомого.

Как соединить две платы Arduino с помощью I2C Рисунок 1

Связь инициируется ведущим устройством, и неправильная адресация ведомого устройства может вызвать ошибки передачи. Одним из основных преимуществ связи I2C является гибкость, которую она предлагает, когда речь идет об управлении питанием. Устройства, работающие при разных напряжениях, могут по-прежнему эффективно обмениваться данными с помощью преобразователя напряжения. Это означает, что устройствам, работающим на 3,3 В, требуется преобразователь напряжения для подключения к шине I2C 5 В.

Библиотека проводов

Библиотека Wire — это встроенная библиотека Arduino, которая предоставляет функции для связи по I2C. Он использует два контакта — SDA и SCL — на плате Arduino для связи I2C.

Контакты I2C на Arduino Uno:

Как соединить две платы Arduino с помощью I2C Рисунок 2

Контакты Arduino Nano I2C:

Как соединить две платы Arduino с помощью I2C. Рисунок 3.

Чтобы использовать библиотеку, вы должны включить заголовочный файл Wire.h в верхнюю часть скетча Arduino.

#включать

Библиотека Wire предоставляет функции для инициирования связи с устройством I2C, отправки и получения данных. Некоторые важные функции, о которых вы должны знать, включают в себя:

  1. Wire.begin() используется для подключения к шине I2C и инициирования связи.
  2. Wire.beginTransmission() используется для указания адреса ведомого устройства и инициирования передачи.
  3. Wire.write() используется для отправки данных на устройство I2C.
  4. Wire.endTransmission() используется для завершения передачи и проверки на наличие ошибок.
  5. Wire.requestFrom() используется для запроса данных с устройства I2C.
  6. Wire.available() используется для проверки доступности данных для чтения с устройства I2C.
  7. Wire.read() используется для чтения данных с устройства I2C.

Используйте функцию Wire.beginTransmission() для установки адреса датчика, который вставляется в качестве аргумента. Например, если бы адрес датчика был 0x68, вы бы использовали:

Wire.beginTransmission(0x68);

Настройка оборудования Arduino I2C

Чтобы соединить две платы Arduino с помощью I2C, вам потребуются следующие аппаратные компоненты:

  1. Две платы Arduino (ведущая и подчиненная)
  2. Макет
  3. Кабели
  4. Два 4,7кОм. подтягивающие резисторы

Подключите контакты SDA и SCL обеих плат Arduino к макетной плате. Подключите подтягивающие резисторы между контактами SDA и SCL к линии питания 5 В на макетной плате. Наконец, соедините две макетные платы кабелями.

Ардуино Уно. Схема

Как соединить две платы Arduino с помощью I2C. Рисунок 4.

Схема Arduino Nano

Как соединить две платы Arduino с помощью I2C Рисунок 5

Настройте плату Arduino в качестве ведущего и ведомого устройства I2C.

Используйте функцию Wire.requestFrom(), чтобы указать адрес ведомого устройства, с которым мы хотим установить связь. Затем используйте функцию Wire.read() для получения данных с ведомого устройства.

Код главного устройства:

#include void setup() { Wire.begin(); // подключение к шине i2c Serial.begin(9600); // запуск серийного номера для вывода } void receiveData() { int address = 8; интервал байтов для чтения = 6; Wire.requestFrom(адрес, bytesToRead); в то время как (Wire.available()) { char data = Wire.read(); Serial.print(данные); } задержка(500); } недействительный цикл() {receiveData(); }

Функция Wire.onReceive() используется для указания того, что делать, когда ведомое устройство получает данные от ведущего устройства. В приведенном выше коде функция Wire.available() проверяет наличие доступных данных, а функция Wire.read() считывает данные, отправленные ведущим устройством.

Код ведомого устройства:

#include void setup() { Wire.begin(8); // подключаемся к шине I2C с адресом 8 Wire.onReceive(receiveEvent); // вызовите receiveEvent при получении данных } void loop() { delay(100); } недействительными receiveEvent (целое число байтов) { Wire.write («привет»); // отвечаем сообщением из 6 байт, как и ожидал мастер }

Отправка и получение данных с использованием I2C

В этом примере считайте температуру с датчика температуры DHT11, который обменивается данными с ведомым устройством Arduino, и распечатайте его на последовательном мониторе ведущего устройства Arduino.

Как соединить две платы Arduino с помощью I2C. Рисунок 6.

Давайте изменим код, который мы написали ранее, чтобы включить измерение температуры, которое мы затем отправим на материнскую плату через шину I2C. Затем основная плата может прочитать отправленное значение и отобразить его на последовательном мониторе.

Код главного устройства:

#include void setup() { Wire.begin(); Серийный.начать(9600); Serial.println(“Мастер инициализирован!”); } void loop() { Wire.requestFrom(8, 1); // Запрос данных о температуре от ведомого устройства if (Wire.available()) { byte Temperature = Wire.read(); // Чтение данных о температуре с ведомого устройства Serial.print(“Temperature: “); Serial.print(температура); Serial.println(“°C”); } задержка(2000); // Подождите 2 секунды перед повторным запросом температуры }

Код ведомого устройства:

#include #include #define DHTPIN 4 // Контакт, подключенный к датчику DHT #define DHTTYPE DHT11 // Тип датчика DHT DHT dht(DHTPIN, DHTTYPE); температура байта; недействительная установка () { Wire.begin (8); // Адрес подчиненного устройства — 8 Wire.onRequest(requestEvent); дхт.начать(); } недействительный цикл () { задержка (2000); // Подождите 2 секунды, пока DHT стабилизирует температуру = dht.readTemperature(); // Чтение температуры с датчика DHT } void requestEvent() { Wire.write(temperature); // Отправляем данные о температуре мастеру }

Вы можете настроить этот код, чтобы он соответствовал любому датчику, который может быть у вас в вашем проекте, или даже отображать значения датчика на модуле дисплея, чтобы создать свой собственный термометр и гигрометр. в комнате.

Ведомая адресация с I2C на Arduino

Для чтения значений из компонентов, добавленных в шину I2C в таком проекте, важно, чтобы вы указали правильный адрес подчиненного устройства при написании кода. К счастью, Arduino предоставляет библиотеку сканера, которая упрощает процесс определения адресов ведомых устройств, избавляя от необходимости просеивать длинные описания датчиков и запутанную онлайн-документацию.

Используйте следующий код, чтобы определить адрес любого ведомого устройства, присутствующего на шине I2C.

#include // Включить библиотеку Wire для связи I2C void setup() { Wire.begin(); // Инициализировать связь I2C Serial.begin(9600); // Инициализировать последовательную связь со скоростью 9600 бод while (!Serial); // Подождите, пока установится последовательное соединение Serial.println(“nI2C Scanner”); // Выводим сообщение о начале сканирования I2C } void loop() { byte error, address; // Объявить переменные для хранения ошибок и адресов устройств int nDevices; // Объявить переменную для хранения количества найденных устройств Serial.println(“Scanning.”); // Выводим сообщение о начале сканирования I2C nDevices = 0; // Установить количество найденных устройств равным 0 для (адрес = 1; адрес

Взаимодействие двух плат Arduino с использованием протокола связи I2C обеспечивает гибкий и эффективный способ решения сложных задач, с которыми не может справиться одна плата. С помощью библиотеки Wire связь между двумя платами по I2C становится проще, что позволяет добавлять в проект больше компонентов.

Похожие записи

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

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