NoelDayi
Üye
- Katılım
- 3 Haziran 2022
- Mesajlar
- 24
Teşekkür ederim hocam.Kod:#define echoPin 7 #define trigPin 8 const float enlgelLimit = 20; // 20 cm //L298N Bağlantısı const int motorA1 = 5; // L298N'in IN3 Girişi const int motorA2 = 6; // L298N'in IN1 Girişi const int motorB1 = 10; // L298N'in IN2 Girişi const int motorB2 = 9; // L298N'in IN4 Girişi int i=0; //Döngüler için atanan rastgele bir değişken int j=0; //Döngüler için atanan rastgele bir değişken int state; //Bluetooth cihazından gelecek sinyalin değişkeni int komut; //Bluetooth cihazından gelecek sinyalin değişkeni int vSpeed=255; // Standart Hız, 0-255 arası bir değer alabilir void setup() { // Pinlerimizi belirleyelim pinMode(motorA1, OUTPUT); pinMode(motorA2, OUTPUT); pinMode(motorB1, OUTPUT); pinMode(motorB2, OUTPUT); // 9600 baud hızında bir seri port açalım Serial.begin(9600); } float mesafeOlc(){ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); int sure = pulseIn(echoPin, HIGH); float mesafe= sure * 0.034 / 2; // 0.034 -> 340 m/sn = 34000 cm/sn = 0.034 cm/microsaniye; /2 -> süre gidiş-geliş süresi olduğu için return mesafe; // cm } void loop() { /*Bluetooth bağlantısı koptuğunda veya kesildiğinde arabayı durdur. (Aktif etmek için alt satırın "//" larını kaldırın.)*/ // if(digitalRead(BTState)==LOW) { state='S'; } boolean islendi = true; //Gelen veriyi 'komut' değişkenine kaydet if(Serial.available() > 0){ komut = Serial.read(); islendi = false; // Yeni komut gelene kadar gereksiz yere aynı komutu tekrar tekrar işlemeye gerek yok. } float engel = mesafeOlc(); if (engel <= enlgelLimit){ state = 'B'; // Auto-brake islendi = false; } /* Uygulamadan ayarlanabilen 4 hız seviyesi.(Değerler 0-255 arasında olmalı)*/ if (komut == '0'){ vSpeed=0;} else if (komut == '1'){ vSpeed=100;} else if (komut == '2'){ vSpeed=180;} else if (komut == '3'){ vSpeed=200;} else if (komut == '4'){ vSpeed=255;} else { // hız komutu değilse state değişkenini değiştir. state = komut; } /***********************İleri****************************/ //Gelen veri 'F' ise araba ileri gider. if (state == 'F') { analogWrite(motorA1, vSpeed); analogWrite(motorA2, 0); analogWrite(motorB1, vSpeed); analogWrite(motorB2, 0); islendi = true; } /**********************İleri Sol************************/ //Gelen veri 'G' ise araba ileri sol(çapraz) gider. else if (state == 'G') { analogWrite(motorA1,vSpeed ); analogWrite(motorA2, 0); analogWrite(motorB1, 100); analogWrite(motorB2, 0); islendi = true; } /**********************İleri Sağ************************/ //Gelen veri 'I' ise araba ileri sağ(çapraz) gider. else if (state == 'I') { analogWrite(motorA1, 100); analogWrite(motorA2, 0); analogWrite(motorB1, vSpeed); analogWrite(motorB2, 0); islendi = true; } /***********************Geri****************************/ //Gelen veri 'B' ise araba geri gider. else if (state == 'B') { analogWrite(motorA1, 0); analogWrite(motorA2, vSpeed); analogWrite(motorB1, 0); analogWrite(motorB2, vSpeed); islendi = true; } /**********************Geri Sol************************/ //Gelen veri 'H' ise araba geri sol(çapraz) gider else if (state == 'H') { analogWrite(motorA1, 0); analogWrite(motorA2, 100); analogWrite(motorB1, 0); analogWrite(motorB2, vSpeed); islendi = true; } /**********************Geri Sağ************************/ //Gelen veri 'J' ise araba geri sağ(çapraz) gider else if (state == 'J') { analogWrite(motorA1, 0); analogWrite(motorA2, vSpeed); analogWrite(motorB1, 0); analogWrite(motorB2, 100); islendi = true; } /***************************Sol*****************************/ //Gelen veri 'L' ise araba sola gider. else if (state == 'L') { analogWrite(motorA1, vSpeed); analogWrite(motorA2, 150); analogWrite(motorB1, 0); analogWrite(motorB2, 0); islendi = true; } /***************************Sağ*****************************/ //Gelen veri 'R' ise araba sağa gider else if (state == 'R') { analogWrite(motorA1, 0); analogWrite(motorA2, 0); analogWrite(motorB1, vSpeed); analogWrite(motorB2, 150); islendi = true; } /************************Stop*****************************/ //Gelen veri 'S' ise arabayı durdur. else if (state == 'S' || state == 'B' ){ // 'S' geldiyse ya da 'B' (otomatik fren) set edildiyse analogWrite(motorA1, 0); analogWrite(motorA2, 0); analogWrite(motorB1, 0); analogWrite(motorB2, 0); islendi = true; } delay(1); }
Kodunuz tek state ile herşeyi yönetmeye çalışıyor. İyi kontrol etmek için biraz daha farklı yazmak lazım ama olanı hızlıca düzenledim.
Test etmedim. Sentaks hatası olabilir. Bir bakarsınız.
NOTLAR:
- Yeni komut gelmedikçe eski komutu sürekli işlemeye gerek yok. 'islendi' değişkeni bunun için eklendi.
- Eski kodda, gelen komutu state değişkenine direk yazıyorsunuz. Hız komutu gelirse 'state' kaybolduğundan hız değişkenini set ediyorsunuz ama yeniden yön komutlarından biri gelene kadar motor sürücüsüne göndermiyorsunuz. O yüzden 'komut' değişkenini ekledim ve hız komutu gelirse 'vSpeed' güncellenip 'islendi' false ediliyor. Böylece 'state' kaybolmuyor ve motor sürücüsüne yeni hız ve 'state' (yeni halinde yön) gönderiliyor. Hız gönderince tekrar yön göndermeye gerek kalmıyor.
- Arabanız pille çalışıyor. delay(1) pil tüketimini azaltmak için. Tüketim problem değilse Arduino için ihtiyaç yok. ESP8266'da bunu ya da yileld() eklemek gerekli
- Her döngüde mesafeyi bir kere ölçüp engelLimit değişkeninden küçük ya da eşitse aracı durduruyor. Farklı bir 'state' olması lazım olabilir diye değeri 'S' yerine 'B' yaptım.
- Gerisini yorumlara yazdım. İncelersiniz.
Bu hali büyük ölçüde işinizi görür. Ancak başka problemleriniz de var. Bunları çözerek kendinizi geliştriebilirsiniz:
- A1, A2, B1, B2 pinlerini biraz karmaşık tanımlamışsınız. O yüzden çapraz gidiş ve dönüş kodlarınızı kontrol etmeye üşendim Ancak oralarda 100 ve 150 olarak sabit değerler kullanmışsınız. Aracın ana hızı değişken olduğundan bu şekilde sabit değerler ile yön veremezsiniz. Büyük ihtimalle, hızın 255 olacağını varsayarak yapmışsınız. Ama hız değişken ve bu durumda 1 ve 2 hız kademelerinde nötr ya da tersine çalışır.
- Engel kontrolünde gidiş yönüne bakmanız mantıklı olur. Geri giderken engel yüzünden durmak istemezsiniz. Ya da engel yüzünden durunca geriye doğru bir daha kalkamamak.
- Bir de engel görmesine rağmen aracın hemen durmayacağı çok nadir ve özel bir durumu bulmayı ve çözümünü size bıraktım.
Varsa sentaks ya da yazım hataları ve yukarıdaki maddeler de sizin ödeviniz olsun
Ödev dediğiniz yerdeki 3. şıkkı kendim manuel olarak yapacağım zaten kontrol ederken. Bana da bir tek LCD ekrana yazdırma kodları kalmış.
Ellerinize sağlık. LCD ekranımdaki sorunu çözdükten sonra mutlaka deneyeceğim. Günlerdir uğraşıyorum da sorunu çözemedim daha.