Netduino İle Pil Voltajı Ölçme

Volkan AKTAŞC#, Elektronik, Micro Framework, Netduino5 Yorum7 Mayıs 2013

ftdi_kabloNetduino üzerinde bulunan analog pinlerden yararlanarak bir kalem pilin voltajını ölçebiliriz. Bunun için netduino ile ölçülen voltaj değerini FTDI kablosunu kullanarak seri porttan bilgisayara göndereceğiz. FTDI kablosu USB’den seriye dönüşüm sağlamaktadır.  Bu kabloyu kullanarak usb port üzerinden bilgisayarda yaptığınız masaüstü uygulamalar ile netduinonun haberleşmesini sağlayabilirsiniz.

 

Kablonun bir yüzünde A tipi USB konnektör diğer yüzünde ise standart pinlere uyumlu 6 pinli konnektör bulunmaktadır.

ftdi_pinout

 

 

Örnek uygulamamızda UART protokolünü kullanarak iletişim kuracağız. Bunun için turuncu renkli kablo (TX), netduino’nun D0 nolu pinine (RX), sarı renkli kablo (RX) ise, netduino’nun D1 nolu pinine (TX) bağlanır. Siyah renkli kabloyu da (GND), netduino üzerindeki GND pinine bağlıyoruz. Ayrıca uygulamamızda windows form uygulaması üzerinden netduino’nun analog pinlerinden birine bağlı kalem pilin voltajını ölçeceğimiz için A0 pinine kalem pilin artı ucunu bağlıyoruz.
Kalem pilin – ucunu ise netduino üzerindeki GND pinine bağlıyoruz.

Netduino içerisine aşağıdaki kod satırlarını yazıyoruz:

using System;

using System.Threading;

using Microsoft.SPOT;

using Microsoft.SPOT.Hardware;

using SecretLabs.NETMF.Hardware;

using SecretLabs.NETMF.Hardware.Netduino;

using System.IO.Ports;

namespace voltajokuma_netduinokod

{

public class Program

{

static SerialPort port;

public static void Main()

{

AnalogInput A0 = new AnalogInput(Cpu.AnalogChannel.ANALOG_0);

port = new SerialPort(“COM1”, 9600, Parity.None, 8, StopBits.One);

port.Open();

double voltaj;

double deger;

byte[] bytes = new byte[1];

while (true)

{

voltaj = A0.Read() * 3.3;

if (voltaj > 0.1)

{

Debug.Print(voltaj.ToString(“f1”));

bytes = Encoding.UTF8.GetBytes(voltaj.ToString(“f1”));

port.Write(bytes, 0, bytes.Length);

}

Thread.Sleep(1000);

}

}

}

}

Kodumuzda

port = new SerialPort(“COM1”, 9600, Parity.None, 8, StopBits.One);

satırında port ismi ile tanımlamış olduğumuz seri port nesnesinin parametrelerini belirliyoruz.

Seri Port nesnesi

SerialPort(Port İsmi, Baud Rate, Parity Biti, Data Biti, Stop Biti)

Şeklinde kullanılır.

Baud Rate: Veri iletişim hızını belirtir. Hız değerleri saniyedeki bit sayısını ifade eder. Varsayılan değer 9600’dür.

Parity (Eşlik) Biti:  Gönderilen verinin hatalı olup olmadığını kontrol etmek amacıyla kullanılır. Alabileceği değerler şunlardır:

Data Biti: Veri uzunluğunu belirlemek için kullanılır. 5 ile 8 arasında bir değer alabilir. 8 değeri bir byte’ın uzunluğuna denk gelip hemen her türlü veri için kullanılabilmektedir.

Stop (Durma) Biti: Yeni bir veri gönderilmeden önce stop bitinin gönderilmesi gerekmektedir. Genellikle tek bitlik durma biti kullanılmaktadır.

byte[] bytes = new byte[1];

satırında seri porttan okuyacağımız verileri saklayacağımız byte dizisini tanımlıyoruz. Tek bir byte okuyarak üzerinde işlem gerçekleştireceğimiz için byte dizisini bir elemanlı olarak tanımlıyoruz.

Daha sonra while(true) şeklinde sürekli bir döngü kurarak

if (voltaj > 0.1)

okunan voltaj değeri 0.1 volt’dan büyükse (yani pil için ölçme işlemi yapıldıysa)

bytes = Encoding.UTF8.GetBytes(voltaj.ToString(“f1”));

port.Write(bytes, 0, bytes.Length);

voltaj değişkeni içerisinde saklanan verileri Encoding.UTF8.GetBytes metodu ile byte türüne dönüştürerek bytes isimli byte dizisi içerisinde saklıyor ve daha sonra Write metodu ile seri porta yazıyoruz. Write metodunun kullanımı aşağıdaki gibidir:

Write(buffer , offset, sayı)

Buffer: Seri porta yazılacak değerlerin saklandığı dizi değişkenini belirtir.

Offset: Verilerin dizinin hangi elemanından itibaren ekleneceğini belirtir. 0 değeri dizinin ilk elemanından itibaren ekleme yapılacağını belirtir.

Sayı: Kaç byte’lık veri yazılacağını belirtir.

Thread.Sleep(1000);

Satırı ile okuma işleminin 1000 ms (1 saniye) aralıklarla gerçekleştirilmesini sağlıyoruz.

