Протокол I2C позволяет подключать к Arduino модули (не все, только поддерживающие I2C) по двум проводам: шине последовательных данных SDA (Serial Data) и шине тактирования SCL (Serial Clock). Это позволяет значительно сэкономить перемычки и место на макетной плате, при этом теоретически возможно параллельное подключение до 127 устройств.
Разъемы для подключения устройств по I2C:
Arduino Uno, Nano, Pro и Pro Mini: SDA-аналоговый выход 4, SCL-аналоговый выход 5. Но на многих аналогах плат разъемы могут быть дублированы.
Для Arduino MEGA это соответственно 20 и 21 цифровые выходы.
При подключении к I2C, всем устройствам присваивается адрес. При программировании, для инициализации некоторых устройств, необходимо его прописать. Иногда издатель указывает адрес в документации к модулю или наносит его прямо на плату. Но если ни один из этих способов не позволяет вам узнать адрес, то его можно определить с помощью приведенного ниже скетча. Источник:http://adatum.ru/skaner-shiny-i2c-dlya-arduino.html
#include <Wire.h>
String stringOne;
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial);
}
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)
{
String stringOne = String(address, HEX);
Serial.print("0x"); Serial.print(stringOne); Serial.print(" - ");
if(stringOne=="0A") Serial.println("'Motor Driver'");
if(stringOne=="0F") Serial.println("'Motor Driver'");
if(stringOne=="1D") Serial.println("'ADXL345 Input 3-Axis Digital Accelerometer'");
if(stringOne=="1E") Serial.println("'HMC5883 3-Axis Digital Compass'");
if(stringOne=="5A") Serial.println("'Touch Sensor'");
if(stringOne=="5B") Serial.println("'Touch Sensor'");
if(stringOne=="5C") Serial.println("'BH1750FVI digital Light Sensor' OR 'Touch Sensor" );
if(stringOne=="5D") Serial.println("'Touch Sensor'");
if(stringOne=="20") Serial.println("'PCF8574 8-Bit I/O Expander' OR 'LCM1602 LCD Adapter' ");
if(stringOne=="21") Serial.println("'PCF8574 8-Bit I/O Expander'");
if(stringOne=="22") Serial.println("'PCF8574 8-Bit I/O Expander'");
if(stringOne=="23") Serial.println("'PCF8574 8-Bit I/O Expander' OR 'BH1750FVI digital Light Sensor'");
if(stringOne=="24") Serial.println("'PCF8574 8-Bit I/O Expander'");
if(stringOne=="25") Serial.println("'PCF8574 8-Bit I/O Expander'");
if(stringOne=="26") Serial.println("'PCF8574 8-Bit I/O Expander'");
if(stringOne=="27") Serial.println("'PCF8574 8-Bit I/O Expander' OR 'LCM1602 LCD Adapter '");
if(stringOne=="39") Serial.println("'TSL2561 Ambient Light Sensor'");
if(stringOne=="40") Serial.println("'BMP180 barometric pressure sensor'" );
if(stringOne=="48") Serial.println("'ADS1115 Module 16-Bit'");
if(stringOne=="49") Serial.println("'ADS1115 Module 16-Bit' OR 'SPI-to-UART'");
if(stringOne=="4A") Serial.println("'ADS1115 Module 16-Bit'");
if(stringOne=="4B") Serial.println("'ADS1115 Module 16-Bit'");
if(stringOne=="50") Serial.println("'AT24C32 EEPROM'");
if(stringOne=="53") Serial.println("'ADXL345 Input 3-Axis Digital Accelerometer'");
if(stringOne=="68") Serial.println("'DS3231 real-time clock' OR 'MPU-9250 Nine axis sensor module'");
if(stringOne=="7A") Serial.println("'LCD OLED 128x64'");
if(stringOne=="76") Serial.println("'BMP280 barometric pressure sensor'");
if(stringOne=="77") Serial.println("'BMP180 barometric pressure sensor' OR 'BMP280 barometric pressure sensor'");
if(stringOne=="78") Serial.println("'LCD OLED 128x64'" );
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow 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(5000);
}
Загрузив данный скетч и открыв монитор порта, вы увидите все подключенные к I2C устройства и их адреса. На рисунке ниже показан результат работы.
Как видно, к данной плате Arduino подключены I2C адаптер по адресу 0x27 и барометр BMP по адресу 0x77. Если вы не можете разобраться, к какому конкретно устройству относится та или иная строка вывода, попробуйте подключать устройства по одному.
|