Arduino: как узнать I2C адрес устройства?

I2C — это такая шина данных, широко используемая в микроэлектронике. С помощью I2C можно подключить к Ардуино много разных полезных модулей, включая датчики, дисплеи, АЦП и даже другие платы Ардуино.

Шина является адресной, так что каждое подключаемое устройство имеет свой адрес в диапазоне от 8 до 127. На одной шине не может быть два устройства с одинаковыми адресами.

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

Программа для сканирования I2C шины

Чтобы понять, какой всё-таки адрес у модуля, подключаемого к плате Ардуино, нужно просто «постучаться» по каждому из 119 возможных адресов. Если кто-то ответит, значит адрес рабочий!

#include <Wire.h>
 
void setup(){
    Wire.begin();
 
    Serial.begin(9600);
    while (!Serial);
    Serial.println("\nI2C Scanner");
} 

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 шины на Ардуино

Это значит, что мой дисплей имеет адрес 0x27 в шестнадцатеричной системе счисления. Теперь можно смело подключить библиотеку для работы с такими дисплеями и указать в ней данный адрес.


Изменено:

Arduino: как узнать I2C адрес устройства?: Один комментарий

  1. Очень интересно, но думаю не помешала бы принципиальная схемка подключения I2C устройства к Ардуино. Ну или ссылка на такую процедуру.

  2. на двух lcd экранах 1602 — один адрес 0x27
    на двух lcd экранах 2004 — один адрес 0x3F

    • Адрес определяется стоит ли микросхема PCF8574A или PCF8574 в драйвере i2c lcd. У первой адрес [1 1 1 A0 A1 A2] , у второй [1 0 0 A0 A1 A2], в бинарном виде. Для [A0 A1 A2] = [1 1 1] перемычки разомкнуты, адрес в HEX по умолчанию первого 0x3F, второго 0x27.

  3. Здравствуйте! У меня выдает что COM3 недоступен( Помогите разобраться в чем может быть причина?

  4. Scanning…
    No I2C devices found
    Подключил всё правильно. Контакты перепаял 2 раза.

  5. у меня бесконечно бегут эти строки:
    8⸮initialization done.
    64 125 2.44 0.29
    0 75 1.46 0.00
    0 75 1.46 0.00
    0 75 1.46 0.27
    245 249 4.86 4.66
    255 249 4.86 5.01
    0 75 1.46 0.00
    0 75 1.46 0.00
    16 75 1.46 0.62
    255 249 4.86 5.01
    255 249 4.86 5.01
    0 75 1.46 0.00
    0 75 1.46 0.01
    227 245 4.78 4.08
    255 249 4.86 5.01

  6. Ошибку исправьте, иначе адрес 127 не проверится.

    for(address = 8; address <= 127; address++ ){

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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.