Arşiv

Archive for Aralık 2017

Arduino ve Python ile Basit Radar Uygulaması – 2. Kısım

Arduino ve Python ile basit radar uygulamasının ilk kısmında ölçülen mesafe bilgileri; ilgili açı bilgisi ile beraber seri porta gönderilmişti. Bu kısımda ise seri porta gönderilen bilgilerin Python ile okunup parse edilerek (ayrıştırılarak) grafiğe dönüştürülmesi anlatılmaktadır.

Arduino tarafında seri porta gönderilen veriler şöyle görülmektedir:

Verileri parse edip grafikleştiren Python kaynak kodumuz ise şu şekildedir:

# -*- coding: utf-8 -*-
import serial, turtle

#Arduino'nun bilgisayara bağlı olduğu seri porta bağlan
ser = serial.Serial(port='COM6', baudrate=9600, timeout=0)

print("connected to: " + ser.portstr)

#Grafik çizmek için turtle nesnesinin özellikleri
turtle.speed(0)
turtle.pensize(1)
turtle.pencolor("black")
turtle.fillcolor("green")

#Mesafe ve açı bilgilerini yazmak için
#ikinci turtle nesnesi ve özellikleri
trt2 = turtle.Turtle()
trt2.speed(0)
trt2.penup()
trt2.hideturtle()

#Mesafe bilgilerini grafikleştirmeden önce
#ekrana uzaklıklara ait temsili
#yarım daireleri çiz
def yarimDaireCiz():  
  turtle.clear()
  turtle.pencolor("black")   

  turtle.penup()
  turtle.goto(0,-20)
  turtle.write("0")    
  turtle.goto(100,-20)
  turtle.write("10cm")
  turtle.goto(200,-20)
  turtle.write("20cm")
  turtle.goto(300,-20)
  turtle.write("30cm")
  turtle.goto(400,-20)
  turtle.write("40cm")

  turtle.goto(-100,-20)
  turtle.write("10cm")
  turtle.goto(-200,-20)
  turtle.write("20cm")
  turtle.goto(-300,-20)
  turtle.write("30cm")
  turtle.goto(-400,-20)
  turtle.write("40cm")

  turtle.penup()
  turtle.home()    
  turtle.forward(400)     
  turtle.seth(90)    
  turtle.pendown()
  turtle.begin_fill()
  turtle.circle(400,180)
  turtle.end_fill()
  turtle.seth(0)    

  turtle.penup()
  turtle.home()    
  turtle.forward(300)    
  turtle.seth(90)    
  turtle.pendown()    
  turtle.circle(300,180)    
  turtle.seth(0)

  turtle.penup()
  turtle.home()    
  turtle.forward(200)    
  turtle.seth(90)    
  turtle.pendown()    
  turtle.circle(200,180)    
  turtle.seth(0)

  turtle.penup()
  turtle.home()    
  turtle.forward(100)        
  turtle.seth(90)    
  turtle.pendown()    
  turtle.circle(100,180)    
  turtle.seth(0)  
        
#Seri porttan okunup parse edilen
#aci ve mesafe bilgilerini
#cizgiye dönüştür  
def cizgiCiz(aci, mesafe):    
  turtle.penup()    
  turtle.home()  
  turtle.seth(aci) 
  turtle.forward(mesafe*10) # 1cm = 10birim
  turtle.pencolor("red")
  turtle.pendown()
  turtle.forward(400-mesafe*10)        

#Parse edilen aci ve mesafe bilgilerini
#ekrana yaz
def mesafeYaz(aci, mesafe):
  trt2.clear()
  trt2.goto(-50,-40)
  trt2.write("Açı: "+str(aci)+" - Mesafe: "+str(mesafe)+ " cm")  

#Seri porttan okunan bilgileri parse et      
def veriAyikla(veri):
  veriler = veri.split(";")
  aci = veriler[0].split(":")
  mesafe = veriler[1].split(":")    
  aci = int(aci[1])
  mesafe = int(mesafe[1])  

  mesafeYaz(str(aci),str(mesafe))

  
  if mesafe>=40 or mesafe == 0:
    mesafe = 41
    
  if aci == 0 or aci == 180:
    yarimDaireCiz()
   
  cizgiCiz(aci, mesafe)

#Seri porttan sürekli veri oku
line = ""
while True:
  for c in ser.read():                
    if c == '\n':
      veriAyikla(line)         
      line = ""
      break
    else:
      line += c

ser.close()

Programda öncelikle Arduino’nın veri gönderdiği -uygulamamızda USB’den bilgisayara bağlı olan- porta bağlanıyoruz. (Port bilgilerini ve baudrate değerini uygun şekilde değiştirmelisiniz)

