elektrik port üyelik servisleri elektrik port üyelik servisleri

Arduino ve Ultrasonik Sensör ile Engelden Kaçan Robot Yapımı

Engelden kaçan robot, önündeki engeli otomatik olarak algılayabilen ve kendisini başka yöne çevirerek engelden kaçabilmektedir. Arduino ve ultrasonik sensör kullanarak yapacağımız bu proje hakkındaki detaylar yazımızın devamında.



A- A+
12.10.2021 tarihli yazı 990 kez okunmuştur.

Engelden Kaçmak İçin Ultrasonik Sensör Nasıl Kullanılır

Robotu yapmaya başlamadan önce ultrasonik sensörün nasıl çalıştığını anlamak önemlidir. Çünkü bu sensör engeli tespit etmek için önemli bir role sahiptir. Ultrasonik sensörün çalışmasındaki temel prensip, sensörün ultrasonik ışınları iletmek ve ultrasonik ışınları yüzeye çarptıktan sonra almak için geçen süreyi not etmektir. Daha sonra mesafe, formül kullanılarak hesaplanır. Bu projede, yaygın olarak kullanılan HC-SR04  Ultrasonik Sensör kullanılmıştır.

►İlginizi Çekebilir: Arduino SPI Haberleşme Nedir?
 
Böylece, HC-SR04’ün Trig pini en az 10us için yüksek yapılır. Her biri 40 KHz’lik 8 darbe ile bir sonik ışın iletilir.


►İlginizi Çekebilir: Arduino I2C Haberleşme Nedir?
 
Sinyal yüzeye çarpar ve geri döner. HC-SR04’ün alıcı pini olan Echo tarafından yakalanır.


►İlginizi Çekebilir: Arduino Pinleri ve Fonksiyonları
 
Işının geri dönüş süresi değişken olarak kaydedilir ve aşağıdaki formül ile mesafe hesaplanır:
Mesafe= (Zaman x Havadaki Ses Hızı (343 m/s))/2

 

Kullanılan Malzemeler

► Arduino uno veya nano
► HC-SR04 Ultrasonik Sensör
► L298N Motor Sürücü
► 5V DC Motor
► Batarya
► Tekerler
► Şasi
► Jumper kablo

Devre Şeması




Engelden Kaçan Robot için Arduino Kodu

HC-SR04’ün trig ve echo pinleri tanımlanır. Trig pini Arduino nano’nun GPIO9’a ve echo pini ise Arduino nano’nun GPIO10 pinine bağlanmıştır.

int trigPin = 9;      // trig pin of HC-SR04
int echoPin = 10;     // Echo pin of HC-SR04


L298N Motor Sürücüsü için giriş pinleri tanımlanır. L298N, kendisine bağlı motorun yönünü kontrol etmek için kullanılan 4 tane veri giriş pinine sahiptir.

int revleft4 = 4;       //REVerse motion of Left motor
int fwdleft5 = 5;       //ForWarD motion of Left motor
int revright6 = 6;      //REVerse motion of Right motor
int fwdright7 = 7;      //ForWarD motion of Right motor

 

Setup() fonksiyonunda, kullanılan GPIO pinlerinin veri yönleri tanımlanır. Dört motor pini ve trig pini OUTPUT olarak   tanımlanır ve echo pini INPUT olarak tanımlanır.

pinMode(revleft4, OUTPUT);      // set Motor pins as output
pinMode(fwdleft5, OUTPUT);
pinMode(revright6, OUTPUT);
pinMode(fwdright7, OUTPUT);
pinMode(trigPin, OUTPUT);         // set trig pin as output
pinMode(echoPin, INPUT);          //set echo pin as input to capture reflected waves


loop fonksiyonunda, HC-SR04 ile hesaplanan mesafeye göre motor yönü ayarlanır. Mesafe, robotun önüne gelen nesne mesafesini gösterecektir.

digitalWrite(trigPin, LOW);
delayMicroseconds(2);  
digitalWrite(trigPin, HIGH);     // send waves for 10 us
delayMicroseconds(10);
duration = pulseIn(echoPin, HIGH); // receive reflected waves
distance = duration / 58.2;   // convert to distance
delay(10);


Mesafe, tanımlanan mesafeden daha büyükse, yolunda hiçbir engel yoktur ve ileri yönde hareket edecektir.

