Facebook RSS Feed
 

C#: Windows 7 Sensor Development Kit

Sensörler, bilgisayarların dış dünyayı algılamasında birer duyu organı görevi görür. Çeşitli sensörleri uygulamalarımıza entegre ederek kullanıcı deneyimini üst noktalara taşımamız daha da mümkün olur. Örneğin, ışık sensörü kullanarak uygulama arayüzünü dinamik olarak ortam şartlarına göre optimize edebiliriz. Windows 7'nin uygulama geliştirmeyi kolaylaştıran özelliklerinden biri de sensör ve konum belirleme cihazlarına erişim için standart bir altyapı sunmasıdır. Sensor & Location Platform ile birçok sensöre native kod tarafından ulaşılabilir. .NET Framework geliştiricileri ise bu özelliklere Windows API Code Pack aracılığıyla ulaşabilir.

Sensörler fiziksel cihazlar oldukları için, uygulama geliştirirken bilgisayarımızda bu sensörlerin bulunması yada bir sensör geliştirme kitine sahip olmamız gerekir. İlerleyen satırlarda Freescale tarafından geliştirilen Windows 7 Sensor Development Kit'i inceleyeceğiz ve bu kiti kullanarak ışık ve ivme verisine ulaşmayı ele alacağız.

Windows 7 Sensor Development Kit

Freescale'in ürettiği sensör geliştirme kartı ile sensör verilerine ulaşmanın yanısıra, üzerindeki mikrodenetleyiciyi programlayarak da çeşitli uygulamalar geliştirilebiliyor. Kartın üzerinde USB bağlantı noktası, kızılötesi verici, 3 boyutlu analog ivme sensörü, buzzer, 3.6V li-ion batarya, -lehimlenmemiş- SD kart yuvası, açma / kapama düğmesi, 8 adet dokunmatik buton, 5x16 LED dizisi, şarj gösterge LEDi, JTAG konnektörü ve mikrodenetleyicinin giriş / çıkış pinlerine bağlı 60 adet pin (header bağlantı noktası) bulunuyor.

-

Kurulum diskindeki sürücüleri yüklediğimizde, cihazı aygıt yöneticisinde Sensors başlığı altında görebiliyoruz.

-

Sensörleri kullanıma açmak için Windows denetim masasından Konum ve Diğer Sensörler (Location and Other Sensors) paneline ulaşıp Sensor Development Kit'in sağındaki checkbox'ı seçmemiz gerekiyor.

-

Bu aşamadan sonra Sensor Development Kit'imiz Windows uygulamalarının kullanımına açılacaktır.

Uygulama Geliştirmek

.NET Framework kullanarak sensör uygulaması geliştirmek için Windows API Code Pack'i indirmemiz gerekiyor. Son sürümünü http://archive.msdn.microsoft.com/WindowsAPICodePack adresinden indirip, arşiv içerisindeki
"Microsoft.WindowsAPICodePack.Sensors.dll" dosyasını daha sonra değiştirmeyeceğiniz bir konuma kaydedin. Visual Studio'dan bir C# uygulaması oluşturup proje referansları arasına az önce kaydettiğiniz dosyayı ekleyin.

Adım 1: Işık Sensörü (Ambient Light Sensor) Kullanımı

İlk adımda ışık sensörüne ulaşan bir uygulama geliştireceğiz. Uygulamamız ışık sensörünün adını, durumunu, anlık değerini (lux) ve raporlama aralığını (1/1000 sn) 4 farklı label üzerinde gösterecek.

-

Bir cihaz üzerinde aynı sensörden birden fazla bulunabilir. Bu nedenle Sensor Manager'ı kullanarak sisteme bağlı istenilen tipdeki sensörleri listeleyip, ID'leri ile bu sensörlere ulaşacağız. İstenilen sensörlerin Data Report Changed eventlerini oluşturup ölçümledikleri değerlere örnekteki gibi kolaylıkla ulaşabiliriz.

[C#]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.WindowsAPICodePack;
using Microsoft.WindowsAPICodePack.Sensors;
 
namespace Windows7SensorDevelopmentKit
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        SensorList<AmbientLightSensor> ambientLightSensorList;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // Ambient light sensörlerini listele:
            ambientLightSensorList = SensorManager.GetSensorsByTypeId<AmbientLightSensor>();
 
            // Listelenen ilk ambient light sensöründen veri alındığında tetiklenecek event:
            ambientLightSensorList[0].DataReportChanged
                += new DataReportChangedEventHandler(ALS_DataReportChanged);
        }
 
        void ALS_DataReportChanged(Sensor sender, EventArgs e)
        {
            // Non-UI Thread'den gelen rapor verisine göre UI güncelleyecek delegate'i oluştur:
            BeginInvoke(new MethodInvoker(delegate { UpdateALSValues(); }));
        }
 
        private void UpdateALSValues()
        {
            // Sensör ismi:
            lblALSFriendlyName.Text = "Friendly Name: " 
                + ambientLightSensorList[0].FriendlyName.ToString();
 
            // Sensör durumu:
            lblALSState.Text = "State: " 
                + ambientLightSensorList[0].State.ToString();
 
            // Sensör değeri:
            lblALSIntensity.Text = "Luminous Intensity: " 
                + ambientLightSensorList[0].CurrentLuminousIntensity.Intensity.ToString();
 
            // Sensörün raporlama zaman aralığı (1/1000 saniye):
            lblALSReportInterval.Text = "Report Interval: " 
                + ambientLightSensorList[0].ReportInterval.ToString();
        }
    }
}

