Makale Özeti

.NET Gadgeteer, zaten .NET Micro Framework ile kolaylaştırılmış mikrodenetleyici programlamanın olabildiğince basite indirgenmiş, görselleştirilmiş hali. Öyle ki, sıfır elektronik bilgisi olan bir .NET programcısının hayalindeki elektronik cihazı çok kısa bir sürede geliştirmesine olanak sağlıyor...

Makale

.NET Gadgeteer ile Başlangıç

.NET Gadgeteer, zaten .NET Micro Framework ile kolaylaştırılmış mikrodenetleyici programlamanın olabildiğince basite indirgenmiş, görselleştirilmiş hali. Öyle ki, sıfır elektronik bilgisi olan bir .NET programcısının hayalindeki elektronik cihazı çok kısa bir sürede geliştirmesine olanak sağlıyor.

Bir anakart (mikrodenetleyici modülü) ve isteğe bağlı buton, sensör gibi cihazları -ters takılamayacak- hazır kablolarla birbirine bağlayarak elektronik kitinizi dilediğiniz gibi oluşturuyorsunuz. Daha sonra, Visual Studio üzerinden görsel olarak neyi nereye bağladığınızı seçiyorsunuz. İşte bu kadar, hazırsınız!

Öngereksinimler

.NET Gadgeteer sistemi, şu an için simulatör üzerinde çalışmıyor. Uygulamanızı test etmek ve hayata geçirmek için fiziksel bir geliştirme kiti satın almanız gerekli.

Yazılımsal olarak ise, Visual Studio 2010 (Express dahil), .NET Micro Framework SDK'sı ve .NET Gadgeteer kitinizin SDK'sına sahip olmanız gerekiyor.

Başlayalım!

Öngereksinimlerde her şey yolundaysa, Visual Studio'nuzu açıp File > New Project ile yola koyulalım. .NET Gadgeteer'i yükledikten sonra ilk kez Visual Studio'nuzu açıyorsanız, Installed Templates bölümüne "Gadgeteer" kategorisinin eklendiğini göreceksiniz.

-

Bize sunulan .NET Gadgeteer Application seçeneği ile projemizi oluşturalım. Bu aşamadan sonra Visual Studio penceresi aşağıdaki gibi bir şekil alacak.

-

Önceden Micro Framework ile çalıştıysanız gözünüze ilk çarpacak olan şey, çok büyük olasılıkla görselliğin eklenmiş olması olacak. Yani, sağ üstteki Toolbox'dan gerekli donanımsal bileşenleri ortadaki Designer penceresine sürükleyerek projemize eklemiş oluyoruz. Toolbox içerisinde buton, kamera, renkli dokunmatik LCD ekran, ethernet bağlantısı, joystick, RGB LED, potansiyometre, SD kart, USB host, USB device, USB seri port ve WiFi modül bileşenleri bulunuyor. Bu parçalar üretici firmaya göre listelenmiş. Örneğin, az önce saydıklarım GHI Electronics'in Kasım 2011 itibariyle ürettiği kitler. Diğer marka ve modeller de güncellemelerle bu listedeki yerini alacaktır.

Ortadaki Designer penceresinde gördüğümüz, FEZ Spider anakart modeli. Üzerindeki 1'den 14'e kadar numaralandırılmış soketler, Toolbox'daki kitlerle bağlantı sağlamamız için yerleştirilmiş. Mikrodenetleyicilerin yapısı gereği her bir soketin kendisine has özelliği bulunuyor. Örneğin, potansiyometre modülünü kullanabilmemiz için mikrodenetleyicinin analog giriş özelliği bulunan pinleriyle bağlantı sağlamamız gerekir. Yani her istediğimiz cihazı istediğimiz yuvaya bağlayamıyoruz. (Panik yok, neyin nereye bağlanabileceğini de Gadgeteer bize gösteriyor.)

Ekranın sol altındaki Gadgeteer Model Explorer araç kutusu, cihazın üzerindeki soketleri ve bunlara eklenen bileşenlerin listesini gösterecek. Designer penceresinden kod görünümüne geçtiğimizde, modüllerin bağlantılarını görmemiz için düşünülmüş bir yenilik...

Bu görünüm üzerinde yeteri kadar durduktan sonra, artık bileşen eklemenin vaktidir. Elimizde 2 düğme (Button), 1 de RGB LED (MulticolorLed) olduğunu varsayalım. Toolbox'dan bu kontrolleri Designer penceresine sürükleyerek projemize ekleyelim.

-

Bileşenleri Designer penceresine sürükledikçe, bunlara otomatik isim verilecek. Bu isimler (button, button1 ve led) aracılığıyla kod penceresinden direkt olarak cihazlara ulaşabileceğiz.

