1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
Nis
20th

Maden Arama Robotu

CCS kullanarak Pic 16f874 ile maden arama robotu uygulamasında kullanılan aşağıdaki kodlar gezgin robotların ileri, geri sağa sola dönme işlevlerini nasıl gerçekleştirdiği, robot amacına ulaştığında nasıl davranması gerektiği gibi konularda önemli bilgiler vermektedir.

Ödül almış olan bu projede mayın tespit etme işlemi reed röle dizisiyle yapılmaktadır.

reedarray.JPG

evrede ouptut çıkışıdan sürekli ‘1′ verilmekte pull-down irenci ile gene bu çıkış pini sıfıra çekilmiÅŸtir. EÄŸer ortamda maden bulunursa reed röle dizisinin kontaklarından
biri çekilir ve input girişinden maden bulundu bilgisi okunur.

Konuyla ilgili daha ayrıntılı biilgiye buradan ulaşabilirsiniz

/************************************************************************/
/* Çeviri: www.ccspic.com
/*
/* Açıklama: CCS kullanarak Pic 16f874 ile maden arama robotu
/*
/*
/* Program akış diyagramı: */
/* (*) Herhangi bir anda mıknastıslanma olursa dur ve sinyal ver. */
/* (1) Bir sınır bul ve hangi yöne dönüleceğine karar ver. */
/* (2) Dön ve düz devam et */
/* (3) Bir sınır bulunursa ~45-90 derece arası rastgele dön. */
/* (4) Aracın boyu kadar düz git */
/* (5) Aynı yönde 3. adımdaki gibi ~45-90 derece arası rastgele dön. */
/* (6) Yönünü tersle whichWayToTurn (Sağ yada sol) */
/* (7) Düz devam et -- 3. adıma git */
/* */
/* --------------------------------------------------------------------- */
/* PIC giriş çıkş pinlerinin dağılımı */
/* --------------------------------------------------------------------- */
/* AN0 */
/* AN1 Analog giriş - Sağ sınınr sensörü */
/* AN2 */
/* AN3 Analog giriş - Sol sınınr sensörü */
/* AN4 */
/* AN5 Analog giriş - Orta sınınr sensörü */
/* AN6 */
/* AN7 */
/* RB0 Orta sınınr sensörü kızılötesi ledi */
/* RB1 Uyarı buzzer */
/* RB2 Uyaı LED */
/* RB3 Debugger kullanımında */
/* RB4 Sol sınınr sensörü kızılötesi ledi */
/* RB5 Sağ sınınr sensörü kızılötesi ledi */
/* RB6 Debugger kullanımında */
/* RB7 Debugger kullanımında */
/* RC0 */
/* RC1 CCP2 -- SaÄŸ motor kontrol sinyali */
/* RC2 CCP1 -- Sol motor kontrol sinyali */
/* RC3 */
/* RC4 */
/* RC5 Debug LED (1) */
/* RC6 Debug LED (2) */
/* RC7 */
/* RD0 */
/* RD1 */
/* RD2 Çıkış -- Reed röle dizisine 1 verilir */
/* RD3 Input -- Reed röle dizisinden okunur */
/* */
/**********************************************************************/
#include <16F874.H>
#fuses HS, NOWDT, NOPROTECT
#use delay( clock = 1000000 )
//—————————————————————————-
// Fonksiyon başlıkları
void stop_motors();
void robot_forward();
void mine_check();
void mine_detected();
void test_for_borders();
void robot_backup();
void turn_left();
//—————————————————————————-
// DeÄŸiÅŸkenler
long int pwm_value; // motor kontrol bilgisi
long int adca; // ADC’den okunan deÄŸer
int clock = 0; // sayıcı
int straighten = 0;
int i;
int dead_lock = 0;
long int random = 1;
/* optik sensörler için ikili değer */
enum Bool{ F, T };
Bool ORleft = F;
Bool ORcenter = F;
Bool ORright = F;
/* yön tayini için basit numaralandırma */
enum TurnDirection{ LEFT, RIGHT, NONE };
TurnDirection whichWayToTurn = NONE;
//—————————————————————————-
main()
{
//======================================================
// Programın başlatılması
setup_ccp1( CCP_PWM ); //  CCP1 PWM olarak ayarlanır
setup_ccp2( CCP_PWM ); // CCP2 PWM olarak ayarlanır
setup_timer_2( T2_DIV_BY_16, 200, 1 ); // PWM ayarı 

stop_motors();
// A portu analog çevrim için ayrılır
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
output_high( PIN_D2 ); // Reed röle çıkışı
//Başlangıç uyarısı
output_high(PIN_B2); //LED
output_high(PIN_B1); //Buzzer
delay_ms(1000);
output_low(PIN_B2);
output_low(PIN_B1);
delay_ms(1000);
//=======================================================
// Ana program iÅŸlemleri
//======================================================
//ROBOT ileri
robot_forward();
do{
random++; //rastgele değeri artırılır
mine_check();
test_for_borders();
//—————————————————
if(ORcenter)
{ 

robot_backup();
delay_ms(500); 

stop_motors();
delay_ms(400); 

turn_left();
delay_ms(450); 

stop_motors();
delay_ms(400); 

robot_forward();
random++;
}
else
{
if( ORleft || ( ORleft && ORcenter ) )
{
whichWayToTurn = RIGHT;
break;
}
if( ORright || ( ORright && ORcenter ) )
{
whichWayToTurn = LEFT;
break;
}
}
if (straighten > 50 )
{
output_high(PIN_C5);
pwm_value = 0;
set_pwm1_duty(pwm_value); //Sol Motor durdurulur
pwm_value = 83;
set_pwm2_duty(pwm_value); //SaÄŸ Motor ileri
delay_ms(120);
pwm_value = 104;
set_pwm1_duty(pwm_value); //Sol Motor ileri
straighten = 0;
output_low(PIN_C5);
random++; //rastgele değeri artırılır
random++; //rastgele değeri artırılır
}
straighten++;
delay_ms(20);
}
while(1);
//STOP ROBOT
stop_motors();
output_high(PIN_B2); //LED
output_high(PIN_B1); //Buzzer
delay_ms(300);
output_low(PIN_B2);
output_low(PIN_B1);
delay_ms(300);
//—————————————————————- 

//Sağa yaa sola dön özelliği çalıştırılır.
straighten = 0;
// Ana arama ÅŸablonu
for (;;)
{
random++; //rastgele değeri artırılır
// Mayın kontrolü
mine_check();
//Sınır kontrolü
test_for_borders();
//——————————————————————
// Sınır bulunursa
if( ORcenter || ORleft || ORright ){
//Dur
stop_motors();
delay_ms(250); 

robot_backup();
delay_ms(300); 

stop_motors();
delay_ms(250);
//Sağ sol kontrolü
if (whichWayToTurn == LEFT)
{
//90 derece sola dön
pwm_value = 65;
set_pwm1_duty(pwm_value); //Sol motor geri
pwm_value = 83;
set_pwm2_duty(pwm_value); //SaÄŸ motor geri 

//En az 45 derece dönülür
for (i = 0; i < 5; i++)
{
delay_ms(74);
mine_check();
}
//Rastgeleyi bul
for (i=0; i < (random % 5); i++)
{
delay_ms(74);
mine_check();
}
}
else //whichWayToTurn == saÄŸ
{
//90 derece sağ dönüşü
pwm_value = 104;
set_pwm1_duty(pwm_value); //Sol motor ileri
pwm_value = 125;
set_pwm2_duty(pwm_value); //SaÄŸ motor geri
//En az 45 derece dönülür
for (i = 0; i < 5; i++)
{
delay_ms(74);
mine_check();
}
//Rastgeleyi bul
for (i=0; i < (random % 5); i++)
{
delay_ms(74);
mine_check();
}
}
//-----------------------------------------
//Sınır sensörleri ve mayın araması dönüş esansında
//kontrol edilir
mine_check();
test_for_borders();
if(ORcenter || ORleft || ORright)
{
//Motorları durdur
stop_motors();
delay_ms(250);
//Sağa 90 derece dönüş
pwm_value = 104;
set_pwm1_duty(pwm_value); //Sol motor ileri
pwm_value = 125;
set_pwm2_duty(pwm_value); //SaÄŸ motor geri
//delay_ms(1400); // ~180 dönüş yapar
for (i = 0; i < 20; i++)
{
delay_ms(70);
mine_check();
}
//deadlock deÄŸikeni kurulur
dead_lock = 1;
}
if (dead_lock == 0)
{
//Motorları durdur
stop_motors();
delay_ms(250);
//------------------------------
//| 1 yol ileri!!!! |
//------------------------------
//Robot ileri
//Bu döngü 800ms çalışarak 1 yol ileri gidilir
for (i = 0; i < 40; i++)
{
robot_forward();
mine_check();
test_for_borders();
if(ORcenter || ORleft || ORright)
{
//Motorları durdur
stop_motors();
delay_ms(250); 

pwm_value = 104;
set_pwm1_duty(pwm_value); //Sol motor ileri
pwm_value = 125;
set_pwm2_duty(pwm_value); //SaÄŸ motor geri
//delay_ms(1400); // ~180 degrees
for (i = 0; i < 20; i++)
{
delay_ms(70);
mine_check();
}
//Set deadlock var
dead_lock = 1;
random++; //Rastgele değeri artırılır
random++; //Rastgele değeri artırılır
random++; //Rastgele değeri artırılır
}
delay_ms(20);
} //for döngüsü
//Motorları durdur
stop_motors();
delay_ms(250);
if(dead_lock == 0)
{
random++; //Random değeri artırılır
//Sağa yada sola kontrolü
if (whichWayToTurn == LEFT)
{
//90 derece sola dönüş
pwm_value = 65;
set_pwm1_duty(pwm_value); //Sol motor geri
pwm_value = 83;
set_pwm2_duty(pwm_value); //SaÄŸ motor ileri
//delay_ms(740); *Still check for mines!!!
//En az 45 derece dönülür
for (i = 0; i < 5; i++)
{
delay_ms(74);
mine_check();
}
//NOW GET RANDOM
for (i=0; i < (random % 5); i++)
{
delay_ms(74);
mine_check();
}
}
else
{
//Right Turn 90 degrees
pwm_value = 104;
set_pwm1_duty(pwm_value); //Sol motor ileri
pwm_value = 125;
set_pwm2_duty(pwm_value); //SaÄŸ motor geri
//delay_ms(740); *Still check for mines!!!
//En az 45 derece dönülür
for (i = 0; i < 5; i++)
{
delay_ms(74);
mine_check();
}
//Rastgele bulunur
for (i=0; i < (random % 5); i++)
{
delay_ms(74);
mine_check();
}
}
}
else { dead_lock = 0;}
//Robot durdurulur
stop_motors();
delay_ms(250);
} // dead_lock #1 sonnu
else { dead_lock = 0; }
if (whichWayToTurn == RIGHT)
{
whichWayToTurn = LEFT;
}
else
{
whichWayToTurn = RIGHT;
}
//Robot ileri
robot_forward();
} //if (ORcenter || ORleft || ORright) koÅŸulu sonu
//------------------------------------------------------------------
if (straighten > 50 )
{
output_high(PIN_C5);
pwm_value = 0;
set_pwm1_duty(pwm_value); //Sol Motor durdurulur
pwm_value = 83;
set_pwm2_duty(pwm_value); //SaÄŸ motor ileri
delay_ms(120);
pwm_value = 104;
set_pwm1_duty(pwm_value); //Sol motor ileri
straighten = 0;
output_low(PIN_C5);
}
straighten++;
delay_ms(20);
} // for(;;) döngüsü sonu
} // main sonu
//=================================================
void stop_motors()
{
pwm_value = 0; // 0% Duty Cycle
set_pwm1_duty(pwm_value);
set_pwm2_duty(pwm_value);
}
void robot_forward()
{
pwm_value = 104;
set_pwm1_duty(pwm_value); //Sol motor ileri
pwm_value = 83;
set_pwm2_duty(pwm_value); //SaÄŸ motor ileri
straighten=0;
}
void mine_check()
{
if( input( PIN_D3 ) )
{
mine_detected();
}
}
void mine_detected()
{
//**********************************//
//* Her iki motor durdurulur *//
//**********************************//
stop_motors();
//**********************************//
//* Led yakıp söndür, ses çıkar  *//
//* 3 defalık *//
//**********************************//
for (i = 0; i < 3; i++)
{
output_high(PIN_B2); //LED
output_high(PIN_B1); //Buzzer
delay_ms(250);
output_low(PIN_B2);
output_low(PIN_B1);
delay_ms(400);
}
//**********************************//
//* Robot geri *//
//**********************************//
robot_backup();
delay_ms( 150 );
//**********************************//
//* Dur ve 3 saniye bekle *//
//**********************************//
stop_motors();
delay_ms(3000);
//**********************************//
//* Mayın tespitinden çık *//
//**********************************//
//Robot ileri
robot_forward();
}
void test_for_borders()
{
//### Sol sınır kontrolü ###
// sol optik sensörü kontrolü ve okuması
set_adc_channel(3);
output_high( PIN_B4 );
delay_ms(1);
adca = Read_ADC();
output_low( PIN_B4 );
if( adca <= 100 ){
ORleft = T;
//numORon++;
}
else ORleft = F;
//### Orta sınır kontrolü ###
// Orta optik sensörü kontrolü ve okuması
set_adc_channel(5);
output_high( PIN_B0 );
delay_ms(1);
adca = Read_ADC();
output_low( PIN_B0 );
if( adca <= 100 ){
ORcenter = T;
//numORon++;
}
else ORcenter = F;
//### Sağ sınır kontrolü ###
// sağ optik sensörü kontrolü ve okuması
set_adc_channel(1);
output_high( PIN_B5 );
delay_ms(1);
adca = Read_ADC();
output_low( PIN_B5 );
if( adca <= 100 ){
ORright = T;
//numORon++;
}
else ORright = F;
}
void robot_backup()
{
// SaÄŸ motor geri
pwm_value = 125; //20%
set_pwm2_duty(pwm_value);
// Sol motor geri
pwm_value = 65; //10%
set_pwm1_duty(pwm_value);
}
void turn_left()
{
//Sola dön
pwm_value = 65;
set_pwm1_duty(pwm_value); //Sol motor geri
pwm_value = 83;
set_pwm2_duty(pwm_value); //SaÄŸ motor ileri
//delay_ms(715); //~90 degrees
}
Share and Enjoy:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google

Benzer Yazılar

Post a Comment