Micro Framework ile GPIO işlemleri

Yazar: Çeliker BAHÇECİ
Kategori: .NET Micro Framework
Eklenme Tarihi: 22.5.2009 21:27:23



Dış dünya ile iletişim kurmanın en kolay yolu olan GPIO portlarını inceliyoruz.

Merhabalar, bu makalede sizinle MF yüklü cihazlardaki GPIO portlarını kullanmayı inceleyecegiz.

MF yüklü kartlar üzerinde bulunan GPIO (General Purpose Input Output) portları ile dış dünyadaki cihazları kontrol edebilir veya farklı cihazlardaki dijital verileri alabiliriz. Her donanım üreticisi modellerinde farklı sayıda GPIO portu koymaktadır.

Kullanacağınız uygulamaya uygun donanım seçmek gerekiyor. Eğer GPIO portlar vasıtasıyla kullanacağınız cihaz sayısı 20 ise en az 20 GPIO çıkışı olan bir kart almak gerekecektir. Ne kadar donanım o kadar fiyat felsefesiyle piyasadaki ürünleri incelediğinizde GPIO sayısı arttıkça kartın diğer donanımların özellikleri de artmaktadır.

Benim sahip olduğum Device Soltıion firmasına ait TahoeII Developer kartının çekirdeginde bulunan Meridian chipsetinde 16 adet GPIO portu mevcut. Tabii bunlar developer kit üzerinde bir çok donanım ( dokunmatik ekran, ısı sensörü, accelerometer vb.) bulunduğu için paylaşımlı olarak kullanılıyor.

Dış dünyadan (diğer donanımlardan) en kolay iletişim kurulabilecek port GPIO dur. GPIO adında anlaşıldığı gibi hem input hem de output olarak kullanılabilmekte. Bu portlar digital oldugu için voltaj seviyesi önem arz etmekte, TahoeII üzerinde bütün GPIOlar 3,3v. Lakin farklı markalarda bu 5v olabiliyor. Yani 0v da logic olarak 0 (False), 3.3v da ise 1( True).

Şimdi çok basit bir uygulama geliştirelim, bu uygulamamızda cihazımız üzerindeki herhangi bir GPIO portunu Output olarak kullanıp bir LED yakalım.

İlk yapılması gereken direnç içeren bir LED bulmak veya devreye süreceğimiz LED için bir direnç ayarlamak. LED ler hiçbir zaman devreye direk sürülmezler mutlaka bir direnç vasıtası ile akımı sınırlamamız gerekmektedir.

Direncin değerini hesaplarken bir yöntem var ama ben üzerinde fazla durmayacağım. Genel olarak LEDler ve çektikleri akımlar aşağıda :

Kırmızı LED : ~1,8V-15mA
Sarı LED     : ~2V-15mA
Yeşil LED    : ~2,2V-15mA
Mavi LED    : ~3V-30mA
Beyaz LED : ~3V-30mA

Ortalama olarak 5KOhm luk bir direnç hepsi için yeterli olacaktır. Eğer parlaklığı yeteri kadar olmazda direnci düşürürsünüz veya arttırırsınız.

Direnci şekildeki gibi anot(+) tarafına lehimleyin.
Şimdi sıra kullanacagımız GPIO portunu seçmekte, ben GPIO4 ü seçtim.

Şimdi VS2008 ile “New Project” deyip proje tipi olarak “Micro Framework” deyip, uygulama template olarak “Windows Application” diyoruz. Bu sayede WPF özelliklerinde faydalana bilecegiz.

Solution Explorer a dikkat ettiyseniz, sıradan Windows Applicationslar dan biraz farklı. En önemlisi Form nesnesi yok. Desing time da tanınlaya bileceginiz görsel bir yapı maalesef yok. Her programdaki gibi Main methodu Program.cs içinde. Program.cs yi şöyle bir incelersek:


