Engelden kaçan robot projesi, temel robotik sistemleri ve Arduino kullanımını öğrenmek için mükemmel bir projedir. Bu projede, ultrasonik sensör kullanarak robotun engelleri algılaması ve hareket yönünü değiştirmesi sağlanacaktır.
Gerekli Malzemeler
- 1 x Arduino Uno (veya benzeri bir model)
- 1 x L298N motor sürücü modülü
- 2 x DC motor (tekerleklerle birlikte)
- 1 x Ultrasonik sensör (HC-SR04)
- 1 x Servo motor (ultrasonik sensörü döndürmek için)
- Robot şasesi (isteğe bağlı)
- 1 x Güç kaynağı (pil veya adaptör)
- Bağlantı kabloları ve breadboard
Devre Bağlantıları
Motor Bağlantıları
- Motor sürücü kartının IN1, IN2, IN3 ve IN4 pinlerini Arduino'nun dijital pinlerine bağlayın (örn. 8, 9, 10, 11).
- Motor sürücünün motor çıkışlarını (OUT1, OUT2, OUT3, OUT4), DC motorlara bağlayın.
- Motor sürücü kartının VCC pinini pilin pozitif ucuna, GND pinini negatif ucuna bağlayın.
Ultrasonik Sensör Bağlantıları
- Trig pinini Arduino'nun 6 numaralı pinine, Echo pinini 7 numaralı pinine bağlayın.
- VCC ve GND pinlerini sırasıyla Arduino'nun 5V ve GND pinlerine bağlayın.
Servo Motor Bağlantıları
- Servo motorun sinyal pinini Arduino'nun 3 numaralı pinine bağlayın.
- VCC ve GND pinlerini sırasıyla Arduino'nun 5V ve GND pinlerine bağlayın.
Arduino Kodu
Aşağıdaki kod, engelleri algılayan ve yön değiştiren bir robot için temel işlevleri içerir:
#include servo.h
// L298N Motor sürücü pinleri
#define ENA 5 // Motor A için PWM (Sağ motor)
#define ENB 6 // Motor B için PWM (Sol motor)
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
// Ultrasonik sensör pinleri (Çakışma düzeltildi!)
#define TRIG 7 // HC-SR04 TRIG → Arduino 7
#define ECHO 12 // HC-SR04 ECHO → Arduino 12
// Servo motor pini
#define SERVO_PIN 3
Servo servo; // Servo motor nesnesi
int motorSpeed = 150; // Motor hızı (0 - 255 arası)
void setup() {
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
servo.attach(SERVO_PIN);
servo.write(90); // Servo başlangıçta ortada
Serial.begin(9600);
}
void loop() {
int distance = measureDistance();
Serial.print("Mesafe: ");
Serial.println(distance);
if (distance < 20) { // Engel algılanırsa
stopMotors();
delay(500);
int rightDistance = checkRight();
int leftDistance = checkLeft();
Serial.print("Sağ: ");
Serial.print(rightDistance);
Serial.print(" | Sol: ");
Serial.println(leftDistance);
if (rightDistance > leftDistance && rightDistance > 20) {
turnRight();
} else if (leftDistance > 20) {
turnLeft();
} else {
moveBackward(); // Eğer her iki yön de kapalıysa geri git
}
} else {
moveForward(); // Engel yoksa düz git
}
}
// Mesafe ölçme fonksiyonu
int measureDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH);
int distance = duration * 0.034 / 2;
return (distance > 400 || distance == 0) ? 400 : distance; // Maksimum 400 cm göster
}
// Sağ mesafeyi kontrol et
int checkRight() {
servo.write(0);
delay(700);
int distance = measureDistance();
delay(200);
servo.write(90);
delay(700);
return distance;
}
// Sol mesafeyi kontrol et
int checkLeft() {
servo.write(180);
delay(700);
int distance = measureDistance();
delay(200);
servo.write(90);
delay(700);
return distance;
}
// Motor hareket fonksiyonları (PWM ile hız kontrolü eklendi)
void moveForward() {
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void moveBackward() {
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(1000);
}
void turnRight() {
analogWrite(ENA, motorSpeed / 2); // Sağa dönerken sağ motor yavaş
analogWrite(ENB, motorSpeed);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(500);
}
void turnLeft() {
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed / 2); // Sola dönerken sol motor yavaş
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(500);
}
void stopMotors() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
Kod Açıklamaları
Mesafe Ölçme
measureDistance()
fonksiyonu, ultrasonik sensör ile mesafeyi ölçer.
Yön Kontrolü
- Robot, sağ ve sol mesafeleri kontrol eder ve engelin olmadığı tarafa döner.
Motor Hareketleri
moveForward()
,turnRight()
,turnLeft()
vestopMotors()
fonksiyonları, motorların hareketini kontrol eder.
Proje Prensibi
- Ultrasonik sensör, önündeki engelin mesafesini ölçer.
- Mesafe belirli bir değerin altına düştüğünde robot durur.
- Sağ ve sol mesafeler kontrol edilerek, uygun tarafa dönülür ve robot tekrar ilerlemeye başlar.
Projenin çalışan örneğini görmek için tıklayınız.
Not: Tinkercad üzerinde L298N motor sürücü modülü olmadığından bu örnek L293D motor sürücü üzerinden yapılmıştır. Simülasyon üzerinde çalışan kodlar bu modüle göre düzenlenmiştir.
Ekstra İpuçları
Hassasiyet Ayarı
- Mesafe ölçüm hassasiyetini artırmak için çevresel parazitlerden kaçının.
Hız Kontrolü
- Motor hızlarını ayarlamak için PWM sinyalleri kullanılabilir.
Bu proje, engellerden kaçınan bir robot yapımını temel düzeyde anlamanıza yardımcı olur. Projeyi daha karmaşık hale getirmek için sensör sayısını artırabilir veya farklı robotik sistemler entegre edebilirsiniz.
Sıkça Sorulan Sorular
Engelleri algılayarak yön değiştiren bir robot türüdür. Ultrasonik sensör kullanarak engellerin mesafesini ölçer ve hareket yönünü otomatik olarak belirler.
Robot, ultrasonik sensör yardımıyla mesafeyi ölçer. Bir engel algıladığında durur, sensör yardımıyla sağ ve sol mesafeleri kontrol eder ve engelin olmadığı yöne doğru ilerler.
HC-SR04 sensörü, ses dalgaları gönderip yansıyan dalgaları algılayarak mesafeyi ölçer. Mesafe belirli bir değerin altına düştüğünde engel algılanmış olur.
Servo motor, ultrasonik sensörü sağa ve sola döndürmek için kullanılır. Bu, robotun farklı yönlerde mesafe ölçmesini sağlar.
L298N, DC motorların hızını ve yönünü kontrol etmeyi sağlar. Arduino’dan gelen sinyalleri motorlara ileterek hareket sağlar.
Kodlar, ultrasonik sensörden mesafe okumayı, motorları kontrol etmeyi ve yön belirlemeyi içerir. Ayrıca engelin olduğu yöne dönme ve hareket devam ettirme işlevlerini içerir.
Hız kontrolü için PWM (Pulse Width Modulation) sinyalleri kullanılabilir. Arduino’da analogWrite
fonksiyonu ile motor hızını ayarlayabilirsiniz.
Sensör bağlantıları veya mesafe ölçüm kodlarında hata olabilir. Ayrıca motorların doğru bağlandığından ve sürücüye uygun sinyal gönderildiğinden emin olun.
- Daha fazla sensör ekleyerek çevresel algılama artırılabilir.
- Robotun hız ve yön kontrolü için Bluetooth veya Wi-Fi modülleri entegre edilebilir.
- Kameralı bir sistem eklenerek görsel algılama yapılabilir.
Evet, Tinkercad’de HC-SR04 ultrasonik sensör, L293D motor sürücü ve Arduino kullanılarak bu projenin simülasyonu yapılabilir.
- Ultrasonik sensörün trig ve echo pinleri doğru bağlanmamış olabilir.
- Kodda mesafe ölçüm formülü hatalı olabilir.
- Güç kaynağının yeterli voltajı sağladığından emin olun.
Bu Gönderiye Yorum Yapılmamış