Turtle modülü kullanımı kolay ve basit çizim işlemlerinde kullanılabilen bir python modülür. Programda iki tane turtle nesnesi kullanılmıştır. “turtle” mesafe bilgilerine göre çizgi çizmek için, “trt2” ise mesafe ve açı bilgilerini ekrana yazmak için kullanılan nesnedir. Seri port bağlantısının ardından turtle nesneleri ve özellikleri tanımlanmıştır.

yarimDaireCiz() fonksiyonu ekrana uzaklıklara ait temsili yarım daireler çizmek için kullanılmaktadır. Radar uygulama alanı 40 cm olarak düşünülmüştür. 1 cm 10 birim baz alınarak yarım daireler bu fonksiyon ile ekrana çizilmektedir. Gelen açı değeri her 0 ve 180 derece olduğunda yarimDaireCiz() program içinden çağırılmaktadır. Önce ekran temizlenmekte ardından yarım daireler çizilmektedir. Fonksiyon bir nevi arka plan oluşturmaktadır.

cizgiCiz() fonksiyonu ise parse edilen mesafe ve açı bilgilerini parametre olarak almaktadır. Bu verilerle ekrana istenilen açıda gelen mesafe bilgisi bazlı çizgi çizmektedir. “turtle” nesnesi çizgi çizmeden gelen mesafeye göre önce ileri gitmekte (santim başına 10 birim) ardından 40cm’den kalan mesafe kadar kırmızı çizgi çizmektedir.

Programda yer alan diğer 2 fonksiyondan biri mesafeYaz() ve diğeri ise veriAyikla() fonksiyonudur. mesafeYaz() fonksiyonu parametre olarak gönderilen açı ve mesafe bilgilerini “trt2” nesnesiyle ekrana yazmaktadır.

veriAyikla() fonksiyonu ise seri porttan okunup kendisine gönderilen veriyi parse etmektedir. Öncelikle “;” ardından “:” karakterinden ayrıştırma yaparak açı ve mesafe bilgilerini elde eder. Ekrana uzun çizgi çizilmemesi ve radar uygulama alanı 40 cm düşünüldüğü için mesafe 40’tan fazla ise 40’a eşitlenmektedir. Mesafeye göre çizgi çizilmeden önce de (cizgiCiz() fonksiyonu çalıştırılmadan önce) açı değeri 0 veya 180 ise yarimDaireCiz() bu fonksiyon içinden çağırılmaktadır.

Program akışı, seri port bağlantısı ve turtle nesnelerinin özelliklerinin tanımlanmasının ardından sürekli olarak seri porttan 1 byte veri okuma işlemi ile devam eder. Okunan karakter satır sonu (\n) değilse devamlı “line” değişkeninin sonuna eklenir. Satır sonu karakteri gönderilmişse (açı ve mesafe bilgisi artık tamamlanmışsa) “line” değişkeninde birleştirilmiş veri parse edilmesi için veriAyikla() fonksiyonuna gönderilir. Önce açı ve mesafe bilgileri elde edilir. Sonrada açı ve mesafe bazlı çizgi çizilir. Döngü kesintisiz devam eder.

Uygulama ekran görüntüsü şöyledir:

Arduino ve Python ile Basit Radar Ekran Görüntüsü

 

Kaynakça
https://elinux.org/Serial_port_programming
https://stackoverflow.com/questions/16077912/python-serial-how-to-use-the-read-or-readline-function-to-read-more-than-1-char
http://pyserial.readthedocs.io/en/latest/shortintro.html
https://docs.python.org/2/library/turtle.html

Arduino ve Python ile Basit Radar Uygulaması – 1. Kısım

Uygulama, Arduino ve Python olmak üzere iki taraflıdır. Arduino tarafında; SG90 servo motor ve HC-SR04 mesafe sensörü ile elde edilen veriler seri porta gönderilmektedir. Python tarafında ise bu veriler seri porttan okunup parse edilerek grafiksel olarak  gösterilmektedir. Bu kısımda Arduino tarafında yapılacaklar anlatılmaktadır.

Servo motorlar, gönderilen PWM sinyaller ile 0-180 derece arasında istenen açıda dönebilen ve robot teknolojisinde sıklıkla kullanılmakta olan motorlardır . SG90, besleme (+5V), toprak (GND) ve motorun açısını belirlemede veri göndermek üzere kullanılan 3 kabloya sahiptir. Besleme kırmızı, toprak kahverengi ve diğer veri kablosu ise turuncu renktedir. Veri kablosu Arduino’nun PWM pinlerine bağlanarak istenen açı için uygun PWM sinyalinin motora gönderilmesi gerekmektedir. SG90’nın veri sayfalarında (datasheet) bu sinyalin nasıl ve ne kadar süre ile gönderileceği belirtilmiştir:

Uygun kodlama yapılarak veya Arduino ile hazır gelen <Servo.h> kütüphanesi kullanılarak SG90 kontrol edilebilmektedir.

SG90’na takılan bir HC-SR04 ile ölçülen mesafe bilgileri seri porta aktarılmaya hazırdır. Kaynak kodumuz şu şekildedir:

#include <Servo.h>

int trig = 11; //HC-SR04 trig pini
int echo =  12; //HC-SR04 echo pini

long sure, mesafe;

int i;
String veri="";

Servo myServoMotor;

void setup ()
{
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  myServoMotor.attach(9); //SG90 PWM kablosu 9.pinde
  Serial.begin(9600);
}

long mesafeHesapla()
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  sure = pulseIn(echo, HIGH, 23280); //timeout 400cm
  mesafe = sure / 29.1 /2;
  return mesafe;
}

void loop()
{  
  /*Seri porta gönderilecek örnek veri
    i:75;m:36 biçimindedir. 
    75 açı pozisyonu, 36 ise ölçülen mesafedir.*/  
  
  /*SG90 sola doğru 1'er derece 
    artışla dönsün. Her açıda 
    mesafe ölçülsün*/
  for (i = 0; i<180; i++) 
  { 
    myServoMotor.write(i); 
    veri += "i:";
    veri += i;
    veri += ";";
    veri += "m:";
    veri += mesafeHesapla();
    
    Serial.println(veri); 
    delay(125); 
    veri = ""; 
  } 
   
  /*SG90 sağa doğru 1'er derece 
    artışla dönsün. Her açıda 
    mesafe ölçülsün */ 
  for (i = 180; i>0; i--)
  {
    myServoMotor.write(i);
    veri += "i:";
    veri += i;
    veri += ";";
    veri += "m:";
    veri += mesafeHesapla();
    
    Serial.println(veri);        
    delay(125);
    veri = "";
  }
    
}

Kaynak koda öncelikle <Servo.h> kütüphanesi dahil edilmiştir. Servo motorun her açı pozisyonunda mesafeyi ölçebilmesi için mesafeHesapla() fonksiyonu yazılmıştır. pulseIn() fonksiyonunun varsayılan timeout süresi 1 saniyedir. Program akışı HIGH sinyal gelmediğinde bu kadar bekleyeceğinden bu süre 400cm’ye karşılık gelecek şekilde düşürülmüştür.

SG90’nın 1’er derece sola ve sağa dönüşleri for döngüsü ile yapılmıştır. Her derecede 125 ms bekleme süresi Python turtle modülünün grafik işlemlerini yavaş yapmasından dolayıdır. Pyhton tarafında grafik işleme; Arduino tarafında servo ve HC-SR04 ile senkronize çalışacağından bu bekleme süresi uygun şekilde ayarlanmalıdır. Böylece servo dönüş hızının da arttırılması mümkündür.

Her açı pozisyonunda ölçülen mesafe seri porta “i:75;m:36” biçiminde satır satır aktarılmaktadır. Burada i açı, m ise cm türünden ölçülen mesafedir. Python tarafında bu veri seri porttan okunup parse edilerek (ayrıştırılarak) grafiğe aktarılmaya artık hazırdır.

 

Kaynakça
http://www.robotiksistem.com/servo_motor_ozellikleri.html
http://www.elektrikrehberiniz.com/elektrik-motorlari/servo-motor-nedir-526/
https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-301/servo-motor
http://www.micropik.com/PDF/SG90Servo.pdf
https://www.arduino.cc/en/Reference.PulseIn

Arduino ile Göstergeli ve Sesli Basit Park Sensörü

HC-SR04 mesafe sensörü, buzzer (minik hoparlör) ve 7 segment display kullanarak basit bir sayısal göstergeli park sensörü uygulaması yapılabilir. Uygulamadan önce HC-SR04 ile mesafe ölçümü ve 7 segment display kullanımının incelenmesinde fayda vardır.

Buzzer’lar basit sesler üretmek için kullanılabilen devre elemanlarıdır. Arduino tone() fonksiyonu ile istenen frekansta (hertz/int türünde) ses çıkışı alınabilir. noTone(pin) ile de ses çıkışı durdurulabilir.

tone(pin, frekans, süre)  /*süre ms ve isteğe bağlı*/

noTone(pin) /*süre belirtilmedi ise ses çıkışını durdurmak için*/

Alttaki devre tasarımında HC-SR04 yerine Ping mesafe sensörü kullanılmıştır. HC-SR04’de fazladan trig pini vardır. Uygulama HC-SR04 ile kodlanmış ve yapılmıştır. Sayısal gösterge ortak anot yapıdadır. Devre tasarımı şöyledir:

Kaynak kod:

/*Trig ve echo pinleri*/
int trig = 2;
int echo = 3;

/*Buzzer pini*/
int buzzer = 4;

/*Gösterge pinleri*/
int ust = 5;
int sagUst = 6;
int solUst = 7;
int orta = 8;
int alt = 9;
int solAlt = 10;
int sagAlt= 11;
int nokta = 12;

long sure;
long mesafe;