Uygulamayı çalıştırdığımızda saniyede 10 defa ışık sensörünün ölçümlediği değer uygulamamızda görüntülenecek.

Adım 2: 3D İvme Sensörü (3D Accelerometer Sensor) Kullanımı

İvme sensörleri, X, Y ve Z eksenlerine uygulanan yerçekimi değerini ölçer ve raporlar. Sensörün özelliğine ve yapılandırılmasına göre 2g, 4g, 8, yada 16g gibi ölçüm kapasitelerine sahiptirler.  Her bir eksene o an ne kadar yerçekimi uygulanıyorsa, anlık değeri de o derecede değişir. 1g değerinin yerçekimine eşit olduğu düşünülürse, ufak bir hesaplama ile cihazın X ve Y eksenlerinin yere paralellik durumu da elde edilebilir.

-

Örnek uygulamamızda, yukarıda yazdıığımız kodlara ekleme yaparak ivme sensörünün adını, durumunu, 3 eksendeki yerçekimi değerini ve raporlama aralığını 6 farklı label üzerinde göstereceğiz.

[C#]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.WindowsAPICodePack;
using Microsoft.WindowsAPICodePack.Sensors;
 
namespace Windows7SensorDevelopmentKit
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        SensorList<AmbientLightSensor> ambientLightSensorList;
        SensorList<Accelerometer3D> accelerometer3DSensorList;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // Ambient light sensörlerini listele:
            ambientLightSensorList = SensorManager.GetSensorsByTypeId<AmbientLightSensor>();
 
            // Listelenen ilk ambient light sensöründen veri alındığında tetiklenecek event:
            ambientLightSensorList[0].DataReportChanged
                += new DataReportChangedEventHandler(ALS_DataReportChanged);
 
            // 3D Accelerometer sensörlerini listele:
            accelerometer3DSensorList = SensorManager.GetSensorsByTypeId<Accelerometer3D>();
 
            // Listelenen ilk 3D Accelerometer sensöründen veri alındığında tetiklenecek event:
            accelerometer3DSensorList[0].DataReportChanged
                += new DataReportChangedEventHandler(Accel_DataReportChanged);
        }
 
        #region Ambient Light Sensor
        void ALS_DataReportChanged(Sensor sender, EventArgs e)
        {
            // Non-UI Thread'den gelen rapor verisine göre UI güncelleyecek delegate'i oluştur:
            BeginInvoke(new MethodInvoker(delegate { UpdateALSValues(); }));
        }
 
        private void UpdateALSValues()
        {
            // Sensör ismi:
            lblALSFriendlyName.Text = "Friendly Name: " 
                + ambientLightSensorList[0].FriendlyName.ToString();
 
            // Sensör durumu:
            lblALSState.Text = "State: " 
                + ambientLightSensorList[0].State.ToString();
 
            // Sensör değeri:
            lblALSIntensity.Text = "Luminous Intensity: " 
                + ambientLightSensorList[0].CurrentLuminousIntensity.Intensity.ToString();
 
            // Sensörün raporlama zaman aralığı (1/1000 saniye):
            lblALSReportInterval.Text = "Report Interval: " 
                + ambientLightSensorList[0].ReportInterval.ToString();
        }
        #endregion
 
        #region 3D Accelerometer Sensor
        void Accel_DataReportChanged(Sensor sender, EventArgs e)
        {
            // Non-UI Thread'den gelen rapor verisine göre UI güncelleyecek delegate'i oluştur:
            BeginInvoke(new MethodInvoker(delegate { UpdateAccelValues(); }));
        }
 
        private void UpdateAccelValues()
        {
            // Sensör ismi:
            lblAccelFriendlyName.Text = "Friendly Name: "
                + accelerometer3DSensorList[0].FriendlyName.ToString();
 
            // Sensör durumu:
            lblAxisState.Text = "State: "
                + accelerometer3DSensorList[0].State.ToString();
 
            // Sensörün X ekseni değeri:
            lblAxisX.Text = "Axis X: "
                + accelerometer3DSensorList[0].CurrentAcceleration[AccelerationAxis.XAxis].ToString();
 
            // Sensörün Y ekseni değeri:
            lblAxisY.Text = "Axis Y: "
                + accelerometer3DSensorList[0].CurrentAcceleration[AccelerationAxis.YAxis].ToString();
 
            // Sensörün Z ekseni değeri:
            lblAccelZ.Text = "Axis Z: "
                + accelerometer3DSensorList[0].CurrentAcceleration[AccelerationAxis.ZAxis].ToString();
 
            // Sensörün raporlama zaman aralığı (1/1000 saniye):
            lblAccelReportInterval.Text = "Report Interval: "
                + accelerometer3DSensorList[0].ReportInterval.ToString();
        }
        #endregion
    }
}

Uygulamanın son halini çalıştırdığımızda, X, Y ve Z eksenlerine uygulanan yerçekimi kuvvetini göreceğiz.

Uygulama 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