5 Haziran 2015 Cuma

Arduino Analog Pot Değerini C# Arayüzde Görüntüleme (Arduino - Pot Progress bar with C# interface)

    Öncelikle merhaba arkadaşlar yine bir Arduino C# haberleşmesini temel alan uygulama ile karşınızdayım.
    Bu uygulamada Arduino MEGA 2560 R3 ve Potansiyometre ( analog input için ) kullanılarak analog değerler alınmış ve C# üzerinde basit bir arayüz oluşturularak bu değerler görüntülenmiştir ve okunan analog değere göre arayüz üzerindeki progressbar ile de görsel olarak gösterilmiştir. C# üzerinde iki adet buton , iki adet textbox, progressbar, 3 adet label, timer kullanılmıştır. Resimlerde de gördüğünüz üzere arayüz üzerinde yer alan "Serial Port" kısmına Arduino'nuzun bağlı olduğu bağlantı noktasını girip, bağlan butonuna bastığınızda değerler okunup "Pot" kısmında görüntülenip ve buna bağlı olarak progressbar üzerinde görüntülenmektedir. Progress bar 0-1023 olarak ayarlanmıştır.



  Potansiyometre Arduino bağlantısı;



  
Bu uygulamanın tüm dosyalarına ulaşmak için buraya tıklayın.

Arduino Kodları;

//writed by ercancag
int potpin=A0;
int val=0;
char x;

void setup(){
  
Serial.begin(9600);
}
void loop(){
  if(Serial.available()>0)
  x=Serial.read();
  if(x=='a')
  {
    val = analogRead(potpin); 
    Serial.println(val);
    delay(100);
  } 

}


C# Kodları;

//writed by ercancag
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        SerialPort serialport;
        public Form1()
        {
            InitializeComponent();
            serialport = new SerialPort();
            serialport.BaudRate = 9600;
        }
        private void Form1_Load(object sender, EventArgs e) { }

        //Bağlan Butonu
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();
            try
            {
                serialport.PortName = textBox1.Text;
                if (!serialport.IsOpen)
                    serialport.Open();
            }
            catch
            {
                MessageBox.Show("Seri Port Hatası!");
            }
        } 
        //Timer1 Tick
        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                serialport.Write("a");
                int receiveddata = Convert.ToInt16(serialport.ReadExisting());
                textBox2.Text = receiveddata.ToString();
                progressBar1.Value = Convert.ToInt16(textBox2.Text);
                System.Threading.Thread.Sleep(100);               
            }
            catch (Exception ex){}
        }
        //Durdur Butonu
        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            serialport.Close();
            
        }              
    }

}


ERCAN ÇAĞLAYAN CÜ-EEM 2015

C# C Sharp Kendi Yazdığımız(Yaptığımız) Tarayıcı (Make browser with C#)

C# da kendi yazdığım bir internet tarayıcısını sizlerle paylaşmak istiyorum.

Program ekran görüntüleri;









Tarayıcımızın C# kodları ;

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

namespace ercancag_browser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        { 
                webBrowser1.Navigate(textBox1.Text);
            
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            webBrowser1.Refresh();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            webBrowser1.GoForward();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            webBrowser1.GoBack();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("www.facebook.com");
        }

        private void button6_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("google.com");
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button7_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("www.youtube.com.tr");
        }

        private void button8_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("www.ercancag.blogspot.com");
        }
    }
}

 

Ercan ÇAĞLAYAN CÜ-EEM  2015





Arduino ile Röle Kontrolü (Relay Control with the Arduino)

Arduino ile farklı cihazları kontrol etmek istiyorsanız ya da ev kontrol sistemi benzeri sistemler üzerinde çalışıyorsanız röleler vazgeçilmez devre elemanları şüphesiz. Bu yazımda Arduino ile 5v röleleri nasıl kontrol edebileceğinizi anlatmaya çalışacağım. Yazının sonunda da sadece röle devresi kullanarak yapılmış güzel bir örnek paylaşacağım.
Yanda verdiğim devre şeması 5v mini PCBröleler için. BC5482N22222N3704transistörlerinden birisini kullanabilirsiniz. Daha büyük röleler için TIP102 transistör ve ek bir enerji kaynağı gerekli.
Röle kontrolüne gelecek olursak, bildiğimiz “Blink” uygulamasındaki mantıkla kontrol ediliyor röleler de. Dijital çıkışları “HIGH” ve “LOW” yaparak ve “delay” fonksiyonunu kullanarak röleleri kontrol etmek mümkün kısaca.
Blink uygulamasını düzenleyerek oluşturduğum örnek bir programı aşağıda paylaşıyorum. “digitalWrite” fonksiyonunu kullanarak 2 saniyeliğine röleyi çektirip 2 saniye bıraktırıyoruz programda. Aynı şekilde belirli şartlarda rölelerin çalışmasını sağlayarak kontrol sistemlerioluşturabilirsiniz.


