Hareketli Kapıdan Geçen Arduino Araba Yapımı

HalilSenn

Üye
Katılım
2 Ocak 2019
Mesajlar
10
Puanları
1
Yaş
28
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.
 
HaliSenn Merhabalar;
Uygulama için kullanacağınız Hc-Sr04 mesafe sensöründen faydalanarak engele sizin örnekte hareketli kapıya olabildiğince yaklaşacaksınız ve motoru sıfır hıza çekeceksiniz kapı açıldığı anda olabildiğince hızlı olarak araba boyu nekadar ise bu mesafe boyunce hareket edip akabinde hemen sıfır hıza ineceksiniz ki diğer kapıya çarpmayasınız,kurguyu bu şekilde tasarlarsanız olabilir.

Kolay Gelsin
 
Merhabalar önerileriniz için teşekkür ederim. Ancak bir sorunum var. Elimdeki sensör ile şuan engel ''var'' veya ''yok'' olarak işletebiliyorum. Hareketli bir engel olduğunda ise motor ''run'' ''stop'' yapıyor. Yani engeli aşağı yukarı hareket ettirdiğimde varsa duruyor, yoksa hareket ediyor. Önünde durduramıyorum maalesef.
 
Şu an elinizdeki sensör on of bir sensör bu işi böyle bir sensör ile çözmeniz çok zor mesafe sensörü kullanıp mesafeye göre algoritmayı çalıştırmanız gerek.
 
Merhaba bu sensorü bende kullandim. Hc-Sr04 mesafeyi artieksi 2 cm ölcüyor. Hc-Sr04 kütüphanesini ekledikten sonra
#include "SR04.h"
su kodla mesafeyi ölcersin:
a = sr04.Distance();
Bir if veya while coduyla 5 cm ye kadar rahatlikla yaklasabilisin.
 
Son düzenleme:
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;
https://i.hizliresim.com/4jrARA.jpg
 
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?
 

Motorları pwm ile sürmüyor musun. Düz gitmesini bu şekilde sağlayabilirsin. Birde bitirme projesi olarak gayet kolay bir proje. Bari bir wifi ya da bluetooth bağlantı ekleseydin. Mesela araç telefonla da çalışabilsin. Sana kıdemli bir arge mühendisi önerisi...Yoksa iş görüşmelerinde sıkıntı çıkarabilir...
 
Cevabınız için teşekkür ederim. PWM deneyeceğim, eğer her şey yolunda giderse telefonla çalıştırmayıda eklemeyi deneyeceğim.
The problem is that it's hard to make the car go straight. Giving the same PWM value to the motors still makes them spin in different speeds, trying to calibrate the value is hard and every time I recharge my batteries the value changes.
Böyle bir yazı okudum, L298N kullanmış ancak yinede farklı hızlarda dönmüş. Pusula sensörü alıp denemek en sağlıklısı gibi duruyor şimdilik. Olursa sonucunu buraya yazarım.
 
Son düzenleme:
Düz gitme sorunu için encoder kullandım ancak araç yinede düz gitmiyor. Kodlamada mı bir sıkıntı var 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);

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

}

void loop() {
// put your main code here, to run repeatedly:

}
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…