Menü

PIC Mikrodenetleyici Kullanarak Engelden Kaçan Robot

9 Aralık 2017 - Genel, pic
4.5 (90%) 4 votes

    Engelden Kaçan Robot  Nasıl Çalışır ?

Engelden Kaçan Robot herhangi bir uzaklık sensörü ile önündeki cisimlere olan uzaklığını ölçen ve belli bir mesafeden sonra çarpmamak için yön değiştiren robottur.

Kullanılan Malzemeler

  1. PIC16F877A
  2. IR Sensor (2 Tane)
  3. Ultrasonic Sensor
  4. DC Motor (2Tane)
  5. L293D Motor Sürücü Devresi
  6. Araba Gövdesi
  7. Power bank (Herhangi bir Güç Kaynağı)
  8. 9V’luk Batarya
  9. Kondansatörler(10uF, 0.1uF, 2 tane 22pF )
  10. Kristal (C-4.0000)
  11. 7805 Transistör

 

Hc-sr04 Ultrasonik Mesafe Sensörü Nasıl Çalışır ?

Hc-sr04 ultrasonik mesafe sensörü zaman diagramı aşağıda gösterilmektedir. Ölçümün başlaması için Trig pini en az 10 uS de +5V almalıdır. Böylelikle sensörden  40 kHZ’de 8 devir ses dalgası dışarıya iletilir ve yansıması beklenir. Hc-sr04 alıcıdan sesl dalgasını aldığında Echo pini 0V dan 5V a geçer ve mesafeyle orantılı bir süre bekler. Biz burda Echo pinindeki genişliği ölçerek , aradaki mesafeyi elde edebiliriz.

Zaman = Echo pin genişliği , uS (mikro saniye)

Ultrasonik zamanlama

Trigger signal______:  Trig pini aktif olduğunda gönderilen 1 adet sinyaldir.

Module send out____:  Trig pini aktif olduğunda tek seferde 40kHz de  8 adet kare dalga sinyal gönderir.

Output on pin Echo__:  Yansıyan dalgaların dönüşte Echo pininde oluşturduğu sinyaldir.

PIC Mikrodenetleyici Bağlantı Şeması

16f877a ile ilgili görsel sonucu

PIC Mikrodenetleyiciye Yazılan KOD :

#include <xc.h>

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 20000000
#define Trigger RB1 //34 is Trigger
#define Echo RB2//35 is Echo

int time_taken;
int distance;

void back_off() //used to drive the robot backward
{
RC4=1; RC5=0; //Motor 1 reverse
RC6=0; RC7=1; //Motor 2 reverse
__delay_ms(1000);
}

void calculate_distance() //function to calculate distance of US
{
TMR1H =0; TMR1L =0; //clear the timer bits

Trigger = 1;
__delay_us(10);
Trigger = 0;

while (Echo==0);
TMR1ON = 1;
while (Echo==1);
TMR1ON = 0;

time_taken = (TMR1L | (TMR1H<<8));
distance= (0.0272*time_taken)/2;
}

