Şimdi Ara

ARDUINO programlama (YARDIM !!!)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
640
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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.



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







  • 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 >




  • 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 >




  • 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 >
  • 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 >




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.