"Enter"a basıp içeriğe geçin

Çizgi İzleyen Robotlar için Sensör Fonksiyonu

Robot yaparken mekaniğiniz ve elektroniğiniz çok iyi olabilir, hatta belki yazılımınız da iyidir ancak fonksiyonlarınız ve algoritmalarınızda eksikler vardır. Amacınıza ulaşırsınız ancak epey vakit kaybedersiniz. Geçen hafta 12-15 Mayıs 2015 tarihleri arasında yapılan MEB Robot yarışmasında çizgi izleyen robot kategorisinde farklı üniversitelerden arkadaşlarla birlikte hakemdim.

Yapılan robotların bir çoğu bir birinin aynısıyken bir çoğu da okul bazında kopyala yapıştır robotlardı. Hepsinin ortak noktası mekanik ve elektronik bakımından tam yazılım kısmında eksiği olan robotlar olmasıydı. Türkiye’de robot çalışmaları üzerinde elektronik ve mekanik tasarımda zirveye ulaşılmış ancak yazılım konusunda çok eksiğimiz olduğu açıktı.

Yeni robotçuların yazılımda kendilerini geliştirmeleri ve fikir sahibi olmaları açısından örnek fonkisyonlar paylaşmanın faydalı olacağını düşünüp bu yazıyı yazma kararı aldım. Umarım kopyala yapıştır robotçuları değil de fikir edinip yazılım konusunda kendini geliştiren robotçular oluruz.

Uzun zaman önce RoboGazi Mekanik atelyede Fatih ARICI (bilgisayarcıdır kendisi) ile PID kodu üzerinde çalışırken bir sensör okuma algoritması geliştirdik. Çoğunluğunu Fatih yazdı, internetten aşırdıklarımızla harmanlanan güzel bir algoritma çıktı ortaya. Bu algoritmanın basitleştirilmiş halini burada paylaşacağım. Fonksiyon normal bildiğimiz fonksiyonlardan biraz farklı olarak pointer mantığıyla çalıştığı için 2 tane değer döndürüyor. Kullanımını da paylaşacağım için anlamama sorunu olmayacaktır.

Kod Basit Çizgi İzleyen Robot yazıdaki robot için yapılmıştır bu yüzden giriş-çıkış, açık şema gibi bilgileri bu yazımdan öğrenebilirsiniz.

#include <16F877A.h>
#device adc=10
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
 
#use delay(clock=20000000)
 
#use fast_io(a)
#use fast_io(c)

#include "fonk_cizgi.c"

unsigned int8 Sensorler=0,GorenSensorler=0,solpwm=0,sagpwm=0;
unsigned int8 Cizgi=0;

void main()
{
   setup_timer_2(T2_DIV_BY_1,249,1); //50.0 us overflow, 50.0 us interrupt
   setup_ccp1(CCP_PWM); // ccp1 ucu pwm çıkışı olarak ayarlandı
   setup_ccp2(CCP_PWM); // ccp2 ucu pwm çıkışı olarak ayarlandı
   set_tris_a(0xFF); // a portunu giriş olarak ayarla
   set_tris_c(0xF0);
   output_low(Sag_Motor_In1);
   output_low(Sol_Motor_In1);
   while(true) //sonsuz döngü
   {
      CNY_Oku(Sensorler,GorenSensorler);
      switch(Sensorler)
      {
         case -16:
            SolPWM = 200;
            SagPWM = 0;
            break;
         case -10:
            SolPWM = 200;
            SagPWM = 100;
            break;   
         case -4:
            SolPWM = 200;
            SagPWM = 120;
            break;
         case -2:
            SolPWM = 200;
            SagPWM = 160;
            break;
         case 0:
            SolPWM = 200;
            SagPWM = 200;
            break;
         case 2:
            SolPWM = 160;
            SagPWM = 200;
            break;
         case 4:
            SolPWM = 120;
            SagPWM = 200;
            break;
         case 10:
            SolPWM = 100;
            SagPWM = 200;
            break;
         case 16:
            SolPWM = 0;
            SagPWM = 200;
            break;
      }
      set_pwm1_duty(SolPWM);
      set_pwm2_duty(SagPWM);
    }
}

 