Bir önceki aşamada sözünü ettiğim, cihazların her pine bağlanamaması da bu aşamada çözülüyor. Ortadaki buton1 bileşeninin soketine tıkladığımızda imleç şekil değiştiriyor ve anakart üzerinde bağlantı yapabileceğimiz soketler yeşil renk alıyor. Bunlardan istediğimiz birine tıklayarak bağlantıyı yapmış oluyoruz. Elimizdeki fiziksel cihaz üzerinde de aynı bağlantıyı yapmamız gerekiyor.

-

Cihazları tek tek bağladığımızda, yukarıdaki gibi bir görüntü elde edeceğiz. Bu aşamada tüm cihazlarımızı anakarta bağlamış olduk. (Bunu da yapmaya üşenen arkadaşlar için, boş bir alana sağ tık > Connect all modules seçeneği, tüm parçaları uygun soketlere otomatik olarak bağlıyor.) Biz bağlama işlemini yaparken, Visual Studio'da arka planda her bir modülü yapılandırıyor ve "Program.generated.cs" dosyasına gerekli kodları ekliyor. Şu ana kadar yaptığımız değişiklikleri yansıtan yapılandırma kodu aşağıdaki gibi oluştu:

[C#] Program.generated.cs

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by the Gadgeteer Designer.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
 
using Gadgeteer;
using GTM = Gadgeteer.Modules;
 
namespace GadgeteerApp1
{
    public partial class Program : Gadgeteer.Program
    {
        // GTM.Module defintions
        Gadgeteer.Modules.GHIElectronics.Button button;
        Gadgeteer.Modules.GHIElectronics.Button button1;
        Gadgeteer.Modules.GHIElectronics.MulticolorLed led;
 
        public static void Main()
        {
            //Important to initialize the Mainboard first
            Mainboard = new GHIElectronics.Gadgeteer.FEZSpider();
 
            Program program = new Program();
            program.InitializeModules();
            program.ProgramStarted();
            program.Run(); // Starts Dispatcher
        }
 
        private void InitializeModules()
        {   
            // Initialize GTM.Modules and event handlers here.		
            button = new GTM.GHIElectronics.Button(5);
		
            button1 = new GTM.GHIElectronics.Button(6);
		
            led = new GTM.GHIElectronics.MulticolorLed(11);
        }
    }
}

Özetle; önce modüller oluşturuldu, sonrasında ise türlerine göre birer instance'ları alınarak kullanıma hazır hale getirildi.

Eklediğimiz bileşenlere erişmek için klasik .NET Micro Framework uygulamalarında olduğu gibi Program.cs dosyasını kullanacağız. Bu dosya, uygulamanın kullanıcı kodunun başladığı yerdir. Program.cs dosyası ilk açıldığında aşağıdaki gibi bir içerikle karşımıza çıkıyor:

[C#] Program.cs

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;
 
using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteer.Modules.GHIElectronics;
 
namespace GadgeteerApp1
{
    public partial class Program
    {
        void ProgramStarted()
        {
            /******************************************************************************************
            Access modules defined in the designer by typing their name:                            
            
            e.g.  button
                  camera1
 
            Initialize event handlers here.
            e.g. button.ButtonPressed += new GTM.MSR.Button.ButtonEventHandler(button_ButtonPressed);
            ***************************************************************************************** */
 
            // Do one-time tasks here
            Debug.Print("Program Started");
        }
    }
}

Debug.Print metodunun hemen altına uygulama kodlarımızı yazabiliriz. Basit bir uygulama olarak, bir butona basınca LED'i yakan, öbürüne basınca söndüren kod blokları aşağıdaki gibi olacak:

[C#] Program.cs

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;
 
using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteer.Modules.GHIElectronics;
 
namespace GadgeteerApp1
{
    public partial class Program
    {
        void ProgramStarted()
        {
            // Do one-time tasks here
            Debug.Print("Program Started");
 
            button.ButtonPressed += new Button.ButtonEventHandler(button_ButtonPressed);
            button1.ButtonPressed += new Button.ButtonEventHandler(button1_ButtonPressed);
        }
 
        void button_ButtonPressed(Button sender, Button.ButtonState state)
        {
            led.TurnWhite(); // LED'i beyaz renkte yakar.
        }
 
        void button1_ButtonPressed(Button sender, Button.ButtonState state)
        {
            led.TurnOff(); // LED'i kapatır.
        }
    }
}

Önce butonların ButtonPressed eventlerini oluşturduk. Fiziksel olarak butonlara basıldığında belirlediğimiz eventler tetiklenecek. (Masaüstü uygulamalarında olduğu gibi.) led.TurnWhite metodu ile bağladığımız RGB LED'i beyaz renkte yakmış olacağız. led.TurnOff metodu ile de söndürmüş olacağız.

Eğer elinizde FEZ Spider kiti bulunuyorsa, USB portundan bilgisayarınıza bağlayarak ve F5 tuşuna basarak fiziksel cihaz üzerinde deneme yapabilirsiniz.

Umut Erkal
www.uerkal.com | @uerkal