Raspberry Pi – Mono ile GPIO işlemleri

   Raspberry Pi’mize mono kurulumunu gerçekleştirdikten sonra sıra geldi eğlenceli şeyler yapmaya. Bu makalemde, birlikte ilk GPIO işlemimizi gerçekleştireceğiz.

   Raspberry Pi üzerinde yer alan GPIO pinlerini kullanmak malesef ki mono ile birlikte gelen hazır bir kütüphane bulunmuyor. Hemen üzülmeyin, C# içerisinde GPIO kullanımının bir kaç farklı yolu bulunuyor. Bu yöntemlere geçmeden, Raspberry Pi üzerinde GPIO kullanımı için C, Python v.b. bir dil ile geliştirilmiş kütüphanelerin hali hazırda bulunduğunu belirteyim. Üstelik bu kütüphaneleri doğrudan shell scriptleri üzerinden kullanabilirsiniz.

   Madem elimizde hazırda GPIO kütüphaneleri var, Amerika’yı yeniden keşfetmenin gereği yok. Bu kütüphaneleri C# uygulamamız içerisinde kullanabiliriz. Bunun ilk yolu tabiki hazırladığımız Shell scriptlerini uygulamamız içerisinden tetiklemek. Bu en kolay yöntem olmakla birlikte uygulamamız içerisinde tam bir entegrasyon olmayacağı için kimi senaryolarda işimizi görmeyebilir. Bu durumda ikinci senaryomuzu incelemeliyiz; C/C++ kütüphanelerini C# içerisine import etmek; ki bu makalemde takip edeceğim yöntem de tam olarak bu olacak.

  Bu açıklamalar ardından sıra geliyor bir kütüphane seçimine. Bu noktada ben tercihimi WiringPi kütüphanesinden yana kullanıyorum. Çok yaygın olması ve stabilliğini kanıtlamış olması tercihimdeki önemli etkenlerden oldu.Öncelikle kütüphaneyi Raspberry Pi’ye kurup biraz inceleyelim. Haydi konsol başına, WiringPi kaynak kodunu Git yardımıyla yerelimize indirelim;

git clone git://git.drogon.net/wiringPi

   Kodların son halini aldıktan sonra aşağıdaki satırlar ile derleyip kurulumunu yapalım;

cd wiringPi
./build

   Bu kadar basit. Artık kullanabileceğimiz bir WiringPi kurulumumuz oldu. Haydi merhaba dünya örneğimize geçelim! Raspberry Pi’mize bağlı bir led’i yakalım. Bu aslında WiringPi örnekleri arasında da yer almakta ve aşağıdaki adımlar daha detaylı olarak GPIO örnekleri arasında bulunabilir. Devre şemamız aşağıdaki şekilde olacak;

led_devresi

   Breadboard üzerinde devremiz şu şekilde görünecektir;

Breadboard layout

   Devre şemasında her ne kadar 270Ω (ohm)’luk bir direnç yer alsada, 270Ω – 330Ω aralığında bir direnç işimizi görecektir.

   GPIO-17 üzerine bağladığımız devremizi çalıştırmak için öncelikle pinimizi çıktı olarak işlem yapacağımızı belirtmeliyiz;

gpio mode 0 out

  Dikkat ederseniz pin olarak 17 yerine 0 yazdık. Bunun nedeni Wiring Pi kütüphanesinin varsayılan olarak pinlerde kendi numaralandırmasını kullanmasıdır. Wiring Pi kütüphanesinin Pin eşleştirmelerini http://wiringpi.com/pins/ adresinde bulabilirsiniz. Orjinal Raspberry Pi pin numaralarını kullanmak isterseniz –g parametresini kullanabilirsiniz. Örneğin;

gpio -g mode 17 out

   Pin’imizi çıktı olarak kullanacağımızı belirttikten sonra artık kolaylıkla akım verebiliriz. Bunun için gpio uygulamasına aşağıdaki şekilde write komutunu geçmeliyiz;

gpio write 0 1
gpio write 0 0

  Bu satırlarla Raspberry Pi’mize 17. pin için sırasıyla önce akım vermesini, sonrasında da 0 Volt geçmesini söylüyoruz. Bu şekilde led’imiz yanıp sönecektir;

