Facebook RSS Feed
 

C# ile LEGO Mindstorms NXT

NXTÇocukluğumuzun keyifli oyuncakları Lego’lar, büyük – küçük demeden her yaşın ilgi odağı olmayı başarıyor. LEGO Mindstorms NXT serisi, robotlarla ilgilenenler için vazgeçilmez bir oyuncak (!) Aklınıza gelen prototipi yarım saat içinde gerçeğe çevirmenize imkan sunan set, ilk bakışta biraz pahalı gözükse de buna değiyor.

Başlangıç seviyesi için görsel programlama ile tek satır kod yazmadan kendi robotunuzu programlayabiliyorsunuz. İleri seviyelerde kendi yazılımınızla Bluetooth üzerinden Windows Mobile cep telefonunuzla yada bilgisayarınızla kontrol edebiliyorsunuz. Hatta tamamen açık kaynak işletim sistemini silip kendi sisteminizi kurabiliyorsunuz. Biz örneğimizde Visual Studio ile C# kullanarak, Bluetooth üzerinden kendi robotumuzu kontrol edeceğiz.

Gerekenler

  • LEGO Mindstorms NXT
  • Bluetooth denetleyicisi
  • .NET Framework 4.0
  • Microsoft Visual Studio 2010
  • NXT# DLL Dosyaları (Buradan İndirebilirsiniz)

Aşama 1: Bilgisayar ile NXT Bağlantısını Kuralım

NXT’mizin Bluetooth menüsünden visibility ayarını geçici olarak “visible” yapmamız gerekiyor. Bilgisayarımızın Bluetooth ayarlarından “add a device” ı seçip “Other” kategorisi içinde çıkan NXT robotumuzu ekliyoruz. Bağlantı için Passkey’i doğruladıktan sonra donanım ekleme penceresinde görünen COM8 ve COM9 adreslerini uygulamamızda bağlantı kurmak için kullanacağız. NXT’nin Bluetooth menüsündeki visibility ayarını “invisible” olarak değiştirebiliriz.

Aşama 2: Visual Studio için Gerekli DLL’ler ve Kontroller

Öncelikle Visual Studio’dan LEGOMindstormsNXT isimli bir Windows Forms Application oluşturalım. Daha sonra Toolbox’da alttan boş bir alana sağ tıklayıp Add Tab’ı seçelim ve başlığına “LEGO Mindstorms NXT” yazalım. Şimdi gerekenler başlığı altından indirdiğiniz DLL’leri bir klasöre kopyalayın. Oluşturduğumuz LEGO Mindstorms NXT başlığının altına sağ tıklayarak Choose Items’ı seçin. .NET Framework Components sekmesinden Browse’a tıklayın ve kopyaladığınız DLL’lerden Bram.NXTSharp’ı seçin, pencereyi onaylarayak kapatın. Toolbox’ımıza NXT ile başlayan 11 adet kontrol gelmiş olmalı.

Aşama 3: C# ile Altyapıyı Oluşturma

Robotumuzla bağlantı kurabilmek için NXTBrick kontrolünü formun üzerine sürükleyelim. Daha sonra 3 tane NXTMotor kontrolü ekleyelim. Ardından NXTLightSensor, NXTSoundSensor, NXTPressureSensor ve NXTSonar’ kontrollerini de ekledik mi temel malzemelerimizi hazırlamış oluyoruz.

NXT App

Şimdi, Visual Studio’nun alt kısmından NXTBrick1’i tıklayalım ve properties penceresinden gerekli ayarlarını yapalım:

Özellik Değer
AutoPoll True
COMPortName COM8
MotorA nxtMotor1
MotorB nxtMotor2
MotorC nxtMotor3
Sensor1 nxtPressureSensor1
Sensor2 nxtSoundSensor1
Sensor3 nxtLightSensor1
Sensor4 nxtSonar1

Yine alt bölmeden 3 motorun ve 4 sensörün özelliklerine gelip LEGO Brick’inizde bağlı oldukları portları seçin. Her birinin Brick özelliğinden nxtBrick1’i de seçin. Uygulama sırasında motorlar LEGO tasarımınıza göre ters dönerse, motorların özelliklerinden Flip özelliğini True olarak değiştirebilirsiniz. Sensörlerdeki AutoPoll özelliği, saniyenin 1000’de kaçında sensör bilgisinin uygulamanıza rapor edileceğini belirtir. Uygulama hassasiyetine göre bu rakamı küçültebilirsiniz. Mesela çizgi izleyen robot yapmak istediğinizde light sensor için 100 değeri yüksek gelecektir.

İlk bağlantımızı kurmak için forma btnBaglan ve btnBaglantiyiKes adlarında 2 buton ekleyelim. Bağlan butonunun Click eventine gelip aşağıdaki kodu yazalım:

private void btnBaglan_Click(object sender, EventArgs e)
{
    try
    {
        if (!nxtBrick1.IsConnected) nxtBrick1.Connect();
    }
    catch (Exception ex)
    {
            if (MessageBox.Show(ex.Message, "Bağlantı Hatası.", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1) == DialogResult.Retry)
            {
                btnBaglan.PerformClick();
            }
    }
}

