Hareketli Kapıdan Geçen Arduino Araba

HalilSenn

MB Üyesi
Kayıt
2 Ocak 2019
Mesajlar
13
Tepkiler
3
Yaş
28
Üniv
Adnan Menderes Üniversitesi
Merhabalar herkese kolay gelsin. 4. sınıf elektrik elektronik öğrencisiyim ve bitirme projesi olarak hareketli kapılardan geçen bir araç yapacağım. Demo olarak engel algılayan ve motoru durduran bir araç tasarladım ancak bu aracın hareketli engelde durmasını nasıl sağlayacağımı bilmiyorum. Engeli önünden çektiğim anda motorlar çalışmaya başlıyor ve araç hareketleniyor. Bu şekilde olursa kapıya çarpacak. Algoritması hakkında yardımcı olacak birisi varsa çok sevinirim. Şimdilik araştırmalarıma göre Arduino UNO ve Hc-Sr04 kullanarak yapacağım.
Tam olarak yapmayı planladığım araç videodadır. Yardımlarınız için şimdiden teşekkür ederim.
 

Mücahit Arslan

Yetkili Kişi
Yönetici
Kayıt
13 Ekim 2016
Mesajlar
244
Tepkiler
99
Meslek
Yüksek Teknoloji Ar-Ge Mühendisi
Üniv
Staffordshire University
Ben olsam önce kapının periyodik bir biçimde açılıp açılmadığına karar vermekle başlardım algoritmaya. Bu işlemi de şöyle yapmak gerekiyor;
robot kapının önüne geldikten sonra ilk kapalı/açık olma durumunu değerlendirmemeli, çünkü robot oraya ulaştığında kapı kaç saniyedir kapalı ve kaç saniye sonra açılacak bunu tahmin edemezsin. O yüzden, kapının açık olduğu ilk durumun hemen sonrasındaki süreç değerlendirmeye alınmalı. Kapı açık konumundan kapalı konumuna kaç saniyede geçiyor ilk döngüde bunun tespiti yapılmalı. Ardından bir döngü daha beklenerek kapı ikinci seferde açık durumundan kapalı durumuna kaç saniyede geçiyor bu saptanmalı. Eğer birinci ve ikinci döngüdeki süreler eşit ise program robota kapının periyodik olarak açıldığını bildirmeli. Bu süre senin motorların içerisindeki ramp current'ı ve motorların aktif hale geçme süresini de hesaba katarak kapı açılır açılmaz robotun engeli geçmesi için gereken toplam zamanı hesaplamana yardım edecektir.
 
Konu sahibi
Konu sahibi
HalilSenn

HalilSenn

MB Üyesi
Kayıt
2 Ocak 2019
Mesajlar
13
Tepkiler
3
Yaş
28
Üniv
Adnan Menderes Üniversitesi
Cevabınız için teşekkür ederim. Ancak kapılar açıkken robot kapıya geldiğini nasıl anlayacak? Bu durum kafamı hayli karıştırıyor.
 

sansar2564

MB Üyesi
Kayıt
22 Mayıs 2016
Mesajlar
59
Tepkiler
20
Meslek
Elektrik Elektronik Mühendisi
Üniv
Konya Teknik Üniversitesi
Cevabınız için teşekkür ederim. Ancak kapılar açıkken robot kapıya geldiğini nasıl anlayacak? Bu durum kafamı hayli karıştırıyor.
Bir çok yolu olabilir ama benim aklıma ilk şu geldi:
Kapıya geldiğini anlamak için kapının biraz gerisine beyaz bir çizgi koyup robotun çizgiyi algılamasını sağlayabilirsiniz.
 

Mücahit Arslan

Yetkili Kişi
Yönetici
Kayıt
13 Ekim 2016
Mesajlar
244
Tepkiler
99
Meslek
Yüksek Teknoloji Ar-Ge Mühendisi
Üniv
Staffordshire University
Bu tarz yakın mesafe engel tespitlerinde genellikle basit bir kızıl ötesi veya akustik sensörler kullanılır. Maliyet açısından benim tavsiyem kızıl ötesi sensör koymandır.
 
Konu sahibi
Konu sahibi
HalilSenn

HalilSenn