void main()
{
TRISD = 0x00; //PORTD declared as output for interfacing LCD
TRISB1 = 0; //Trigger pin of US sensor is sent as output pin
TRISB2 = 1; //Echo pin of US sensor is set as input pin
TRISB3 = 0; //RB3 is output pin for LED

TRISD2 = 1; TRISD3 = 1; //Both the IR sensor pins are declared as input
TRISC4 = 0; TRISC5 = 0; //Motor 1 pins declared as output
TRISC6 = 0; TRISC7 = 0; //Motor 2 pins declared as output

T1CON=0x20;

while(1)
{

calculate_distance();
if (distance>5)
{
RC4=0; RC5=1; //Motor 1 forward
RC6=1; RC7=0; //Motor 2 forward
}

calculate_distance();
if (RD2==0 && RD3==1 && distance<=5) //Left sensor is blocked
{
back_off();
RC4=1; RC5=1; //Motor 1 stop
RC6=1; RC7=0; //Motor 2 forward
__delay_ms(500);
}

calculate_distance();
if (RD2==1 && RD3==0 && distance<=5) //Right sensor is blocked
{
back_off();
RC4=0; RC5=1; //Motor 1 forward
RC6=1; RC7=1; //Motor 2 stop
__delay_ms(500);
}

calculate_distance();
if (RD2==0 && RD3==0 && distance<=5)//Both sensor is open
{
back_off();
RC4=0; RC5=1; //Motor 1 forward
RC6=1; RC7=1; //Motor 2 stop
__delay_ms(500);
}

calculate_distance();
if (RD2==1 && RD3==1 && distance<=5)//Both sensor is blocked
{
back_off();
RC4=1; RC5=0; //Motor 1 reverse
RC6=1; RC7=1; //Motor 2 stop
__delay_ms(1000);
}

}
}

 

Bu Kodu MPLABX programıyla yazılıp derlendi. Expkits CCS arayüzü ile entegreye kod atıldı.

 

L298 Motor Sürücü Entegresi

L298 motor sürücü entegresi genellikle L293D ve L293B gibi motor sürücü entegrelerin maksimum akım sınırlarını aşan motorların kontrolü için tercih edilen 15 bacaklı bir motor sürücü entegredir.

L298 motor sürücü entegre kullanımında voltaj sınırı 46 V, akım sınırı ise 2 A değerindedir.

L298 motor sürücü entegre de L293 motor sürücü entegreler gibi içerisinde 2 adet H köprüsü bulundurur ve iki motoru bağımsız ve çift yönlü olarak kontrol edebilir.

L298 Motor Sürücü Bacak Yapısı

Yukarıda L298 motor sürücü entegresinin bacak yapısı verilmiştir. Burada 5. ve 7. bacaklar birinci motorun, 10. ve 12. bacaklar ise ikinci motorun çift yönlü kontrolleri için giriş bacakları olup 2. ve 3. bacaklar ve 13. ve 14. bacaklar ise bunlara karşılık gelen çıkış bacaklarıdır. L298 4. bacağına kontrol etmek istenilen motora uygun voltaj verilmeli ve bu voltaj değeri 46 V değerini aşmamalıdır. 9 numaralı bacağa uygulanacak olan voltaj 5 V değerindedir. 8 numaralı bacak ise toprak bağlantısının yapılacağı bacaktır.

                       Projenin Yapım Aşaması

Projemizi yapmaya başlarken ilk önce malzeme listesi çıkardık.Malzemeleri test ettikten sonra MPLABX programıyla kod derlenip  Expkits CCS kullanılarak PIC’e kodlar atıldı.

 

Motor sürücü devresini test etmek amacıyla entegresiz çalıştırdık.Motorların çalışırken aynı yönde dönmesini sağladık.Motorların çalıştığını gördükten sonra devreyi kurma aşamasına geçtik.Devreyi kurduktan sonra sensörlerin engel algıladığını görmüş olduk.Güç kaynağı ile devreye 9 volt verip motorlara 12 volt gerilim uyguladık.Motorlara 12 volt verdiğimiz zaman robotun çok hızlı manevra yapması sebebiyle gerilimi 5 volta düşürmeye karar verdik.Yazdığımız kodların doğruluğunu test ettik.Sonra da güç kaynağı yerine taşınabilir batarya(power bank ve 9 voltluk pil) kullanarak robota monte ettik.

 

Robotun tekerlekleri ağırlığı dengeleyemediği için düz zeminde boş yere çok döndüğünden dolayı ve power bank’i robota monte edebilmek için kartonlardan resimde görülen şekli oluşturduk.Bu şekli motorların arasına yapıştırdık.

 

Fotoğrafta görülen son hale getirmiş olduk.

İşte Thisfriend !

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Araç çubuğuna atla