Led_devresi

   Yeni bir shell scripti hazırlayıp aşağıdaki içerik ile led’imizin yanıp sönmesini sağlayabiliriz;

nano led_ac_kapa.sh
#!/bin/bash
source gpio

gpio mode 0 out

while true; do
    gpio write 0 1
    sleep 0.5

    gpio write 0 0
    sleep 0.5
done

script

   Oluşturduğumuz shell scriptini aşağıdaki komut ile çalıştırılabilir olarak işaretledikten sonra deneyebiliriz;

chmod +x led_ac_kapa.sh

   İşin zor kısmını bu adımlarla tamamlamış olduk. Şimdi kendi sularımıza geri dönüp aynı işlemi basit bir C# konsol uygulamasında yapalım.

   Öncelikle WiringPi kütüphanesine C# içerisinden erişebilmemiz lazım. Şanslısınız ki bunun yapılmışı hazır 🙂 Github üzerindeki RPI.GPIO repositorimden bu kütüphaneyi indirip hemen kullanabilirsiniz. Kütüphane WiringPi’ye bağımlı olduğu için aşağıdaki şekilde paylaşılan kütüphaneleri kaydetmelinisiniz;

cc -shared wiringPi.o -o libwiringPi.so
cc -shared wiringPiI2C.o -o libwiringPiI2C.so
cc -shared wiringPiSPI.o -o libwiringPiSPI.so

   Sonrasında GitHub üzerinde yer alan kaynak kodları yerelimize indirmeliyiz;

git clone https://github.com/fatihboy/RPI.GPIO.git

   Kaynak kodlar yerelimize indikten sonra aşağıdaki kodla derleyebiliriz;

cd RPI.GPIO/
MONO_IOMAP=case xbuild /p:Configuration=Release Enterprisecoding.RPI.GPIO.sln

   Solution’ın bu şekilde derlenmesi ardından aşağıdaki komut ile solution içerisinde yer alan led örneğini çalıştırabiliriz;

cd Enterprisecoding.RPI.GPIO.LedTest/bin/Release/
sudo mono Enterprisecoding.RPI.GPIO.LedTest.exe

led_test

   Şimdi sıra geldi uygulamanın nasıl çalıştığını sizlerle paylaşmaya. Öncelikle WiringPi wrapper kütüphanemizin Enterprisecoding.RPI.GPIO projesi olduğu belirtmeliyim. İlk iş bu kütüphaneye referans verilmelidir. WiringPi’nin hazırlanması için WiringPi.Core altında yer alan Setup fonksiyonu çalıştırılmalıdır. Bu fonksiyon çağrısının –1 değeri dönmesi durumunda WiringPi ilklendirmesinde bir problem olduğu anlamına gelecektir;

int result = WiringPi.Core.Setup();

if (result == -1) {
    Console.WriteLine("WiringPi ilklendirmesi başarısız!");
    return;
}

   İlklendirme ardından PinMode fonksiyonu ile pinimizi çıktı için kullanacağımızı belirtmeliyiz;

WiringPi.Core.PinMode(0, PinMode.Output);

   Son olarak; DigitalWrite fonksiyonu ile istediğimiz değeri pin’e gönderebiliriz;

for (; ; ) {
     WiringPi.Core.DigitalWrite(0, DigitalValue.High);
     System.Threading.Thread.Sleep(1000);

     WiringPi.Core.DigitalWrite(0, DigitalValue.Low);
     System.Threading.Thread.Sleep(1000);
 }

  Gördüğünüz gibi RPI.GPIO kütüphanesi yardımıyla Raspberry Pi üzerinde oldukça kolay bir şekilde pin işlemleri yapabiliyoruz. Burada dikkat edilmesi gereken tek  nokta uygulamamızın root yetkisi ile çalışmasıdır.

   Enterprisecoding Raspberry Pi GPIO kütüphanesi projelerinizde kullanmak için kaynak kodları üzerinden hareket edebileceğiniz gibi dilerseniz NuGet paketini de kullanabilirsiniz;

NuGet_Paketi

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

1 Yorum

  1. Fatih Baysu   •  

    Fatih Bey,

    Bu güzel bilgiler için çok tesekkürler emeginize saglik.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir