Facebook RSS Feed
 

.NET Micro Framework: USB Gamepad Kullanımı

-.NET MF ile geliştirdiğimiz sistemlere birkaç adımda gamepad entegre ederek kullanım kolaylığı sağlamamız mümkündür. Örneğimizde USB portuna bağladığımız bir gamepadin analog ve buton değerlerini yakalayıp debug ekranına yazdıracağız. Bu uygulamayı servo motor ve step motor kontrolünü anlattığım uygulamalarla birleştirerek, joystick ile robot kolları ve birçok mekanizmayı kontrol edebilirsiniz.


Öngereksinimler

Uygulamayı çalıştıracağınız mikrodenetleyicinin .NET Micro Framework 4.0 yada 4.1 desteklemesi ve USB Host özelliğinin bulunması gerekiyor. Örnek kodları GHI Electronics'in USB Host destekleyen cihazlarında çalıştırabilirsiniz. (USBizi 144, EMX, Embedded Master ve FEZ).

Uygulama Kodları

Visual Studio 2010 ile yeni bir .NET Micro Framework 4.0 Console Application oluşturduktan sonra, proje referanslarına GHIElectronics.NETMF.USBHost.dll, GHIElectronics.NETMF.System.dll ve GHIElectronics.NETMF.Hardware.USBizi.dll kütüpanelerini ekleyelim. (Mikrodenetleyiciniz .NET MF 4.0 ile çalışıyorsa, proje özelliklerinden Target Framework ayarını 4.0 olarak değiştirin). Sonrasında Program.cs dosyasına aşağıda açıkladığım kodları yazalım.

using System;
using System.Threading;
using Microsoft.SPOT;
using GHIElectronics.NETMF.USBHost;
 
namespace MFGamepad
{
    public class Program
    {
        static USBH_Joystick joystick;
 
        public static void Main()
        {
            //USB Portuna cihaz bağlandığında fırlayacak eventi oluşturalım:
            USBHostController.DeviceConnectedEvent 
                += new USBH_DeviceConnectionEventHandler(USBHostController_DeviceConnectedEvent);
 
            //Main Thread'i uyutalım:
            Thread.Sleep(Timeout.Infinite);
        }
 
        //USB Cihaz bağlanma eventi
        static void USBHostController_DeviceConnectedEvent(USBH_Device device)
        {
            //Bağlanan cihaz joystick ise
            if (device.TYPE == USBH_DeviceType.Joystick)
            {
                //Joystick bağlantısının olşutuğunu Immediate Window'a yazdıralım:
                Debug.Print("Joystick Bağlandı.");
 
                //Joystick cihazı instance'ı oluşturalım:
                joystick = new USBH_Joystick(device);
 
                //Joystick durumunu sorgulayacak thread'in önceliğini ayarlayalım:
                joystick.InternalThreadPriority = ThreadPriority.Normal;
                //Highest, daha sık güncelleme yapar, fakat diğer kodlara ayrılan işlemci zamanını
                //azaltır. Lowest ise daha düşük sıklıkta güncelleme yapar ve diğer kodlara
                //daha çok işlemci zamanı düşer.
 
                //Sol Analog'da hareket algılandığında fırlayacak event:
                joystick.JoystickXYMove 
                    += new USBH_JoystickEventHandler(joystick_JoystickXYMove);
 
                //Sağ Analog'da hareket algılandığında fırlayacak event:
                joystick.JoystickXY2Move 
                    += new USBH_JoystickEventHandler(joystick_JoystickXY2Move);
 
                //Point of View'da değişiklik olduğunda fırlayacak event:
                joystick.HatSwitchPress 
                    += new USBH_JoystickEventHandler(joystick_HatSwitchPress);
 
                //Herhangi bir butona basıldığında fırlayacak event:
                joystick.JoystickButtonDown 
                    += new USBH_JoystickEventHandler(joystick_JoystickButtonDown);
 
                //Herhangi bir buton serbest bırakıldığında fırlayacak event:
                joystick.JoystickButtonUp 
                    += new USBH_JoystickEventHandler(joystick_JoystickButtonUp);
            }
        }
 
        //Sol Analog'da hareket algılandığında fırlayacak event:
        static void joystick_JoystickXYMove(USBH_Joystick sender, USBH_JoystickEventArgs args)
        {
            Debug.Print("Sol Analog: " + sender.Cursor.X + ", " + sender.Cursor.Y);
        }
 
        //Sağ Analog'da hareket algılandığında fırlayacak event:
        static void joystick_JoystickXY2Move(USBH_Joystick sender, USBH_JoystickEventArgs args)
        {
            Debug.Print("Sağ Analog: " + sender.Cursor2.X + ", " + sender.Cursor2.Y);
        }
 
        //Point of View'da değişiklik olduğunda fırlayacak event:
        static void joystick_HatSwitchPress(USBH_Joystick sender, USBH_JoystickEventArgs args)
        {
            Debug.Print("POV: " + sender.HatSwitch.ToString());
        }
 
        //Herhangi bir butona basıldığında fırlayacak event:
        static void joystick_JoystickButtonDown(USBH_Joystick sender, USBH_JoystickEventArgs args)
        {
            Debug.Print("Buton Basıldı: " + args.ChangedButton);
        }
 
        //Herhangi bir buton serbest bırakıldığında fırlayacak event:
        static void joystick_JoystickButtonUp(USBH_Joystick sender, USBH_JoystickEventArgs args)
        {
            Debug.Print("Buton Bırakıldı: " + args.ChangedButton);
        }
    }
}

Debug Zamanı

Uygulamayı çalıştırıp mikrodenetleyicinizin USB portuna gamepad bağladığınızda, Visual Studio Immediate Window'da aşağıdaki gibi değerler görünecektir.

Joystick Bağlandı.
Sol Analog: 2, 2
Sağ Analog: -3, 2
Sol Analog: 106, -3
Sağ Analog: 54, -388
POV: 0
POV: 8
POV: 2
POV: 6
Buton Basıldı: 0
Buton Basıldı: 1
Buton Bırakıldı: 0
Buton Bırakıldı: 1
Buton Basıldı: 8
Buton Bırakıldı: 8
Buton Basıldı: 9
Buton Bırakıldı: 9

Analog değerleri varsayılan olarak -512 ile 512 arasında değişir. Bu çözünürlüğü değiştirmek için joystick.SetCursorBounds(); komutunu kullanabilirsiniz. POV ise boştayken 8, yukarıya basıldığında 0 ve saat yönüne doğru 45 derecede 1 artacak şekilde değer döndürecektir.




 
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