Arduino Uno’da toplamda 20 giriş/çıkış pini bulunmasına rağmen zaman zaman bu pinlerin yetmediği durumlarla karşılaşabiliyoruz. Bunun çözümlerinden biri de I2C protokolü üzerinden çalışan sistemler.
Daha önce PCF8574 kodlu I2C Expander entegre devresinin Arduino ile nasıl kullanıldığını anlatmıştık. Bu yazıda bir diğer I2C Expander (çoklayıcı) çipi olan MCP23017 entegre devresini kullanarak Arduino’ya nasıl çıkış pini ekleyebileceğimizi anlatacağız.
MCP23017 28 pinli bir yapıya sahip bir entegre devre ve tek başına bize 16 adet giriş veya çıkış verebiliyor. Bu giriş/çıkış pinleri sadece dijital pin gibi kullanılabiliyor. Yani bu çip üzerinden analog değerler okumamız mümkün değil.
Bu çip A0, A1 ve A2 olmak üzere 3 adres pinine sahip ve bu pinleri farklı şekilde bağlayarak çipin I2C adresini değiştirebiliyoruz.
Yukarıdaki resimde MCP23017’nin bacak bağlantılarını ve adres tablosunu görüyoruz. Çizimde çipin besleme girişi 5 Volt ile gösterildi, ancak çip 3,3 Volt ile de rahatlıkla çalışabiliyor. SDA ve SCL pinleri I2C giriş bağlantılarıyken, 0’dan 15’e olan ve GPA ve GPB olarak iki bölüme ayrılmış pinler ise çipin bize kazandırdığı giriş/çıkış bağlantıları.
Kullanacağımız kütüphanede pinleri 0-15 arasında tanımlanmış numaralarıyla kullanacağız.
Çipi çalışır hale getirmek için yapmamız gereken besleme gerilimini sağlamak, adresini ayarlamak ve I2C bağlantılarını yapmak. Sonrasında çıkış pinlerini istediğimiz gibi kontrol edebiliriz.
MCP23017’yi DIP28 biçiminde bir entegre devre olarak veya hazır PCB modüller halinde edinmemiz mümkün. Bu yazıda DIP entegre devre olarak kullanıyoruz.
Devre kurulumu ile başlayalım.
Görüldüğü gibi sadece 4 kablo ile Uno’ya bağlayabildik. Adres pinlerini de ayarladığımızda çipimiz kullanıma hazır olacaktır. Uno’ya tek bir MCP23017 bağlayacaksak 3 adres girişini de GND’ye bağlayarak adresi 0x20 olarak ayarlayabilir ve kullanabiliriz.
Olur da çipin hangi I2C adresinde olduğunu bulamazsak I2C Arduino Modüllerinin Adres Numarası Nasıl Bulunur? adlı makalemizdeki kodu kullanarak bağlı olan I2C cihazların adreslerini bulabiliriz.
ÖNEMLİ: MCP23017’yi harici bir güç kaynağı ile besleyeceksek veya çok fazla I2C modülü bağlayacaksak SDA ve SCL pinlerini 2,2K-10K Ohm arası dirençlerle 5V/VCC hattına bağlamak önerilir.
Sonrasında çıkış pinlerini sanki bir Arduino piniymiş gibi istediğimiz şekilde kullanmamız mümkün. Pinleri giriş veya çıkış olarak tanımlarken tıpkı Arduino’dan alışık olduğumuz gibi INPUT, INPUT_PULLUP ve OUTPUT seçeneklerine sahibiz.
I2C protokolüne sahip modülleri kullanmak ileri düzey kod bilgisi gerektireceği için Arduino’nun bize tanıdığı en büyük kolaylığı kullanmayı tercih ediyoruz: kütüphane kullanmak. MCP23017 çipi için hazırlanmış pek çok kütüphane yer alıyor. Biz kullanım kolaylığı nedeniyle Adafruit tarafından hazırlanmış Adafruit MCP23017 Arduino Library kütüphanesini tercih ediyoruz.
Kütüphaneyi Arduino IDE’nin ana menüsünden Araçlar > Kütüphaneleri Yönet… bölümüne girip Adafruit MCP23017 kelimesini aratarak Adafruit tarafından hazırlanmış versiyonu kurarak ekleyebiliriz. Kütüphanenin Github sayfasını merak edenler buraya tıklayabilir.
Aşağıdaki sketch kodu çıkışlara bağlanmış 16 adet LED’i sırayla yakıp söndürüyor. Kullandığımız LED’lere koruma dirençlerini eklemeyi unutmayalım.
Sketch kodunu kopyalamak için pencerenin sağ üst köşesindeki butona tıklayabilir veya buraya tıklayarak ZIP dosyası olarak indirebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/* MCP23017 I2C Çoklayıcı Arduino ile Nasıl Kullanılır? MCP23017 I2C Çoklayıcının detaylı açıklaması ve örnek projelerini web sitemizde bulabilirsiniz. Mete Hoca https://www.metehoca.com/ */ #include <Adafruit_MCP23X17.h> // Adafruit'in "Adafruit MCP23017 Arduino Library" kütüphanesi. const byte LED[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; // 16 adet LED'imizin bağlı oldukları // pinleri dizi haline getirdik. Adafruit_MCP23X17 MCPExpander; void setup() { MCPExpander.begin_I2C(0x20); // Buraya seçtiğimiz I2C adresini (0x20) giriyoruz. // Boş bırakırsak kütüphane kendisi de bulabiliyor. for (int x = 0; x < sizeof(LED); x++) MCPExpander.pinMode(LED[x], OUTPUT); // Pini çıkış olarak ayarlıyoruz. } void loop() { for (int x = 0; x < sizeof(LED) ; x++) { MCPExpander.digitalWrite(LED[x], HIGH); // Pini HIGH yapıyoruz. delay(100); MCPExpander.digitalWrite(LED[x], LOW); } } |
Arduino’da iyi olmak için öncelikle elektronikte iyi olmak gerekir. Türkiye’nin en iyi temel elektronik eğitim seti ARDUINO ÖNCESİ TEMEL ELEKTRONİK EĞİTİM VE DENEY SETİ‘ni keşfedin. Gereksiz bilgilerden arındırılmış basit ve eğlenceli anlatımla ELEKTRONİK öğrenin ve Arduino’ya METE HOCA farkıyla güçlü başlayın!
ÖZGÜN ve KULLANIŞLI projeler yapabilmek için ARDUINO’yu doğru öğrenmek gerekir. Arduino’ya güçlü başlamanın en iyi yolu ARDUINO’YA GÜÇLÜ BAŞLANGIÇ EĞİTİM VE PROJE SETİ‘dir. Arduino Uno üzerine kurulu olan set ile bu müthiş geliştirme platformunu tüm detaylarıyla anlayacak, başka hiçbir yerde bulamayacağınız inceliklerini öğrenecek ve en sık kullanılan Arduino sensör ve modüllerine aşina olacaksınız.