Arduino Engel Algılayan ve Çizgi İzleyen Robot

Şu anda konuyu okuyanlar (Üyeler: 1, Ziyaretçi & Botlar: 0)


HalilSenn

Üyecik
Katılım
13 Nis 2019
Mesajlar
3
Puanları
1
Merhaba arkadaşlar çizgi izleyen ve engel geçen araç yapıyorum. Çizgi izleme ve engele gelmede bir sorun yaşamıyorum ancak engelin önünde durduktan sonra aracın bir kez daha engel görmesini istiyorum. Bir kez daha engeli gördükten sonra geçecek. Eğer bunu yaptırmazsam engel yok diyerek geçmek isteyecek, belkide engel kapanırken denk gelecek ve engelle çarpışacak. O yüzden 1 kere daha engeli gördükten sonra geç işlemini nasıl yaptırabilirim?
#define SensorSol 4 //left sensor
#define echoPin 12
#define trigPin 11
#define SensorSag 2 //right sensor

long sure, uzaklik; //duration, distance

#define MotorR1 9
#define MotorR2 8
#define MotorRE 10

#define MotorL1 7
#define MotorL2 6
#define MotorLE 5



void setup() {

pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(SensorSol, INPUT);
pinMode(SensorSag, INPUT);

pinMode(MotorR1, OUTPUT);
pinMode(MotorR2, OUTPUT);
pinMode(MotorRE, OUTPUT);

pinMode(MotorL1, OUTPUT);
pinMode(MotorL2, OUTPUT);
pinMode(MotorLE, OUTPUT);

Serial.begin(9600);


}

void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

sure = pulseIn(echoPin, HIGH);
uzaklik = (sure / 2) / 29.1 ;
Serial.print("uzaklik: ");
Serial.println(uzaklik);
if (uzaklik > 5 ) {
if(digitalRead(SensorSol) == 0 && digitalRead(SensorSag) == 0){
ileri();
}

if(digitalRead(SensorSol) == 0 && digitalRead(SensorSag) == 1){
sag();
}

if(digitalRead(SensorSol) == 0 && digitalRead(SensorSag) == 0){
ileri();
}

if(digitalRead(SensorSol) == 1 && digitalRead(SensorSag) == 0){
sol();
}

if(digitalRead(SensorSol) == 0 && digitalRead(SensorSag) == 0){
ileri();
}

}

if (uzaklik < 5){
dur();
delay(500);

//SORUN BURADA BAŞLIYOR.
//ENGELİ BİR DAHA GÖR VE ARDINDAN if (uzaklik > 5);
//geç();
//delay(1000);
//void stop
//delay(500);
//Tekrar çizgi izlemeye devam et
}


}


void ileri(){ // move forward

digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, 60);

digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, 80);
}


void sag(){ //right

digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, 0);

digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, 80);
}

void sol(){ //left

digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, 80);

digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, 0);
}

void dur(){ // stop

digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, 0);

digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, 0);
}

void gec(){ //pass obstacle

digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, 250);

digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, 250);
}

Veya engeli gördürme konusunda MZ80 mi kullanmalıyım? Hangisi daha iyi sonuç verir, MZ80 mi yoksa HCSR04 mü?
MZ80 ile saydırma yapıp 3. görmeyişinde geçirebilir miyim?
Yardımlarınızı bekliyorum, teşekkürler.
Projem hakkında video;
 

ertan2002

Asistan
Katılım
9 Ara 2008
Mesajlar
247
Puanları
28
kodlarina tam olarak yardimci olamam ancak söyle bir mantik kurgulayabilirsin. bir threshold degeri belirlersin atiyorum en az 5 kere görmesi lazim ondan sonra gecsin gibilerinden.. Bunun icin de basit bir count degiskeni tanimlarsin ve sinirsiz döngüyle kontrol ettirirsin eger count degeri 5 ise o zaman gecmesine izin verirsin..

Basitce söyle

C:
int counter=0;

do{

    if(counter==5) 
     break;

    if (EngelVarMi())
       counter++;

     delay(200);

}while(true);
Gec();

burdaki engelvarmi fonksiyonu engel varsa true yollayayacak.. 5 kere true yollayinca bizim counterimiz da 5 olacak ve döngü tekrar döndügünde counter 5 oldugundan döngü kirilacak ve döngünün altindaki gec metodu calisacak..
 

HalilSenn

Üyecik
Katılım
13 Nis 2019
Mesajlar
3
Puanları
1
kodlarina tam olarak yardimci olamam ancak söyle bir mantik kurgulayabilirsin. bir threshold degeri belirlersin atiyorum en az 5 kere görmesi lazim ondan sonra gecsin gibilerinden.. Bunun icin de basit bir count degiskeni tanimlarsin ve sinirsiz döngüyle kontrol ettirirsin eger count degeri 5 ise o zaman gecmesine izin verirsin..

Basitce söyle

C:
int counter=0;

do{

    if(counter==5)
     break;

    if (EngelVarMi())
       counter++;

     delay(200);

}while(true);
Gec();

burdaki engelvarmi fonksiyonu engel varsa true yollayayacak.. 5 kere true yollayinca bizim counterimiz da 5 olacak ve döngü tekrar döndügünde counter 5 oldugundan döngü kirilacak ve döngünün altindaki gec metodu calisacak..
Teşekkür ederim yanıt için.
for(counter=0; counter>=3; counter++){
gec(); }
for(counter=0; counter<3; counter++){
dur();}
şeklinde bir kod yazmıştım ama daha deneme fırsatım olmadı. Aracın şasesinde bir problem oldu hallettikten sonra sizin kodunuzu da deneyeceğim. Sonucu yazarım buraya
 

ertan2002

Asistan
Katılım
9 Ara 2008
Mesajlar
247
Puanları
28
yazdigin kodun pek anlami yok burda cünkü engel tespit etmiyor.. Bunu engeli tespit ettikten sonra saydirman gerek ama for döngüsü cok hizli oldugu icin istedigin sonucu alamayacaksin.

Oncelikle olayin mantigini kavramaya calis daha sonra kod yazilir. Engeli görecek ve saymaya baslayacak.. Arada biraz süre vereceksin (100 ms mesela ya da 200 ms), sonra tekrar engele bakacak ve eger engel varsa counter i arttiracak, sonra tekrar 200 ms ara verecek, sonra tekrar kontrol ettirecek bu sefer yine varsa o zaman o döngüden cikip duracak.. Ayni seyi engel olmadigini varsayarak yapabilirsin. Engel yoksa 3 kere 5 kere sayacak yine yoksa bu sefer gececek..

Senin yazdigin kod da ise counter cok cok kisa bir sürede dolacak ve fonksiyonlar calisacak.. Ayrica bunlarin engel bulma metodunun icinde olmasi lazim ya da benim yaptigim gibi bir döngü icerisinde engelin olup olmadigini kontrol ettirip o counterlari ona göre arttirman lazim

kolay gelsin
 

HalilSenn

Üyecik
Katılım
13 Nis 2019
Mesajlar
3
Puanları
1
Kodlamada çok iyi değilim zaten. Sadece bulabildiğim bilgileri harmanlamaya çalışıyorum... Değerli bilgileriniz için teşekkür ederim. Denemelerim devam ediyor.
 
Üst
stat counter