Arduino bir pinden çoklu buton ile motor hız kontrolü proje yardım

Braveman

Üye
Katılım
15 Ocak 2019
Mesajlar
5
Puanları
1
Yaş
44
Merhaba arkadaşlar. Ekte eklediğim taslağı Tinkercad sitesinde oluşturdum. İstediğim bir pin yuvasından 4 buton okutmak. Başka bir pinden potans okutmak.

1'inci buton, her seyi durduran stop olacak.
Potans 3 ve 4'üncü butonları kontrol edip voltajı ayarlayacak.

2'nci buton, motoru sürekli belirli bir hızda dondurecek. (Bu hızı elle değer verip test etmem lazım. Ondan motor yüzde 50 hızda dönsün misal.)
3'üncü buton, motor sürekli döngü halde 10 saniye çalışıp duracak.
4'üncü buton ile motor sürekli döngü halde 20 saniye çalışıp 10 saniye duracak..

Bu kod yazma işinde çok acemiyim. Ekte eklediğim şekilde 4 butondan da her bastığımda degerleri tinkercad içindeki seri ekrandan görüyorum. verdiğim kodlar çalışıyor. Sadece motoru istediğim gibi kontrol etmek istiyorum. Projede daha sonra motor yerinde watlı led kullanacam.

Verdiğim kodun içine motoru yukarda istediğim şekilde kontrol etmek için gerekli kodları yazıp mesaj atabilir misiniz?

1'inci butona basılınca 1023 değeri ,2'nci butonda 930 değeri, 3'üncü butonda 852 değeri, 4'üncü butonda 787 değeri böylece tek pinden 4 buton çalıştığını teyit ediyorum.
Malzeme olarak her şey var. Uno, L298n sürücü kartı, pin kablolar, board, lehim havya vb. Elektronik tüm malzemeler. Sadece kodu tamamlamam lazım. Yardımlarınız ile.

Bu arada 4 buton 4 pin kullanarak yapılmış bir projeyi kurdum. bana bu konuda dediğim gibi tek pinden 4 buton besleme projesi lazım.



Şimdiden elinize emeğinize sağlık .Teşerkkür ederim.


Kod:
#define buton A1

#define M1_Ena 11             // Enable1 L298 for PWM  bu onemli hızı ayarlatan pin
#define M1_in1 10             // In1  L298
#define M1_in2 9              // In2  L298

byte buton_bul(int x)
{
  int buton_numarasi = 90;
  if (x > 950)
    buton_numarasi = 91;
  else if (x > 880 && x < 980)
    buton_numarasi = 92;
  else if (x > 800 && x < 900)
    buton_numarasi = 93;
  else if (x > 750 && x < 820)
    buton_numarasi = 94;
  else if (x > 700 && x < 800)
    buton_numarasi = 95;
  else
    buton_numarasi = 90;

  return buton_numarasi;
}

void setup()
{
  Serial.begin(9600);
 
pinMode(M1_Ena, OUTPUT);
pinMode(M1_in1, OUTPUT);
pinMode(M1_in2, OUTPUT);
}

void loop()
{
  int buton_deger = analogRead(buton);
  Serial.print("okunan_deger = ");
  Serial.println(buton_deger);
  Serial.print("basilan buton = ");
  byte basilan_buton = buton_bul(buton_deger);
  Serial.println(basilan_buton);
  Serial.println("-------------------------");
  delay(500);
 }
 

Ekli dosyalar

  • buton ve potans ile motor kontrol.png
    buton ve potans ile motor kontrol.png
    184.4 KB · Görüntüleme: 11
Üstat . Bu attığınız kod zaten buton okuma yapmış. Benim verdiğim konudaki kodlarda buton okuyor zaten. Benim sorunum konudaki L298N verdiğim kodlar ile kontrol etmek. Kodlarda daha acemiyim. Sizin verdiğiniz kodlar ile benim sistem kurmam zor.

L298n tek pin girişten çoklu buton ve başka pinden potans ile hız kontrolü . sistem iki pin üzerinden işlemesini istiyorum.

Yinede teşekkürler.
 
Son düzenleme:
Çıkışa pwm verebilmek için "analogWrite" komutunu
kullanacaksınız. Arduino 3, 5, 6, 9, 10, 11 nolu pinler
donanımsal pwm için kullanılabilir.
Pot için ikinci bir analog giriş eklemeniz gerekmekte.
Buton numarasına göre -örneğin- switch/case ile
durum makinesi oluşturabilirsiniz.
 
Son düzenleme:
Tek bir sorun kaldı. Motoru döngü halinde çalıştır komutu verdiğimde ilk stop butonu dongü de işe yaramıyor. Döngü içinde süre 20 saniye diyelim. 20 saniye motor anında durdurulma durum yok. Anca arduino üzerindeki reset düğmesi ile işe yarıyor. (DONGÜ BUTONU 5 )

Kodu tekrar buraya atıyorum. fazla içinde kodlar da kalmış olabilir. tek sorun dongüde iken acil ilk durdurma butonu çalışmıyor. dongü olmadığında stop butonun da sorun yok.

