1 Master – 4 Slave: Arduino ile Yüksek Hızlı ve Donanım Tasarruflu Paralel Veri Yolu Mimarisi
Bir önceki yazımda, Arduino ile paralel veri yolu (Parallel Bus) mimarisinin temellerine ve bu çalışma mantığının bize neler kazandırabileceğine değinmiştim. Bu yazımda ise teoriyi tamamen pratiğe döküyoruz. Sınırları biraz daha zorlayarak; 1 Merkez (Master) ve 4 Yardımcı (Slave) Arduino’nun tek bir ortak paralel veri yolu üzerinden, yüksek hızda nasıl pürüzsüzce haberleştiğini adım adım inceleyeceğiz.
Bu projede sadece bir veri aktarımı yapmıyoruz; aynı zamanda mikrodenetleyici dünyasında çok sık karşılaşılan “pin yetmeme” sorununa harici mantık entegreleriyle nasıl zekice ve ekonomik çözümler üretebileceğimizi gösteriyoruz.
Donanım Mimarisi ve Pin Tasarrufu Sihri
Verici olarak görev yapan Master Arduino (tasarımımızda en solda yer alan), aynı veri yolunu kullanarak tam 4 farklı alıcı Arduino’ya birbirinden bağımsız veriler gönderebiliyor. Normal şartlarda 8-bitlik paralel haberleşme + kontrol hatları kullandığımızda sadece bir alıcı için bile işlemcimizin tüm pinlerini tüketebilirdik. Ancak burada donanım tasarımcısının en büyük dostları devreye giriyor:
-
74HC595 (Kaydırmalı Kaydedici – Shift Register): 8-bitlik paralel veri yolunu sürmek için Master Arduino’nun pinlerini doğrudan kullanmak yerine veriyi buraya aktarıyoruz. Bu sayede pin tasarrufu sağlıyoruz. Dahası, 74HC595 girişlerini Arduino’nun donanımsal SPI uçlarına (MOSI ve SCK) bağlayarak 8 MHz gibi maksimum donanımsal hızda haberleşiyoruz. Bu, alıcı sayısı arttığında bile tepki süresinin (latency) mikrosaniyeler seviyesinde kalmasını sağlıyor.
-
74HC238 (3-to-8 Demultiplexer): Master Arduino’nun alıcılara gönderdiği
STROBE(Haberleşmeyi Başlatma) kontrol sinyalini çoklamak için kullanılır. Tek bir tetik pinini adresleyerek 8 farklı çıkış elde etmemizi sağlar. -
74HC151 (8-to-1 Multiplexer): Alıcılardan Master’a geri dönen el sıkışma (
ACK– Acknowledge) sinyallerini tek bir pin üzerinden Master’a ulaştırır.
Seçim ve Adresleme Mantığı (A, B, C Hatları)
Master Arduino, hangi alıcı ile konuşacağını belirlemek için PORTD register’ının 5, 6 ve 7. pinlerine bağlı olan A, B, C adres hatlarını kullanır. Bu 3 hat, 74HC238 ve 74HC151 entegrelerine ortak bir ikili sayıcı (binary counter) olarak bağlanır.
Şöyle düşünün: Master, adres hatlarında 001 (Decimal: 1) bilgisini ürettiğinde;
-
74HC238 entegresinin 1. çıkışı aktif olur ve Master’ın gönderdiği
STROBE(Pin 8) sinyali doğrudan 1. Arduino’nun A1 girişine yönlendirilir. -
Aynı anda 74HC151 entegresi de 1. girişini aktif eder. Böylece 1. Arduino’nun A0 çıkışındaki ACK sinyali, doğrudan Master’ın okuma yaptığı A1 girişine bağlanır.
Bu sayede diğer alıcıların hatları elektriksel olarak izole edilir ve ortak veri yolunda hiçbir çakışma yaşanmaz.
Adım Adım Haberleşme Algoritması (Handshake Protokolü)
Sistemimizin kararlı çalışmasının arkasındaki sır, geliştirdiğimiz milimetrik el sıkışma (handshake) algoritmasıdır. İşlem sırası tam olarak şu şekilde akar:
Verici (Master) Alıcı (Slave)
| |
|--- 1. Karakteri SPI ile 74HC595'e yaz --->| (Veri hatlarda hazır)
| |
|--- 2. Adresi seç (A, B, C) -------------->| (Doğru kapı yönlendirildi)
| |
|--- 3. STROBE = HIGH yap ----------------->| (Alıcı uyarılır)
| |
| |--- 4. Karakteri PIND ile oku
| |--- 5. ACK = HIGH yap --->|
| |
|<-- 6. ACK sinyalini oku ------------------|
|
|--- 7. STROBE = LOW yap ------------------>|
| |
| |--- 8. ACK = LOW yap ---->|
| |
|--- 9. Adres = 000 (Park) ---------------->| (Sistem bir sonraki karaktere hazır)
Bu döngü, ilgili alıcıya gönderilecek metnin her bir karakteri için tekrarlanır. Cümle bittiğinde ise özel bir sonlandırıcı olan \0 (NULL) karakteri gönderilerek alıcının gelen veriyi ekrana basması tetiklenir. Ardından sıradaki alıcıya geçilir.
Master (Verici) Programı Kaynak Kodu
Verici kodu, doğrudan port manipülasyonu (Register-level programming) ve donanımsal SPI birimi kullanılarak maksimum hız ve kararlılık için optimize edilmiş verici yazılımıdır.
Sinyal geçişlerindeki milisaniyelik gecikmeleri önlemek adına tüm adresleme ve STROBE işlemleri doğrudan PORTB ve PORTD register’ları manipüle edilerek gerçekleştirilmiştir.
Sınırları Zorlamak: 4 Alıcı Değil, 15 Alıcı Olsaydı Ne Yapardık?
Mevcut tasarımımızda kullandığımız 74HC238 ve 74HC151 entegreleri 3-bit adresleme ile en fazla 8 kanalı (pratikte gürültüyü önlemek amacıyla 000’ı boşta bırakıp 7 kanalı) destekler.
Peki, sisteme 15 adet alıcı Arduino bağlamak isteseydik ne yapacaktık? Hemen daha fazla pini olan Arduino Mega’ya mı geçeceğiz? Hayır!
Çözüm son derece basit ve yine ekonomik:
-
Sisteme birer adet daha 74HC238 ve 74HC151 entegresi ekleriz.
-
Master Arduino’dan boşta kalan Pin 4‘ü devreye alıp adresleme için kullanırız (Artık 4-bitlik bir adresleyicimiz olur).
-
İlk 7 alıcı taranırken Pin 4’ü hep
LOWtutarız. -
8 nolu alıcıya ve sonrasına sıra geldiğinde Pin 4’ü
HIGHseviyesine çekeriz. -
Pin 4’ün bu durumunu, entegrelerin üzerindeki
E(Enable) bacaklarına (biri tersleyici kapı ile olacak şekilde) bağlayarak hangi entegre çiftinin (aktif/pasif) çalışacağını dinamik olarak seçeriz.
Böylece Master Arduino üzerinde sadece tek bir ekstra pin kullanarak alıcı kapasitemizi saniyeler içinde iki katına çıkarabiliriz!
Alternatif Yollar ve Donanım Dünyasındaki Esneklikler
Paralel veri yolları bize müthiş bir oyun alanı sunar. İhtiyaca göre bu yapıyı çok daha farklı şekillerde manipüle edebiliriz:
-
Çift 74HC595 Tasarımı: İletişim kontrol pini yerine iki adet 74HC595’i ardışık (cascade) bağlayabiliriz. 1. entegre 8-bitlik karakter bilgisini taşırken, 2. entegre doğrudan hedef alıcının ID bilgisini (seçimini) kontrol edebilir.
-
PCF8574 Çözümü: Çoğu hobicinin sadece “I2C LCD Modülü” olarak bildiği PCF8574 entegresi, aslında I2C protokolünü 8-bitlik bir paralel porta dönüştürür. Arduino’nun yanına bu entegreleri konumlandırarak donanımsal pin tasarrufunu bambaşka bir boyuta taşıyabiliriz.
Geliştiricinin Kulak Küpesi: Bakış Açınızı Genişletin!
Bu projenin bize öğrettiği en büyük ders şudur: Projenizde pin yetmediği anda hemen daha büyük, daha pahalı bir mikrodenetleyiciye (örneğin Mega veya harici geliştirme kartlarına) geçiş yapmayın. Donanım tasarımı, eldeki kısıtlı kaynakları mantık entegreleriyle akıllıca genişletebilme sanatıdır. Ancak burada çok kritik bir detayı asla unutmamalısınız:
Zamanlama ve Entegre Hızı Uyumu: Arduino 16 MHz hızda çalışırken, donanımsal SPI hattımız 8 MHz frekansta sinyal üretir. Tasarımınıza ekleyeceğiniz her harici mantık entegresinin (Shift Register, Multiplexer vb.) bu hız sınırlarını elektriksel olarak desteklediğinden emin olmalısınız. Aksi takdirde simülasyonda veya gerçek donanımda kilitlenmeler, veri kayıpları ve hız düşüşleri kaçınılmaz olacaktır.
Projelerinizde sınırları zorlamaya ve donanımın gücünü yazılımla birleştirmeye devam edin.
YETER Kİ BAKIŞ AÇINIZI GENİŞLETİN.
TÜM PROGRAMLARA BURADAN ULAŞABİLİRSİNİZ.