int frekans = 205;

void setup() {  
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  pinMode(buzzer, OUTPUT);
  
  pinMode(ust, OUTPUT);
  pinMode(sagUst, OUTPUT);
  pinMode(solUst, OUTPUT);
  pinMode(orta, OUTPUT);
  pinMode(alt, OUTPUT);
  pinMode(solAlt, OUTPUT);
  pinMode(sagAlt, OUTPUT);
  pinMode(nokta, OUTPUT);
  
  Serial.begin(9600);
}

void loop() {
  /*10 mikrosaniye ses dalgası yolla*/
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  //Gitme-gelme süresini ve mesafeyi hesapla
  sure = pulseIn(echo, HIGH); //mikrosaniye
  mesafe = sure / 29.13 / 2; //cm

  Serial.print(sure);
  Serial.print("-");
  Serial.println(mesafe);

  sesCikar(mesafe);
  mesafeGoster(mesafe);   
}

void sesCikar(long mesafe)
{
  if (mesafe<=20) //Mesafe 20cm'den küçükse ses çıksın
  {
    tone(buzzer, frekans, 100); //100ms ses süresi
  } else //Mesafe 20'den fazla ise 250ms bekle
  {
    delay(250);
  }
  
  if (mesafe<=5) //5'ten küçükse 200ms aralıkla ses çıksın
  {   
    delay(200);   
  } else if (mesafe<=10) //10'dan küçükse 350ms
  {    
    delay(350);   
  } else if (mesafe<=20) //20'den küçükse 750ms
  {    
    delay(750);   
  }
}

void mesafeGoster(long mesafe)
{
  /*Ortak anot için yanacak ledler LOW*/
  /*Ortak katot için yanacak ledler HIGH*/
  /*mesafe 0-9 arası değilse orta ve nokta yanacak*/
  switch (mesafe)
  {
    case 0: 
      digitalWrite(ust, LOW);
      digitalWrite(solUst,LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);  
      digitalWrite(nokta, HIGH);   
      break;
    case 1:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);   
      break;
    case 2:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, HIGH);
      digitalWrite(alt, LOW);  
      digitalWrite(nokta, HIGH);    
      break;
    case 3:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);
      digitalWrite(nokta, HIGH);      
      break;
    case 4:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);
      break;
    case 5:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);  
      digitalWrite(nokta, HIGH);    
      break;
    case 6:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);   
      digitalWrite(nokta, HIGH);   
      break;
    case 7:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);    
      break;
    case 8:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);
      digitalWrite(nokta, HIGH);      
      break;
    case 9:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);    
      break;
    default:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, HIGH);
      digitalWrite(alt, HIGH);          
      digitalWrite(nokta, LOW);
      break;
  }      
}

Kaynakça
http://www.electroschematics.com/wp-content/uploads/2013/07/HCSR04-datasheet-version-1.pdf
https://elecfreaks.com/estore/download/EF03085-HC-SR04_Ultrasonic_Module_User_Guide.pdf
https://www.arduino.cc/en/Reference.PulseIn
http://www.f15ijp.com/2012/09/arduino-ultrasonic-sensor-hc-sr04-or-hy-srf05/
https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-301/arduino-ile-uzaklik-olcumu
http://www.elektrikport.com/teknik-kutuphane/pull-up-ve-pull-down-direnc-nedir/16930#ad-image-0
http://ufek.gazi.edu.tr/docs/UFEK2017_Ozetler/files/basic-html/page58.html
https://e-radionica.com/productdata/LD3361BS.pdf
http://www.elektrikport.com/teknik-kutuphane/7-segment-display-nedir/18475#ad-image-0
http://maker.robotistan.com/arduino-dersleri-9-buzzer-ile-ses-cikisi-alma-2/

 

Arduino ile 7 Segment Display Kullanımı

7 Segment Display devre elemanları led tabanlı sayısal göstergelerdir. Yapısında nokta ile birlikte 8 tane ufak led olup ledlerin herbirine segment denmektedir. Kullanımı RGB ledlerdeki gibi ortak anot veya ortak katot yapıda olma durumuna göredir. Veri sayfalarından (datasheet) veya ölçü aleti kullanarak ortak anot veya ortak katot yapıda olup olmadığı ve hangi pinin hangi ledi yaktığı tespit edilerek kullanılabilir.

Yukarıda ortak katot yapısında tek haneli bir sayısal göstergenin pin bağlantıları gösterilmiştir. 3 ve 8 numaralı pinler ortak katot bağlantısı içindir.

Hangi rakam oluşturulmak istenirse ona uygun ledlerin yanması sağlanmalı, diğer ledler söndürülmelidir. Örneğin ortak katot yapısında bir sayısal göstergede 1 rakamını göstermek için B ve C ledleri HIGH, diğer tüm ledler LOW konumuna getirilmelidir. Ortak anotta ise durum tam tersidir. Ledler düşük voltajlarda çalıştığı için önlerine mutlaka direnç yerleştirilmelidir.

