Raspberry Pi ile İ2C İletişimi
Raspberry Pi artık günümüzde geliştiricilerin gözdesi olan araçlardan biri haline geldi.Bu yazımızda sizlerle Raspberrynin çevre arabirimler ve diğer elektronik cihazlarla haberleşme protokollerinden biri olan i2c protokolü üzerine değineceğiz.
İ2c protokolünü kullanan pek çok cihaz bulunmaktadır. Elimde eeprom entegrelerinden biri olan 24c01 entegreside bu protokolü kullanarak iletişim sağlayan entegrelerde bir tanesi bulunuyor.( Bunun dışında bu protokolü kullanan sensörler , zamanlayıcı entegreleri gibi pek çok araç bulunmaktadır. ) Şimdi Raspberry ile eeprom entegremizin içine veri kaydedip okuyacağız.
Bunun için öncelikle devremizi aşağıdaki gibi kuralım.
Daha sonra Raspberrymize bağlantı kurup lazım olan kurulumları gerçekletirmeye başlayalım.
Önce i2c için araçlarımızın kurulumunu gerçekleştirelim.Bunun için öncelikle aşağıdaki komutu vererek repodan paketlerimizi kuralım.
sudo apt-get install i2c-tools
Daha sonra i2c modülümüzü aktif hale getirmemiz gerekiyor. Bunun için aşağıdaki komutu vermemiz gerek.
sudo modprobe i2c-dev
Yanlız raspberryi her açtığımızda bu modülü sürekli aktif hale getirmemiz gerek.Bunu önlemek için şu yöntemi izliyoruz.
sudo nano /etc/modules
Komutunu vererek açılan pencerede modül isimlerimizi kaydedip çıkıyoruz.
Yukarıdaki devrede entegremizi i2c pinlerinin birincisine bağlamıştık. Şimdi bu pinlere bağlı cihazlara bakalım.Buradan entegremizin adresini raspi ne olarak görüyor onu öğrenelim. Bunun için aşağıdaki komutu vermemiz yeterli.
i2cdetect -y -a 1
Ekranda 50 koduna sahip bir entegre görmekteyiz. Bundan sonra entegremize ulaşmak için bu adresi kullanacağız.
Şimdi python kodumuzu yazmaya geçelim. Bunun için pythonun smbus modülünü kurmamız gereklidir.
sudo apt-get install python-smbus
Python kodumuz ;
import smbus #smbus modülünü ekliyoruz from time import sleep adres = 0x50 # Burası entegremizin adresini tanımladığımız değişken i2c = smbus.SMBus(1) # i2c pinlerinin 1 numarasını kullandığımız için SMBus modülünü burada tanımlıyoruz. i2c.write_byte_data(adres,0,63) # Burada entegremizin 0 segmentine decimal 63 değerini yazıyoruz sleep(0.5) # bir miktar bekliyoruz print "Yazilan veri : " + str(i2c.read_byte_data(adres,0)) #yazdığımız veriyi okuyoruz
Yazdığımız veriyi kontrol etmek için diğer bir yol ise şu şekildedir.
i2cget -y 1 0x50 0
Aşağıda i2c ile ilgili birkaç fonksiyonu verelim..
long write_quick(int addr)
Sadece okuma yazma biti gönder
long read_byte(int addr)
Adresten segment belirtöedem 1 bayt oku.
long write_byte(int addr,char val)
Bir aygıta 1 bayt gönder
long read_byte_data(int addr,char cmd)
1 bayt oku
long write_byte_data(int addr,char cmd,char val)
1 bayt yaz.
long read_word_data(int addr,char cmd)
1 word tipinde veri oku
long write_word_data(int addr,char cmd,int val)
1 word tipinde veri yaz
long[] read_block_data(int addr,char cmd)
32 bayt oku.
write_block_data(int addr,char cmd,long vals[])
Aygıta 32 bayt yazar.
long[] read_i2c_block_data(int addr,char cmd)
Blok oku. 32 veri okur.
write_i2c_block_data(int addr,char cmd,long vals[])
Blok yaz. 32 veri yazar.
Herkese kolay gelsin.