MB Üyesi
Kayıt
2 Ocak 2019
Mesajlar
13
Tepkiler
3
Yaş
28
Üniv
Adnan Menderes Üniversitesi
Bir çok yolu olabilir ama benim aklıma ilk şu geldi:
Kapıya geldiğini anlamak için kapının biraz gerisine beyaz bir çizgi koyup robotun çizgiyi algılamasını sağlayabilirsiniz.
Teşekkürler bunu hocamla konuşacağım. Mantıklı bir yol gibi geldi

Bu tarz yakın mesafe engel tespitlerinde genellikle basit bir kızıl ötesi veya akustik sensörler kullanılır. Maliyet açısından benim tavsiyem kızıl ötesi sensör koymandır.
Şuan elimde MZ80 ve HCSR04 sensörleri var. Demoyu HCSR ile hazırladım ancak MZ80 in tepkime süresi daha yüksek olduğu için onu kullanmayı düşünüyorum. Kodlamamı değiştirip birde MZ80 kızılötesi sensörle deneyeceğim.
 

Mücahit Arslan

Yetkili Kişi
Yönetici
Kayıt
13 Ekim 2016
Mesajlar
244
Tepkiler
99
Meslek
Yüksek Teknoloji Ar-Ge Mühendisi
Üniv
Staffordshire University
Takıldığın bir nokta olursa yardımcı olmaya çalışırız.
 
Konu sahibi
Konu sahibi
HalilSenn

HalilSenn

MB Üyesi
Kayıt
2 Ocak 2019
Mesajlar
13
Tepkiler
3
Yaş
28
Üniv
Adnan Menderes Üniversitesi
Hareketli engeli algılayıp önünde durması için önerileriniz varsa yardımınızı alabilirim. sansar2564'ün söylediğine ek olarak, benimde aklıma kapının kenarındaki tahtaları görüp ona göre durdurmak geliyor. Ancak kapının kenarındaki tahtayı görüp durduktan sonra engeli algılayıp tekrar hareket ettirmek sorun olur mu onda biraz tereddütteyim.
 

Mücahit Arslan

Yetkili Kişi
Yönetici
Kayıt
13 Ekim 2016
Mesajlar
244
Tepkiler
99
Meslek
Yüksek Teknoloji Ar-Ge Mühendisi
Üniv
Staffordshire University
Sen kızıl ötesi bir sensörü öncelikle robota dahil etmeden kapıya belli bir mesafede yerleştir. Sonra sensörün kapı açıkken ve kapalıyken verdiği cevapları analiz et. Arada mutlaka bir fark göreceksin. Bu fark yoğunluk olabilir, intensity olabilir, diversity olabilir ama mutlaka bir fark göreceksin. Gördüğün farktan sonra yazılım üzerinde gerekli algoritmayı hazırla. Zor olmadığını göreceksin. Öte yandan, alternatif bir metot istersen LabVIEW ile basit bir görüntü işleme programı yazıp kapının açık/kapalı durumunu algılayıp ona göre de bir algoritma geliştirebilirsin. Bir yerden başlaman gerekiyor.
 
Konu sahibi
Konu sahibi
HalilSenn

HalilSenn

MB Üyesi
Kayıt
2 Ocak 2019
Mesajlar
13
Tepkiler
3
Yaş
28
Üniv
Adnan Menderes Üniversitesi
Algoritmayı kafamda oluşturdum ve kapının önünde durma meselesini şöyle çözmeye karar verdim;
İki mod olacak, arayış ve geçiş modu. Arayış modundayken karşıda bir engel olup olmadığını araştıracak. Ses dalgası bir engele çarparsa mesafeyi hesaplayıp (örneğin 45cm), ona göre bir mesafeden sonra duracak (42cm gibi). Eğer öndeki engeli görmeyip onun yerine arkadaki engeli görürse diye engel aramayı sürekli devam ettirecek ve en kısa mesafeyi hafızasında tutup orada duracak.
Durduktan sonra maksimum hızda araba boyu+3cm kadar gidip tekrar duracak ve arama moduna tekrar dönecek.
Algoritma şeması bu şekilde;
 

Dosyalar

Mücahit Arslan

