Sıcaklık Sensörünün Seçilmesi
Sıcaklık ölçümü için, Adafruit firması tarafından üretilen, MCP9808 breakout board seçilmiştir. MCP9808, gerçekte PCB üzerindeki, Microchip tarafından üretilmiş, I2C sıcaklık sensörünün adıdır.
Not: Breakout board'lar, genellikle bir elektriksel komponent ile çalışmayı kolaylaştırmak için tasarlanmış baskı devrelerdir (PCB, Printed Circuit Board). Elektriksel komponentlerin pinleri birbirine oldukça yakın olabilmektedir, bu durumda bu komponentleri breadboard üzerinde kullanmak veya lehim yapmak oldukça zordur. Breakout board'lar kullandıkları komponentin pinlerine karşılık gelen, araları açılmış, pinlere sahiptir. Bu sayede bu komponentlerle breadboard üzerinde de çalışmak kolaylaşmaktadır.
Adafruit firmasının, bu şekilde değişik sensörlerin kullanılmasını kolaylaştıran breakout PCB tasarımları mevcuttur.
PCB'nin şematiği aşağıdaki gibidir:
Teknik Özellikler
MCP9808, kullanıcı tarafından programlanabilen ve okunabilen yazmaçlara sahiptir. Sıcaklık ölçüm çözünürlüğü ve sıcaklık limiti gibi değerler bu yazmaçlar yoluyla belirlenmekte ayrıca sıcaklık değeri de yine bir yazmaç üzerinden okunmaktadır. Yazmaçlar 8 bit'lik adreslere sahiptir ve 16 bit genişliğindedir.
Bir yazmaç içeriği okunmak istendiğinde, I2C üzerinden, ilk önce yazmaç adresi gönderilmeli ardından cihazdan 2 byte'lık veri okunmalıdır. Okunan ilk byte, yüksek anlamlı byte'dır.
MCP9808, besleme ve I2C uçları (SDA, SCL) hariç, 1 adet alert ve 3 adet adres uçuna daha sahiptir. Kullanıcı tarafından belirlenen sıcaklık değerinin aşılması ya da altına düşülmesi gibi durumlarda alert ucundaki elektriksel seviye değişmektedir.
Not: alert ucu open collector özelliği göstermektedir, bu yüzden bir pull-up direnci ile Vdd'ye çekilmelidir.
SDA ve SCL uçları ise, PCB üzerinde, 10K'lık dirençlerle Vdd'ye çekilmiştir.
Alert ucu, mikroişlemcili bir sistem için interrupt kaynağı olarak kullanılabilir. A0, A1 ve A2 şeklinde isimlendirilen diğer uçlar ise adres uçlarıdır. Bu 3 uç üzerindeki elektriksel seviye değiştirilerek sensörün adresi değiştirilebilmektedir.
MCP9808 4 bit'i sabit, diğer 3 bit ise kullanıcı tarafından değiştirilebilen 7 bitlik bir adrese sahiptir. Adresin sabit ve değişebilen kısmı aşaşıdaki gibidir.
A6 | A5 | A4 | A3 | A2 | A1 | A0 |
---|---|---|---|---|---|---|
0 | 0 | 1 | 1 | x | x | x |
Not: Bu bilgi Microchip MCP9808 datasheet'inde PIN DESCRIPTION bölümünde yer almaktadır.
Yukarıdaki PCB şematiğinde gösterildiği gibi A2, A1 ve A0 adres uçları, birer pull-down direnci ile, toprak seviyesine çekilmiştir. Bu durumda bu uçlar lojik 0 seviyesindedir. Bu uçların elektriksel seviyesi üzerinde bir işlem yapılmazsa MCP9808 adresi 0011000 yani 0x18 olacaktır.
Linux altındaki I2C işlemlerini incelerken, slave adresinin ioctl çağrısı ile kullanıldığını hatırlayınız. Örneğin:
int slave_addr = 0x18;
rc = ioctl(i2c_fd, I2C_SLAVE, slave_addr);
Örnekteki 0x18 değeri sıcaklık sensörünü tanımlamaktadır.
Programlanabilir adres uçları sayesinde, 8 farklı sensörü aynı I2C hattı üzerine bağlamak mümkündür. Biz bu uçlardaki elektriksel seviyeyi değiştirmeyeceğiz.
MCP9808 ile ilgili önemli gördüğümüz özellikleri maddeleyecek olursak:
- I2C ve SMBus standartları desteklenmektedir.
- -40°C to 125°C sıcaklık aralığı 0.25°C tipik doğruluk ile ölçülebilmektedir.
- Ölçüm çözünürlüğü değiştirilebilmektedir (+0.5°C, +0.25°C, +0.125°C, +0.0625°C). Default değer 0.0625°C'dir.
- 2.7V ile 5.5V arasında çalışabilmektedir.
- Ayarlanabilir adresi pinleri sayesinde 8 tane sensör aynı veri yolu üzerinde bulunabilir.
- Sıcaklık sınırı belirlenebilir ve alert ucu bir interrupt kaynağı olarak kullanılabilir.
Sıcaklık Değerinin Okunması
MCP9808 sıcaklık değerine karşılık gelen analog bir gerilim üretmekte ve daha sonra bu değeri sayısallaştırarak bir yazmaça yüklemektedir. Bu 16 bit'lik yalnız okunabilen yazmaç, Microchip dokümanlarında, ortam sıcaklık yazmacı (Ambient Temperature Register) olarak isimlendirilmektedir.
Bu 16 bit'in tamamı sıcaklık değerine karşılık gelmemektedir. Yüksek anlamlı 4 bit, alert durumu ve sıcaklığın negatif veya pozitif oluşuna ilişkindir. Sıcaklık değeri ise geriye kalan düşük anlamlı 12 bit ile ifade edilmektedir.
Daha önce bir sıcaklık sınırının aşılması veya altına düşülmesi durumunda bir alert durumu oluştuğunu söylemiştik. Aslında, 3 farklı durumda alert oluşabilmektedir. Ölçülen sıcaklık kritik bir değer, bir üst ve bir alt değer ile karşılaştırılmakta ve nihayetinde bir alert oluşmaktadır. Bu değerler için, MCP9808 içinde, crit, upper ve lower şeklinde isimlendirilen yazmaçlar bulunmaktadır. Ortam sıcaklık yazmacı içindeki ilk 3 bit alert durumunu çözümlemek için kullanılmaktadır. İlk 3 bit'in karşılıkları aşağıdaki gibidir.
Bit | Alert detayı |
---|---|
15. bit 1 ise | Ölçülen sıcaklık kritik değere eşit veya daha büyük |
14. bit 1 ise | Ölçülen değer üst sınırı aşmış |
13. bit 1 ise | Ölçülen değer alt sınırın altına düşmüş |
12.bit ise işaret bitidir. Geriye kalan düşük anlamlı 12 bit ise sıcaklığı, sayının ikiye tümleyeni (two’s complement) şeklinde, ondalıklı bir biçimde ifade etmektedir.
Sıcaklık sabit noktalı bir sayı olarak ifade edilmektedir. En düşük anlamlı 4 bit sayının ondalıklı kısmını göstermektedir. Sıcaklık yazmacının içeriğini aşağıdaki gibi temsil edebiliriz.
Not: Daha önce öntanımlı ölçüm çözünürlüğünün 0.0625°C olduğununu söylemiştik. Ölçüm çözünürlüğü, sayısal verinin değerini değiştiren en düşük değeri göstermektedir. Sıcaklık yazmacındaki en düşük anlamlı bit, noktanın sağındaki 4. basamağı ifade etmektedir. Bu basamağın çarpan değeri 1/16 yani 0.0625 değeridir. Bu değeri daha sonraki işlemlerimizde kullanacağız.
Ayrıca sıcaklığın ölçülmesi (Temperature Conversion Time) ölçüm çözünürlüğüne bağlı olarak değişmektedir. Bu değer öntanımlı durumda 250 ms'dir. Yani bu süreden daha hızlı yapılan okumalar aynı değeri üretecektir.
Ortam sıcaklık sensörünün adresi 0000 0101 yani 0x5 olarak tanımlanmıştır. Sıcaklık okumalarında bu değeri kullanacağız.
Kablolama
Adafruit MCP9808 PCB, beraberinde breadboard üzerinde çalışmaya imkan veren 8'li bir pin header'ı ile gelmektedir. Pinleri PCB'ye lehimledikten sonra breadboard üzerinde çalışabilirsiniz.
Bu aşamadan sonra SavageBoard ile MCP9808 arasındaki bağlantıyı kurmalıyız. Bu amaçla 4 adet atlama kablosuna ihtiyacımız olacak. Vdd, toprak, SCL ve SDA uçlarını karşılıklı olarak bağlamalıyız. MCP9808 pull-up dirençlerine sahip olduğu için başka bir bileşene ihtiyaç bulunmamaktadır.
Sıcaklık Sensörünün Test Edilmesi
SavageBoard ile sensör arasındaki gerekli kablolamayı yaptıktan sonra, herhangi bir kod yazmadan, sensöre I2C üzerinden erişip erişemediğimizi kontrol edebiliriz. Bu amaçla i2c-tools araçlarını kullanabiliriz.
İlk olarak, i2c-tools içindeki araçları SavageBoard hedefli derlemeliyiz. Sisteminizdeki çapraz derleyiciyi kullanarak derleme işlemini aşağıdakine benzer şekilde yapabilirsiniz. Biz derlemelerimizde CodeSourcery araçlarını kullanacağız.
$ CC=arm-none-linux-gnueabi-gcc make
Test amaçlı olarak tools dizinindeki i2cdetect ve i2cget araçlarını kullanacağız.
Bu aşamadan sonra cihaza enerji verdiğimizde /dev altında i2c portlarına ilişkin aygıt dosyası düğümlerini görebilmeliyiz.
# ls /dev/i2c*
/dev/i2c-0 /dev/i2c-1 /dev/i2c-2
I2C veri yolları üzerindeki cihazları i2cdetect -y i2cbus
şeklinde belirlemek mümkündür. i2cbus değeri olarak, 0, 1, 2 gibi I2C veri yolu numaraları girilmelidir. Biz sensörümüzü SavageBoard üzerindeki 3 numaralı I2C portuna bağlamıştık. i2cdetect ile tüm veri yolları üzerindeki aygıtlar belirlenebilir. 3 numaralı veri yolu için, numaralandırma 0'dan başladığı için 2 değeri girilerek elde edilen sonuç aşağıdaki gibidir.
/mnt # ./i2cdetect -y 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
0x18 değerini daha önce Microchip dokümanından elde ettiğimizi hatırlayınız.
i2cdetect, bir veri yolu üzerindeki tüm muhtemel adresleri denemekte ve aldığı yanıta göre cihazları tespit etmektedir.
Bir diğer test aracı olarak ise i2cget'yi kullanabiliriz. Bu aracın en genel kullanım hali aşağıdaki gibidir:
i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
Sensör adresinin 0x18 olduğunu belirlemiştik, sıcaklık değerini okuyacağımız yazmaç adresinin de 0x5 olduğunu söylemiştik. Bu durumda i2cget aşağıdaki gibi bir sonuç üretmektedir.
/mnt # ./i2cget -y 2 0x18 0x5 w
0xd7c1
i2cget, MCP9808'i adresleyip bağlantıyı kurduktan sonra, okuma yapacağı yazmaca ilişkin adresi gönderir. MCP9808 bu sayede hangi yazmacın adreslendiğini anlayıp içeriğini göndermektedir.
i2cget, ilk okunan değeri düşük anlamlı olarak ifade etmektedir. Fakat, MCP9808 tarafından, ilk olarak yüksek anlamlı byte gönderilmektedir. Bu durumda gerçekte sıcaklık yazmacındaki değer aşağıdaki değer yani 0xc1d7
şeklinde olacaktır. Bu sayının bitsel karşılığını yazarak önceki bilgilerimize göre yorumlamaya çalışalım.
1100 0001 1101 0111
Yüksek anlamlı ilk 3 bit alert durumuyla ilişkili olduğu için göz ardı edebiliriz. 12. bit ise işaret bit'idir ve sayının pozitif olduğunu göstermektedir. İşaret biti 0 ise sayı pozitif, 1 ise negatif olarak ele alınmalıdır. Geriye kalan 12 bitin 8 biti sıcaklığın tam değeri, düşük anlamlı 4 biti ise ondalıklı değerini göstermektedir. Bu 12 bitlik sayının onluk sistemdeki karşılığını hesaplayıp sonrasında 16'ya bölerek veya 0,0625 çözünürlük değeriyle çarparak sıcaklık değerine ulaşabiliriz.
0001 1101 0111 sayısının onluk sistemdeki karşılığı 471'dir. Bu değeri 0,0625 ile çarptığımızda 29,4375 değerine ulaşmaktayız.