Перейти к содержанию

Интерфейс i2c Ардуино, сканер i2c шины (scl sda)

Интерфейс i2c Ардуино, сканер i2c шины

I2C Arduino (i2c — Inter-Integrated Circuits) — это протокол последовательной связи по двум линиям связи. Эти линии также называются: шина SDA (последовательные данные) и шина SCL (последовательный тактовый генератор). Порты SDA и SCL Ардуино подтягиваются к шине питания микроконтроллера через резисторы. Рассмотрим, что такое шина i2c Arduino Nano и как подключить к плате Ардуино несколько устройств по интерфейсу i2c.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • lcd 1602 i2c дисплей
  • модуль rtc ds1307 i2c
  • коннекторы
  • библиотека LiquidCrystal_I2C.h и iarduino_RTC.h

Дополнительные материалы на эту тему:

  1. Подключение устройств по шине SPI к Arduino
  2. Порты коммуникации на Arduino Uno, Nano, Mega
  3. Язык программирования Ардуино C++

Микроконтроллеры Arduino используют два контакта для работы i2c. В Arduino Uno и Nano линия SDA соответствует аналоговому порту A4, а SCL — аналоговому порту A5. В Ardunio Mega линия SDA — это 20 вывод, а линия SCL — 21 вывод. Чтобы облегчить работу с шиной i2c и обмен данными между устройствами, для IDE Arduino написана стандартная библиотека Wire (скачивать и устанавливать библиотеку не требуется).

Протокол интерфейс i2c Ардуино: описание

Интерфейс i2c Ардуино, сканер i2c шины

Каждому устройству при подключении к микроконтроллеру по протоколу i2c присваивается уникальный адрес (можно подключить до 127 устройств). Изменить адрес устройства на шине невозможно, так как он встроен в микросхему. Часто производители модулей предлагают возможность изменения адреса устройства в небольшом диапазоне, что позволяет подключить к шине iic Arduino несколько одинаковых устройств одновременно.

I2C scanner Arduino (сканер шины i2c)

I2C scanner Arduino (сканер шины i2c)

LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

Следующая программа позволяет узнать адреса всех устройств, подключенных к шине i2c. Если устройство не было подключено или подключено неправильно, на мониторе порта появится сообщение о том, что устройство не найдено. Вместо дисплея можно подключить любое устройство, поддерживающее связь с микроконтроллером по протоколу iic — модуль часов реального времени DS1302, датчик атмосферного давления BMP180 и т.д.

Скетч для сканирования шины I2C Arduino


#include "Wire.h"
 
void setup(){
   Wire.begin();    
   Serial.begin(9600);
} 
 
void loop(){
   byte error, address;
   int nDevices;
 
   Serial.println("Scanning...");
 
   nDevices = 0;
   for(address = 8; address < 127; address++ ){
      Wire.beginTransmission(address);
      error = Wire.endTransmission();
 
       if (error == 0){
          Serial.print("I2C device found at address 0x");
          if (address < 16)
             Serial.print("0");
             Serial.print(address,HEX);
             Serial.println(" !");
             nDevices++;
       }

       else if (error == 4) {
           Serial.print("Unknow error at address 0x");
           if (address < 16)
              Serial.print("0");
           Serial.println(address,HEX);
      } 
   }
   if (nDevices == 0)
      Serial.println("No I2C devices found\n");
   else
      Serial.println("done\n");
 
   delay(5000);
}

Подключение несколько устройств к шине i2c Ардуино

Подключение несколько устройств к шине i2c Ардуино

DS1307 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

В следующем примере два устройства: дисплей 1602 и модуль часов времени будут подключены к шине IIC. После сборки схемы можно провести предварительное сканирование шины, используя программу, размещенную выше. Адреса всех устройств различны, и можно изменить только iic адрес жк дисплея 1602 i2c. Для остальных устройств адреса «жестко привязаны» и используются в библиотеках по умолчанию.

Скетч несколько устройств на i2c, scanner i2c шины

#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27,16,2);
 
#include "iarduino_RTC.h"
iarduino_RTC time (RTC_DS1307);           // DS1307 i2C
// iarduino_RTC time (RTC_DS3231);        // DS3231 i2C

void setup() {
  Serial.begin(9600);
  LCD.init();
  LCD.backlight();
  time.begin();
  // 0  sec, 30 min, 18 hour, 2 date, january, 2022, wed
  time.settime(0, 30, 18, 2, 1, 22, 0);
}

void loop() {
  // выводим время 1 раз в секунду
  if (millis() % 1000 == 0) {
     Serial.println(time.gettime("d-m-Y, H:i:s, D"));

     LCD.setCursor(0,0);
     LCD.print(time.gettime("d M Y, D"));
     LCD.setCursor(4,1);
     LCD.print(time.gettime("H:i:s"));
  }
}

Заключение. Мы исследовали возможность подключения нескольких i2c устройств к плате Ардуино, что будет полезно знать при разработке различных DIY проектов. Например, метеостанции на Ардуино с дисплеем и датчиком давления. Если у вас остались вопросы о сканере шины i2c или о подключении нескольких периферийных устройств по этому протоколу, не стесняйтесь оставлять их в комментариях к этой статье.

Комментарии 3

  • Снова я не раскрыл тайну — если у разных контроллеров разные ноги прод I2C (а у некоторых даже 3 пары), то как же программе передать — к каким ногам мы подвязались?
    Это интересует в разрезе STM32. В листинге библиотек про дисплей даже не нашел сочетаний SDA/SCL. Китайская грамота в музее понятней…

  • Спасибо за ответ, но это может справедливо для родных плат.
    Меня беспокоит STM32f103 — у нее 2 порта I2C и целых 6 ног под коммуникацию. Как библиотека узнает, куда я подвязался? На Форуме дали намёк:
    github.com/stm32duino/Arduino_Core_STM32/blob/main/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino

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

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

newzaym
➜