// writed by ercancag
// Dijital 2 pinini role olarak isimlendiriyoruz.
int role = 2;
// Devre şemasındaki Arduino Dijital Pin-Arduino Dijital 2 bağlantısını yapıyoruz.
void setup() { 
  // Role(Dijital 2)  pinini çıkış olarak ayarlıyoruz.
  pinMode(role, OUTPUT); 
}

void loop() {
  // Role(Dijital 2 pinini HIGH olarak tanımlıyoruz, yani roleyi çektiriyoruz.
  digitalWrite(role, HIGH);
  delay(2000); // 2 saniye bekle.
  // Role pinin voltajını LOW yaparak röleyi bıraktırıyoruz.
  digitalWrite(role, LOW);
  delay(2000); // 2 saniye bekle.
}
Sadece röle devresi kullanarak yapılmış bir Arduino projesinden bahsedeceğim. Projede eski bir Nokia 3310“un tuşları röle kullanarak kontrol ediliyor ve telefonda kayıtlı bir mesaj kayıtlı bir numaraya SMSolarak gönderiliyor. Acil durumlarda sabit SMS göndermek isteyenler için çok basit bir çözüm olabilir. 
Video;


Ercan ÇAĞLAYAN CÜ-EEM  2015

Arduino ile Step Motor Kontrolü (Stepper motor control with Arduino)

Step(Adım ) Motorlar, adından da anlaşılacağı üzere adım adım hareket eden, motorun sargılarından birinin enerjilendirilmesi ile  sadece 1 adım hareket eden motorlardır.  Adımlarınızın kaç derecelik olacağı motorunuzun tasarımına bağlıdır. Örneğin;  400 adımlık bir step motor 360 derecelik bir tam dönüşünde 400 adım yol alır. Bu durumda motorunuzun bir adım açısı 360/400= 0.9 derece olur.  Bu aynı zamanda sizin çözünürlük değerinizdir. Arduino ile Step Motor kontrolü oldukça kolaydır.



Step Motorlarla ilgili ayrıntılı bilgiyi buradan bulabilirsiniz. Ayrıca Arduino IDE’ niz için ilgili kütüphanelere buradan ulaşabilirsiniz.
Step Motorları kullanmak için genelde sürücü devreleri kullanılmaktadır. Step Motorların istenilen yönde ve hızda çalıştırmak istendiğinde sargılarına belli bir sırada darbeler uygulanmalıdır. Bu darbelere göre step motorunuz istenilen sayıda adım atabilir. Günümüzde bu işlemi yapan hazır devreler (kontrolor, sürücü devreler) bulunmaktadır.  Sürücü devreleri ile aynı zamanda tork değerinizi de belirlemiş olursunuz.
Aşağıdaki örnekte basit bir step motor sürme örneği verilmiştir. Bu örnekte sürücü devresi olarak ULN2003AN kullanılmıştır.



Step motorun 4 tane çıkış pinini sürücü devremiz ile bağlantıladık ve sürücü devremizden de Arduino’ muzun 8, 9, 10, 11  nolu pinlerine bağlantı kurduk. Dolayısıyla step motorun uçlarını sırasıyla HIGH konumuna çekerek motorumuzu hareket ettirebiliriz. Uçlardan sadece birini HIGH(Lojik 1) edebiliriz, bu esnada diğer uçların LOW(Lojik 0) olması gerekir.
Kodlarımız aşağıdaki gibi olmalıdır.

//writed by ercancag
int motorPin2 = 9;
int motorPin3 = 10;

int motorPin1 = 8;

int motorPin4 = 11;

int delayTime = 500;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(delayTime);
}

Bu çalışmada step motorun sırasıyla motorPin1, motorPin2, motorPin3, motorPin4 şeklinde tanımladığımız uçlarını HIGH yapıyoruz. Eğer bu sıralamayı motorPin4, motorPin3, motorPin2, motorPin1 şeklinde değiştirirsek motorumuz ters yönde dönmüş olacaktır.

Ercan ÇAĞLAYAN CÜ-EEM 2015

Arduino Esplora ile Güzel Bir Termometre Projesi (Thermometer on the TFT with Arduino Esplora)

