![Сканиране на I2C интерфейса с Arduino](http://ardudevelop.eu/wp-content/uploads/2024/09/Сканиране-на-I2C-интерфейса-с-Arduino-Как-да-намерим-свързаните-устройства.png)
Какво е I2C и за какво се използва?
I2C (Inter-Integrated Circuit) е сериен комуникационен протокол, който позволява свързване и комуникация между микроконтролери и различни периферни устройства като сензори, дисплеи, и други. Едно от основните предимства на I2C е, че позволява управление на няколко устройства чрез само две комуникационни линии – SDA
(Serial Data Line) и SCL
(Serial Clock Line). Всяко устройство на I2C шината има уникален 7-битов или 10-битов адрес, което позволява на микроконтролера да комуникира с множество устройства по една и съща линия.
I2C често се използва за свързване на:
- Температурни сензори (например, DS3231),
- OLED дисплеи,
- EEPROM памети,
- Акселерометри и жироскопи (например, MPU-6050).
Този интерфейс е полезен в проекти, където е необходимо множество устройства да бъдат свързани към един микроконтролер, но наличните пинове са ограничени.
В този пример ще използваме Arduino UNO. За да свържете коректно I2C устройствата към платката на контролера разгледайте нашето ревю за Arduino UNO.
Необходимост от сканиране на I2C шина
Когато използвате I2C интерфейса в проект с Arduino, може да се наложи да определите адресите на всички устройства, свързани към шината. Всеки I2C компонент има предварително зададен адрес, но в някои случаи може да се наложи ръчно да определите кои устройства са свързани и с какви адреси работят.
Това се постига чрез сканиране на I2C шината – процес, при който Arduino проверява всеки възможен адрес на I2C интерфейса и открива активните устройства. Такава проверка е особено полезна, когато имате проблеми с комуникацията или когато не знаете точния адрес на дадено устройство.
Какво прави програмата за сканиране на I2C?
Кодът, който ще разгледаме, представлява програма за сканиране на I2C интерфейса. Тя проверява всички възможни адреси на I2C шината (от 1 до 127) и съобщава на Serial монитора, ако на даден адрес има устройство.
КОД
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; 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("Unknown 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(2000); // wait 2 seconds for next scan
}
Пълно обяснение на кода
- Библиотека
Wire.h
: В кода първо включваме библиотекатаWire.h
, която предоставя функции за управление на I2C комуникацията. Тази библиотека е стандартна част от Arduino IDE и се използва за инициализиране на I2C шината и изпращане на данни между устройства. - Функция
setup()
:Wire.begin()
: Инициализира I2C комуникацията като главно устройство (master). Тази функция е задължителна за всеки проект, който използва I2C интерфейса.Serial.begin(9600)
: Стартира сериен монитор със скорост на комуникация от 9600 бода. Това е необходимо, за да можем да виждаме резултатите от сканирането на I2C на компютъра чрез Serial Monitor.while (!Serial);
: Тази част от кода е специфична за платформи като Arduino Leonardo, където Serial връзката не се установява веднага. Тя осигурява изчакване до успешното стартиране на сериен монитор.Serial.println("\nI2C Scanner");
: Отпечатва съобщение за старт на сканирането.
- Функция
loop()
:- Цикълът за сканиране: Основният цикъл на програмата, който сканира всички възможни I2C адреси от 1 до 127. Адресът
0
не се използва, тъй като е запазен. Wire.beginTransmission(address)
: Започва предаване към даден I2C адрес.Wire.endTransmission()
: Изпраща данни към устройството на дадения адрес и връща код на грешка. Ако няма грешка (код 0), това означава, че има устройство на този адрес.- Обработка на намерено устройство: Ако не е върната грешка, програмата отпечатва адреса на намереното устройство на Serial монитора.
- Обработка на грешки: Ако кодът за грешка е 4, това означава “неизвестна грешка“, която също се отпечатва за съответния адрес.
- Цикълът за сканиране: Основният цикъл на програмата, който сканира всички възможни I2C адреси от 1 до 127. Адресът
- Отчет за резултати:
- След като цикълът премине през всички адреси, програмата проверява дали са намерени устройства. Ако няма намерени устройства, отпечатва съобщение, че не са намерени I2C устройства.
- Ако има намерени устройства, програмата отпечатва “done“.
- Забавяне: След всеки цикъл от сканиране, програмата изчаква 2 секунди, преди да стартира ново сканиране. Това е полезно, ако искаме непрекъснато да наблюдаваме за свързани устройства.
За какво може да се използва тази програма?
Тази програма е полезна, когато работите с множество I2C устройства и трябва да установите техните адреси. Често различни устройства идват с предварително зададени адреси, които могат да се припокриват или да не са известни предварително. Сканирането на I2C шината ви помага бързо да идентифицирате наличните устройства и техните адреси, за да можете да конфигурирате проекта си правилно.
Примерни приложения:
- Откриване на адреса на температурен сензор DS3231.
- Сканиране за OLED дисплей на I2C шина.
- Проверка за наличие на акселерометър MPU-6050 на I2C шината.
Заключение
I2C интерфейсът е изключително полезен за свързване на множество устройства с минимален брой кабели. Програмата за сканиране на I2C, която разгледахме, ви позволява лесно да установите адресите на всички устройства на шината, което е важна стъпка в разработката на I2C-базирани проекти с Arduino.