Devre tasarımı (ortak anot):

Uygulamada sayısal göstergede hangi rakam görüntülenmek istenirse o rakam seri porttan veri olarak gönderilmektedir. Kaynak kod şöyledir:


/*Ledlerin bağlı oldukları digital pinler*/
int ust = 5;
int sagUst = 6;
int solUst = 7;
int orta = 8;
int alt = 9;
int solAlt = 10;
int sagAlt= 11;
int nokta = 12;

int sayi;

void setup() {  
  pinMode(ust, OUTPUT);
  pinMode(sagUst, OUTPUT);
  pinMode(solUst, OUTPUT);
  pinMode(orta, OUTPUT);
  pinMode(alt, OUTPUT);
  pinMode(solAlt, OUTPUT);
  pinMode(sagAlt, OUTPUT);
  pinMode(nokta, OUTPUT);
  
  Serial.begin(9600);
}

void loop() {
  
  if (Serial.available())
  {
    //Seri porttan veri oku ve integer'a dönüştür
    sayi = Serial.readString().toInt();  
  }

  /*Ortak anot için yanacak ledler LOW*/
  /*Ortak katot için yanacak ledler HIGH*/
  switch (sayi)
  {
    case 0: 
      digitalWrite(ust, LOW);
      digitalWrite(solUst,LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);     
      break;
    case 1:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);     
      break;
    case 2:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, HIGH);
      digitalWrite(alt, LOW);      
      break;
    case 3:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 4:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      break;
    case 5:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 6:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 7:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);      
      break;
    case 8:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 9:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);      
      break;
  }
  digitalWrite(nokta, HIGH);  
}

Kaynakça
https://e-radionica.com/productdata/LD3361BS.pdf
http://www.elektrikport.com/teknik-kutuphane/7-segment-display-nedir/18475#ad-image-0

Arduino ve HC-SR04 ile Mesafe Ölçümü

HC-SR04, 2cm-4m arası ölçüm yapabilen ultrasonik bir mesafe sensörüdür. Uygulamadan önce Arduino pulseIn() fonksiyonunun incelenmesinde fayda vardır.

HC-SR04’de Vcc, Trig, Echo ve Gnd olmak üzere 4 bacak bulunmaktadır. Vcc ve Gnd, besleme (+5V) ile toprak bağlantısı için kullanılırken Trig verici, Echo ise alıcı olarak kullanılmaktadır.

Sensörün çalışması için 10 mikrosaniye HIGH (+5V) sinyal trig bacağına gönderilir. Sensör otomatik olarak insan kulağının duyamayacağı ses dalgası salarak geri dönüp dönmediğini tespit eder. Eğer geri dönüş varsa ses dalgasının gönderilme ve geri gelme süresi boyunca HIGH sinyal Echo bacağına gönderir. İşte burada pulseIn() fonksiyonu ile bu süre tespit edilir ve mesafe ölçümü yapılabilir.

Mesafe ölçümü sensörün datasheet’inde HIGH sinyalin süresi ile ses hızının (340 m/s) çarpılması ve sonucun ikiye bölünmesi olarak belirtilmiştir. Bununla birlikte sesin hızı ortam sıcaklığına göre de değişiklik göstermektedir. Ses hızı yaklaşık olarak 20 derecede 343.2 m/sn’dir. Buradan mesafeyi hesaplamak için Mesafe = HIGH sinyal süresi (mikrosaniye) * 343.2 (m/sn) / 2 formülünde gereken dönüşümler (saniye ve cm) yapılarak aşağıdaki formüller elde edilir ve kullanılabilir:

Mesafe = (HIGH sinyal süresi/1000000sn) * 343.2 * 100cm / 2
=> Mesafe = HIGH sinyal süresi / 29.13 / 2
=> Mesafe = HIGH sinyal süresi / 58,27

Örnek kaynak kod şöyle olabilir:

int trigPin = 4;
int echoPin = 5;
long sure, mesafe;

void setup()
{
  pinMode(trigPin, OUTPUT); //trig pin çıkış
  pinMode(echoPin, INPUT); //echo pin giriş
  Serial.begin(9600);
}

void loop()
{
  //10 mikrosaniyelik trig pinini HIGH konumuna getir
  //(10 mikrosaniye ses dalgası sal)
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  //echo pininin ne kadar süre HIGH olduğunu dinle  
  //(ses dalgasının gelme ve gitme süresini belirle)  
  sure = pulseIn(echoPin, HIGH); //varsayılan timeout 1 sn

  //mesafeyi hesapla  
  mesafe = sure/29.13/2;

  Serial.print(sure);
  Serial.print(" mikrosn --- ");
  Serial.print(mesafe);
  Serial.println(" cm");
}

Seri monitör çıktıları:

Kaynakça
http://www.electroschematics.com/wp-content/uploads/2013/07/HCSR04-datasheet-version-1.pdf
https://elecfreaks.com/estore/download/EF03085-HC-SR04_Ultrasonic_Module_User_Guide.pdf
https://www.arduino.cc/en/Reference.PulseIn
http://www.f15ijp.com/2012/09/arduino-ultrasonic-sensor-hc-sr04-or-hy-srf05/
https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-301/arduino-ile-uzaklik-olcumu
http://www.elektrikport.com/teknik-kutuphane/pull-up-ve-pull-down-direnc-nedir/16930#ad-image-0
http://ufek.gazi.edu.tr/docs/UFEK2017_Ozetler/files/basic-html/page58.html

Kategoriler:Robotik Etiketler:, , , , ,

Arduino pulseIn() Fonksiyonunun Kullanımı

pulseIn() fonksiyonu, bir pinin ne kadar süre HIGH veya LOW durumda kaldığını takip eder ve geçen süreyi mikrosaniye cinsinden döndürür.

Örnek devre tasarımı şöyle olabilir:

Örnekte düğme her basılı tutulduğunda Arduino’nun 5 numaralı pinine HIGH sinyali gönderilecektir. Bırakıldığında ise aynı pine LOW sinyali gönderilmiş olacaktır. (pull down direnç yöntemi).

Düğmeyi basılı tuttuğumuzda pulseIn() pin durumunu izler ve LOW durumuna geçince sure değişkenine geçen zamanı atar ve program kaldığı yerden devam eder. timeout 10 sn. olarak tanımlanmıştır. 10 sn boyunca LOW sinyali alınamazsa veya HIGH durumu hala devam ediyorsa pulseIn(), 0 değerini döndürerek programın akışı kaldığı yerden devam eder.

Kaynak kod şu şekildedir:

long sure;

void setup() {  
  pinMode(5,INPUT);
  Serial.begin(9600);
}

void loop() {
 sure = pulseIn(5, HIGH, 10000000); //timeout 10 sn. 
 
 if (digitalRead(5)==1)
 {
   Serial.print("digitalRead: 1");  
 } else
 {
   Serial.print("digitalRead: 0");
 }
 
 Serial.print(" --- sure: ");
 Serial.println(sure);
 
}

Kodda ufak değişiklik yapılarak pulseIn() ile pinin LOW durumu da izlenebilir. Bu kez düğmeye her basıldığında 5 numaralı pine HIGH sinyali gönderilecek ve programın akışı devam edecektir.

Seri monitör çıktıları örnekteki gibidir:

 

Kaynakça
https://www.arduino.cc/en/Reference.PulseIn

Arduino ultrasonic sensor (HC-SR04 or HY-SRF05)


http://www.elektrikport.com/teknik-kutuphane/pull-up-ve-pull-down-direnc-nedir/16930#ad-image-0
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/

Kategoriler:Robotik Etiketler:, , , , ,

Arduino ile RGB Led Kontrolü (Ortak Anot)

07/12/2017 1 yorum

Ortak anot ve ortak katot RGB ledlerin devreye bağlanma şekilleri şöyledir:

Ortak anot RGB ledlerin kullanımı ortak katot RGB ledlere göre biraz farklılık göstermektedir. RGB ledin ortak anot bacağına +5V verildiği için toprak bağlantısı yapılan kırmızı, yeşil ve mavi led direk yanmaktadır. Yanması istenilen led bacağı toprak seviyesine çekilmeli, sönmesi istenilen ledden ise voltaj düşümü yapılmalıdır. Arduino’da 0V toprağa eş değerdir.

Devre tasarımımız şöyledir:

digitalWrite() fonksiyonu ile örnek uygulama kodu şöyledir:

int kirmiziPin = 9;
int maviPin = 10;
int yesilPin = 11;

void setup() {
  pinMode(kirmiziPin, OUTPUT);
  pinMode(maviPin, OUTPUT);
  pinMode(yesilPin, OUTPUT);
}

void loop() {
  //Mavi renk için kırmızı ve yeşil pine voltaj verilip
  //gerilim farkı düşürülüyor. Mavi pin toprak.
  digitalWrite(maviPin, LOW);
  digitalWrite(kirmiziPin, HIGH);
  digitalWrite(yesilPin, HIGH); 
  delay(1000);

  //Yeşil renk için kırmızı ve mavi pine voltaj verilip
  //gerilim farkı düşürülüyor. Yeşil pin toprak.
  digitalWrite(yesilPin, LOW);
  digitalWrite(kirmiziPin, HIGH);
  digitalWrite(maviPin, HIGH);
  delay(1000);

  //Kırmızı renk için yeşil ve mavi pine voltaj verilip
  //gerilim farkı düşürülüyor. Kırmızı pin toprak.
  digitalWrite(kirmiziPin, LOW);
  digitalWrite(yesilPin, HIGH);
  digitalWrite(maviPin, HIGH);
  delay(1000);  
}

