SAYISAL DEVRE TASARIMI_7_ARDUINO

 

Bu yazım Sayısal tasarım yazı dizisinin son yazısıdır. Şimdiye kadar anlattıklarımdan yola çıkarak, size bir arduino UNO kullanarak, 4 ayrı bağımsız modül kartını nasıl kontrol edebileceğinizi göstereceğim. Devreyi değiştirmeden 7 karta kadar kontrol edebilirsiniz.

Bu güne kadar dedim ki; Arduino ya da diğer mikrokontrolcülerin zamanını çalmayan kendi başına çalışan modül kartlarıyla çalışılırsa, hem pim sayısından tasarruf edilir, hem de gerçek zamanlı çalışması gereken işlere daha fazla zaman ayrılır. Mikrokontrolcü bu modül kartlarından aldığı bilgilere göre bir orkestra şefi gibi tüm sistemi yönetir. Bunu yaparken de devamlı bir şeyleri kontrol etmek zorunda kalmaz.

Ne demek istediğimi ise şöyle anlatayım. Bir arduino programı çalışırken, bağladığınız butonları ve sensörleri devamlı kontrol eder. Bir yandan da röle ve motorlar gibi çıkış devrelerini de kumanda etmek zorundadır. Bunu yaparken çok hızlı olduğu için her birine bir zaman ayırır. 2 tane buton varsa sorun yok 30 buton varsa her birine 1ms zaman ayırsa 30ms zaman kaybı demektir. Bunun gibi diğer çıkış devrelerini de kumanda ederken zaman kaybedecek ve o sırada butonları kontrol edemeyecek. Çünkü arduino programı, sıralı işlem yapar. Bundan dolayı hızlı dahi olsa zaman kayıpları yaşanır.
Sayısal devrelerle hazırlanmış modüller, verilen işi yerine getiresiye kadar mikrokontrolcü onu kontrol etmez. Bu zaman içerisinde diğer işlerine bakar. Komut verilen modül kart, işi yerine getirdikten sonra ise geri bildirim vererek istenilen işi yaptım bana başka iş ver der.
O zaman mikrokontrolcü modül karttan bilgiyi alır ve yeni bilgi gönderir. Bu şekilde çalışmayla diğer modülleri de kontrol ederken fazla kayıp zamanı olmaz. LOOP döngüsünde beklemeye devam eder.

Bu devreyi algılamanız için, mikrobotik sitemdeki diğer sayısal tasarım yazılarımı da okursanız işiniz kolaylaşır.

Öncelikle Arduinodan başlayalım. Yukarıdaki resimde gördüğünüz gibi bir bağlantı mevcut.

Öncelikle INT0 ve 1 bağlantısına bakalım. Aşağıda detaylarını vereceğim şekilde interrupt kullanımını sağlayabilirsiniz. Bu uçlar 2 adet interrupt (kesme) pimleridir. 1 tanesi MULTI INPUT kartları için,
1 tanesi de MOTOR KONTROL kartları için kullanılır.
Motor kartı istenen görevi bitirince buraya bir kesme yollar ve arduino, o kesmeye göre yapacağı görevi başlatır.
Diyelim ki 2 kesme var ve bunun 2 si birden aynı anda geldi. Arduino ne yapacak. Tabii ki öncelik sırasıyla bunu işleyecek. Öncelik sırası UNO kartında INT0 ve INT1 olarak gerçekleşiyor. Aşağıda Öncelik tablosu bulunmaktadır.
Bu sıralama atmega328 kullanan arduino kartları için standarttır.
İnterrupt çalışması için öncelikle kesme pimi tanımlanır. Sonrasında ise SETUP bölümünde ATTACH komutu tanımlanır. Sonrasında ise kesmeler aktif hale gelmiştir.

Resimde gördüğünüz şekilde komutu kullanabilirsiniz. Attachinterrupt komutunun sonunda LOW gördüğünüz yeri Aşağıdaki resimdeki gibi değiştirebilirsiniz.


