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:

  1. w pliku /etc/modprobe.d/raspi-blacklist.conf zakomentować linię blacklist i2c-bcm2708
  2. W pliku /etc/modules dodać linię i2c-dev
  3. Zainstalować oprogramowanie dodatkowe sudo apt-get install i2c-tools sudo apt-get install python-smbus
  4. Ustawić uprawnienia dla użytkownika sudo adduser pi i2c
  5. 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]

3 comments

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

This site uses Akismet to reduce spam. Learn how your comment data is processed.