analogWrite() fonksiyonu ile örnek uygulama kodu şöyledir:

int kirmiziPin = 9;
int maviPin = 10;
int yesilPin = 11;

void setup()
{
  pinMode(kirmiziPin, OUTPUT);
  pinMode(maviPin, OUTPUT);
  pinMode(yesilPin, OUTPUT);   
}

void loop()
{     
  //Mavi renk için kırmızı ve yeşil pine voltaj verilip
  //gerilim farkı düşürülüyor. Mavi pin toprak.  
  analogWrite(maviPin,0);
  analogWrite(kirmiziPin, 255);    
  analogWrite(yesilPin, 255); 
  delay(750);

  //Yeşil renk için kırmızı ve mavi pine voltaj verilip
  //gerilim farkı düşürülüyor. Yeşil pin toprak.  
  analogWrite(yesilPin, 0);   
  analogWrite(kirmiziPin, 255);    
  analogWrite(maviPin,255);  
  delay(750);  

  //Kırmızı renk için yeşil ve mavi pine voltaj verilip
  //gerilim farkı düşürülüyor. Kırmızı pin toprak.  
  analogWrite(kirmiziPin, 0);   
  analogWrite(yesilPin, 255);  
  analogWrite(maviPin,255); 
  delay(750); 
  
  /**Ortak katotta olduğu gibi direk istenilen değerle
    renk elde etmek için alttaki fonksiyon da kullanılabilir.**/

  //Mavi için
  analogWrite(maviPin, istenenDeger(255)); //Mavi ledin yanması isteniyor
  analogWrite(kirmiziPin, istenenDeger(0));  //Kırmızı led sönsün
  analogWrite(yesilPin, istenenDeger(0)); //Yeşil led sönsün
  delay(750);

  //Renkler karıştırılarak kullanılabilir  
  analogWrite(kirmiziPin, istenenDeger(150));
  analogWrite(maviPin, istenenDeger(50));
  analogWrite(yesilPin, istenenDeger(75));
  delay(750);
}

int istenenDeger(int deger)
{
  return 255-deger;
}

Kaynakça
https://mvaslan.blogspot.com.tr/2014/04/arduino-rgb-led-uygulamasi.html
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

Kategoriler:Robotik Etiketler:, , , , , ,

Arduino ile RGB Led Kontrolü (Ortak Katot)

RGB ledler kırmızı, yeşil ve mavi olmak üzere bünyesinde 3 ledi bulunduran ve 4 bacağı olan ledlerdir. Yapısal olarak RGB ledlerin anot kutupları veya katot kutupları birleştirilmiştir.

Ortak katotlu RGB ledin katot ucu toprağa bağlanıp kırmızı, yeşil ve mavi uçlarına pozitif gerilim verilerek istenilen led yakılır. analogWrite() ile istenilen ledlere istenilen voltaj verilerek ara renkler de elde edilebilir.

Devre tasarımı şöyledir:

digitalWrite() fonksiyonu ile örnek uygulama kodu şöyledir:


int kirmiziPin = 9;
int maviPin = 10;
int yesilPin = 11;

void setup()
{
  pinMode(kirmiziPin, OUTPUT);
  pinMode(maviPin, OUTPUT);
  pinMode(yesilPin, OUTPUT);
}

void loop()
{
  digitalWrite(kirmiziPin, HIGH);
  delay(750);
  digitalWrite(kirmiziPin, LOW);
  delay(750);

  digitalWrite(maviPin, HIGH);
  delay(750);
  digitalWrite(maviPin, LOW);
  delay(750);

  digitalWrite(yesilPin, HIGH);
  delay(750);
  digitalWrite(yesilPin, LOW);
  delay(750);
}

analogWrite() fonksiyonu ile örnek uygulama kodu şöyledir:

int kirmiziPin = 9;
int maviPin = 10;
int yesilPin = 11;

void setup()
{
  pinMode(kirmiziPin, OUTPUT);
  pinMode(maviPin, OUTPUT);
  pinMode(yesilPin, OUTPUT);   
}

void loop()
{   
  analogWrite(kirmiziPin, 0);  
  analogWrite(maviPin, 50);  	 
  analogWrite(yesilPin, 50); 
  delay(750);
  
  analogWrite(kirmiziPin, 100);  
  analogWrite(maviPin, 100);  	 
  analogWrite(yesilPin, 0);  	  
  delay(750);
  	
  analogWrite(kirmiziPin, 200);  
  analogWrite(maviPin, 0);  	 
  analogWrite(yesilPin, 200);
  delay(750);  
}

Kaynakça
https://mvaslan.blogspot.com.tr/2014/04/arduino-rgb-led-uygulamasi.html
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

Kategoriler:Robotik Etiketler:, , , , , ,

