L298N ve yazılım hakkında sorularım var

NoelDayi

Üye
Katılım
3 Haziran 2022
Mesajlar
24
Öncelikle iyi günler dilerim. İki kez konu açmak yerine tek konu çatısı altında topluyorum, bu yüzden yanlış yere açmış olabilirim. Bunu için kusura bakmayın.
Arduino ile kontrol ettiğim L298N motor sürücüm vardı. Dün 2 tane 3.7V-2600mAh-7.8A pil aldım. Motor sürücüme taktım, her şey yoldunda gidiyordu. Bir süre sonra motor sürücüden ufak patlama sesi geldi ve sağ motor çalışmamaya başladı. Motora dışarıdan güç verdiğimde çalışıyor ama. Bu neyden kaynaklanmış olabilir?

İkinci sorum ise; projem için iki tane yazılım var, ayrı ayrı 2 arduino kullanmak yerine 1 arduino kullanmak istiyorum fakat bu iki yazılımı nasıl birleştirebilirim? Detaylı yazılım bilgim yok. Yardımcı olabilirseniz yazılımları da alıntılarım.
Şimdiden teşekkür ederim.
 
L298 bağlantısı yaparken lojik girişlere beslemeyi deydirmiş olabilir misiniz?
Motorlarınız fazla akım çekiyor olabilir mi?
Çok uzun süre kullanmış olabilir misiniz? (aralıksız 1-2 saat motor sürmek gibi)

Sürekli ani dönüşler yaptığınızda(yani 1-2 saniye içinde defalarca motoru ileri geri sürmek)
Motor bir yöne dönerken daha durmadan diğer yöne döndürmeye çalışırsanız motor diğer yöne dönmek için normal çalışma akımının 10 katı kadar akım çekebilir bu akım L298 üstünden geçiyor ve zorlaması çok normal bunu defalarca yapınca bozulması da çok normal.
Bunun için motorlarınızda enkoder olmalı puls saydırmasanız bile motorun durduğunu kontrol edip daha sonra dönüş yaptırırsanız sürücünüz ve motorlarınız için daha sağlıklı çalışmış olursunuz
 
L298 bağlantısı yaparken lojik girişlere beslemeyi deydirmiş olabilir misiniz?
Motorlarınız fazla akım çekiyor olabilir mi?
Çok uzun süre kullanmış olabilir misiniz? (aralıksız 1-2 saat motor sürmek gibi)

Sürekli ani dönüşler yaptığınızda(yani 1-2 saniye içinde defalarca motoru ileri geri sürmek)
Motor bir yöne dönerken daha durmadan diğer yöne döndürmeye çalışırsanız motor diğer yöne dönmek için normal çalışma akımının 10 katı kadar akım çekebilir bu akım L298 üstünden geçiyor ve zorlaması çok normal bunu defalarca yapınca bozulması da çok normal.
Bunun için motorlarınızda enkoder olmalı puls saydırmasanız bile motorun durduğunu kontrol edip daha sonra dönüş yaptırırsanız sürücünüz ve motorlarınız için daha sağlıklı çalışmış olursunuz
Evet, ani hareketler yaptırdım. Sağdan sola ya da soldan sağa çok döndürdüm. Fakat maksimum 3 dakika çalıştı. Sanırım yeni bir tane sürücü almam lazım. Bu projeden sunum yapmam lazım, bu patlama tarzı şeylerin olmaması için ne yapabilirim peki?
 
Evet, ani hareketler yaptırdım. Sağdan sola ya da soldan sağa çok döndürdüm. Fakat maksimum 3 dakika çalıştı. Sanırım yeni bir tane sürücü almam lazım. Bu projeden sunum yapmam lazım, bu patlama tarzı şeylerin olmaması için ne yapabilirim peki?
Normalde L298 tasarımında SENSE pinlerine bağlanan dirence göre akım ölçümünü yapar entegre fakat çin malı kırmızı kartlarda bu pinler direkt 0a çekildiği için böye bir kontrol yapmayıp çıkışa ne yük bağlarsan bağla akım kontrolü yapmıyor L298 entegresi.

Buda motorun ani dönüşlerde çekeceği akım.
Motor zorlanma anında çekeceği akım.

Bunların hiçbirini ölçemediği için ne akım varsa geçirmeyi deniyor entegre üstünden.

Öncelikle şunu sorayım motorlarınız sarı redüktörlü motor mu?

Eğer motorunuz buysa şöyle bir uygulama yaparbilirsiniz
MOTOR.png

l298 çıkışna bağlayacağınız 1A değerinde cam sigorta motor zorlanma aşırı akım çekme durumlarında atıp koruyacaktır l298'inizi tabbi bu sigortaları sigorta yuvasu ile montaj yapmalısınız sigorta atınca değiştirmesi pratik olması için
 
