Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4
Cevap
725
Tıklama
0
Öne Çıkarma
ARDUINO programlama (YARDIM !!!)
M
6 yıl
Teğmen
Konu Sahibi

Merhaba arkadaslar. uygulamayı düşündüğüm bir proje için yardımınıza ihtiyacım var.

Yazılım kısmında takıldım kaldım. Bilindiği üzere arduino uno'da 6 adet analog giriş ve 14 adet dijital giriş/çıkış var.

Yapmayı düşündüğüm projede;

13 adet buton
14 adet limit switch
13 adet çıkış (redüktörlü dc motor sürmek için tetikleme ucu)

olacak.

yani arduino'ya 27 adet giriş, 13 adet çıkış olacak. Ancak pin sayısı sınırlı olduğundan 27 adet girişin hepsini de 6 adet analog girişe dağıtmayı düşünüyorum.

yani;

1. butona basıldığında A0 girişinde a değeri verecek
2. butona basıldığında A0 girişinde b değeri verecek
3. butona basıldığında A0 girişinde c değeri verecek
4. butona basıldığında A0 girişinde d değeri verecek
.
.
.
gibi

boylece arduino hangi butondan veya switch ten veri girişi olacağını anlayacak çıkış pinlerinden herhangi bir tanesini tetikleyecek.

ben programı oluştururken analog olarak okunan değerin nasıl işleneceğini oluşturamadım.

ÖRNEK:

1 dc motor var ve bu motor için

ileri butonu A0 pinine
geri butonu A0 pinine
ileri stop switchi A0 pinine
geri stop switchi A0 pinine
ileri komutu 0 pinine
geri komutu 1 pinine

bağlanacak olursa; butona bir kere basıldığında motor ileri stop switchini görene kadar ilerleyecek ve duracak. bu sırada butona birkez daha basılırsa da duracak.

geri butona bir kez basıldığında da geri stop switchini görene kadar geri gelecek ve switchi gördüğünde duracak veya durma komutu geri butonuna tekrar basılırsa gerçekleşecek.

ayrıca ileri switchi görmüşken ileri butonuna basılsa bile ileri gitmeycek
geri switchini görmüşken de geri basılması durumunda geri komutunu uygulamayacak şekilde olmalıdır.

Not: butonların ve switch değerlerinin farklı voltaj değerlerinde algılanabilmesi için her birini farklı direnç değerlerinde bağlayacağım ve 0...1023 değer aralığınının tamamını kullanarak değerlerin olabildiğince birbirinden uzak olmasını sağlayacağım.

bu örnek yazılım nasıl olabilir sizce arkadaşlar.

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi mutluca -- 11 Mart 2019; 11:54:8 >

O
6 yıl
Teğmen

Analog girişlerden gelen sayısal veriyi okuyup uygun değişkenlere atacaksınız(Bu kısmı atlayıp direk kod kısmına geçiyorum). Örnek olarak sadece ileri butonunu dikkate alalım. Diğerleri de aynı mantıkla olacak zaten.

İleri butonuna basılıp basılmadığını denetlemek için bir değişken tanımla. (bool ileri_basildimi = 0;)

bool ileri_basildimi = false;
bool ileri_switch = false;

Tuşların basılıp basılmadığını denetleyen kod bloğunda ilgili tuşun basılıp basılmadığı durumu güncellenecek,

if(Eğer ileri tuşuna basılınca oluşacak değer oluştuysa -yani tuşa basıldıysa-)
{
ileri_basildimi = !ileri_basildimi;
}


Tuş durumları güncellendikten sonra tuş durumuna ve switch durumuna göre işlem yapılacak,

if (ileri_basildimi == true && ileri_switch == false)
{
motoru ileriye doğru hareket ettir.
}
else if (ileri_basildimi == false || ileri_switch == true)
{
motoru durdur
}

Yine her döngüde stop switchlere ulaşıldımı kontrol ettir.

if (eğer ileri stop switch e ulaşıldıysa)
{
ileri_switch = true;
}


Genel yapı itibari ile bu şekilde olacak. Switch ve buton parazitlerini önlemek için aralara uygun gecikmeler konulabilir.

Not: İlla bu şekilde olacak diye bir kural yok çok farklı algoritmalar da oluşturulabilir. Ama genel yapı itibari ile buna benzer olacak.
Kolay gelsin. İyi çalışmalar...





< Bu mesaj bu kişi tarafından değiştirildi osmanertomac -- 11 Mart 2019; 12:59:17 >
Bu mesaja 1 cevap geldi.
M
6 yıl
Teğmen
Konu Sahibi

quote:

Orijinalden alıntı: osmanertomac

Analog girişlerden gelen sayısal veriyi okuyup uygun değişkenlere atacaksınız(Bu kısmı atlayıp direk kod kısmına geçiyorum). Örnek olarak sadece ileri butonunu dikkate alalım. Diğerleri de aynı mantıkla olacak zaten.

İleri butonuna basılıp basılmadığını denetlemek için bir değişken tanımla. (bool ileri_basildimi = 0;)

bool ileri_basildimi = false;
bool ileri_switch = false;

Tuşların basılıp basılmadığını denetleyen kod bloğunda ilgili tuşun basılıp basılmadığı durumu güncellenecek,

if(Eğer ileri tuşuna basılınca oluşacak değer oluştuysa -yani tuşa basıldıysa-)
{
ileri_basildimi = !ileri_basildimi;
}