(Çalışmayan döngü olan buton dongü süresi boyunca sanki sürekli basıyor .Seri ekranda o şekilde . STop butonu dongüde işe yaramıyor )
(Çalışanlar : Potans tüm butonlarda çalışıyor. Bütün butonlardan doğru veri okunuyor. )
Kod:
#define buton A1                // bir pin 5 buton   
#define potans  A0              //10k potansiyometre
#define M1_Ena 11                 // Enable1 L298 for PWM  bu onemli hızı ayarlatan pin
#define M1_in1 10                 // In1  L298
#define M1_in2 9                  // In2  L298
int potans_oku =0;
int potans_dongu;
int set = 0;

byte buton_bul(int x)
{
  int buton_numarasi = 0;
  if (x > 950)
    buton_numarasi = 1;
  else if (x > 880 && x < 980)
    buton_numarasi = 2;
  else if (x > 800 && x < 900)
    buton_numarasi = 3;
  else if (x > 750 && x < 820)
    buton_numarasi = 4;
  else if (x > 700 && x < 800)
    buton_numarasi = 5;
  else
    buton_numarasi = 0;

  return buton_numarasi;
}

void dur()
{
  digitalWrite(M1_in1, LOW); // Motoru durdur
  digitalWrite(M1_in2, LOW);
}

void buton2(int hiz)
{
  analogWrite(M1_Ena, potans_dongu); // Motor hızını potans ile ayarla

  digitalWrite(M1_in1, HIGH); // Motoru sürekli döndür
  digitalWrite(M1_in2, LOW);
}

void buton3(int hiz)
{
  analogWrite(M1_Ena, potans_dongu); // Motor hızını potans ile ayarla
  digitalWrite(M1_in1, HIGH); // Motoru sürekli döndür
  digitalWrite(M1_in2, LOW);
}

void buton4(int hiz)
{
  analogWrite(M1_Ena, potans_dongu); // Motor hızını potans ile ayarla
  digitalWrite(M1_in1, HIGH); // Motoru sürekli döndür
  digitalWrite(M1_in2, LOW);
}
void buton5(int hiz)
    {
 
  for (int i = 0; i < 20 /*soldaki süre dongü süresi bu süre boyunca stop çalışmıyor.*/; i++)
  {
  analogWrite(M1_Ena, potans_dongu);
  digitalWrite(M1_in1, potans_dongu); // Motoru sürekli döndür
  digitalWrite(M1_in2, LOW);
    delay(1500);
  digitalWrite(M1_in1, LOW); // Motoru sürekli döndür
  digitalWrite(M1_in2, LOW);
    delay(1000);
 }

}

void setup()
{
  Serial.begin(9600);
  pinMode(buton, INPUT);
  pinMode(M1_Ena, OUTPUT);
  pinMode(M1_in1, OUTPUT);
  pinMode(M1_in2, OUTPUT);
  pinMode(potans, INPUT);
}

void loop()
{
  int buton_deger = analogRead(buton);
  Serial.print("okunan_deger = ");
  Serial.println(buton_deger);
  Serial.print("basilan buton = ");
  byte basilan_buton = buton_bul(buton_deger);
  Serial.println(basilan_buton);
  Serial.println("-------------------------");

     potans_oku = analogRead(potans);
    potans_dongu = map(potans_oku, 0, 1023, 0, 200);  // 200 degeri 255 idi. verilen voltaj maksimum idi ben kendime gore 1200 ile gırdım.maksimum voltajı dusurdum.
      analogWrite(M1_Ena, potans_dongu);

  switch (basilan_buton)
  {
    case 1:
      // İlk butona basıldığında motoru durdur
      dur();
      break;

    case 2:
      // İkinci butona basıldığında motoru potans ile bir hızda döndür
      buton2(255);
      break;

    case 3:
      // Üçüncü butona basıldığında motoru potans ile bir hızda döndür
      buton3(255);
      break;

    case 4:
      // Dördüncü butona basıldığında motoru potans ile bir hızda döndür
      buton4(255);
      break;
    
    case 5:
      // Beşinci butona basıldığında motoru potans ile bir hızda döndür
      buton5(255);
      break;

    default:
      break;
  }
  delay(50);//süre kısayken misal 50 daha iyi butonlar tepki veriyor.Artırmak iyi değil gibi
}
 
tm1638 kullansanız daha basit olmaz mı
 
Bunun için birkaç seçenek olabilir:
* For döngüsü yerine if kullanılabilir. delay
değeri 1ms verilir, sayaç istenilen zamana
göre artırılır.
* For kullanılacak ise yine delay değeri
yine 1ms verilir ve aynı zamanda buton
kontrolü yapılır, durdurma fonksiyonu
çağrılabilir.
... vs.
 
tm1638 kullansanız daha basit olmaz mı
Merhaba. Bu kartı ilk defa duydum. Benim gibi arduino da acemi bir kişi daha kodu yazamazken . Açtığım konuda kodu yazamadığımı belirtmişken. Bu dediğiniz kartı nasıl işleyim de kod yazayım.

