MCP23017, I2C üzerinden bağlanıp mikrodenetleyiciye 16 dijital giriş-çıkış pini kazandıran bir GPIO genişletici entegredir. A2, A1 ve A0 pinleriyle 0x20-0x27 arasında adres alır; aynı hatta 8 adet bağlanarak 128 pin elde edilir. Her pinde yaklaşık 100 kΩ dahili pull-up ve INTA/INTB kesme çıkışları vardır.
Arduino'da buton, LED, röle ya da tuş takımı sayısı arttıkça pinler hızla biter. MCP23017 GPIO genişletici, yalnızca iki I2C hattıyla 16 yeni dijital pin ekleyerek bu sorunu çözer. Bu yazıda MCP23017'nin pinlerini, I2C adresinin nasıl ayarlandığını, Arduino bağlantısını, örnek kodu, kesme kullanımını ve yeni veri sayfasındaki GPA7/GPB7 uyarısını anlatıyoruz.
MCP23017 nedir?
MCP23017, Microchip'in ürettiği, I2C arayüzüyle kontrol edilen ve iki 8 bitlik porttan (GPA ve GPB) oluşan 16 kanallı bir giriş-çıkış (G/Ç) genişletici entegredir. Her pin ayrı ayrı giriş ya da çıkış yapılabilir; girişlerde dahili pull-up açılabilir ve pin değişimi kesme sinyaliyle bildirilir.
Entegre 1,8-5,5 V ile çalışır; I2C hattında 100 kHz, 400 kHz ve 1,7 MHz hızlarını destekler. SPI arayüzlü ikizi MCP23S17'dir. Breadboard için MCP23017-E/SP DIP-28 entegresi, hızlı kurulum için pull-up ve adres jumper'ları hazır olan MCP23017 I2C 16 kanal modül kullanılabilir.
MCP23017'nin pinleri ne işe yarar?
MCP23017'nin 28 pininden 16'sı G/Ç (GPA0-GPA7 ve GPB0-GPB7), geri kalanı besleme, I2C, adres, reset ve kesme pinleridir. DIP-28 kılıfta dizilim şöyledir:
| Pin no | Ad | Görev |
|---|---|---|
| 1-8 | GPB0-GPB7 | B portu G/Ç pinleri |
| 9 / 10 | VDD / VSS | Besleme (+) ve GND |
| 12 / 13 | SCL / SDA | I2C saat ve veri |
| 15, 16, 17 | A0, A1, A2 | Adres seçimi; boş bırakılmaz |
| 18 | RESET | Düşük seviyede reset; VDD'ye bağlanır |
| 19 / 20 | INTB / INTA | B ve A portu kesme çıkışları |
| 21-28 | GPA0-GPA7 | A portu G/Ç pinleri |
11 ve 14 numaralı pinler MCP23017'de kullanılmaz (NC). RESET pinini boş bırakmak en yaygın hatadır; entegre rastgele resetlenir ya da hiç yanıt vermez.
MCP23017 I2C adresi nasıl ayarlanır?
MCP23017'nin adresi A2, A1 ve A0 pinlerinin GND (0) ya da VDD (1) bağlantısıyla 0x20 ile 0x27 arasında seçilir. Üçü de GND'ye bağlıyken adres 0x20'dir ve kütüphanelerin varsayılanı budur.
| A2 | A1 | A0 | Adres |
|---|---|---|---|
| 0 | 0 | 0 | 0x20 |
| 0 | 0 | 1 | 0x21 |
| 0 | 1 | 0 | 0x22 |
| 0 | 1 | 1 | 0x23 |
| 1 | 0 | 0 | 0x24 |
| 1 | 0 | 1 | 0x25 |
| 1 | 1 | 0 | 0x26 |
| 1 | 1 | 1 | 0x27 |
Sekiz farklı adres sayesinde aynı hatta 8 MCP23017 bağlanarak 128 G/Ç pini elde edilir. PCF8574 da 0x20-0x27 aralığını kullandığı için iki entegreyi aynı hatta kullanırken adreslerin çakışmamasına dikkat edin. I2C adreslerinin genel mantığı I2C nedir rehberimizde anlatılıyor.
MCP23017 Arduino'ya nasıl bağlanır?
MCP23017 Arduino Uno'ya VDD → 5V, VSS → GND, SDA → A4 ve SCL → A5 olarak bağlanır; RESET pini VDD'ye, A0-A2 pinleri GND'ye bağlanır. Çıplak entegrede SDA ve SCL için 3,3-10 kΩ arası pull-up dirençleri eklenir; modüllerde bu dirençler genellikle hazırdır. Adım adım:
- Entegreyi breadboard'a oturtun; çentikli taraf 1 numaralı pini gösterir.
- 9. pini 5V'a, 10. pini GND'ye, 18. pini (RESET) 5V'a bağlayın.
- 15, 16 ve 17. pinleri (A0-A2) GND'ye bağlayın; adres 0x20 olur.
- 13. pini (SDA) Arduino Uno R3 kartının A4 pinine, 12. pini (SCL) A5 pinine bağlayın.
- GPA0'a (21. pin) 220 Ohm dirençle bir LED, GPB0'a (1. pin) bir 6x6 mm tact buton bağlayın; butonun diğer ucu GND'ye gider.
MCP23017 Arduino ile nasıl kodlanır?
En kolay yol Adafruit MCP23017 Arduino kütüphanesidir: begin_I2C() ile başlatılır, sonra pinler Arduino'daki gibi pinMode, digitalWrite ve digitalRead ile kullanılır. Kütüphanede 0-7 numaraları GPA0-GPA7'yi, 8-15 numaraları GPB0-GPB7'yi gösterir.
#include <Adafruit_MCP23X17.h>
Adafruit_MCP23X17 mcp;
const uint8_t LED_PIN = 0; // GPA0
const uint8_t BUTON_PIN = 8; // GPB0
void setup() {
Serial.begin(9600);
if (!mcp.begin_I2C(0x20)) {
Serial.println("MCP23017 bulunamadi");
while (1);
}
mcp.pinMode(LED_PIN, OUTPUT);
mcp.pinMode(BUTON_PIN, INPUT_PULLUP);
}
void loop() {
// Buton basiliyken pin LOW okunur, LED yanar
bool basili = (mcp.digitalRead(BUTON_PIN) == LOW);
mcp.digitalWrite(LED_PIN, basili ? HIGH : LOW);
delay(20);
}
Kütüphane, Arduino IDE'nin Kütüphane Yöneticisi'nde "Adafruit MCP23017" adıyla bulunur. Her digitalRead bir I2C işlemi olduğu için çok hızlı tarama gereken işlerde (ör. kodlayıcı okuma) doğrudan Arduino pinleri daha uygundur.
GPA7 ve GPB7 neden giriş olarak kullanılmamalı?
Microchip, MCP23017 veri sayfasının 2022 tarihli D revizyonundan itibaren GPA7 ve GPB7 pinlerini yalnızca çıkış olarak tanımlar; bu pinleri giriş yapmayın. Üretici açıklamasına göre okuma sırasında bu pinlerdeki gerilim değişirse SDA hattı bozulabilir ve I2C hattı kilitlenebilir.
Eski kartlarda ve örneklerde bu pinlerin giriş olarak çalıştığını görebilirsiniz, ancak yeni tasarımlarda butonları ve sensörleri GPA0-GPA6 ile GPB0-GPB6'ya bağlayın; GPA7 ve GPB7'yi LED ya da röle gibi çıkışlara ayırın. Bu kısıtlama SPI'lı MCP23S17'de yoktur. Böylece giriş için kullanılabilen pin sayısı fiilen 14'tür.
MCP23017 kesmeleri nasıl kullanılır?
Kesme, giriş pinlerinden biri değiştiğinde INTA ya da INTB çıkışının seviye değiştirmesidir; Arduino böylece MCP23017'yi sürekli okumak yerine yalnızca bir değişiklik olduğunda okur. INTA A portunu, INTB B portunu izler; MIRROR ayarı açılırsa iki çıkış birlikte çalışır ve tek kablo yeter.
Adafruit kütüphanesinde setupInterrupts() ile kesme çıkışı, setupInterruptPin() ile izlenecek pin ayarlanır; getLastInterruptPin() kesmeye hangi pinin neden olduğunu söyler. INTA'yı Arduino Uno'nun 2 numaralı pinine bağlayıp attachInterrupt ile yakalamak yaygın bir yöntemdir. Kesme bilgisi, ilgili port okunana ya da temizlenene kadar aktif kalır.
MCP23017 ile PCF8574 arasındaki fark nedir?
MCP23017 16 pinli, pin başına yön ayarlı ve iki kesme çıkışlı bir genişleticidir; PCF8574 ise 8 pinli, daha basit ve daha ucuz bir genişleticidir. Az pin ve basit iş için PCF8574, çok sayıda buton ve çıkış için MCP23017 seçilir.
| Özellik | MCP23017 | PCF8574 |
|---|---|---|
| G/Ç sayısı | 16 | 8 |
| Adres aralığı | 0x20-0x27 | 0x20-0x27 (PCF8574A: 0x38-0x3F) |
| I2C hızı | 1,7 MHz'e kadar | 100 kHz |
| Pin yapısı | Gerçek çıkış, yön kaydı | Yarı çift yönlü, zayıf pull-up |
| Dahili pull-up | Pin başına açılır (yaklaşık 100 kΩ) | Zayıf akım kaynağı (sabit) |
| Kesme çıkışı | 2 (INTA, INTB) | 1 (INT) |
LCD ekranların arkasındaki I2C adaptörü de bir PCF8574'tür; PCF8574 I2C genişletme modülü 8 pinin yettiği işlerde iyi bir alternatiftir. LCD tarafı için 16x2 LCD ekran bağlantı rehberimize bakabilirsiniz.
Sık sorulan sorular
MCP23017 pini kaç mA verir?
MCP23017'nin her pini en fazla 25 mA verebilir ya da çekebilir; ancak toplamda VDD'den 125 mA, VSS'e 150 mA sınırı vardır. 16 LED'i aynı anda sürecekseniz LED başına akımı 5-7 mA ile sınırlayın. Röle, motor ve yüksek akımlı yükleri doğrudan değil, transistörlü röle modülü ya da sürücü üzerinden bağlayın.
MCP23017 3,3 V ile çalışır mı?
Evet, MCP23017 1,8-5,5 V arasında çalışır ve ESP32 ya da STM32 gibi 3,3 V kartlarla sorunsuz kullanılır. Entegreyi 3,3 V ile besleyin; böylece G/Ç pinleri de 3,3 V seviyesinde çalışır ve seviye dönüştürücü gerekmez. ESP32'de SDA için GPIO21, SCL için GPIO22 varsayılandır.
Bir hatta kaç MCP23017 bağlanır?
Aynı I2C hattına A2-A0 pinleriyle farklı adres verilmiş en fazla 8 MCP23017 bağlanır; bu 128 G/Ç pini demektir. Daha fazlası için I2C çoklayıcı (TCA9548A gibi) kullanılabilir. Çok sayıda modülde her modülün pull-up dirençleri paralel bağlanacağı için fazlasını sökmek gerekebilir.
MCP23017 ile 4x4 tuş takımı okunur mu?
Evet, 4x4 tuş takımı MCP23017'nin 8 pinine bağlanıp satır-sütun taramasıyla okunur. Satırları çıkış, sütunları dahili pull-up'lı giriş yapın ve sütunlar için GPA7 ile GPB7'yi kullanmayın. Standart Keypad kütüphanesi Arduino pinlerini kullandığı için MCP23017'ye uyarlanmış bir sürüm ya da kendi tarama kodunuz gerekir; tuş takımının temelleri 4x4 keypad rehberimizde.
Özet
- MCP23017, I2C ile 16 dijital G/Ç pini ekleyen, 1,8-5,5 V ile çalışan bir genişletici entegredir.
- Adres A2-A0 ile 0x20-0x27 arasında seçilir; bir hatta 8 adet, toplam 128 pin bağlanabilir.
- RESET pini VDD'ye, adres pinleri GND ya da VDD'ye bağlanmalı; boş bırakılmamalıdır.
- Güncel veri sayfasına göre GPA7 ve GPB7 yalnızca çıkış olarak kullanılmalıdır.
- Pin başına 25 mA, toplamda 125 mA (VDD) ve 150 mA (VSS) sınırları aşılmamalıdır.
