12v Dc motor tek buton ile yön kontrol sağlanması

Aşağıdaki devre işinizi görür.

Fritzing devre şeması:

isis devre şeması:

Program kodları:

Kod:
// GIRISLER
int buton= A0;

// CIKISLAR
int ileri= 2;
int geri= 3;

// DEGISKENLER
int motor_durum=0;
int izin=0;

void setup()
{
  pinMode(ileri, OUTPUT);
  pinMode(geri, OUTPUT);
  pinMode(buton, INPUT);
}

void loop()
{
  if (digitalRead(buton)==LOW) {dur();}
  else
  {
    if (digitalRead(buton)==HIGH && motor_durum == 0) {ileri_don();}
    else if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1) {geri_don();}
    else if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1) {ileri_don();}
  }
}

void dur()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, LOW);
  izin=1;
}

void ileri_don()
{
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, LOW);
  motor_durum=1;
  izin=0;
}

void geri_don()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, HIGH);
  motor_durum=2;
  izin=0;
}
Deneyeceğim inşallah çalışır. Zaman ayırıp gösterdiğin ilgi için çok teşekkür ederim.
 
Devreyi kurup çalıştırınca butona basışlarda kontak sıçraması olursa söylersiniz devre şemasında değişiklik yapmadan kodlamada değişiklik yaparız düzelir.
 
Devreyi kurup çalıştırınca butona basışlarda kontak sıçraması olursa söylersiniz devre şemasında değişiklik yapmadan kodlamada değişiklik yaparız düzelir.
Devreyi kurdum çalışıyor sağa sola dönüyor sorunsuz ama hatasız çalışmıyor bazen 2ci basışta aynı yöne dönüyor düzeltme şansımız varmı bunu sıfır hata ile çalıştırabilirmiyiz.
Devreyi kurup çalıştırınca butona basışlarda kontak sıçraması olursa söylersiniz devre şemasında değişiklik yapmadan kodlamada değişiklik yaparız düzelir.
Bir de röle sürekli çekili kalıyor normal mi ?
 
Son düzenleme:
Bazen butona ikinci basışta yine aynı yöne döndüğünü yazmışsınız. Bu durum muhtemelen butondaki kontak sıçramasından kaynaklı olsa gerek. Düzeltmek için program kodlarını aşağıdaki şekilde değiştirip deneyin.

Kod:
// GIRISLER
int buton= A0;

// CIKISLAR
int ileri= 2;
int geri= 3;

// DEGISKENLER
int motor_durum=0;
int izin=0;

void setup()
{
  pinMode(ileri, OUTPUT);
  pinMode(geri, OUTPUT);
  pinMode(buton, INPUT);
}

void loop()
{
  if (digitalRead(buton)==LOW)
  {
  delay(50);
  if (digitalRead(buton)==LOW) {dur();}
  }
  else
  {
    if (digitalRead(buton)==HIGH && motor_durum == 0)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 0){ileri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1){geri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1){ileri_don();}
  }
  }
}

void dur()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, LOW);
  izin=1;
}

void ileri_don()
{
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, LOW);
  motor_durum=1;
  izin=0;
}

void geri_don()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, HIGH);
  motor_durum=2;
  izin=0;
}

Röleleriniz motorun durma anında çekili kalıyorsa bu durum röle modülünüzün lojik 0 ile tetiklenmesinden (low active) kaynaklıdır. Lojik 1 ile tetiklenen röle modülü (high active) kullanırsanız bu sorun ortadan kalkacaktır. Röle modülünü değiştirmek istermezseniz kodlarınızı şu şekilde değiştirirseniz motor dönmediği zaman röleler çekili kalmaz.

Kod:
// GIRISLER
int buton= A0;

// CIKISLAR
int ileri= 2;
int geri= 3;

// DEGISKENLER
int motor_durum=0;
int izin=0;

void setup()
{
  pinMode(ileri, OUTPUT);
  pinMode(geri, OUTPUT);
  pinMode(buton, INPUT);
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, HIGH);
}

void loop()
{
  if (digitalRead(buton)==LOW)
  {
  delay(50);
  if (digitalRead(buton)==LOW) {dur();}
  }
  else
  {
    if (digitalRead(buton)==HIGH && motor_durum == 0)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 0){ileri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1){geri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1){ileri_don();}
  }
  }
}

void dur()
{
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, HIGH);
  izin=1;
}

