Введение
I2C (Inter-Integrated Circuit) — популярный протокол связи, позволяющий микроконтроллерам общаться с датчиками, дисплеями и другими периферийными устройствами всего по двум проводам: SDA (данные) и SCL (тактирование). Но при прототипировании вы часто не знаете точный адрес нового I2C-устройства. Вот тут и пригодится I2C сканер. Он опрашивает все возможные адреса на шине и сообщает, какие из них отвечают.
В этом руководстве мы создадим I2C сканер для Raspberry Pi Pico с помощью симулятора Velxio в браузере. Вы узнаете, как собрать простую схему с двумя индикаторными светодиодами, написать код сканирования на Arduino C++ и интерпретировать результаты. Никакого оборудования не нужно — только ваш браузер!

Сборка схемы
Наша схема минималистична, но поучительна. Мы используем два светодиода для визуальной обратной связи во время сканирования:
- Синий светодиод (led-scan): Подключен к GP12 (D12 на Pico) через токоограничивающий резистор (встроенный в компонент светодиода). Его анод (A) соединяется с GP12, а катод (C) — с землей. Этот светодиод мигает каждый раз, когда сканер отправляет условие старта на шине I2C.
- Зеленый светодиод (led-found): Подключен к GP10 (D10). Его анод идет к GP10, катод — к земле. Этот светодиод загорается, когда во время сканирования найдено устройство.
Оба светодиода имеют общее заземление, подключенное к контакту GND.1 на Pico. Сама шина I2C использует стандартные выводы: SDA = GP4 и SCL = GP5. Внешние подтягивающие резисторы не требуются, так как библиотека Wire включает внутренние подтяжки Pico.
Чтобы собрать эту схему в Velxio:
- Откройте выбор компонентов на панели инструментов холста.

- Добавьте плату Raspberry Pi Pico.
- Добавьте два светодиода (синий и зеленый) из категории Output.
- Подключите их, как описано: GP12 → анод синего светодиода, GP10 → анод зеленого светодиода, оба катода → GND.
- Используйте панель инструментов холста для масштабирования и аккуратного расположения компонентов.

Разбор кода
Теперь давайте разберем код. Откройте редактор кода в Velxio и вставьте следующий скетч:
// Raspberry Pi Pico — I2C Scanner
// Scans I2C bus (Wire / I2C0: SDA=GP4, SCL=GP5) for devices
#include <Wire.h>
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin(); // SDA=GP4, SCL=GP5 by default on Pico
Serial.println("=== Pico I2C Scanner ===");
Serial.println("Default I2C0: SDA=GP4, SCL=GP5");
Serial.println();
}
void loop() {
Serial.println("Scanning I2C bus...");
int found = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
byte error = Wire.endTransmission();
if (error == 0) {
found++;
Serial.print(" Device found at 0x");
if (addr < 16) Serial.print("0");
Serial.print(addr, HEX);
// Identify known addresses
switch (addr) {
case 0x48: Serial.print(" (Temperature sensor)"); break;
case 0x50: Serial.print(" (EEPROM)"); break;
case 0x68: Serial.print(" (DS1307 RTC)"); break;
case 0x27: Serial.print(" (LCD backpack)"); break;
case 0x3C: Serial.print(" (SSD1306 OLED)"); break;
default: break;
}
Serial.println();
}
}
Serial.print("Scan complete. Found ");
Serial.print(found);
Serial.println(" device(s).");
Serial.println();
delay(5000);
}
Как это работает
Wire.begin()инициализирует периферию I2C на стандартных выводах (GP4/GP5). На Pico это настраивает I2C0.- Цикл
forперебирает все возможные 7-битные адреса от 1 до 127. Адрес 0 зарезервирован для общего вызова, поэтому мы его пропускаем. - Для каждого адреса мы вызываем
Wire.beginTransmission(addr), а затемWire.endTransmission(). Возвращаемое значениеendTransmission()равно 0, если устройство подтвердило прием, или ненулевому коду ошибки в противном случае. - Если устройство отвечает, мы выводим его адрес в шестнадцатеричном формате. Код также включает оператор switch, который помечает некоторые распространенные адреса (например, 0x3C для OLED-дисплеев SSD1306).
- Синий светодиод на GP12 переключается каждый раз, когда начинается цикл сканирования (вы можете добавить
digitalWrite(12, HIGH)иdigitalWrite(12, LOW)вокруг цикла сканирования для визуальной обратной связи). Зеленый светодиод на GP10 загорается, когда устройство найдено.
Чтобы скомпилировать и запустить, нажмите кнопку compile на панели инструментов редактора.

Ключевые концепции
- Протокол I2C: Много master-много slave, пакетно-коммутируемая, одноконечная, последовательная шина связи. Каждое устройство имеет уникальный адрес.
- Библиотека Wire: Встроенная библиотека Arduino для связи по I2C. На Pico она по умолчанию использует I2C0.
- Подтягивающие резисторы: Линии I2C требуют подтягивающих резисторов к VCC. Pico имеет внутренние подтяжки, которые можно включить, но для надежной работы с несколькими устройствами рекомендуются внешние резисторы на 4.7 кОм.
- Адресация: 7-битные адреса находятся в диапазоне от 0x01 до 0x7F (127). Некоторые адреса зарезервированы (например, 0x00 для общего вызова).
Типичные ошибки и советы по отладке
- Устройства не найдены? Проверьте, что ваши I2C-устройства подключены к питанию и правильно соединены. В симуляции убедитесь, что вы добавили виртуальные I2C-периферийные устройства (например, OLED или датчик температуры) в схему.
- Не те выводы? Стандартные выводы I2C0 на Pico — GP4 (SDA) и GP5 (SCL). Если вы используете другие выводы, вызовите
Wire.setSDA(pin)иWire.setSCL(pin)передWire.begin(). - Последовательный монитор не показывает вывод? Убедитесь, что скорость передачи данных совпадает (115200 в нашем коде). В Velxio откройте последовательный монитор на панели инструментов.
- Светодиоды не мигают? Проверьте подключение: анод к GPIO, катод к GND. Также убедитесь, что вы настроили выводы как выходы в
setup()с помощьюpinMode(12, OUTPUT)иpinMode(10, OUTPUT).
Предлагаемые расширения
- Добавьте реальное I2C-устройство: Разместите OLED SSD1306 или датчик BMP280 на холсте и посмотрите, как сканер его обнаружит.
- Сканирование нескольких шин: Pico имеет два I2C-периферийных устройства (I2C0 и I2C1). Измените код для сканирования обеих.
- Отображение результатов на LCD: Вместо последовательного монитора показывайте найденные адреса на LCD 16x2.
- Автоопределение и настройка: Как только вы узнаете адрес устройства, автоматически инициализируйте его библиотеку.
Попробуйте сами!
Готовы просканировать шину I2C? Откройте живой пример в Velxio и начинайте экспериментировать:
Запустить Pico I2C Scanner на Velxio
Никаких загрузок, никакой пайки — только чистая симуляция. Изменяйте код, добавляйте новые компоненты и мгновенно видите результаты. Удачного сканирования!