Burada LOW CHANGE RISING FALLING UNO için geçerlidir. Bir de HIGH özelliği var o ise başka modellerde kullanılmaktadır.
LOW, INT girişi LOW ise kesme gelmiştir. CHANGE ise 1 den 0 a ya da 0 dan 1 e değişim olduğunda algılanır. RISING ise Gelen sinyalin 0 dan 1 e geçen yükselme zamanında algılanır. FALLING ise 1 den 0 a düşerken kesme algılanır demektir. Siz kendi programınızda burayı değiştirebilirsiniz. Ayrıca resimde bir de KESME algılandığında nereye gideceği bulunmaktadır. Ben kesme ve kesme 2 olarak tanımladım. Aşağıda 2 adet kesmeye ait alt program görünüyor.

Burada önemli olan KESME altprogramında DELAY gibi komutlar kullanmamak ve çok fazla satırlı işlemler yapmamak. ASIL OLAN, kesmeye gidip hızlı bir şekilde kesme alt programından çıkmak. Çünkü kesme zamanında diğer kesmeler gelirse onları algılayamayacaktır.
Bundan dolayı ben birer değişkene değer vererek kesme işleminden ayrıldım. Aşağıda program içeriğini görebilirsiniz.


Bir de LOOP döngüsünde farklı bir kesme komutu var. Bu komut Kesmeleri çalışmayacak şekilde ayarlar. Normalde uzun bir seri bilgi alıyorsanız mesela IR kumanda sinyali gibi, O zaman
detachInterrupt(0); komutu kullanılır.
Seri bilgi alındıktan sonra attachInterrupt(digitalPinToInterrupt(interruptPin1),kesme2, LOW); ile kesmeler aktif duruma getirilir.
Ben burada ne için kullandım derseniz. LOW olarak kesme geldiğinde çalış dediğimde bir buton basılı kaldıysa kesme onu kontrol etmiyordu. Çünkü değişimi algılamıyordu. Bundan dolayı ben de kesme 1 kez uygulandıktan sonra kesmaleri kapatıp açıyorum ki buton basılıysa tekrar okumaya gidiyor.
Tabii ki bu normalde istenmeyen bir döngü yaratacaktır devamlı buton okuyarak diğer işlemlere gidemeyecektir. Bunu bir sayı ile sınırlandırarak bu sayıya kadar kesme okuması yapılır sonrasında butonlarda arıza var diye hata bölümüne gidilir. Sistem durdurulur. Bu şekilde kullanabilirsiniz.


Kesmelerin hangi modeller de hangi pimlerde olduğunu ise bu tablodan görebilirsiniz.


Yine arduino resmine dönersek orada C0-3 pimleri var. Bu pimler KART SEÇME kodu ve kartın seçilirken OKU YAZ komutlarını da içerir.
Bu devrede çalışma şekli şöyledir. Her karttan bilgi okunacak ise o kartın kodu verilir ve daha sonra bilgiler gönderilir ya da okunur. Kart kodu 3 bitliktir. C0-2 arası. C3 ise karta yaz ya da oku kodudur.

Bu çıkışların aynı anda değişmesi gerektiği için C0-3 PORT MANIPULATION denilen metot ile çıkışa yansıtılır. Bu Digital Write komutundan farklıdır. Digital Write komutu sıra ile pimleri kontrol eder. Sayısal devrelerde aldığı bilgiyi hemen işler. Sonunda Hatalı komut işlenir.
Örnek ile anlatsam daha iyi olacak sanırım. Mesela kart kodu 1001 ve son durum 0000 durumundaydı. Digital Write C0 HIGH deseniz durum 0001 olacaktır. Bu 1 numaralı kartın oku bilgisidir. Modül hemen okuma moduna geçecektir. Fakat bizim istediğimiz 1001 komutu yani yaz komutudur. Bundan dolayı çıkışları sırayla değil aynı anda değiştirmemiz gerekir.
PORT MANIPULATION modunda çalışmaktadır.
BU modda komutu PORTD = B11111111 & B11000000; şeklinde göndeririz. Bunu gönderirken DDRD komutunu SETUP bölümünde tanımlamamız gerekir. Hangi pimler giriş hangileri çıkış olacak şekilde tanımlarız.
DDRD = B11110010; // set PORTD (digital 1,4-7) to outputs