Masaüstü uygulamamız için yeni bir C# windows form uygulaması açıyoruz.  Form tasarımı aşağıdaki gibi olacak:

pil_olcme_tasarım_izahlı1) label1
2) cmbCOMPort
3) btnPortAc
4) btnPortKapat
5) btnOku
6) timer1
7) serialPort1
8) lblVoltaj
9) progressBar1

 

Kodumuz ise aşağıdaki gibi olacak:

using System;

using System.ComponentModel;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

using System.Threading;

namespace voltaj_okuma_winform

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

byte[] degerler = new byte[1];

private void btnOku_Click(object sender, EventArgs e)

{

serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

}

void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)

{

CheckForIllegalCrossThreadCalls = false;

byte[] bytes = new byte[3];

if (serialPort1.BytesToRead > 0)

{

serialPort1.Read(bytes, 0, bytes.Length);

string deger=Encoding.UTF8.GetString(bytes);

lblVoltaj.Text = “Pil Voltajı = ” + deger +”V”;

progressBar1.Value = (int)(Convert.ToDouble(deger.ToString()));

Thread.Sleep(1000);

}

}

private void btnPortKapat_Click(object sender, EventArgs e)

{

if (serialPort1.IsOpen)

serialPort1.Close();

}

private void Form1_Load(object sender, EventArgs e)

{

foreach (string portname in SerialPort.GetPortNames())

cmbCOMPort.Items.Add(portname);

}

private void btnPortAc_Click(object sender, EventArgs e)

{

serialPort1.PortName = cmbCOMPort.Text;

if (!serialPort1.IsOpen)

serialPort1.Open();

}

}

}

Kodumuzda formun Load olayı içerisinde

foreach (string portname in SerialPort.GetPortNames())

cmbCOMPort.Items.Add(portname);

satırları ile foreach döngüsü içerisinde GetPortNames metodu ile bilgisayarda yüklü olan seri port isimlerini elde ederek comboBox içerisine ekliyoruz.

serialPort1.PortName = cmbCOMPort.Text;

if (!serialPort1.IsOpen)

serialPort1.Open();

Satırlarında comboBox içerisinde seçili olan port ismini PortName özelliğine aktarıyoruz. IsOpen özelliği portun açık olup olmadığını belirtir. Eğer açıksa geriye true değeri, açık değilse false değeri dönmektedir. Kodumuzda (!) operatörü ile bu işlemin tersini alarak, port açık değilse Open metodu ile portun açılmasını sağlıyoruz. Aynı işlemi portu kapatmak için de uygulayarak pert açıksa Close metodu ile portun kapatılmasını sağlıyoruz.

if (serialPort1.IsOpen)

serialPort1.Close();

satırlarında ise eğer seri port açıksa seri portun kapatılmasını sağlıyoruz.

Seri porttan değer okuma işlemini serialPort1_DataReceived metodu içerisinde yazıyoruz.

CheckForIllegalCrossThreadCalls = false;

Satırında aynı anda birden fazla thread yürütülürken oluşabilecek kilitlenmeleri engelliyoruz.

serialPort1.Read(bytes, 0, bytes.Length);

satırında Read metodu ile seri porttan veri okuyoruz. Okunan değeri

progressBar1.Value =          (int)(Convert.ToDouble(deger.ToString()));

Satırlarında progressBar’ın Value özelliğine atayarak, okunan voltaj değerinin progressBar değeri şeklinde gösterilmesini sağlıyoruz. Okunan voltaj değeri double türden olduğu için string türdeki değeri önce double’a dönüştürüyoruz. ProgressBar’ın Value özelliği int türünden değer aldığı için de okunan değeri int türüne dönüştürüyoruz.

Uygulamamızı çalıştırdığımızda herhangi bir voltaj değeri okunmadığında minimum voltaj değeri olan 0.1 V görüntülenecektir.

pil_olcme_bosta

 

 

 

 

Pili ölçtüğümüzde ise pilin voltaj değeri görüntülenecektir.

pil_olcme_dogru

Etiketler: , ,

Netduino İle Pil Voltajı Ölçme Hakkında Yapılan Yorumlar

  1. Akın Karagöz diyor ki:

    Merhaba Volkan bey. Peki, bu programla daha yüksek voltlu bir aygıtın ölüçümünü yapabilir miyiz? Örneğin bir cep telefonu adaptörünün. Yada bir araba aküsünün. Veya şöyle sorayım: En fazla kaç voltluk bir ölçüm yapabiliriz?

    • Volkan AKTAŞ diyor ki:

      En fazla 5V ölçüm yapabilirsiniz. Üzeri voltajlar kartınız yakacaktır. Daha yüksek voltajlar için harici bir devre yaparak ölçüm yapabilirsiniz.

  2. Furkan Biçer diyor ki:

    Netduino ile direnç ölçümü yapılabilirmi ?

  3. Furkan Biçer diyor ki:

    Ölçeceğim diren bir ldr araştırdım biraz en yüksek 600 ohm gibi bir direnç gösteriyor. netduino ile direnç ölçmeyi nasıl yapabilirim ?

Netduino İle Pil Voltajı Ölçme Hakkında Yorum Yaz

Sponsor Reklam Sponsor Reklam Sponsor Reklam Sponsor Reklam

Son Yorumlar

En çok Tıklananlar

Site İstatistikleri

Yandex.Metrica