Dün biraz boş vaktim olunca masamın üzerindeki Esplora’ya takıldı gözlerim. Peşinden Esplora’nın TFT ekranının da bir köşede durduğunu görünce, boş vakti değerlendirmek adına bir dijital-görsel termometre yapayım dedim.
Adafruit’in GFX ve ST7735 LCD Kütüphanesi olduğu da aklıma gelince, yapımının oldukça basit olacağını düşünerek giriştim çalışmaya.
Termometrenin tamamlanması yaklaşık 50 dakika sürdü. Hatalarını gidermek ve biraz da makyaj için 2 saat ayırmak gerekti.
Gelelim nasıl yapıldığına. Öncelikle Adafruit’in GFX ve ST7735 kütüphanelerini indirip Arduino’nun “libraries” klasörüne eklememiz gerekiyor.
Aşağıdaki linklerden bu kütüphaneleri edinebilirsiniz:

https://github.com/adafruit/Adafruit-GFX-Library

GitHub sayfasının sağ sütunundaki “Download ZIP” butonuna tıklayarak ZIP dosyası olarak indiriniz.
Arduino yazılımındaki Sketch > Import Library > Add Library… menüsünden, indirdiğiniz zip dosyalarını seçerek kütüphaneleri Arduino derleyicisine ekleyebilirsiniz.
GFX kütüphanesinin kullanım klavuzu için aşağıdaki PDF dosyasını inceleyin:
Termometre kodlarını aşağıda sizlerle paylaşıyorum. Kod satırlarında gerekli açıklamarı yapmaya çalıştım. Deneme yanılma yöntemiyle de keşfetmeniz mümkün. Termometremiz 0 ile 99 santigrad derece arasını ölçebiliyor. İsterseniz kodlar üzerinde biraz oynamalar yapıp -40 ile +150 santigrad derece arasında ölçüm yapabilirsiniz. LCD küçük olduğundan ben 0-99 derece arasını tercih ettim.

/**
 * @file   Esplora_Termometre.ino
 * @author Ercan ÇAĞLAYAN (ercancag@engineer.com)
 * @date   Haziran, 2015
 * @brief  Arduino Esplora ile Termometre.
 *
 * Arduino Esplora + TFT LCD ile Adafruit kütüphaneleri kullanılarak
 * yapılmış şık bir termometre.
 * www.ercancag.blogspot.com
 */

#include <Esplora.h>// Esplora hazır fonksiyonlarını kullanmak için
#include <Adafruit_GFX.h>// Çekirdek grafik kütüphanemizi dahil edelim
#include <Adafruit_ST7735.h>// Esplora LCD'sinin sürücüsünü dahil edelim
#include <SPI.h>// Esplora LCD'sini SPI haberleşme kullanarak daha hızlı
                             // kullanmak için SPI.h dosyasını dahil edelim

// Esplora LCD'sinin pin bağlantılarını ayarlıyoruz
#define sclk 15 // Arduino'nun 15. pini: SCK clock pini
#define mosi 16 // Arduino'nun 16. pini: Master Output Slave Input (MOSI) data pini
#define cs   7
#define dc   0
#define rst  1

// RGB565CONVERT fonksiyonu 32 bit rgb renk kodunu 16 bit rgb renk koduna cevirir
// Photoshop, Adobe Fireworks gibi tasarım programları 32bit rgb renk kodları ile çalışır.
// Parlak kırmızı renk kodu bilgisayarda #FF3300 iken, bunu 16 bit renk koduna çevirmek
// için RGB565CONVERT fonksiyonundan geçirmeliyiz: RGB565CONVERT(0xFF, 0x33, 0x00)
#define RGB565CONVERT(red, green, blue)\
(uint16_t)((( red   >> 3 )<< 11 )| \
(( green >> 2 )<< 5  )| \
( blue  >> 3 ))

// renk tanımlamalarımız
#define  kirmizi  RGB565CONVERT(0xFF, 0x33, 0x00)// parlak kırmızı
#define  gri      RGB565CONVERT(0xCC, 0xCA, 0xCF)
#define  koyu_gri RGB565CONVERT(127, 127, 135)
#define  yesil    RGB565CONVERT(0x66, 0xcc, 0x00)// parlak yesil
#define  sari     RGB565CONVERT(0xFF, 0xFF, 0x00)// sari
#define  siyah    0

// Seçenek 1: herhangi bir giriş-çıkış pinini kullanarak LCD ile haberleşebiliriz.
// ama bu biraz yavaş olacak.
//Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);

// Seçenek 2: SPI donanım pinlerini kullanarak LCD ile haberleşelim.
// İşte bu LCD'yi kullanmanın en hızlı yolu!
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