Tek istediğim istediğim özellikte çalışan kod.
Bu arada konuda ilk verdiğim kodu başka bir forum da yayınladım. Bir arkadaş chapcpt ile geri kalan L298n kontrol etme kodunu yazdırdı. Oda olmasa kodu bu aşamaya getiremiyecektim. Sağolsun.

Ondan sizin verdiğiniz bu kartı kullanmam benim için kolay bir şey değil. Ama bilgi için teşekkürler.
Bunun için birkaç seçenek olabilir:
* For döngüsü yerine if kullanılabilir. delay
değeri 1ms verilir, sayaç istenilen zamana
göre artırılır.
* For kullanılacak ise yine delay değeri
yine 1ms verilir ve aynı zamanda buton
kontrolü yapılır, durdurma fonksiyonu
çağrılabilir.
... vs.
Üstat. çok acemiyim kod işinde. İşin içinden çıkamadığım için kod konusunda yardım istedim. Teşekkürler
 
sorun çözüldü. Evet bende chatgpt ile bir tanışayım dedik. istediklerimi yazdım. A=0 pinden 5 buton bağlı . lezzetlirobottarifleri ndeki bir pinden birden fazla buton bağla buton bağlama öntemi kullanıldı. şemayı atıyorum. onada teşekkür ederim. yapay zekaya birinci butonu stop olarak kullan .herseyi stop etsin dedim. potans tüm butonlarda işe yarasın dedim. 2 butona döngü ver dedim. butonlara bir kere basacam. stop butona basana kadar çalış dedim. 2 butona sabit hız ver dedim. beni anladıysan madde madde yaz dedim. töbe töbe . hepsini anladı. 😀 işine yarayan kodu alabilir. thank you chatgpt

Kod:
//A1 den 5 buton bağlı
//2 buton potans ile hız kontrol 2 buton döngü halinde çalışıp duruyor.
//tinkercad.com denendi çalışıyor.

#define buton A1
#define potans A0

// L298N motor sürücüsü için pin tanımlamaları
#define IN1 9
#define IN2 10
#define ENA 11

byte buton_bul(int x) {
  int buton_numarasi = 0;

  if (x > 1015) buton_numarasi = 5;
  else if (x > 990 && x < 1010) buton_numarasi = 4;
  else if (x > 970 && x < 990) buton_numarasi = 3;
  else if (x > 950 && x < 970) buton_numarasi = 2;
  else if (x > 930 && x < 950) buton_numarasi = 1;
  else buton_numarasi = 0;

  return buton_numarasi;
}

void motorDur() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 0); // Motor hızını 0 yaparak durdur.
  Serial.println("Motor Durduruldu");
}

void motorKontrol(int hiz) {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, hiz); // ENA pinine yazılan PWM değeri motor hızını kontrol eder.
  Serial.print("Motor Hizi: ");
  Serial.println(hiz);
}

void setup() {
  Serial.begin(9600);
 
  // Motor sürücü pinleri OUTPUT olarak ayarlanır.
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENA, OUTPUT);
 
  motorDur(); // Başlangıçta motoru durdur.
}

void loop() {
  static byte aktif_buton = 0; // Aktif buton durumunu saklamak için.
  int buton_deger = analogRead(buton);
  byte basilan_buton = buton_bul(buton_deger);
  int potansDeger = map(analogRead(potans), 0, 1023, 0, 255); // Potansiyometre değerini 0-255 aralığına eşle
 
  if (basilan_buton == 1) { // Stop butonu her zaman çalışır
    aktif_buton = 0; // Aktif butonu sıfırla
    motorDur();
  } else if (basilan_buton > 1 && basilan_buton != aktif_buton) {
    aktif_buton = basilan_buton; // Yeni aktif butonu güncelle
  }
 
  switch (aktif_buton) {
    case 2:
    case 3:
      motorKontrol(potansDeger);
      break;
    case 4:
    case 5:
      motorKontrol(potansDeger); // 3 saniye çalıştır
      delay(1500);
      motorDur(); // Motorları durdur
      delay(1000); // 4 saniye bekle
      break;
  }

  Serial.print("Okunan Deger = ");
  Serial.println(buton_deger);
  Serial.print("Aktif Buton = ");
  Serial.println(aktif_buton);
  Serial.print("Potansiyometre Degeri = ");
  Serial.println(potansDeger);
  Serial.println("-------------------------");
  delay(500); // Buton okuma gecikmesi
}
 

Ekli dosyalar

  • Copy of favori .calıstı.Buton ile motor kontrol,Potans ile hız kontrol . tek sıkıntı donguler ...png
    Copy of favori .calıstı.Buton ile motor kontrol,Potans ile hız kontrol . tek sıkıntı donguler ...png
    194.4 KB · Görüntüleme: 9

Forum istatistikleri

Konular
129,834
Mesajlar
930,598
Kullanıcılar
452,662
Son üye
Yılmaz Çetiner

Yeni konular

Geri
Üst