Port manipulation kullanımını Şu yazımdan bakabilirsiniz :
https://www.mikrobotik.com/wp2/2022/05/05/74hc595-ile-karakter-lcd-kontrol/

Ayrıca Arduino sitesinden de kullanımına bakabilirsiniz.
https://docs.arduino.cc/hacking/software/PortManipulation

Bunların dışında PORT B pimlerini de kullanıyorum. PORTB pimlerini yine resme bakarsanız
1 adet CLK, 1 Adet MISO, 1 adet MOSI ve 1 adet de SH LOAD olarak kullanıyorum.
Aslında SPI haberleşme gibi kullanılıyor fakat sayısal devrelerde kullanılan entegreler, SPI uyumlu olmayabiliyor. Bunun için mantık aynı olsa bile, haberleşmeyi biraz değiştirmek zorunda kalabiliyoruz.
Mesela S_LOAD çıkışı 74HC595 için bir STROBE ucunu kontrol eder. Seri bilgiyi gönderdikten sonra bu pimi aktif ederek 74HC595 in aldığı seri bilgiyi paralel hatta vermesini sağlarız.
Aslında SPI gibi dedim. Ama CS pimi yok diyeceksiniz. Elbette var. CS entegre seçme pimidir. Yani birden fazla olan haberleşme devrelerinde, hangisiyle haberleşileceğinin seçilmesini sağlıyor.
Ben de bu kartta CS görevini Kart seçme komutu olan C0-3 ile yapıyorum. Hangi kartı seçersem bu pimler o modül kart ile haberleşiyor.

Arduino bağlantıları bu kadar. Görevleri de basit. Peki ya modül kartlar buna nasıl tepki verecek. Şimdi de bunlara bakalım.


Bu resimdeki kart motor kartıdır. Diğer motor kartı da aynıdır. Sadece kart seçme kısmı farklıdır. Arduino bu karta 15 adım git derse, 15 adım gider ve bitince, bitirdim diye kesme pimi ile arduinoya bilgi verir. Bu şekilde döngü gerektiğince devam edilir.
Kartın numarası  0011 dir. Bu kart başlarken mutlaka resetlenmesi gerekir. Bunun için 1011 komutu verilerek hem resetlenir hem de yeni adım sayısı verilir.
Devrede sol taraf 74HC595 ile seri bilgiyi alan kısımdır. Bilgi gönderildikten sonra kart kodu 0011 olarak verilir ve çalışma başlar. Bu bilgi alındıktan sonra en sağdaki karşılaştırma devresinde eşitlik bozulur ve step motor dönmeye başlar.
Bu karşılaştırma devresinin girişinde bir sayıcı vardır. Bu step motor döndükçe sayar ve istenen adım sayısı sağlandığında motoru durdurur. Aynı zamanda arduinoya işi bitirdiğini söyler.
Çalışması basittir.
Step motor sürücü olarak GAL entegresi programlanıp devreye eklendi.
Bu GAL entegresini nasıl programlarım derseniz. Bu yazıma bakabilirsiniz.
https://www.mikrobotik.com/wp2/2023/07/22/sayisal-devre-tasarimi_5-plds_fpga/

74HC595 çıkışında 6. Bit YÖN tayin etmek içindir. Bu da GAL programında belirtilmiştir. Bu bit değerine göre sağa ya da sola döner.

Girişin seri olarak verilmesi sizin esnek çalışmanızı sağlar. Ben burada 4 bitlik bir çalışma yaptım yani 15 e kadar maksimum adım sayısı var. 8 bitlik bir çalışma yaptım 4 biti motor komutudur.
Sizler seri haberleşme olduğundan 16 bitlik seri bilgiyi de modül karta iletebilirsiniz.
Bunu yapmak için 74hc595 nasıl 16 bit bilgi alır bu yazıma bakabilirsiniz.
https://www.mikrobotik.com/wp2/2023/05/21/sayisal_devre_tasarimi_3/

Resimde fikir verecektir.


