Начнем пожалуй немного с теории.
I2C — это протокол, который позволяет различным устройствам взаимодействовать друг с другом используя одну шину данных SDA и SCL (всего два проводника), так же, для каждого устройства присваивается свой уникальный адрес. Максимально на одной шине может находиться 127 устройств. Как правило адрес i2c в устройстве вшит в микросхему с завода и его изменить нельзя, кроме тех случаев, когда это предусмотренно изготовителем и то обычно возможно поменять адрес только в небольшом диапазоне.
Иногда либо лень искать документацию на устройство или же ее не получается найти или вообще в документации один адрес указан, а у нас модуль с браком и адрес у него другой, для этого и пишу эту коротенькую статью.
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Статья будет своего рода шпаргалкой, для того чтоб быстро узнать I2c адрес устройства. Я приведу два примера, один для того чтоб узнать адрес при помощи arduino, а второй способ будет, чтоб найти адрес устройства через raspberry pi.
Итак чтоб узнать i2c адрес на arduino нужно подключить устройство к пинам SDA и SCL они у arduino находятся A4(SDA) и A5(SCL).
Скетч выглядит следующим образом:
#include <Wire.h> void setup(){ Wire.begin(); Serial.begin(9600); while (!Serial); Serial.println("\nI2C Scanner"); } void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 8; 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("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); }
Скачать скетч можно по ссылке: https://yadi.sk/d/i5UeLsXiKsLRUA
Собственно после загрузки скетча в ардуино и подключения устройства, откроем монитор порта и должны увидеть, какой адрес у устройства при сканировании. Выглядит это таким образом:
Со сканером i2c на ардуино мы я думаю разобрались, теперь давайте бегло разберемся как отсканировать шину на raspberry pi.
i2c у raspberry pi находится на пинах PIN3 и PIN5
Все будет показано на примере работы в OC Rasbian. Для начала необходимо убрать модуль I2C из блэклиста и добавить его в автозагрузку. Для этого делаем в консоли следующее, открываем файл raspi-blacklist.conf и видим в нем следующее:
sudo nano /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708
blacklist i2c-bcm2708
Закоментируем две строчки и сохраним файл:
# blacklist spi-bcm2708
# blacklist i2c-bcm2708
Далее добавляем модуль I2C в автозагрузку, открываем файл /etc/modules
sudo nano /etc/modules
и добавляем в конец строку i2c-dev, должно получиться так:
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
snd-bcm2835
i2c-dev
Перезагружаемся
sudo reboot
Теперь необходимо поставить некоторые дополнительные пакеты:
sudo apt-get update
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
Теперь, при подключении любого i2c устройства, выполним команду:
sudo i2cdetect -y 0
И увидим вывод с адресом устройства: из вывода мы видим что устройство имеет адрес 0x68. На этом все, надеюсь пригодится.