int celsius = 0;
int old_celsius=0;
long previousMillis = 0;

void setup(void) {
  // Eğer LCD'niz düzgün çalışmıyorsa aşağıdaki farklı tanımlamaları deneyin.
  // If your TFT's plastic wrap has a Black Tab, use the following:
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  // If your TFT's plastic wrap has a Red Tab, use the following:
  //tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
  // If your TFT's plastic wrap has a Green Tab, use the following:
  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab

  // LCD'yi yatay kullan
  tft.setRotation(1);

  // LCD'yi siyah renkle doldur
  tft.fillScreen(siyah);

  tft.setCursor(10, 5);   // imleci X:10, Y:5 koordinatlarına getir
  tft.setTextSize(2);     // yazı boyutunu 2 yap
  tft.println("Termo");   // Önceden ayarladığımız koordinatlara Termo yaz
  tft.setCursor(14, 18);  // imleci X:14, Y:18 koordinatlarına getir
  tft.println("metre");   // metre yaz

  // termometre gövdemizi çiziyoruz
  tft.drawRoundRect(130, 4, 10, 10, 5, gri);
  tft.drawRoundRect(125, 104, 20, 20, 10, gri);
  tft.drawRect(130, 9, 10, 100, gri);
  tft.fillRect(131, 10, 8, 4, siyah);
  tft.fillRect(131, 104, 8, 4, siyah);

  tft.fillRoundRect(131, 5, 8, 8, 4, siyah);
  tft.fillRoundRect(126, 105, 18, 18, 9, siyah);
  tft.fillRoundRect(127, 106, 16, 16, 8, kirmizi);

  // termometre çizgilerini ve 0'dan 100'e kadar sayıları yazıyoruz
  // yazı boyutlarını küçük olarak ayarla
  tft.setTextSize(1);
  for( int i=0; i<11; i++ ) {
    switch( i ) {
      case 0: // Eğer 100'ü yazıyorsan biraz sola yaz
      tft.setCursor(98, (i*10)+3);
      break;

      case 10: // Eğer 0'ı yazıyorsan biraz sağa yaz
      tft.setCursor(108, (i*10)+3);
      break;

      default: // diğerlerini bu hizada yaz
      tft.setCursor(103, (i*10)+3);
    }

    // yazılarda mavi'den kırmızıya geçiş efekti
    tft.setTextColor(RGB565CONVERT(map(i,0,10,255,0), 55, map(i,0,10,0,255)));

    // çizgi yazılarını yaz
    tft.println(100-(i*10));

    // çizgileri çiz
    tft.drawLine(120, (i*10)+6, 125, (i*10)+6, yesil);
  }

  // derece yazdığımız alanın köşeleri yuvarlatılmış gri ile doldurulması
  tft.fillRoundRect(10, 44, 80, 34, 4, koyu_gri);  

  // başlangıçta 00°C yaz
  tft.setCursor(16,50);
  tft.setTextSize(3);
  tft.setTextColor(gri);

  tft.print("00");
  tft.print("\xF7");
  tft.print("C");

  tft.setCursor(4,116);
  tft.setTextSize(1);
  tft.setTextColor(gri);
  tft.print("\x41\x72\x64\x75\x69\x6e\x6f\x54\x75\x72\x6b\x69\x79\x65\x2e\x63\x6f\x6d");

  // bundan sonraki yazıların boyutunu 3 ve rengini sari olarak ayarla
  tft.setTextSize(3);
  tft.setTextColor(sari);
}

void loop() {
  unsigned long currentMillis = millis();

  // Yarım saniyede bir sıcaklık oku
  if(currentMillis - previousMillis > 500) {
    previousMillis = currentMillis;

    celsius = Esplora.readTemperature(DEGREES_C);

    if( celsius > 99 ) {
      celsius = 99;
    }
    
    if( celsius < 0 ) {
      celsius = 0;
    }
    
  }
  // eğer sıcaklık değişmişse
  if( celsius != old_celsius ) {
    // Derece değerini yazacağımız yeri önce koyu gri ile temizliyoruz
    tft.fillRect(16, 50, 34, 22, koyu_gri);

    // Derece değerini yaz
    tft.setCursor(16,50);
    tft.print(celsius);

    // termometre barını güncelle
    tft.fillRect(132, 102-(celsius), 6, 4, siyah);
    tft.fillRect(132, 106-(celsius), 6, celsius, kirmizi);

    old_celsius = celsius;
  }
}

Ercan ÇAĞLAYAN CÜ-EEM  2015