Arduino ve LM35 ile Sıcaklık Ölçümü

LM35, sıcaklık ölçmek için kullanılabilen bir sensördür. Besleme, toprak ve çıkış olmak üzere 3 tane bacağı vardır. 4-20V arası besleme gerilimi ile çalışmakta olup her sıcaklık artışında doğrusal olarak 10mV çıkış gerilimi vermektedir.

0-100 derece arası ölçüm yapabilen LM35D’nin çıkışı orta bacak olup Arduino ile gelen gerilim okunarak sıcaklık dönüşümü yapılabilir.

 

Devre tasarımı şöyledir:

Kaynak kodumuz şöyledir:

int gelenDeger;
int gelenVoltaj;
float sicaklik;

void setup() {
  pinMode(A1, INPUT);
  Serial.begin(9600);
}

void loop() {
 gelenDeger = analogRead(A1); //0-1023 arası değer gelecek
 gelenVoltaj = (gelenDeger/1023.0)*5*1000; //V->mV
 sicaklik = gelenVoltaj/10.0; // 10mV->1 derece
  
 Serial.print(gelenDeger);
 Serial.print("-");
 Serial.print(gelenVoltaj);
 Serial.print("-");
 Serial.println(sicaklik);
 
 delay(750);
}

Seri monitör çıktıları:

Kaynakça
http://www.ti.com/lit/ds/symlink/lm35.pdf
http://devreokulu.com/LM35.html

Kategoriler:Robotik Etiketler:, , , , ,

Arduino ile Karanlıkta Yanan Led (Parlaklık Ayarlı)

Bir önceki karanlıkta yanan led uygulamasında LDR voltajı digitalRead() ile okunarak digitalWrite() ile led devresine 5V verilmiştir. Bu uygulamada ise karanlığa oranla led parlaklığı arttırılacaktır.

Arduino pinleri çıkış olarak ayarlandığında 0 veya 5V vermektedir. Ara değerleri çıkış olarak verebilmek için analog sinyal üretilmesi gerekir. Analog çıkışı Arduino’nun PWM (Pulse Width Modulation) sahip pinleri (yanında ~ işareti olan pinler) verebilmektedir. Arduino Uno’da 3,5,6,9,10 ve 11. pinler PWM çıkışına sahiptir. Bu pinlerle analog sinyal üretilip motor hız kontrolü, LED parlaklığı ayarlanabilmektedir.

Bu pinler; analogWrite(pin, deger) fonksiyonu ile 0-5V arası çıkış gerilimi verebilir. deger parametresi 0-255 arası int türündendir. 0-> 0V, 255->5V için kullanılır. Ara değer vermek içinse oranlama yapılır.

Devrede 330 ohm’luk led direnci ve 10K’lık potansiyemetre (direnç yerine) kullanılmış olup devre tasarımımız şöyledir:

Dijital 9.pin (PWM var) lede +0..5V arası voltaj vermek için kullanılmaktadır. Karanlıkta LDR direnci artar dolayısıyla üzerine düşen voltaj da artar. Analog 1.pin LDR’ye düşen voltajı okur ve 0-1023 arası değere dönüştürür. Eşik değer 300 belirlenmiştir. Eşik değer aşıldığında (karanlık arttığında) analogWrite(9, gonderilecekDeger) ile karanlığa oranla 0-5V arası voltaj dijital 9.pin ile lede gönderililir. Aksi durumda led söndürülür. Oranlama gelen değerin 1023’e bölünüp 255 ile çarpılmasıyla yapılmıştır.

Kaynak kod şöyledir:

int gelenDeger;
int gonderilecekDeger;

void setup()
{
  pinMode(9, OUTPUT); //PWM pini 
  pinMode(A1, INPUT); //LDR'ye düşen voltaj  

  Serial.begin(9600);
}

void loop()
{
  gelenDeger = analogRead(A1); //0-1023 arası değer dönecek
  gonderilecekDeger = (gelenDeger/1023.0)*255; //PWM değeri
  
  if (gelenDeger >=300) //LDR eşik değeri
  {
    analogWrite(9, gonderilecekDeger); 
  } else
  {
    analogWrite(9, 0); //OV
  }

  Serial.print(gelenDeger);
  Serial.print("-");
  Serial.println(gonderilecekDeger);
  
  delay(750);
}

Seri monitör çıktıları aşağıdaki gibi olup solda LDR’den okunan analog değer, sağda ise lede gönderilen analog değer vardır.

Ledin ne kadar karanlıkta yanacağı analog pinin potansiyemetrenin orta ayağına çekilmesi ile ya da pot’un direncinin arttırılmasıyla da ayarlanabilir.

Kaynakça
https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/
https://www.arduino.cc/en/Tutorial/PWM
https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-301/arduinoda-analog-sinyal-uretme

 

Kategoriler:Robotik Etiketler:, , , , , , , ,