Obsługa magistrali I2C w Raspberry Pi
Jedną z rzeczy sprawiającą, że Raspberry Pi jest wymarzoną platformą dla majsterkowiczów jest wbudowana obsługa magistrali I2C i dostępność do złącza tej magistrali. Umożliwia to łatwe podłączanie różnego typu urządzeń i czujników. Na szybko można wymienić choćby czujniki temperatury, odległości, przetworniki A/C i C/A i tak dalej i tak dalej.
Wyprowadzenia magistrali I2C są umieszczona na złączu rozszerzeń tak jak na rysunku z prawej strony. Są to piny:
- 1 - 3.3V
- 3 - SDA
- 5 - SCL
- 6 -GND
Uwaga, ważne: Logika Raspberry Pi pracuje na 3,3V. Bezpośrednie podłączenie urządzenia z logiką 5V do GPIO może spowodowań uszkodzenie procesora.
Uwaga, ważne: piny nie są buforowane, nie mają zabezpieczeń i są podłączone bezpośrednio do CPU. Zwarcie lub zbyt duże napięcie może uszkodzić procesor.
System operacyjny Raspbian ma domyślnie wyłączona obsługę I2C. Aby ją włączyć należy:
- w pliku /etc/modprobe.d/raspi-blacklist.conf zakomentować linię blacklist i2c-bcm2708

- W pliku /etc/modules dodać linię i2c-dev

- Zainstalować oprogramowanie dodatkowe
sudo apt-get install i2c-toolssudo apt-get install python-smbus - Ustawić uprawnienia dla użytkownika
sudo adduser pi i2c - Zrestartować Raspberry Pi
Od tego momentu nasze Raspberry Pi będzie potrafiło obsługiwać I2C i komunikować się z innymi urządzeniami przy jej pomocy.
Ważne: większość tutoriali dostępny w internecie zakłada, iż używamy magistrali 0. Rasberry Pi rev 2 , czyli te dostępne obecnie na rynku, na złączu rozszerzeń udostępnia magistralę 1. Z tego powodu 0 z przykładów należy także zamienić na 1.
Na przykład, aby sprawdzić adresy urządzeń podłączonych do magistrali należy posłużyć się poleceniem:
i2cdetect -y 1
A później idzie już z górki:
Na przykład możemy podłączyć przetwornik analogowo-cyfrowy PCF8591 i za pomocą Pythona odczytać napięcie na fotorezystorze:
import smbus import time # define I2C bus number BUS_NUMBER = 1 # define device address DEVICE_ADDR = 0x48 bus = smbus.SMBus(BUS_NUMBER) bus.write_byte(DEVICE_ADDR,0x00) step = 0 avg = 0; while True: step += 1 if step < 1024 : avg += bus.read_byte(DEVICE_ADDR) else: print avg/1024 avg = 0 step = 0
Grafika: [1]