Normalde L298 tasarımında SENSE pinlerine bağlanan dirence göre akım ölçümünü yapar entegre fakat çin malı kırmızı kartlarda bu pinler direkt 0a çekildiği için böye bir kontrol yapmayıp çıkışa ne yük bağlarsan bağla akım kontrolü yapmıyor L298 entegresi.

Buda motorun ani dönüşlerde çekeceği akım.
Motor zorlanma anında çekeceği akım.

Bunların hiçbirini ölçemediği için ne akım varsa geçirmeyi deniyor entegre üstünden.

Öncelikle şunu sorayım motorlarınız sarı redüktörlü motor mu?

Eğer motorunuz buysa şöyle bir uygulama yaparbilirsiniz
17616 eklentisine bak
l298 çıkışna bağlayacağınız 1A değerinde cam sigorta motor zorlanma aşırı akım çekme durumlarında atıp koruyacaktır l298'inizi tabbi bu sigortaları sigorta yuvasu ile montaj yapmalısınız sigorta atınca değiştirmesi pratik olması için
Evet, motorlarım sarı redüktörlü motor. Değerli cevaplarınız için teşekkür ederim. Sigortayı herhangi bir elektronikçide bulabilir miyim peki?
 
Evet, motorlarım sarı redüktörlü motor. Değerli cevaplarınız için teşekkür ederim. Sigortayı herhangi bir elektronikçide bulabilir miyim peki?
Her elektronikçide vardır.

Fakat önce motorlarınızı önce direkt pile bağlaylıp bir ampermetre ile çektikleri akımı ölçün
Biraz elinizle zorlayın en fazla kaç mA çekiyor.

Benim hatırladığım motoru sıkışıtırıp dönmez hale getirince 950mA-1A civarında akıma çıktıkları.
Ben o yüzden 1A yazdım fakat sizin motorunuz çinlilerin azizliğine uğrayıp değişti farklı bir yapıya döndüyse bilemem belki tipi aynı motoru farklı bir model ve zorlanma anında 1 amper seviyesine çıkmayacak.

Önce gözlem/deney sonra deney sonucunuza göre sigorta seçin.
 
cam_sigorta_yuva-600x315.jpg

Sigorta ve yuvası bu resimde görükleriniz

2 Adet yuvası
ve
2 ADETTEN FAZLA
sigorta alın çünkü sigorta attığında yenisini takmanız gerekecek atan sigorta çöp oluyor.
Zaten bu sigrotaların pek bir para tutacağını sanmıyorum 10 tanesini 5 liraya alabilirsiniz hatta daha ucuza.
 
17617 eklentisine bak
Sigorta ve yuvası bu resimde görükleriniz

2 Adet yuvası
ve
2 ADETTEN FAZLA
sigorta alın çünkü sigorta attığında yenisini takmanız gerekecek atan sigorta çöp oluyor.
Zaten bu sigrotaların pek bir para tutacağını sanmıyorum 10 tanesini 5 liraya alabilirsiniz hatta daha ucuza.
Tekrardan teşekkür ederim ilginiz için. Hocam iki tane farklı kodlarım var, onları birleştirme konusunda yardımcı olabilir misiniz peki?
 
*************** ARDUINO - BLUETOOTH KONTROLLÜ ARAÇ KODLARI **************

Kod:
//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 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);
}
 
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'; }

  //Gelen veriyi 'state' değişkenine kaydet
    if(Serial.available() > 0){     
      state = Serial.read();   
    }
 
  /* Uygulamadan ayarlanabilen 4 hız seviyesi.(Değerler 0-255 arasında olmalı)*/
    if (state == '0'){
      vSpeed=0;}
    else if (state == '1'){
      vSpeed=100;}
    else if (state == '2'){
      vSpeed=180;}
    else if (state == '3'){
      vSpeed=200;}
    else if (state == '4'){
      vSpeed=255;}
    
  /***********************İleri****************************/
  //Gelen veri 'F' ise araba ileri gider.
    if (state == 'F') {
      analogWrite(motorA1, vSpeed); analogWrite(motorA2, 0);
        analogWrite(motorB1, vSpeed);      analogWrite(motorB2, 0);
    }
  /**********************İ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);
    }
  /**********************İ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);
    }
  /***********************Geri****************************/
  //Gelen veri 'B' ise araba geri gider.
    else if (state == 'B') {
      analogWrite(motorA1, 0);   analogWrite(motorA2, vSpeed);
        analogWrite(motorB1, 0);   analogWrite(motorB2, vSpeed);
    }
  /**********************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);
    }
  /**********************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);
    }
  /***************************Sol*****************************/
  //Gelen veri 'L' ise araba sola gider.
    else if (state == 'L') {
      analogWrite(motorA1, vSpeed);   analogWrite(motorA2, 150);
        analogWrite(motorB1, 0); analogWrite(motorB2, 0);
    }
  /***************************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);     
    }
 
  /************************Stop*****************************/
  //Gelen veri 'S' ise arabayı durdur.
    else if (state == 'S'){
        analogWrite(motorA1, 0);  analogWrite(motorA2, 0);
        analogWrite(motorB1, 0);  analogWrite(motorB2, 0);
    } 
}





