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.
 
Zaman rölesi bir diğer ifade ile zaman saati adı verilen sistem süresi belli olan bir aralıkta araya girmesi veya çıkması amaçlanan elektrik sisteminin kontrol edilmesinde kullanılmak için tasarlanmıştır.
İyi bir topraklama değeri sıfıra ohm'a yakın olan değerdir. Fakat her işte olduğu topraklamadada maliyetler önemli, onun için iyi bir topraklama değeri izin verilen değerler içinde olandır.
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.
 

Yeni mesajlar

Forum istatistikleri

Konular
128,179
Mesajlar
915,661
Kullanıcılar
449,944
Son üye
önder sem

Yeni konular

Geri
Üst