Engelden Kaçan Robot Yapımında HC-SR04 Ultrasonic Sensör Kullanımı
Merhabalar,
Bu çalışmada sizlere Hc-SR04 ultrasonic sensörün çalışma mantığını, nasıl kullanıldığını açıklamaya çalıştım. Örnek olması açısından bu sensörü kullanarak Engelden Kaçan Robot projesi gerçekleştirdim.
Umarım sizler için faydalı olmuştur. Videomu beğendiyseniz lütfen beğene tıklamayı ve kanalıma abone olmayı unutmayın :)
Teşekkürler...
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