Başlangıç > Python, Robotik > Arduino ve Python ile Basit Radar Uygulaması – 2. Kısım

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

  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Yorum bırakın