Mekanik
Fotoğraflarını paylaştığım çizgi izleyen robot en basit ve en zahmetsiz bir çizgi izleyen yapmak için yapılmıştır. Çizgi izleyen iki pleksiden oluşmaktadır. Birinci pleksi 10×8.5 cm lik olan motoru ve kontrol kartının montaj edileceği pleksidir. İkinci pleksi 8×5 cm lik sensörlerin ve sarhoş tekerleğin montaj edileceği pleksidir. Birinci pleksinin 8.5 cm lik olan kısmının uzun olduğunu düşünebilirsiniz ancak robotun şaha kalkmaması için ağırlık merkezinin tekerlerin biraz önünde olması gerekmektedir. Bu yüzden robotta her bir parçayı tek tek tarttığımızda en ağır parçası olan pili koymak için bu kadar uzun tutulmuştur. En boy oranı olarak 1.1 ila 1.4 arasında tasarım yapabilirsiniz. Eğer en boy oranınız 1.1 olursa motorlarınızdaki en ufak bir pwm değişimiyle çok çabuk yönünü değiştirebilirsiniz. Bu tür bir tasarım düşük hızlı motorlar için uygundur. Eğer motorlarınız çok hızlıysa motorun en boy oranını 1.4 lere çekmeniz gerekmektedir. Bu değerler uzun denemeler ile elde edilmiştir. En boy oranı iki tekerleğin yere değdikleri noktaların uzunluğunun sarhoş tekere olan dik uzanlığına oranıdır.
Elektronik
Devre tasarımı bir robotun planlamasında en başta yapılması gereken bir bölümüdür. Ancak PCB tasarımı robotun mekanik tasarımı yapıldıktan sonra yapılmalıdır. Paylaşacağım devre tasarımı en az elemanla yapılabilecek bir devre tasarımıdır. Mikro denetleyici olarak Pic16F877A kullanmış olmamıza rağmen bu tasarımdaki bir robot için Pic16F876A mikro denetleyicisi de yeterlidir. Elimde kullanmadığım 877A olduğu için tasarımı 877A ile yaptım.
Toplam çekilen akımı azaltmak için 4 tane CNY70 bir birine seri bağlanarak 1 ohmluk direnç bağlanmıştır. 5. CNY70 ise 100 ohmluk direnç ile beslemeye bağlanmıştır. Kristal 4 ya da 20 MHz kullanılabilinir ve motor akımları yükte 900 mA ‘i geçmemelidir.
*Program CCS C derleyicisinde yazılmıştır. On-Off Kontrol programı
#
include
<16F877A.h>
#device adc=10
#FUSES HS
//High speed Osc (> 4mhz)
#
use
delay(clock=20000000)
#
use
fast_io (a)
#
use
fast_io (c)
void main()
{
set_tris_a(0xFF);
set_tris_c(0xF0);
while
(true)
{
if
(input(pin_a0)==1)
{
output_c(0x0a);
// Sağ geri sol ileri
}
if
(input(pin_a1)==1)
{
output_c(0x02);
// Sağ duruyor sol ileri
}
if
(input(pin_a2)==1)
{
output_c(0x06);
// Sağ ileri sol ileri
}
if
(input(pin_a3)==1)
{
output_c(0x04);
// Sağ ileri sol duruyor
}
if
(input(pin_a5)==1)
{
output_c(0x05);
// Sağ ileri sol geri
}
}
}
PWM programı
#
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)
unsigned int8 sensorler=0,solpwm=0,sagpwm=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);
while
(true)
//sonsuz döngü
{
sensorler = input_a();
// A porundaki tüm pinleri oku
sensorler = sensorler *
"b00101111"
;
// Sensörden gelen değerleri maskeleyerek al
// birinci ifade beyaz zemin üzeri siyah çizgi için
// ikinci ifade siyah zemin üzerine beyaz çizgi için
//Düz git
if
(sensorler==
"b00000100"
|| sensorler==
"b00101011"
)
{
solpwm=990;
sagpwm=990;
}
//sola dön vites1
if
(sensorler==
"b00000110"
|| sensorler==
"b00101001"
)
{
solpwm=700;
sagpwm=990;
}
//saga dön vites1
if
(sensorler==
"b00001100"
|| sensorler==
"b00100011"
)
{
solpwm=990;
sagpwm=700;
}
//sola dön vites2
if
(sensorler==
"b00000010"
|| sensorler==
"b00101101"
)
{
solpwm=500;
sagpwm=990;
}
//saga dön vites2
if
(sensorler==
"b00001000"
|| sensorler==
"b00100111"
)
{
solpwm=990;
sagpwm=500;
}
//sola dön vites3
if
(sensorler==
"b00000011"
|| sensorler==
"b00101100"
)
{
solpwm=300;
sagpwm=990;
}
//saga dön vites3
if
(sensorler==
"b00101000"
|| sensorler==
"b00000111"
)
{
solpwm=990;
sagpwm=300;
}
//sola dön vites4
if
(sensorler==
"b00100000"
|| sensorler==
"b00001111"
)
{
solpwm=0;
sagpwm=990;
}
//saga dön vites4
if
(sensorler==
"b00000001"
|| sensorler==
"b00101110"
)
{
solpwm=990;
sagpwm=0;
}
set_pwm1_duty(solpwm);
set_pwm2_duty(sagpwm);
}
}
Projenin proteus dosyalarını buradan indirebilirsiniz.iNdirme Sitesi: http://www.emrahbudak.com/indir/cizgi_izleyen_robot.rar
0 Yorumlar