Hakan Kaya

RPi & Windows IoT Core & C# – 1 – Blink

Not: Merhabalar, Bu yazı dizisinde Visual Studio ile C# – Xaml ile Windows 10 IoT Core platformunda yaptığım uygulamaları aktaracağım. Raspberry Pi’de Linux dağıtımları üzerinden Python dili ile uğraşmış biri olarak benim için de yeni bir soluk olacak. Ne yazık ki yazıyı yazdığım zamanlar pek içerik bulamadığım için bazı eksikliklerim/hatalarım olabilir. 

Bu platformda geleneksel LED yakıp söndürme uygulamasıyla biraz aşina olmaya çalıştım. Buyrun neler yapmışım görelim…

Grafiksel bir arayüz ile kafa karıştırmayı gerek görmediğim için UI kısmıyla ilgili bir çalışma yapmadım ilk etapta. Olabildiğince basit bir kod yazmaya da özen gösterdim. Hikaye örgüsü şu şekilde olacak; bir tane LED’imiz bir saniye aralıklarla yanıp sönecek.

Raspberry Pi için proje nasıl açılır, hangi dosya ne işe yarar buradan daha fazla detaya sahip olabilirsiniz.

İlk olarak kullandığım kütüphaneleri eklemekle başladım.

using System;
using System.Threading.Tasks;
using Windows.Devices.Gpio;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

Burada GPIO kontrolleri için Windows.Devices.Gpio kütüphanesini eklemeliyiz. Universal Windows uygulamalarında ekli halde gelmiyor.

 

 // Pin tanımlamaları
 private const int LED_PIN = 12;

 // Nesne Tanımlamaları
 private GpioPin pin;
 private GpioPinValue pinDegeri;

Sabit bir integer değişkenine LED’imiz bağlı olduğu pin numarasını atadım. Hazır yazıyorken GpioPin için pin, GpioPinValue için de pinDegeri  nesnesi yaratalım dedim.

 

public void pinHazirliği()
 {
 // gpio nesnesi tanımlaması
 var gpio = GpioController.GetDefault();
 
 // Pin çıkış ayarlamaları
 pin = gpio.OpenPin(LED_PIN); // Pin açtık
 pin.SetDriveMode(GpioPinDriveMode.Output); // Pini çıkış yaptık
 }

Genel kod yazma kültürüne sahibiz ya biz şimdi. Yazdığımız kodlar okunabilir olacak, parça parça olacak, tane tane olacak. Heh! İşte bende pin hazırlıkları için fonksiyon açtım bu nedenle. İçine de gpio nesnesi yarattım. Var tipi kullandığınızda nesnenin tipini siz değil derleyici seçecektir. Kullandığım pin için vize işlemleri yaptırdım, Output(çıkış) olarak süreceğimi de belirttim, oh mis. Main method içerisinde çağırabiliriz artık sanırım.

Ekstra: Eğer cihazınızda Gpio herhangi bir nedenden dolayı kullanılamıyorsa gpio değişkeni size null döndürecektir. İncelediğim bazı kodlarda bunun sorgusu için küçük bir kod parçacığı yazıp uyarı mesajı yazdırmışlar, nasıl mı aynen şöyle;

if (gpio == null){
   GpioStatus.Text = "GPIO yok yada çalışmıyor kardeşim"   
}

Ana fonksiyonumuzda bir while döngüsü açıp bir açık bir kapı yapma güzel fikir geldiği için bu algoritmayı denedim.

 public MainPage()
  {
    this.InitializeComponent();


    pinHazirliği();

    pinDegeri = GpioPinValue.Low;

    while (true)
    {

      // durumlara göre sorgu tanımlamaları
      if (pinDegeri == GpioPinValue.High)
      {
        pinDegeri = GpioPinValue.Low;
        pin.Write(pinDegeri);
        Task.Delay(1000).Wait();
      }
      else
      {
        pinDegeri = GpioPinValue.High;
        pin.Write(pinDegeri);
        Task.Delay(1000).Wait();
      }
   }
 }

3. satırda yazılan Initiliaze Component Xaml arayüz yüklenmesini için gerekli bir method. Orada ne işi var onun şimdi? Silin gitsin. Aslında siyah bir arkaplan attım da ben, pek de önemli değil şimdi.

Neyse pin hazırlığı için bir fonksiyon açmıştık onu çağıralım.

Gerisi klasik bir while döngüsü zaten.

pinDeğeri’ini High yapmak için GpioPinValue.Low veya GpioPinValue.High deyimini kullanmak gerekiyor. Bir çıkışı lojik-1 veya lojik-0 yapmak için pin değerini High yada Low yapıp bunu pine yazdırmalıyız. İlk bir pinDegeri atamıştım, ona göre bir döngüye girecek var olan değeri tersine çevirip, pine yazacaktır.

Bekleme için timer kullanılabilir. Onu da burada anlattım. Bu örnekte DispatcherTimer kullanmadan yaptım. Delay içindeki parantez içi argümanı milisaniye cinsinden gördüğünüz gibi.


Kodun tamamı (MainPage.xaml.cs);

using System;
using System.Threading.Tasks;
using Windows.Devices.Gpio;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace App1
{
    public sealed partial class MainPage : Page
    {

        // Pin tanımlamaları
        private const int LED_PIN = 12;

        // Nesne Tanımlamaları
        private GpioPin pin;
        private GpioPinValue pinDegeri;



        public MainPage()
        {
            this.InitializeComponent();


            pinHazirligi();


            while (true)
            {

                // durumlara göre sorgu tanımlamaları
                if (pinDegeri == GpioPinValue.High)
                {
                    pinDegeri = GpioPinValue.Low;
                    pin.Write(pinDegeri);
                    Task.Delay(1000).Wait();
                }
                else
                {
                    pinDegeri = GpioPinValue.High;
                    pin.Write(pinDegeri);
                    Task.Delay(1000).Wait();
                }
            }
           

        }



        public void pinHazirligi()
        {
            // gpio nesnesi tanımlaması
            var gpio = GpioController.GetDefault();
        
            // Pin çıkış ayarlamaları
            pin = gpio.OpenPin(LED_PIN);                // Pin açtık
            pin.SetDriveMode(GpioPinDriveMode.Output);  // Pini çıkış yaptık
            

        }


        
    }

}

Exit mobile version