4.09.1. Лабораторная работа №4.9.1.md
Сканер I2C-устройств
Тема работы
Мы вступаем в мир интерфейса I2C
— удивительной технологии, которая позволяет подключать к Рудирону
десятки устройств, используя всего два провода! Но прежде чем подключать датчики и дисплеи, любой инженер сначала проверяет, «видит» ли микроконтроллер устройства на шине. В этой лабораторной работе мы напишем программу-сканер, которая опросит все возможные адреса на шине I2C
и выведет в монитор порта адреса всех найденных устройств.
Цель
- Понять практическое назначение интерфейса
I2C
. - Научиться инициализировать шину
I2C
с помощью библиотекиWire.h
. - Написать полезную утилиту — сканер
I2C
-адресов. - Подготовить «инструмент» для отладки будущих проектов с
I2C
-устройствами.
Оборудование и материалы
- Отладочная плата
Рудирон
. - USB-кабель для подключения
Рудирона
. - Компьютер с
Arduino IDE
.
Ход работы
-
Адреса на шине
I2C
Представьте, что
I2C
— это улица, аРудирон
— почтальон. На этой улице может быть до 127 домов — нашихI2C
-устройств (датчиков, дисплеев и пр.). Чтобы почтальон знал, в какой дом доставить посылку, у каждого дома должен быть свой уникальный номер — адрес.Каждое
I2C
-устройство имеет свой уникальный 7-битный адрес (число от 0 до 127), который «зашит» в него производителем. Микроконтроллер (master) обращается к устройству (slave), вызывая его по этому адресу.Задача нашего сканера — «прокричать» на улице
I2C
каждый адрес от 1 до 127 и послушать, откликнется ли кто-нибудь. Если устройство с таким адресом на шине есть, оно ответит, и мы поймём, что оно подключено и работает. -
Сборка схемы
Для этой лабораторной работы нам не нужно подключать никаких внешних компонентов! Мы будем сканировать пустую шину.
Рудирон
имеет встроенные подтягивающие резисторы на линияхI2C
, поэтому нам даже не нужно собирать схему.Если же у вас есть какое-либо
I2C
-устройство, подключите его, чтобы увидеть сканер в действии:VCC
устройства — к5V
или3.3V
Рудирона
.GND
устройства — кGND
Рудирона
.SCL
устройства — к пинуSCL
(18)Рудирона
.SDA
устройства — к пинуSDA
(19)Рудирона
.
-
Написание и загрузка кода
- Установите перемычку
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», чтобы загрузить код на плату.
- Установите перемычку
-
Проверка работы
- Откройте Монитор последовательного порта (
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
. Вы научились инициализировать шину и написали полезную программу-сканер. Теперь, если в будущем ваш новый датчик не будет работать, первым делом вы сможете запустить этот сканер и проверить, «видит» ли его Рудирон
на шине.
Вопросы для самопроверки
- Для чего используется интерфейс
I2C
? - Что такое адрес
I2C
-устройства? - Какие два пина на
Рудироне
отвечают заI2C
? - Какая библиотека используется для работы с
I2C
вArduino IDE
? - Что означает, если сканер вернул
0
устройств? А если он нашёл устройство по адресу0x27
?
Вы подготовили инструмент для исследования I2C
-устройств и поняли, как работает этот популярный интерфейс. Теперь, если в ваших будущих проектах появятся I2C
-датчики или дисплеи, вы всегда сможете проверить их подключение с помощью этой утилиты. Переходите к следующему параграфу, чтобы познакомиться с ещё одним важным интерфейсом для обмена данными — SPI
.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home