Facebook RSS Feed
 
Windows IoT: GPIO Kullanımı
Tarih: 07.12.2016, Platform: Windows 10 IoT Core, IDE: Visual Studio 2017, Level: 200

Elektronik komponentler dünyayla bağlantılarını pinleri aracılığıyla gerçekleştirir. Bu pinler mikrodenetleyicilerin, sensörlerin ve tüm bileşenlerin yanında ya da alt kısmında bulunur ve baskı devreye lehimlenir. Geliştirme kartlarında el ile bağlantı yapabilmemiz için bir çok pin, header adı verilen parçayla dışarıya verilmiştir. Örneğin, Raspberry Pi'ın üzerinde 40 pinlik header bulunur. Bu header ile +5V, +3.3V, seri port, I2C, SPI ve GPIO fonksiyonlarını kullanabilirsiniz.

Bazı pinlerin kendine özel görevi bulunur. Örneğin I2C protokolü için ayrılmış SDA ve SCL pinlerini Windows IoT Core üzerinde yalnızca kendi amacı için kullanabilirsiniz. Yani, başka cihazlarla, sensörlerle haberleşme sağlarsınız. Çoğunlukta kalan pinler de GPIO olarak adlandırılır. GPIO, genel amaçlı giriş - çıkış pini anlamına gelir. GPIO Pinlerinden dışarıya +3.3V elektrik verebilirsiniz ve dışarıdan +3.3V elektrik girişini algılayabilirsiniz.

Geliştirme kartlarının pinlerine uygulayabileceğiniz elektrik çoğunlukla +3.3V'dur. Elde edeceğiniz akım da 10 ile 20mA arasındadır ve tüm pinlerden alacağınız akım toplamı (örneğin) 50mA'i geçmemelidir. Bu demek oluyor ki pinlerle direkt bir şeyleri açıp kapamak isterseniz transistör ve röle gibi bileşenleri kullanmalısınız. Geliştirme kartınızın pin başına verdiği akımı teknik dökümanlarından bulabilirsiniz.

GPIO Pinleri özetle dışarıya elektrik verir ve elektrik girişini algılayabilir. Bir pini kullanmak için önce giriş mi çıkış mı olacağını belirtmeniz gerekir. Windows IoT Core'da bu işi yapmak için aşağıdaki adımları uygulayın:
- Önce bir UWP uygulaması açın ve proje referanslarına Windows IoT Extensions for the UWP'yi eklediğinizden emin olun. Bu referans uygulamanızın masaüstü bilgisayarlardan erişilemeyen GPIO, I2C, SPI gibi özelliklere sahip olmasını sağlar.
- Uygulama kodunuzdaki using statement'lar arasına:

using Windows.Devices.Gpio;

Satırını ekleyin. Artık düzenlediğiniz class içerisinde GPIO pinlerine erişebilirsiniz. Öyleyse GPIO altyapısını denetleyen GPIOController'ı başlatalım:

GpioController gpio = GpioController.GetDefault();

Artık gpio adındaki denetleyici, pin ayarlarından sorumlu olacak. Şimdi kullanmak istediğiniz pinleri belirleyin:

static GpioPin pin1, pin2;

 pin1 ve pin2 adında 2 GPIO pini belirledik. Bu pinlerin fiziksel olarak hangi pin numarasına bağlanacağını seçin:

pin1 = gpio.OpenPin(21);
pin2 = gpio.OpenPin(22);

 Artık pin1 ile yaptığınız işlemler GPIO21 üzerinden gerçekleşecek.

Pinlerin giriş ve çıkış modu bulunduğuna göre, pin1'i çıkış moduna ayarlayın:

pin1.SetDriveMode(GpioPinDriveMode.Output);

Bu pinden dışarıya elektrik vermek için:

pin1.Write(GpioPinValue.High);

Komutunu kullanın. High yerine Low yazdığınız zaman pin elektrik vermeyi keser.

Bilgisayarınızı açtığınızda, siz pin komutu verene kadar bazı pinler high, bazıları low değer verir. Örneğin röle kontrolü yapacaksanız, doğru türde pini seçmezseniz uygulamanız açılana kadar, ya da kapandıktan sonra cihazlarınız kendiliğinden açılabilir. Bunu önlemek için (mesela) Raspberry Pi 3 pinout araması yaparak pinlerin pull-up ve pull-down değerlerini kontrol edin. Pull-down: varsayılan değeri 0V, pull-up varsayılan değeri +3.3V'dur.

Giriş pini kontrolü için:

pin2.SetDriveMode(GpioPinDriveMode.InputPullDown);

Komutunu kullanın. Burada da yine GPIO pininizin Pull-up / down değerini belirtin. Şimdi pin2 girişinde değişiklik olduğunda tetiklenecek eventi belirleyin:

pin2.ValueChanged += Pin2_ValueChanged;

 Ve Event Handler kodunu tamamlayın:

private void Pin2_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
    if(args.Edge == GpioPinEdge.RisingEdge)
    {
        // High ise çalışacak kod
    }
    else
    {
        // Low ise çalışacak kod
    }
}

Artık pine elektrik verdiğinizde ve elektriği kestiğinizde yukarıda belirttiğiniz kod kısımları çalışacak. Uygulamayı denediğinizde, tek bir pin girişi değişikliğinde eventin defalarca tetiklendiğini farkedeceksiniz. Bunun sebebi pinin ark yapmasıdır, yani siz kabloyu değdirdiğinizde / butona bastığınızda oluşan kıvılcımlardır. Böyle durumlarda tek bir event oluşması için pin2'yi yapılandırdığınız kısıma şu satırı ekleyin:

pin2.DebounceTimeout = new TimeSpan(0, 0, 0, 0, 10);

 Artık 10ms içerisinde oluşan tüm arklar görmezden gelinecektir.

Tüm uygulama kodlarını aşağıda görebilirsiniz:

[C#] MainWindow.xaml.cs

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

namespace WinIoTGPIO
{
    public sealed partial class MainPage : Page
    {
        // GPIO Pinlerini belirle
        static GpioPin pin1, pin2;

        public MainPage()
        {
            this.InitializeComponent();

            // GPIO Denetleyicisini başlat
            GpioController gpio = GpioController.GetDefault();

            // Pinleri fiziksel GPIO pinlerine bağla
            pin1 = gpio.OpenPin(21);
            pin2 = gpio.OpenPin(22);

            // Pin1'i çıkış moduna al
            pin1.SetDriveMode(GpioPinDriveMode.Output);

            // Pin1'i aç
            pin1.Write(GpioPinValue.High);

            // Pin2'yi giriş moduna al
            pin2.SetDriveMode(GpioPinDriveMode.InputPullDown);

            // Pin2 ark korumasını ayarla
            pin2.DebounceTimeout = new TimeSpan(0, 0, 0, 0, 10);

            // Pin2'de değişim olduğunda tetiklenecek event handler'ı oluştur
            pin2.ValueChanged += Pin2_ValueChanged;
        }

        private void Pin2_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
        {
            if(args.Edge == GpioPinEdge.RisingEdge)
            {
                // High ise çalışacak kod
            }
            else
            {
                // Low ise çalışacak kod
            }
        }
    }
}

Ek Dosya: Belirtilmemiş.
Okunma Sayısı: 936

comments powered by Disqus
 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi