4.09.1. Лабораторная работа №4.9.1.md


Сканер I2C-устройств

Тема работы

Мы вступаем в мир интерфейса I2C — удивительной технологии, которая позволяет подключать к Рудирону десятки устройств, используя всего два провода! Но прежде чем подключать датчики и дисплеи, любой инженер сначала проверяет, «видит» ли микроконтроллер устройства на шине. В этой лабораторной работе мы напишем программу-сканер, которая опросит все возможные адреса на шине I2C и выведет в монитор порта адреса всех найденных устройств.

Цель

  • Понять практическое назначение интерфейса I2C.
  • Научиться инициализировать шину I2C с помощью библиотеки Wire.h.
  • Написать полезную утилиту — сканер I2C-адресов.
  • Подготовить «инструмент» для отладки будущих проектов с I2C-устройствами.

Оборудование и материалы

  • Отладочная плата Рудирон.
  • USB-кабель для подключения Рудирона.
  • Компьютер с Arduino IDE.

Ход работы

  1. Адреса на шине I2C

    Представьте, что I2C — это улица, а Рудирон — почтальон. На этой улице может быть до 127 домов — наших I2C-устройств (датчиков, дисплеев и пр.). Чтобы почтальон знал, в какой дом доставить посылку, у каждого дома должен быть свой уникальный номер — адрес.

    Каждое I2C-устройство имеет свой уникальный 7-битный адрес (число от 0 до 127), который «зашит» в него производителем. Микроконтроллер (master) обращается к устройству (slave), вызывая его по этому адресу.

    Задача нашего сканера — «прокричать» на улице I2C каждый адрес от 1 до 127 и послушать, откликнется ли кто-нибудь. Если устройство с таким адресом на шине есть, оно ответит, и мы поймём, что оно подключено и работает.

  2. Сборка схемы

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

    Если же у вас есть какое-либо I2C-устройство, подключите его, чтобы увидеть сканер в действии:

    • VCC устройства — к 5V или 3.3V Рудирона.
    • GND устройства — к GND Рудирона.
    • SCL устройства — к пину SCL (18) Рудирона.
    • SDA устройства — к пину SDA (19) Рудирона.
  3. Написание и загрузка кода

    • Установите перемычку PRG | RUN в положение PRG.
    • В Arduino IDE введите следующий код:

      // Подключаем стандартную библиотеку для работы с I2C
      #include <Wire.h>
      
      void setup() {
        // Инициализируем I2C и Serial
        Wire.begin();
        Serial.begin(115200);
      
        Serial.println("\nСканирование шины I2C...");
      }
      
      void loop() {
        byte error, address;
        int nDevices = 0;
      
        // Проходим по всем возможным адресам (от 1 до 127)
        for (address = 1; address < 127; address++) {
        // Wire.beginTransmission() начинает сеанс связи с устройством
        Wire.beginTransmission(address);
        // Wire.endTransmission() завершает сеанс и возвращает код ошибки
        // 0: успех (устройство найдено)
        // 4: другая ошибка (устройство не ответило)
        error = Wire.endTransmission();
      
        if (error == 0) {
            Serial.print("Найдено I2C-устройство по адресу 0x");
            if (address < 16) {
              Serial.print("0");
            }
            Serial.println(address, HEX);
            nDevices++;
        }
        }
      
        if (nDevices == 0) {
        Serial.println("I2C-устройств не найдено.");
        } else {
        Serial.println("Сканирование завершено.");
        }
      
        delay(5000); // Ждём 5 секунд перед повторным сканированием
      }
      
    • Нажмите кнопку «Upload», чтобы загрузить код на плату.
  4. Проверка работы

    • Откройте Монитор последовательного порта (Tools → Serial Monitor) и установите скорость 115200 бод.
    • Если у вас ничего не подключено, программа выведет:

      Сканирование шины I2C...
      I2C-устройств не найдено.
      
    • Если у вас подключено I2C-устройство, программа найдёт его и выведет его адрес. Например, для часов реального времени DS3231:

      Сканирование шины I2C...
      Найдено I2C-устройство по адресу 0x68
      Сканирование завершено.
      

Результаты

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

Анализ результатов

  • #include <Wire.h>. Подключает стандартную библиотеку для работы с I2C.
  • Wire.begin(). Инициализирует I2C-интерфейс на Рудироне, делая его «мастером» на шине.
  • Wire.beginTransmission(address). «Почтальон» пытается начать разговор с домом по указанному адресу.
  • Wire.endTransmission(). «Почтальон» завершает попытку и сообщает результат. Если вернулся 0, значит, кто-то «открыл дверь» — устройство с таким адресом существует и готово к работе.

Выводы

В этой лабораторной работе вы подготовились к работе с интерфейсом I2C. Вы научились инициализировать шину и написали полезную программу-сканер. Теперь, если в будущем ваш новый датчик не будет работать, первым делом вы сможете запустить этот сканер и проверить, «видит» ли его Рудирон на шине.

Вопросы для самопроверки

  1. Для чего используется интерфейс I2C?
  2. Что такое адрес I2C-устройства?
  3. Какие два пина на Рудироне отвечают за I2C?
  4. Какая библиотека используется для работы с I2C в Arduino IDE?
  5. Что означает, если сканер вернул 0 устройств? А если он нашёл устройство по адресу 0x27?

Вы подготовили инструмент для исследования I2C-устройств и поняли, как работает этот популярный интерфейс. Теперь, если в ваших будущих проектах появятся I2C-датчики или дисплеи, вы всегда сможете проверить их подключение с помощью этой утилиты. Переходите к следующему параграфу, чтобы познакомиться с ещё одним важным интерфейсом для обмена данными — SPI.