Raspberry-Pi - I2C (TWI)
Raspberry Pi B має дві шини I2C (TWI), які виведені на різні роз’єми. Лінії SDA, SCL шини 1 виведені на роз’єм P1. SDA, SCL шини 0 виведені на роз’єм P5.
P5:
P1:
I2C налаштування
Для включення I2C шини на Raspberry Pi потрібно виконати операції, що описані нижче.Відредагуємо файл: /etc/modprobe.d/raspi-blacklist.conf:
nano /etc/modprobe.d/raspi-blacklist.conf
Закоментуємо рядок blacklist i2c-bcm2708. Приклад вмісту файлу:
#blacklist spi-bcm2708
#blacklist i2c-bcm2708
Коригуємо файл /etc/modules:
sudo nano /etc/modules
Додаємо рядки:
i2c-bcm2708
i2c-dev
Встановлюємо i2c-tools утиліти:
sudo apt-get install python-smbus i2c-tools
Перезавантажуємо Raspberry Pi:
reboot
Після перезавантаження можемо переглянути всі підключені прилади до шин I2C:
sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
В даному випадку на шині 1 тільки один пристрій за адресою 0x27
Якщо команда выдає помилку: Error: Could not open file `/dev/i2c-0` or `/dev/i2c/0`: No such file or directory
треба додати у файл /boot/config.txt рядок:
dtparam=i2c_arm=on і перезавантажити систему.
Дві шини I2C
Виконуючи команду sudo i2cdetect -y 1 ми вказуємо номер шини I2C, у нашому випадку - 1. Зверніть увагу: у попередніх версіях Raspberry Pi на основний роз’єм може бути виведена шина 0. У нових Raspberry Pi шина 0 виведена на роз’єм P5. Цей роз’єм, зазвичай, не запаяний. При потребі є можливість впаяти роз’єм і використовувати обидві лінії I2C.Утиліти I2C
i2cdetect - дозволяє переглянути адреси усіх підключених до шини I2C пристроїв. Приклад:
i2cdetect -y 1
де 1 - номер шини I2C.
i2cget - зчитує дані з вказаної адреси вказаного пристрою. Приклад:
i2cget -y 1 0x27 0xA0
де: 1 - номер шини I2C; 0x27 - адреса пристрою; 0xA0 - адреса, з якої виконується зчитування.
i2cset - записує дані до вказаної адреси вказаного пристрою. Приклад:
i2cset -y 1 0x27 0xA0 0xFF
де: 1 - номер шини I2C; 0x27 - адреса пристрою; 0xA0 - адреса, до якої виконується запис; 0xFF - значення, що записуються.
Проблеми I2C. Зменшення швидкості шини I2C (TWI)
Деякі повільні пристрої при роботі з шиною I2C можуть виконувати зупинку тактування (clock stretching). Це прописано в протоколі I2C, але на момент написання статті не підтримується драйверами Raspberry Pi. Це може стати причиною неможливості зчитування даних або їх спотворення. Зазвичай, робоча частота шини I2C - 100КГц. Для забезпечення стабільної роботи доводиться знижати її. Це можна зробити, вказавши потрібну швидкість в одному з конфіг-файлів у директорії /etc/modprobe.d/ . Наприклад, створивши файл i2c.conf таким чином:
echo options i2c_bcm2708 baudrate=32000 > /etc/modprobe.d/i2c.conf
де, 32000 - частота роботи шини. Після змін у конфігурації треба перезавантажити Raspberry Pi.
Якщо Вам потрібно працювати зі швидкими та повільними пристроями, які підключені до однієї шини, зменшення частоти роботи шини може викликати небажані затримки. Існує інший шлях вирішення проблеми з повільними пристроями. Ви можете скачати і використовувати утиліти, які можуть уповільнювати роботу шини I2C і повертати її в початковий стан. Скачайте архів з цими програмами:
wget http://www.hobbytronics.co.uk/download/rpi_i2c.zip
Розпакуйте архів:
unzip rpi_i2c.zip
Добавимо атрибут можливості запуску:
chmod +x i2c_fast i2c_slow
Тепер, перед роботою з повільними пристроями, можемо уповільнити швидкість шини I2C, а після - повернути до початкового стану:
sudo ./i2c_slow
i2cget -y 1 0x27 0xA1
sudo ./i2c_fast
Успіхів.
Дивись також:
- Raspberry Pi — що це таке?
- Raspberry Pi — GPIO
- Raspberry Pi — UART
- Raspberry Pi — FT232
- Raspberry Pi — PWM і Сервопривод
- Raspberry Pi — DHT11
- Raspberry Pi - FM Transmitter
- Прошивка AVR мікроконтролерів за допомогою Raspberry Pi
- Raspberry Pi — LCD display 1602
- Raspberry Pi — WiFi
- Raspberry-Pi — I2C (TWI)
- Raspberry Pi - DS18B20
- Raspberry Pi Camera
- nRF24L01+ ATMEGA + Raspberry Pi
- BMP180 + Raspberry Pi + WH1602
- Wi-Fi Метео станція
- Raspbian. Apache + PHP + Python + MySQL
- Встановлюємо Raspbian на Raspberry Pi без клавіатури та монітору
- IR-дистанційне керування. Використання LIRC у Python
- Raspberry Pi. Raspbian. Відправлення пошти через аккаунт Gmail
- Neoway M590 – GSM/GPRS modem
- MPU-6050 – гіроскоп – акселерометр
- HMC5883L Магнітометр
- PWM контролер з інтерфейсом I2С на базі мікросхеми PCA9685
- Метеостанція на Raspberry Pi своїми руками
- Raspberry Pi. Live-stream video
Недавні записи
- CRSF to PWM
- U-FOC PC Monitor для Chrome browser
- Фільтрація Back-EMF. Безсенсорні BLDC мотори
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
Tags
bluetooth bldc nodemcu tim max1674 eeprom led avr hih-4000 brushless programmator mpu-6050 usart examples smd sensors piezo rs-232 motor html git meteo bme280 gps bkp encoder java-script raspberry-pi websocket esp8266 books solar eb-500 atmega mongodb gpio sms css pwm ethernet pmsm st-link capture dma stm32 watchdog lcd rfid python uart battery dc-dc soldering timer ssd1331 wifi nvic dht11 docker i2c 3d-printer adc bmp280 flash rtc servo barometer remap exti mpx4115a web flask ngnix usb displays foc ssd1306 mpu-9250 options
Архіви