Tuş durumları güncellendikten sonra tuş durumuna ve switch durumuna göre işlem yapılacak,

if (ileri_basildimi == true && ileri_switch == false)
{
motoru ileriye doğru hareket ettir.
}
else if (ileri_basildimi == false || ileri_switch == true)
{
motoru durdur
}

Yine her döngüde stop switchlere ulaşıldımı kontrol ettir.

if (eğer ileri stop switch e ulaşıldıysa)
{
ileri_switch = true;
}


Genel yapı itibari ile bu şekilde olacak. Switch ve buton parazitlerini önlemek için aralara uygun gecikmeler konulabilir.

Not: İlla bu şekilde olacak diye bir kural yok çok farklı algoritmalar da oluşturulabilir. Ama genel yapı itibari ile buna benzer olacak.
Kolay gelsin. İyi çalışmalar...
bu şekilde mi



int motorileri = 0;
int motorgeri = 1;

int A0degeri;

bool motorileribut = false;
bool motorgeribut = false;

bool ileriswitch = false;
bool geriswitch = false;



void setup()
{
pinMode(A0, INPUT);

pinMode(0, OUTPUT);
pinMode(1, OUTPUT);


Serial.begin(9600);


}

void loop()
{
A0degeri = analogRead(A0);
if (A0degeri<950 && A0degeri>750) // motor ileri butonuna basıldığında 800 değeri veriyor
{
motorileribut =! motorileribut;
}

if(motorileribut == true && ileriswitch == false)
{
digitalWrite(motorileri == HIGH);
}
else if(motorileribut == false || ileriswitch == true)
{
digitalWrite(motorileri == LOW);
}

if(A0degeri<650 && A0degeri>450) // ileri switche ulaşıldığında 500 değeri veriyor
{
ileriswitch = true;
}


if (A0degeri<400 && A0degeri>300) // motor geri butonuna basıldığında 350 değeri veriyor
{
motorgeribut =! motorgeribut
}

if(motorgeribut == true && geriswitch == false)
{
digitalWrite(motorgeri == HIGH);
}
else if(motorgeribut == false || geriswitch == true)
{
digitalWrite(motorgeri == LOW);
}

if(A0degeri<250 && A0degeri>150) // ileri switche ulaşıldığında 200 değeri veriyor
{
geriswitch = true;

}





< Bu mesaj bu kişi tarafından değiştirildi mutluca -- 11 Mart 2019; 14:35:28 >

O
6 yıl
Teğmen

Bu yazdığın şekilde sorunsuz çalışması lazım. Sadece ufak bir durum eklemek gerek. Motor ileri giderken geri tuşuna basılırsa geri tuşunu false yapmalı. Tam tersi durumda da ileri tuşu false olmalı. Yoksa ileri giderken geri tuşuna basılırsa her iki pinde çıkış vereceğinden motor kilitlenir.

Tuşları guncelleyen if blogunun içinde ileri basıldığında geri butonunu false yap.
Geri butonu basıldığında ileri butonunu false yap.

Birde geri tuşuna basılırsa ileri Switch i false yap. İleri basılırsa geri Switch i false yap.switch ler false yapılmadan kalırsa bu sefer motor tek sefer iş yapar.

Bunları da ekleyince sorun kalmiyor.





< Bu mesaj bu kişi tarafından değiştirildi osmanertomac -- 11 Mart 2019; 15:52:14 >

< Bu ileti mobil sürüm kullanılarak atıldı >

M
6 yıl
Teğmen
Konu Sahibi

programa kırmızı yazılı olan komutları ekledim.

bu şekilde sorun olur mu acaba?

ayrıca başka nasıl olabilir. çünkü böyle çok karışacak. bu kısım sadece bir motor için


int motorileri = 0;
int motorgeri = 1;

int A0degeri;

bool motorileribut = false;
bool motorgeribut = false;

bool ileriswitch = false;
bool geriswitch = false;



void setup()
{
pinMode(A0, INPUT);

pinMode(0, OUTPUT);
pinMode(1, OUTPUT);


Serial.begin(9600);


}

void loop()
{
A0degeri = analogRead(A0);
if (A0degeri<950 && A0degeri>750) // motor ileri butonuna basıldığında 800 değeri veriyor
{
motorileribut =! motorileribut;
}

if(motorileribut == true && ileriswitch == false)
{
digitalWrite(motorileri == HIGH);
do{
digitalWrite(motorgeri == LOW);
}while(ileriswitch == true);


}
else if(motorileribut == false || ileriswitch == true)
{
digitalWrite(motorileri == LOW);
}

if(A0degeri<650 && A0degeri>450) // ileri switche ulaşıldığında 500 değeri veriyor
{
ileriswitch = true;
}


if (A0degeri<400 && A0degeri>300) // motor geri butonuna basıldığında 350 değeri veriyor
{
motorgeribut =! motorgeribut
}

if(motorgeribut == true && geriswitch == false)
{
digitalWrite(motorgeri == HIGH);
do{
digitalWrite(motorileri == LOW);
}while(geriswitch == true);

}
else if(motorgeribut == false || geriswitch == true)
{
digitalWrite(motorgeri == LOW);
}

if(A0degeri<250 && A0degeri>150) // ileri switche ulaşıldığında 200 değeri veriyor
{
geriswitch = true;

}
}





< Bu mesaj bu kişi tarafından değiştirildi mutluca -- 14 Mart 2019; 15:49:41 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.