void ileri_don()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, HIGH);
  motor_durum=1;
  izin=0;
}

void geri_don()
{
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, LOW);
  motor_durum=2;
  izin=0;
}

Kolay gelsin.
 
Bazen butona ikinci basışta yine aynı yöne döndüğünü yazmışsınız. Bu durum muhtemelen butondaki kontak sıçramasından kaynaklı olsa gerek. Düzeltmek için program kodlarını aşağıdaki şekilde değiştirip deneyin.

Kod:
// GIRISLER
int buton= A0;

// CIKISLAR
int ileri= 2;
int geri= 3;

// DEGISKENLER
int motor_durum=0;
int izin=0;

void setup()
{
  pinMode(ileri, OUTPUT);
  pinMode(geri, OUTPUT);
  pinMode(buton, INPUT);
}

void loop()
{
  if (digitalRead(buton)==LOW)
  {
  delay(50);
  if (digitalRead(buton)==LOW) {dur();}
  }
  else
  {
    if (digitalRead(buton)==HIGH && motor_durum == 0)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 0){ileri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1){geri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1){ileri_don();}
  }
  }
}

void dur()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, LOW);
  izin=1;
}

void ileri_don()
{
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, LOW);
  motor_durum=1;
  izin=0;
}

void geri_don()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, HIGH);
  motor_durum=2;
  izin=0;
}

Röleleriniz motorun durma anında çekili kalıyorsa bu durum röle modülünüzün lojik 0 ile tetiklenmesinden (low active) kaynaklıdır. Lojik 1 ile tetiklenen röle modülü (high active) kullanırsanız bu sorun ortadan kalkacaktır. Röle modülünü değiştirmek istermezseniz kodlarınızı şu şekilde değiştirirseniz motor dönmediği zaman röleler çekili kalmaz.

Kod:
// GIRISLER
int buton= A0;

// CIKISLAR
int ileri= 2;
int geri= 3;

// DEGISKENLER
int motor_durum=0;
int izin=0;

void setup()
{
  pinMode(ileri, OUTPUT);
  pinMode(geri, OUTPUT);
  pinMode(buton, INPUT);
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, HIGH);
}

void loop()
{
  if (digitalRead(buton)==LOW)
  {
  delay(50);
  if (digitalRead(buton)==LOW) {dur();}
  }
  else
  {
    if (digitalRead(buton)==HIGH && motor_durum == 0)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 0){ileri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 1 && izin == 1){geri_don();}
  }
    else if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1)
  {
    delay(50);
    if (digitalRead(buton)==HIGH && motor_durum == 2 && izin == 1){ileri_don();}
  }
  }
}

void dur()
{
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, HIGH);
  izin=1;
}

void ileri_don()
{
  digitalWrite(ileri, LOW);
  digitalWrite(geri, HIGH);
  motor_durum=1;
  izin=0;
}

void geri_don()
{
  digitalWrite(ileri, HIGH);
  digitalWrite(geri, LOW);
  motor_durum=2;
  izin=0;
}

Kolay gelsin.

Gerçekten siz bu işten anlıyorsunuz koca forum da 2 gündür yapan çıkmadı ayrıyetten sormadığım insan kalmadı olamayacağını söyledi herkes çok teşekkür ediyorum karşılıksız yardım ettiniz umarım herşey gönlünüzce olur.
 
iyi dilekleriniz ve güzel sözleriniz için teşekkür ederim. Boş vaktim vardı. Yardımcı olabildim. Neticede ortada 1 saatlik bir emek var. Vaktim olmasaydı yardım edemezdim. İşiniz görüldü ya bu nedenle ben de mutlu oldum. Kolay gelsin.
 
Merhaba arkadaşlar aynı devreyi benim de kurmam gerekiyor ama tek buton değil 3 buton olması gerekiyor. 1. Anahtara bas cek yapıldığında sag tarafa sürekli donecek 2. Butona basili tutulduğu surece motor duracak 3. Anahtara bas cek yapıldığında ise sol tarafa donecek. Bu konuda bana yardımcı olabilirmisiniz. Şimdiden çok teşekkür ediyorum.
 
uğraşmak gerek yapılır.
 

Forum istatistikleri

Konular
129,867
Mesajlar
930,872
Kullanıcılar
452,732
Son üye
erencok

Yeni konular

Geri
Üst