Yetkili Kişi
Yönetici
Kayıt
13 Ekim 2016
Mesajlar
244
Tepkiler
99
Meslek
Yüksek Teknoloji Ar-Ge Mühendisi
Üniv
Staffordshire University
Şuan için algoritmada bir sıkıntı gözükmüyor. Zaten herhangi bir sıkıntı varsa da bunu uygulamada görüp gerekli önlemleri alırsın.
 
Konu sahibi
Konu sahibi
HalilSenn

HalilSenn

MB Üyesi
Kayıt
2 Ocak 2019
Mesajlar
13
Tepkiler
3
Yaş
28
Üniv
Adnan Menderes Üniversitesi
Tekrar merhabalar.
Projemi hayata geçirmek için malzemeleri alacağım. Ancak kafama bir soru takıldı. Demo aracım şuan düz gitmiyor, sağa çekiyor biraz. Aracın düz gitmesi için encoder şart mı acaba? Pusula sensörüyle aracımı düz bir doğrultuda götürebilir miyim?
 

Mücahit Arslan

Yetkili Kişi
Yönetici
Kayıt
13 Ekim 2016
Mesajlar
244
Tepkiler
99
Meslek
Yüksek Teknoloji Ar-Ge Mühendisi
Üniv
Staffordshire University
Aracın neden düz gittiğini tespit etmeni öneririm öncelikle. Mekanik bir durum olmadığından emin olmalısın önce.
 
Konu sahibi
Konu sahibi
HalilSenn

HalilSenn

MB Üyesi
Kayıt
2 Ocak 2019
Mesajlar
13
Tepkiler
3
Yaş
28
Üniv
Adnan Menderes Üniversitesi
Motorların çektiği akımları ve voltajlarını ölçtüğümde aralarında güç farkı var. Bu yüzden bir teker daha hızlı dönüyor. Bunu enkoderle giderip tekerlere tur saydırıyorlar genelde ancak ben bunu sadece pusula sensörüyle yapabilir miyim diye merak ediyorum.
İlgili tarihte otomatik birleştirildi:

Düz gitme işini halletmek için encoder kullandım ancak aracım yinede düz gitmiyor. Kodun herhangi bir yerinde eksik gören var mı acaba? Yardımcı olabilir misiniz?

const byte MOTOR_SAG = 3;
const byte MOTOR_SOL = 2;

const float stepcount = 20.00;
const float wheeldiameter = 60.00;

volatile int counter_A = 0;
volatile int counter_B = 0;

//Motor sağ
int enA = 10;
int in1 = 9;

//Motor sol
int enB = 5;
int in3 = 7;

//Motor sağ pulse counter
void ISR_countA()
{
counter_A++;
}
//Motor sol pulse counter
void ISR_countB()
{
counter_B++;
}

int CMtoSteps(float cm)
{
int result;
float circumference = (wheeldiameter * 3.14) / 10;
float cm_step = circumference / stepcount;

float f_result = cm / cm_step;
result = (int) f_result;
return result;
}

void MoveForward(int steps, int mspeed)
{
counter_A = 0;
counter_B = 0;

//Motor sağ ileri
digitalWrite(in1, HIGH);
//Motor sol ileri
digitalWrite(in3, HIGH);

//Sayılan sayı bitene kadar ilerle
while (steps > counter_A && steps > counter_B)
{ if(steps > counter_A)
{ analogWrite(enA, mspeed);}
else
{ analogWrite(enA, 0); }
if (steps > counter_B)
{ analogWrite(enB, mspeed); }
else
{analogWrite(enB, 0);}
}

// Bittiğinde durdur
analogWrite(enA, 0);
analogWrite(enB, 0);
counter_A = 0;
counter_B = 0;
}
void setup() {
attachInterrupt(digitalPinToInterrupt (MOTOR_SAG), ISR_countA, RISING);
attachInterrupt(digitalPinToInterrupt (MOTOR_SOL), ISR_countB, RISING);

//cm sonra durdur
MoveForward(CMtoSteps(5000),255);
delay(1000);

}

void loop() {


}
İlgili tarihte otomatik birleştirildi:

GitHub'ta kod araştırdım ancak bütün kodlar hareketsiz bir engelden kaçmaya yönelik, aracı hareketli bir engelin önünde nasıl durdurabilirim?
 
Son düzenleme:
Yukarı Alt