******************** MESAFEÖLÇER KODLARI **********************

Kod:
#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

#define echoPin 7

#define trigPin 8

long sure, mesafe;

void setup()

{

  Serial.begin (9600);

  pinMode(trigPin, OUTPUT);

  pinMode(echoPin, INPUT);

  lcd.init();

  lcd.backlight();

  lcd.blink_on();

}

void loop()

{

  delay(150);

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);

  sure = pulseIn(echoPin, HIGH);

  mesafe = sure / 58.2;

  String disp = String(mesafe);

  lcd.clear();

  lcd.print("Mesafe :");

  lcd.setCursor(0, 1);

  lcd.print(disp);

  lcd.print(" cm");

}
 
Son düzenleme:
Program kodunu "kod ekle" butonu ile eklersen daha rahat okunabilir

1654251068687.png
 
@NoelDayi ben araba kodlarından çok anlamam(!)
Ama hcsr-04 2x16I2C kodunda sanki init doğru bir tanımlama değil biraz daha araştır

2 programıda önce anlamaya çalış
daha sonra tek program haline getirmek için

kütüphane atamalarını aynı yere topla

setup kısmını aynı yere topla

loop için biraz daha uğraşman lazım birbinin seyrini eklemeyecek yerlere enjekte etemn lazım
 
@NoelDayi programınızı bir blog'dan aldığınızı görüyorum.

Hazır programa müdahale etmek için önce programa tamamen hakim olmalısınız.
HC-05/06 ile biraz uygulamalar yaptıktan sonra kendi araba programınızı yazabilirsiniz.
 
C:
#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:
  1. Yeni komut gelmedikçe eski komutu sürekli işlemeye gerek yok. 'islendi' değişkeni bunun için eklendi.
  2. 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.
  3. 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
  4. 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.
  5. 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:
  1. 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.
  2. 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.
  3. 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 ;)
 
Son düzenleme:
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:
  1. Yeni komut gelmedikçe eski komutu sürekli işlemeye gerek yok. 'islendi' değişkeni bunun için eklendi.
  2. 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.
  3. 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
  4. 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.
  5. 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:
  1. 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.
  2. 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.
  3. 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 ;)
Abi çok güzel anlatmışssın ve tamamlamışssın programı ama arkadaş 2 programı birleştirmek istiyordu.

HCSR-04+LCD PROGRAMI İLE
BLUETOOTH ARABA

Bu programları tek program haline getirmek istiyordu.
 
Teşekkür ederim hocam.
Ö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.
Teşekkürü asıl hak eden değerli büyüğüm @ozkarah abim'dir

Gayet güzel açıklamış ve eklemeler yapmış programa.
 
@NoelDayi programınızı bir blog'dan aldığınızı görüyorum.

Hazır programa müdahale etmek için önce programa tamamen hakim olmalısınız.
HC-05/06 ile biraz uygulamalar yaptıktan sonra kendi araba programınızı yazabilirsiniz.
Evet hocam bir yerden almıştım programı. Kendi kodlarımda hep bir sıkıntı çıkıyordu, istikrarsızdı ve biraz araştırmadan sonra bu kodlara yöneldim.
Cam sigorta ile ilgili bir soru soracaktım. 5x20 ve 6x30 arasındaki fark sadece boyut farkı mı acaba?
 
Evet hocam bir yerden almıştım programı. Kendi kodlarımda hep bir sıkıntı çıkıyordu, istikrarsızdı ve biraz araştırmadan sonra bu kodlara yöneldim.
Cam sigorta ile ilgili bir soru soracaktım. 5x20 ve 6x30 arasındaki fark sadece boyut farkı mı acaba?
benim bildiğim sadece boyut farkı ben kullandığımda 5x20 kullanıyorum.

6x30 genelde makine panolarında valf bobinlerine, kontaktör bobinlerinde, schneider marka ray tipi sigorta yuvalarında kullanılıyor.
 

Forum istatistikleri

Konular
5,789
Mesajlar
99,024
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top