if (distance > 19)           
            {
            digitalWrite(fwdright7, HIGH);                    // move forward
            digitalWrite(revright6, LOW);
            digitalWrite(fwdleft5, HIGH);                               
            digitalWrite(revleft4, LOW);                                                      
            }


Mesafe, tanımlanan mesafeden daha az ise, ileride bir engel var demektir. Bu durumda robot bir süre duracak ve geriye doğru hareket edecek, daha sonra tekrar bir süre duracak ve sonra başka bir yöne dönecektir.

if (distance < 18)
             {
             digitalWrite(fwdright7, LOW);  //Stop               
             digitalWrite(revright6, LOW);
             digitalWrite(fwdleft5, LOW);                               
             digitalWrite(revleft4, LOW);
             delay(500);
             digitalWrite(fwdright7, LOW);      //movebackword        
             digitalWrite(revright6, HIGH);
             digitalWrite(fwdleft5, LOW);                               
             digitalWrite(revleft4, HIGH);
             delay(500);
             digitalWrite(fwdright7, LOW);  //Stop               
             digitalWrite(revright6, LOW);
             digitalWrite(fwdleft5, LOW);                               
             digitalWrite(revleft4, LOW); 
             delay(100); 
             digitalWrite(fwdright7, HIGH);      
             digitalWrite(revright6, LOW);  
             digitalWrite(revleft4, LOW);                                
             digitalWrite(fwdleft5, LOW); 
             delay(500);
            }


Bu şekilde robot, yolundaki herhangi bir engele takılmadan hareket edecektir.

Kod:

int trigPin = 9;      // trig pin of HC-SR04
int echoPin = 10;     // Echo pin of HC-SR04
 
int revleft4 = 4;       //REVerse motion of Left motor
int fwdleft5 = 5;       //ForWarD motion of Left motor
int revright6 = 6;      //REVerse motion of Right motor
int fwdright7 = 7;      //ForWarD motion of Right motor
 
long duration, distance;
 
void setup() {
 
  delay(random(500,2000));   // delay for random time
  Serial.begin(9600);
  pinMode(revleft4, OUTPUT);      // set Motor pins as output
  pinMode(fwdleft5, OUTPUT);
  pinMode(revright6, OUTPUT);
  pinMode(fwdright7, OUTPUT);
 
  pinMode(trigPin, OUTPUT);         // set trig pin as output
  pinMode(echoPin, INPUT);          //set echo pin as input to capture reflected waves
}
 
void loop() {
 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);  
  digitalWrite(trigPin, HIGH);     // send waves for 10 us
  delayMicroseconds(10);
  duration = pulseIn(echoPin, HIGH); // receive reflected waves
  distance = duration / 58.2;   // convert to distance
  delay(10);
    // If you dont get proper movements of your robot then alter the pin numbers
  if (distance > 19)           
  {
    digitalWrite(fwdright7, HIGH);                    // move forward
    digitalWrite(revright6, LOW);
    digitalWrite(fwdleft5, HIGH);                               
    digitalWrite(revleft4, LOW);                                                      
  }
 
  if (distance < 18)
  {
    digitalWrite(fwdright7, LOW);  //Stop               
    digitalWrite(revright6, LOW);
    digitalWrite(fwdleft5, LOW);                               
    digitalWrite(revleft4, LOW);
    delay(500);
    digitalWrite(fwdright7, LOW);      //movebackword        
    digitalWrite(revright6, HIGH);
    digitalWrite(fwdleft5, LOW);                               
    digitalWrite(revleft4, HIGH);
    delay(500);
    digitalWrite(fwdright7, LOW);  //Stop               
    digitalWrite(revright6, LOW);
    digitalWrite(fwdleft5, LOW);                               
    digitalWrite(revleft4, LOW); 
    delay(100); 
    digitalWrite(fwdright7, HIGH);      
    digitalWrite(revright6, LOW);  
    digitalWrite(revleft4, LOW);                                
    digitalWrite(fwdleft5, LOW); 
    delay(500);
  }
 
}

 

Kaynaklar:

arduino.cc/en/reference/wire
dronebotworkshop.com/i2c-arduino-arduino/
 


Aktif etkinlik bulunmamaktadır.
ANKET
Endüstri 4.0 için En Hazır Sektör Hangisidir

Sonuçlar