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;

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

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;

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

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

Ş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;