Aynı zamanda 4 bit karşılaştırma yaptım. Sizler 8 bit ya da 16 bit de karşılaştırma yapabilirsiniz.
Bu yazımda ise 8 bitlik karşılaştırma nasıl yapılır bunu bulacaksınız.
https://www.mikrobotik.com/wp2/2023/05/12/sayisal-devre-tasarimi_2_adc/

Resimde fikir verecektir.

Ayrıca bu motor devresinde INT kesme çıkışı bir TRISTATE buffer entegresiyle brleştirilmiş durumdadır. Bu durum çok önemlidir. Kullanılan her kart, INT çıkışını verir. Fakat Arduino hangisinin INT çıkışı olduğunu bulmak için tüm çıkışlara tek tek bakması gerekir.
Bu paralel olarak birbiriyle çalışan sistemlerde, sadece 1 devrenin çıkışı ya da girişinin BUS denilen veri yolunda olmasını gerektirir. TRISTATE çalışmanın anlamı şudur. Giriş ve  çıkış arasında bir kontrol kısmı vardır. Bu kontrol kısmı aktif olmaz ise çıkış Z empedansı yüksek gösterir ve Girişi çıkışa bağlamaz.
Arduino, INT kesmesi geldiğinde, kartları tek tek kart kodu vererek dolaşır. Aynı zamanda kart kodunu verdiğinde S_CLK ucunu HIGH yaparak o kartın INT çıkışını okur.
Bu da hangi kartın INT kesmesi yolladığını anlamasını sağlar.

Bir diğer kart ise MULTI INPUT kartıdır. Burda sadece dijital çalışma vardır. Yani buton basıldı mı, basılmadı mı bunu kontrol eder. 8 buton kontrolü 1 karttır.
2 kart kullandım 16 buton kontrol edebiliyorum. Butonlar basılıp bırakılacağı için, o sırada arduino bunu hemen kontrol edemeyeceği için kaçırabilir.
Bundan dolayı S-R Flip flop kullandım. Butona basıp bıraksanız bile SET edilmiş olacağından Arduino bunu kaçırmayacaktır. Bu karttan bilgi okunduğunda, kart kodunun 3. Biti 1 yapılarak S-R FF un RESETLENMESİ sağlanır.  Burada da 74LS244 Tristate çıkışlı entegre kullanılır. Bunun amacı sadece OKUMA kodu geldiğinde veri yoluna koy demektir.  Bu kartın en sağında ise yine Paralel Seri çevirici entegre kullanıldı. Arduino bu seri çıkışı okuyarak hangi butonun basıldığını algılar.


Bütün bunların yanısıra devreyi değiştirmeden daha 3 kart kontrol etme imkanı var. Bu da ADC olarak kontrol edebileceğiniz bir kartı aynı mantıkla oluşturabileceğinizi gösterir.  ADC kartını da buraya eklerseniz LM35 gibi bir sıcaklık sensörünün okumasını yapıp Dijital analog çevirici ile bilgiyi dijitale çevirerek seri veri yoluyla Arduinoya yollayabilirsiniz. Analog kartınıza bir numara verirsiniz. Bu numara ile Arduino ile haberleşir.
1 den fazla sensör okuyabilirsiniz. Bunu kart tasarımınızda yapabilirsiniz. Nasıl olsa seri bilgi olarak göndereceğiniz için tüm sensörlerin değerlerini arka arkaya gönderebilirsiniz. Tabii ki, Okuma zamanı geldiğinde.
Bundan başka ne yapabilirsiniz.
Arduino bu sensörlerin limitlerini kartınıza yollar. SET eder. Bundan sonra tüm yük modül karttadır. Limitler aşılasıya kadar kartınız normal çalışmasına devam eder ve Arduinoya iş düşmez.
Ancak LİMİT değerler aşıldıysa Arduinoya KESME gönderilerek durum bildirilir. Arduino da gereğini programına göre yapar.
Nasıl ADC okuyup DA kullanarak çevireceğim derseniz.
Sayısal tasarım yazı dizisindeki bu yazıma bakabilirsiniz. 
https://www.mikrobotik.com/wp2/2023/05/12/sayisal-devre-tasarimi_2_adc/

 

TÜM dosyalara buradan ulaşabilirsiniz.

 


 

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.