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.
 
Elektrik tesisatlarında seçilecek kablo kesiti genellikle kullanılacak güce göre çekilecek akımın hesaplanması ile belirlenmelidir.
Topraklama ölçümü ister endüstriyel bir tesis ister bir ofis binası olsun her işletme için kritik bir öneme sahiptir.
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,235
Mesajlar
924,527
Kullanıcılar
451,616
Son üye
sezercoban1

Yeni konular

Geri
Üst