Merhaba arkadaşlar bu yazımda arduino ile hazırlamış olduğum otomatik park sistemini sizlerle paylaşacağım.
Park sistemini bir Motorsiklet entegre edeceğiz.
Malzemeler
- 5 adet ultrasonik sensör
- 1 adet servo motor
- 2 adet DC motor
Kod
Öncelikle değişkenleri tanımlamakla başlayalım;
Servo sDireksiyon; int onTrig=13,solTrig=11,sagTrig=9,arkaSolTrig=7,arkaSagTrig=5;//ultrasonik sensör int onEcho=12,solEcho=10,sagEcho=8,arkaSolEcho=6,arkaSagEcho=4; float onUzaklik,solUzaklik,sagUzaklik,arkaSolUzaklik,arkaSagUzaklik; int motorileri=2,motorgeri=3; int solkir=80,sagkir=150;// açılar
Ultrasonik sensörler için trig ve echo’ları tanımladık, sensörlerden aldığımız bilgileri uzaklık değişkenlerine atadık. motor ileri ve motor geri ön ve arka motorları temsil ediyor, solkir ve sağ kir değişkenleri ise direksiyonun açılarını belirtiyor. Şimdi void setup() kısmına bakalım.
void setup() { sDireksiyon.attach(1); pinMode(motorileri,OUTPUT); pinMode(motorgeri,OUTPUT); pinMode(onTrig,OUTPUT); pinMode(solTrig,OUTPUT); pinMode(sagTrig,OUTPUT); pinMode(arkaSolTrig,OUTPUT); pinMode(arkaSagTrig,OUTPUT); pinMode(onEcho,OUTPUT); pinMode(solEcho,OUTPUT); pinMode(sagEcho,OUTPUT); pinMode(arkaSolEcho,OUTPUT); pinMode(arkaSagEcho,OUTPUT); sDireksiyon.write(60);//başlangıç direksiyon açısı Serial.begin(9600); }
Pinmode ile tanımlamaları yaptık. Ve Direksiyonun başlangıç açısını belirledik. Şimdi ultrasonik sensörlerden aldığımız bilgileri uzaklık değişkenlerine atacağımız bir fonksiyon yazalım;
float uzaklikHesap(int trig,int echo) { digitalWrite(trig,HIGH); delay(100); digitalWrite(trig,LOW); float hesap; hesap=pulseIn(echo,HIGH); hesap=(hesap/2)/29.1; return hesap; } void mesafeler() { onUzaklik=uzaklikHesap(onTrig,onEcho); solUzaklik=uzaklikHesap(solTrig,solEcho); sagUzaklik=uzaklikHesap(sagTrig,sagEcho); arkaSolUzaklik=uzaklikHesap(arkaSolTrig,arkaSolEcho); arkaSagUzaklik=uzaklikHesap(arkaSagTrig,arkaSagEcho); }
Mesafeleri ölçtüğümüze göre ileri geri ve dur fonksiyonlarını yazalım.
void ileriGit() { digitalWrite(motorileri,HIGH); digitalWrite(motorgeri,LOW); } void geriGit() { digitalWrite(motorileri,LOW); digitalWrite(motorgeri,HIGH); } void dur() { digitalWrite(motorileri,LOW); digitalWrite(motorgeri,LOW); }
Şimdi Direksiyon kontrolünü sağlayan fonksiyonu yazalım.
void direksiyonKontrol(int baslangic,int bitis) { int i; if(baslangicbitis;i--) { sDireksiyon.write(i); } } }
Fonksiyon tanımlamalarımız bittiğine göre loop kısmını yazmaya başlayalım. İlk önce mesafeleri kontrol ediyoruz. Motorun önünde ki duvar ile arasında ki mesafe 150 cm’den kısa ise motorları durduruyoruz, sağı ve solu kontrol ediyoruz hangi taraf boş ise o tarafa doğru direksiyonu kırıyoruz. Sağ veya Sol taraflardan hangisi boş ise onun tarafına doğru ilerler. Daha sonra Bu hareketin tam tersini yapıp motoru düzeltir. Motor ile duvar arasında ki mesafe korunduğu zaman motor arkaya doğru ilerlemeye başlar ve ilk bulduğu duvar ile arasında ki mesafe 150 cm olduğu yerde park işlemini tamamlamış olur.
void loop() { mesafeler(); if(onUzaklik<150) { dur(); if(solUzaklik<150) { geriGit(); //direksiyonu Sola kır direksiyonKontrol(solkir,sagkir); delay(500); dur(); direksiyonKontrol(sagkir,solkir); ileriGit(); delay(500); dur(); sDireksiyon.write(50);// direksiyonu normale döndür while(arkaSolUzaklik>150 && arkaSagUzaklik>150) { mesafeler(); geriGit(); } bitir(); } else if(sagUzaklik>150) { geriGit(); //direksiyonu Sağa kır direksiyonKontrol(sagkir,solkir); delay(500); dur(); direksiyonKontrol(solkir,sagkir); ileriGit(); delay(500); dur(); sDireksiyon.write(50);// direksiyonu normale döndür while(arkaSolUzaklik>150 && arkaSagUzaklik>150) { mesafeler(); geriGit(); } } } else { ileriGit(); } }
Park algoritması bu kadar arkadaşlar umarım işinize yarayacak bir yazı olmuştur,Projenin kaynak kodlarına buradan ulaşabilirsiniz, bir sonra ki yazımda görüşmek üzere.