Bağlantıyı Kes butonunun click eventine de istendiğinde motorları serbest bırakması ve bağlantıyı kesmesi için gerekli satırı ekleyelim:

private void btnBaglantiyiKes_Click(object sender, EventArgs e)
{
    if (nxtBrick1.IsConnected)
    {
        nxtMotor1.Coast();
        nxtMotor2.Coast();
        nxtMotor3.Coast();
        nxtBrick1.Disconnect();
    }
}

Formun FormClosing eventine uygulama kapanırken motorları serbest bırakması ve bağlantıyı kesmesi için aşağıdaki  kodu ekleyeceğiz:

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    btnBaglantiyiKes.PerformClick();
}

Aşama 4: İlk Hareket

Artık robotumuza ilk komutları vermenin zamanı geldi! Formumuza NXTTankControl ve NXTTankDrive Kontrollerini ekleyelim. Visual Studio’nun alt panelinden nxtTankDrive1’i tıklayalım ve properties penceresinden gerekli ayarları yapalım:

Özellik Değer
Brick nxtBrick1
Motor1 nxtMotor2
Motor2 nxtMotor3

Form üzerinden nxtTankControl’e gelip properties panelinden TankDrive özelliğini nxtTankDrive1 olarak değiştirelim. Şimdi uygulamamızı çalıştırabiliriz. …ve robotumuz ilk komutlarını alıyor!

Bağlan komutu hata döndürürse nxtBrick1’in COMPortName özelliğini değiştirin yada Bluetooth ayarlarınızı kontrol edin.

Aşama 5: Sensörler

Sensörler olmadan yaptığımız makine yalnızca bir uzaktan kumandalı araba gibidir. Yaptığımızın robot olması için sensörlerden gelen veriyi işlememiz gerekir. Mindstorms NXT kitinde bulunan 4 sensör ile dokunma, ses, ışık ve 0-255 cm arası uzaklık değerlerini alabiliriz. 2009 yılında çıkan NXT 2.0 ile renk değerlerini de görebilmemiz mümkün. Şimdi elimizdeki 4 sensörün kullanımına bakalım:

Formumuza 4 tane label ekleyelim. İsimleri lblPressure, lblSound, lblLight ve lblSonar olsun. Visual Studio’nun alt kısmındaki panelden sensörlere tek tek tıklayarak properties pencerelerine gelelim. Oradan Events ikonunu tıklayarak ValueChanged eventlerine ilgili kodları ekleyelim:

private void nxtSoundSensor1_ValueChanged(Bram.NxtSharp.NxtSensor sensor)
{
    lblSound.Text = "%" + nxtSoundSensor1.Value.ToString();
}

private void nxtLightSensor1_ValueChanged(Bram.NxtSharp.NxtSensor sensor)
{
    lblLight.Text = "%" + nxtLightSensor1.Value.ToString();
}

private void nxtPressureSensor1_ValueChanged(Bram.NxtSharp.NxtSensor sensor)
{
    lblPressure.Text = nxtPressureSensor1.IsPressed.ToString();
}

private void nxtSonar1_ValueChanged(Bram.NxtSharp.NxtSensor sensor)
{
    lblSonar.Text = nxtSonar1.RawValue.ToString() + " cm";
}

Kullanacağınız sensörlerin AutoPoll özelliğinin true olması gerekir. nxtLightSensor1’in Active özelliği, ışığını yakıp yakmayacağını belirler. Çizgi izleyen robot tarzı uygulamalarda true olarak, ışık seviyesini gösteren uygulamalarda ise false olarak belirlenmelidir.

Sensör değerleri değiştiğinde uygulamanın hata vermemesi için formun load eventine
”CheckForIllegalCrossThreadCalls = false;“ kodunu ekleyelim:

private void Form1_Load(object sender, EventArgs e)
{
    CheckForIllegalCrossThreadCalls = false;
}

Uygulamamızı çalıştırdığımızda sensör değerlerini göreceğiz.

Aşama 6: Motorlarda Detaylı Kontrol

NXT Kiti servo motor kullanır. Servo motorlar istenilen derece ve hızda dönüş yapabilirler. Aynı zamanda NXT motorları kaç derece döndüklerini de rapor eder. Bir engelle karşılaşırsa, belirlediğimiz dereceye kadar gücünü arttırarak dönmeye devam eder. Motorların 3 ana fonksiyonu mevcut. Bunlar:

  • nxtMotor.Turn(int speed, int degrees); //İstenilen hızda ve derecede dönüş yapar.
  • nxtMotor.Coast(); //Motoru serbest bırakır.
  • nxtMotor.Brake(); //Motoru durdurur, hareket etmesini engeller.

Brake modunda motorlar sürekli enerji tükettiğinden, gerekmedikçe Brake modunda tutmamakda fayda var. Turn komutundaki degrees değişkenine 0 değeri verirseniz, Motor Coast yada Brake komutu alana kadar dönmeye devam edecektir.

Örnek uygulamayı, DLL dosyalarını ve kaynak kodlarını buradan indirebilirsiniz.




 
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