Engelden Kaçan Robot Yapımında HC-SR04 Ultrasonic Sensör Kullanımı

Gerekli Malzemeler:
1 adet arduino kontrol kartı (UNO-NANO),
1 adet L298N motor sürücü kartı
1 adet HC-SR04 Ultrasonic Sensör,
1 adet SG90 9gr servo,
4 adet N20 12mm 60-300ROM arası motor
4 adet tekerlek,
4 adet 3cm distans,
1 adet 110x70x6mm dakota levha
1 adet 80x70x6mm dakota levha
Pil ve jumper kablo
Devre Şeması:
Motor Mount Thingverse:
Arduino Kodu:
//Mucit Pilot 2020 Engelden Kaçan Robot Projesi
//servo kütüphanesini çağıralım
#include <Servo.h>
//motor pinlerini tanımladık
#define MotorL1 6
#define MotorL2 9
#define MotorLE 5
#define MotorR1 2
#define MotorR2 4
#define MotorRE 3
//ultrasonic sensör pinleri
#define trigPin 8
#define echoPin 7
//myservo adında bir servo nesnesi oluşturduk
Servo myservo;
//değişkenler
boolean ileriGit=false;
int mesafe = 100;
int solspeed=200;
int sagspeed=240;
long gecenSure;
void setup() {
pinMode(MotorR1, OUTPUT);
pinMode(MotorR2, OUTPUT);
pinMode(MotorL1, OUTPUT);
pinMode(MotorL2, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
myservo.attach(10); //servoyu 10.pine bağladım
myservo.write(100); //servonun ortada durması için deneyerek değer verdim
delay(2000);
//ultrasonic sensör çalışması
digitalWrite(trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin,LOW);
gecenSure= pulseIn(echoPin, HIGH);
mesafe= (gecenSure/2) / 29.1; //29.1 e bölmemizin sebebi cm'ye dönüşüm için
delay(100);
//Serial.begin(9600);
}
void loop() {
int mesafeR = 0;
int mesafeL = 0;
delay(40);
// Serial.println(distance);
// Serial.println();
if(mesafe <= 20) //mesafe 20cmden küçük eşitse
{
dur();
delay(200);
geriGit();
delay(700);
dur();
delay(200);
mesafeR = sagaBak();
delay(300);
mesafeL = solaBak();
delay(300);
if(mesafeR>=mesafeL)
{
sagaDon();
dur();
}
else
{
solaDon();
dur();
}
}
else
{
ilerle();
}
//tekrar yeni mesafe ölçümü alıyoruz
digitalWrite(trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin,LOW);
gecenSure= pulseIn(echoPin, HIGH);
mesafe= (gecenSure/2) / 29.1;
}
int sagaBak()
{
myservo.write(0); //servoyu tam sağa çevir
delay(500);
digitalWrite(trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin,LOW);
gecenSure= pulseIn(echoPin, HIGH);
mesafe=(gecenSure/2) / 29.1;
delay(100);
myservo.write(100); //servoyu ortala
return mesafe;
delay(100);
}
int solaBak()
{
myservo.write(180); //servo tam sola
delay(500);
digitalWrite(trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin,LOW);
gecenSure= pulseIn(echoPin, HIGH);
mesafe=(gecenSure/2) / 29.1;
delay(100);
myservo.write(100); //servoyu ortala
return mesafe;
delay(100);
}
void dur() { // Robotun durma hareketi için fonksiyon tanımlıyoruz.
digitalWrite(MotorR1, LOW);
digitalWrite(MotorR2, LOW);
digitalWrite(MotorL1, LOW);
digitalWrite(MotorL2, LOW);
}
void ilerle() {
if(!ileriGit)
{
ileriGit=true;
digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, sagspeed);
digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, solspeed);
}
}
void geriGit() {
ileriGit=false;
digitalWrite(MotorR1, LOW);
digitalWrite(MotorR2, HIGH);
analogWrite(MotorRE, sagspeed);
digitalWrite(MotorL1, LOW);
digitalWrite(MotorL2, HIGH);
analogWrite(MotorLE, solspeed);
}
void sagaDon() {
digitalWrite(MotorR1, LOW);
digitalWrite(MotorR2, HIGH);
analogWrite(MotorRE, sagspeed);
digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, solspeed);
delay(600); //motorlarınızın hızına göre kaç derece dönüş yapacağınızı ayarlayabilirsiniz.
digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, sagspeed);
digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, solspeed);
}
void solaDon() {
digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, sagspeed);
digitalWrite(MotorL1, LOW);
digitalWrite(MotorL2, HIGH);
analogWrite(MotorLE, solspeed);
delay(600);
digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, sagspeed);
digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, solspeed);
}
Yorumlar
Yorum Gönder