SPOT namespace ini fark etmişsinizdir. Microsoft 2003 yılında SPOT (Smart Personal Objects Technology) sini ilk duyurduğunda, yazılımın günlük hayatın her yerinde yer almasını hayal etmişti. Kol saatlerinden buzdolaplarına kadar. 2007 yılında bu teknolojinin adı .Net Micro Framework olana dek SPOT idi. Bu namespace onun mirası.

Uygulamalarda Form olmadığını söylemiştim. Window nesnesi mevcut aynı görevi üstelenilecek. CreateWindow() methodunda mainWindow nesnesi yaratılmakta ve ekranda gösterilmektedir. Yine bu method için cihaz üzerindeki butonların çalışması için AddHandler methodu ile OnButtonUp fonksiyonu tetiklenmektedir. Hazır gelen proje templatesinde bütün butonlar için tek bir method tanımlanmıştır. Siz tabii değiştirebilirsiniz.

İlk yapmamız gereken ne zaman ledin yanacağına karar vermek. Ben developer kit üzerindeki SW7 (Top buton) a basınca yansın yine SW5 (Bottom) a basınca sönsün istiyoruz.

Seçtiğimiz GPIO portunu

static OutputPort LED;

 bu şekilde output olarak set edip LED adında bir değişkenle tanımlıyoruz. Bu tanımlamayı global de static olarak yapıyoruz. Tıpkı mainWindow gibi ve CreateWindow() methodu için  mainWindow yaratıldıgı anda  bizde LED imizi yaratıyoruz:

LED = new OutputPort(Meridian.Pins.GPIO4, false);

GPIO4 portunu kullanıyoruz bu iş için. Ledimizi anotunu GPIO4 e diger ucunuda board üzerinde 0 v baglıyoruz. Ledin yanması için UP butonuna basıldığı anı yakalıyoruz ve ledi açıyoruz. DOWN butonunda ise ledi kapatıyoruz. Bu işlemleri butona basıldığında çalışan OnButtonUp() methodunu içine yazıyoruz.

        static OutputPort LED;

        private void OnButtonUp(object sender, ButtonEventArgs e)

        {

            switch (e.Button)

            {

                case Button.Up:

                    LED.Write(true);

                    break;

                case Button.Down:

                    LED.Write(false);

                    break;

            }

        }

Bütün işlem bu kadar aşağıdaki videoda dokunmatik ekran üzerinde yaratılan 2  buton ile LEDi yakıp söndürmeyi izleye bilirsiniz.
http://akilli.tv/video/322162/Net-Micro-Framework-GPIO-ve-Dokunmatik-Ekran.aspx

Yine bu şekilde LED yerine 3.3v luk bir röle kullanılarak daha yüksek gerilimlerde çalışan cihazlar açılıp kapatıla bilir.

GPIO portunu Input olarak kullanmak istediğimizde ise InputPort tanımlayıp, Read ile pindeki değeri true veya false olarak okuya biliriz. GPIO da bilmemiz gereken bir önemli konuda Interrupt olayının gerçekleşme zamanıdır.


InterruptEdgeBoth – Sinyal yükselirken ve düşerken tetiklenmesi.
InterruptEdgeHigh - Sinyal yalnızca yükselirken tetiklenmesi.
InterruptEdgeLow – Sinyal düşerken tetiklenemesi.
InterruptEdgeLevelHigh – Sinyal tam tepedeyken.
InterruptEdgeLevelLow – Sinyal en düşük seviyede iken.

Port un Interrupt modu olarak yukarıdakilerden birisini seçebilirsiniz.

Çeliker BAHÇECİ
Bilg. Müh.
ben @ celiker.com


Çeliker BAHÇECİ

2004 yılında Doğu Akdeniz Üniversitesi Bilgisayar Mühendisliginden mezun oldum. .Net platformu ile 2002 yılında tanıştım. Yazılım firmamda ekibim ile birlikte, .Net platformunda ticari uygulamalar geliştirmekteyim.

celiker.com
Bu makaleye ilk yorum yapan siz olun.

Yorumunuz