///////////////////////////////////////////////////////////////////////////
////                                                                   ////
////                         fonk_cizgi.c                              ////
////                                                                   ////
//// Bu kütüphane Ankakit kartı için tasarlanmıştır.                   ////
////                                                                   ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 2013, 2015 Anka Elektronik                   ////
//// Ankakit kartı için gerekli tanımlamalar ve ön krulum fonksiyoları ////
//// içeren bu kütüphane 2014 Ocağından itibaren geliştirilmeye devam  ////
//// etmektedir. İlk Önemli adımlar Mart 2015 tarihinde atılmış olup   ////
//// geliştirme süreci hızlandırılmıştır.                              ////
////                                                                   ////
////                                            Emrah BUDAK            ////
///////////////////////////////////////////////////////////////////////////

#include "fonk_cizgi.h"
extern unsigned int8 Cizgi;
unsigned int8 cizgi_say=0;

void CNY_Oku(signed int8 &Sensor, unsigned int8 &Goren_Sensor)
{
   unsigned int8 CNYs[7];
   signed int8  Sensor_Deger = 0.0;
   if(Zemin==0)//zemin beyazsa
   {
      CNYs[0] = CNY1;
      CNYs[1] = CNY2;
      CNYs[2] = CNY3;
      CNYs[3] = CNY4;
      CNYs[4] = CNY5;
   }
   else //zemin siyahsa
   {
      CNYs[0] = !CNY1;
      CNYs[1] = !CNY2;
      CNYs[2] = !CNY3;
      CNYs[3] = !CNY4;
      CNYs[4] = !CNY5;
   }
   Goren_Sensor = CNYs[0] + CNYs[1] + CNYs[2] + CNYs[3] + CNYs[4];   
   if (Goren_Sensor!=0)
   {
      Sensor_Deger = CNYs[0] * (Agirlik1)   +
                     CNYs[1] * (Agirlik2)   +
                     CNYs[2] * (Agirlik3)   +
                     CNYs[3] * (Agirlik4)   +
                     CNYs[4] * (Agirlik5)   ;
   
      Sensor =(signed int8)Sensor_Deger/Goren_Sensor; //çikacak olan değerler -16,-10,-4,-2,0,2,4,10,16
   }
   
   //// düz çizgi sayma /////////////////////////   
   if(Goren_Sensor>=3 && cizgi_say==0)cizgi_say=1;
   if(Goren_Sensor<=2 && cizgi_say==1)
   {
      cizgi_say=0;
      Cizgi++;  
   }
}

 

///////////////////////////////////////////////////////////////////////////
////                                                                   ////
////                         fonk_cizgi.h                              ////
////                                                                   ////
//// Bu kütüphane Ankakit kartı için tasarlanmıştır.                   ////
////                                                                   ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 2013, 2015 Anka Elektronik                   ////
//// Ankakit kartı için gerekli tanımlamalar ve ön krulum fonksiyoları ////
//// içeren bu kütüphane 2014 Ocağından itibaren geliştirilmeye devam  ////
//// etmektedir. İlk Önemli adımlar Mart 2015 tarihinde atılmış olup   ////
//// geliştirme süreci hızlandırılmıştır.                              ////
////                                                                   ////
////                                            Emrah BUDAK            ////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////

#ifndef _FONK_CIZGI
#define _FONK_CIZGI

#define Zemin  1  //1=siyah - 0=beyaz
#define CNY1   input(pin_a0)
#define CNY2   input(pin_a1)
#define CNY3   input(pin_a2)
#define CNY4   input(pin_a3)
#define CNY5   input(pin_a5)


#define  Sag_Motor_In1  pin_c3
#define  Sol_Motor_In1  pin_c0
#define  Sag_Motor_PWM  pin_c1
#define  Sol_Motor_PWM  pin_c2


#define  Agirlik1       -16
#define  Agirlik2       -4
#define  Agirlik3       0
#define  Agirlik4       4
#define  Agirlik5       16

void CNY_Oku(signed int8 &Sensor, unsigned int8 &Goren_Sensor);

#endif

 

 

İlk Yorumu Siz Yapın

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir