Обнаружение проблем:
- ICM20948: FAIL - проблема с подключением или питанием IMU
- BMP280: FAIL - конфликт адресов I2C или неисправность датчика
- INT pin: FAIL - провод отключен или обрыв соединения
- FSINC pin: FAIL - провод отключен или обрыв соединения
Преимущества
- Быстрота: тест выполняется за 0.2-0.5 секунды
- Надежность: точное определение подключения проводов
- Простота: не требует дополнительных компонентов
- Информативность: подробный вывод для диагностики
Схема подключения:
| Модуль IMU | Arduino Pin | Назначение |
|---|---|---|
| VCC | 3.3V | Питание 3.3V |
| GND | GND | Земля |
| SDA | A4 (SDA) | I2C данные |
| SCL | A5 (SCL) | I2C тактовая |
| INT | D10 | Прерывание |
| FSINC | D12 | Синхронизация |
Использование в проектах
После успешного тестирования модуль готов к использованию. Для работы с данными датчиков рекомендуются библиотеки:
Adafruit_ICM20948для ICM20948Adafruit_BMP280для BMP280
Программа является идеальным инструментом для первоначальной проверки модуля перед использованием в сложных проектах.
#include <wire.h>
void setup() {
Serial.begin(9600);
// Настройка пинов с подтяжкой к VCC
pinMode(13, OUTPUT);
pinMode(10, INPUT_PULLUP); // INT с подтяжкой
pinMode(12, INPUT_PULLUP); // FSINC с подтяжкой
digitalWrite(13, LOW);
Wire.begin();
Serial.println("=== ТЕСТ С ПРОВЕРКОЙ ПОДКЛЮЧЕНИЯ ПРОВОДОВ ===");
bool allTestsPassed = true;
// Тест датчиков
allTestsPassed &= testSensor(0x68, 0x00, 0xEA, "ICM20948");
allTestsPassed &= testSensor(0x77, 0xD0, 0x58, "BMP280");
// Тест пинов с проверкой подключения проводов
allTestsPassed &= testPinWithWireCheck(10, "INT");
allTestsPassed &= testPinWithWireCheck(12, "FSINC");
// Итоговый результат
Serial.println("========================");
if (allTestsPassed) {
Serial.println("✅ ALL TESTS PASSED!");
digitalWrite(13, HIGH);
} else {
Serial.println("❌ SOME TESTS FAILED!");
}
// Дополнительная информация о пинах
Serial.println("\n=== ТЕКУЩЕЕ СОСТОЯНИЕ ПИНОВ ===");
Serial.print("INT (D10): "); Serial.println(digitalRead(10));
Serial.print("FSINC (D12): "); Serial.println(digitalRead(12));
Serial.println("0 = подключен, 1 = отключен");
}
void loop() {}
bool testSensor(uint8_t addr, uint8_t reg, uint8_t expected, const char* name) {
Serial.print(name); Serial.print(": ");
Wire.beginTransmission(addr);
Wire.write(reg);
if (Wire.endTransmission() != 0) {
Serial.println("FAIL");
return false;
}
Wire.requestFrom(addr, 1);
if (!Wire.available()) {
Serial.println("FAIL");
return false;
}
bool result = (Wire.read() == expected);
Serial.println(result ? "OK" : "FAIL");
return result;
}
bool testPinWithWireCheck(int pin, const char* name) {
Serial.print(name); Serial.print(" pin: ");
// При INPUT_PULLUP отключенный провод = HIGH
// Подключенный провод = LOW (активный низкий уровень)
int state = digitalRead(pin);
if (state == LOW) {
Serial.println("OK (провод подключен)");
return true;
} else {
Serial.println("FAIL (провод отключен!)");
return false;
}
}</wire.h>
Итоговые результаты:
✅ ICM20948: исправен
✅ BMP280: исправен
✅ INT пин (D10): подключен, активный низкий уровень
✅ FSINC пин (D12): подключен, активный низкий уровень
✅ Функции прерываний: работают
✅ Светодиод на D13: загорится при успехе

Обсуждение