Şimdi Ara

Arduino bir buton ile iki farklı işlem yapma

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
15
Cevap
0
Favori
391
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Şu şekildeki ben ilk butona bastığım zaman aynı anda 2 farklı elemanı kontrol edicem. Bu elemanlardan biri ilk butona bastıktan sonra diğer butona basılana kadar çalışacak diğerkisi ise belirli ,kısa bir süre çalışıcak ve ben ilk butona basana kadar çalışmayacak
    Arduinonun multitasking özelliği yok dersenizde eğer Attiny13a gibi ufak bir mikrodenetleyici almayı düşünüyorum ama bu butonu ikisine birden nasıl bağdaştırıcam



    < Bu mesaj bu kişi tarafından değiştirildi Buraktı -- 12 Mart 2023; 15:31:54 >



  • Pic ile yapabilirim ama Arduino'ya henüz yabancı sayılırım.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • ipli jeton kullanıcısına yanıt
    Anladım sağolun

    < Bu ileti Android uygulamasından atıldı >
  • Hocalarım sizin bir fikriniz var mı.



    < Bu mesaj bu kişi tarafından değiştirildi Buraktı -- 12 Mart 2023; 17:39:57 >
    < Bu ileti Android uygulamasından atıldı >
  • Arduinoyu aktif olarak kullanmıyorum, arm (stm,gigadevice, texas) ve microchip mcu lar hakkında yol gösterebilirim.


    Yazılım alt yapınız varsa algoritma oluşturma veya c dilinde Pseudocode örnekleri üzerinden devam edebiliriz.


    Hiç yazılım tecrübeniz yoksa bu işi bilen birisinden destek almanız işinizi hızlandırır.


    Uğraşayım kendim öğreneyim derseniz ne kadar zaman ayırdığınıza ilgi seviyenize göre uzun bir süreç sizi bekliyor.


    Tarif ettiğiniz işin üstünden arduino veya eşdeğer mcular hayli hayli üstesinden gelir.


    Yapmak istediklerinizi detaylı şekilde madde madde yazmanız kodlama konusunda size yardımcı olmak isteyenlerin işlerini kolaylaştıracaktır / ihtimalini artıracaktır.

  • rafet32 kullanıcısına yanıt
    Yazılım altyapım var zaten c# ta kendimi ileri seviyede geliştirdim ama arduinoda işler istediğim gibi yürümedi. Arduinoda 2 tane bu işlem için bir fonksiyon oluşturup ardından iki fonksiyonu aynı anda çalıştırsam olur mu diye düşünüyorum

    < Bu ileti Android uygulamasından atıldı >
  • "Aynı anda" ifadesi sizi yanıltmasın. Elinizdeki mcu tek core (işlem birimi olan) işlemci. Aynı anda sadece bir iş yapabilir. Fakat yapılacak işleri belirli kurallar dahilinde (zaman ve öncelik) sıraya koyduğumuzda "sanki aynı anda" çalışıyormuş gibi etkisi görülür.


    Kullandığımız bilgisayarlar ve windows/linux işletim sistemide benzer mantıkla çalışıyor. Tek fark pc işlemcilerinde daha fazla core ve kaynak bulunması.


    Yazılım alt yapınız olduğuna göre fikir vermesi açısından, düşük kapasiteli/kaynaklı embedded sistemlerde çalışabilen ücretli veya ücretsiz çeşitli RTOS (real time operating system) işletim sistemleri var. Ücretsiz olanlardan en popüleri FreeRTOS. Araştırmanızı tavsiye ederim.


    Bunu şöyle düşünebilirsiniz: C# da yazdığınız bir uygulamada Therad (iş parçacığı) kullanımına veya windows altında aynı anda birden fazla program çalıştırmaya benzetebiliriz.


    Kullanacağınız mcu ya göre RTOS seçimi ve konfigürasyonunu yaparsınız, daha sonra yapmak istediğiniz işleme göre task lar oluşturursunuz. RTOS da bu taskları sizin belirlediğiniz peryot ve öncelik sırasına arka planda otomatik olarak yürütür. Sanırım aklınızdan geçen yöntem bu şekilde bir kurgu.


    C# bildiğiniz için c veya c++ a çok kolay adapte olabilirsiniz. Fakat zorlanacağınızı düşündüğüm kısım; yazılım bilmenin yanında biraz/ileri elektronik altyapısı birazda (aslında çokça) kullanılan mcu platformunun yetenekleri/kabiliyetleri konusunda bilgi sahibi olmak gerekiyor.


    İlla rtos kullanmak zorunda değilsiniz. Yapacağınız şeyi klasik "süper loop (*)" içerisinde kurgulanacak bir algoritma ilede yapılabilir.





    (*)

    While(True)

    {

    // birinci işlem


    //ikinci işlem

    .....


    }





  • rafet32 kullanıcısına yanıt
    Şimdi arduinoda timerları yeni öğrendim ona bir komut verip bu işlemleri yaptırabilir miyim diye düşündüm çünkü yapıcağım projede gecikme pek istediğim bir durum değil aslında ana devreye gecikme yapmıycaksa bir sorun yok ama işimi sağlama almak istiyorum o yüzden ayriyetten küçük MCU alarak seri haberleşme yapıcam attiny13a var kafamda araştırıyorum şu anda ama bir türlü Rx ve Tx pinlerini nasıl bağlıycağımı bulamadım.
    Temel olarak şunu yapıcam ana devrede kullandığım butona basınca seri olarak aynı bilgiyi attiny13a ya da ileticem o da ona uyguladığım programı kendi devresi üzerinde aynı anda çalıştırıcak. Zaten tek bir mosfeti açmak ve kapamak olucak görevi.
    Bu mantığı çözene kadar idarelikmen lm555 ile bir timer devresi yaparım ama işte 12 volt voltaj regülatörü potansiyometre kapasitör onun ucundan çıkan gücü mosfete bağlama mosfetten akıcak olan 24volt falan derken biraz dağınık bir çalışma olur çünkü işte bir önceki konuda konuştuğumuz H bridge devresi ile senkronize çalışması lazım bu devrenin.



    < Bu mesaj bu kişi tarafından değiştirildi Buraktı -- 12 Mart 2023; 20:3:21 >
    < Bu ileti Android uygulamasından atıldı >




  • rafet32 kullanıcısına yanıt
    Hocam aklıma birşey geldi şimdi bir butonu 2 mikrokontrolcüye nasıl bağlayabilirim. Buton arduinoda yine aynı komut aynı işlevinde çalışıcak.Aynı şekilde attiny13a nın bir bacağını buton algılaması için atayıp kodumu geliştirsem olabilir mi? Zaten gndlerini bir yapıcam arduinodan gelen 5 voltu butona bağlıycam butonun diğer bacağını iki ayrı çıkış yapıp birini attinye birini arduinoya bağlasam olur mu

    < Bu ileti Android uygulamasından atıldı >
  • ipli jeton kullanıcısına yanıt
    Peki hemen hemen mantık aynı mikroişlemcilerde birkaç fark hariç bu butona iki if atarsam olur mu
    Örnek
    if(digitalRead(buton1) ==HIGH) //Butonun basılmış olduğunu belirtmek için
    {
    digitalWrite(cihaz1, high) ; //cihazı çalıştırmak için
    }
    if(digitalRead(buton1) ==HIGH) //Butonun basılmış olduğunu belirtmek için
    {
    digitalWrite(cihaz2, high) ; //cihazı çalıştırmak için
    delay(250) ; //Ne kadar süre çalışmasını belirmek için
    }
    if(digitalRead(buton2) ==HIGH) //Butonun basılmış olduğunu belirtmek için
    {
    digitalWrite(cihaz1, LOW) ; //cihazı kapatmak için
    delay(250) ; //Ne kadar süre çalışmasını belirmek için
    }

    Arduinoyla ilginiz olmadığından yanlarına ne işlem gördüklerini yazdım iki tane if kullandım aynı buton için bu şekilde aynı anda yapar mı bu işlemi. Pic ile tabi teknik ve yazılım konusundan biraz daha farklılar ama yani hemen hemen aynı amaç doğrultusunda çalışıyorlar, olabilir mi böyle?

    < Bu ileti Android uygulamasından atıldı >




  • Buraktı kullanıcısına yanıt

    Evet olur. Ama bence gereksiz bir yöntem olur tek işlemci ile yapılabilir.

  • Buraktı kullanıcısına yanıt

    If komutu ilk durumun tersinde ne olacağı için kullanılır.


    if

    butona basıldıysa

    pin 1 i yüksek yap

    değilse //butona basılmadıysa

    pin 1 i düşük yap


    gibi


    İlk durumun tersi olmayan farklı bir durum olacaksa case kullanmanız lazım.


    void loop

    switch(range)

    case1

    buton1'e basılıysa

    pin1'i yüksek yap

    pin2'yi yüksek yap

    delay(süre)

    pin1'i, düşük yap

    case2

    buton2'ye basılıysa

    pin2'yi düşük yap


    Bunu ardunino dilinde yaz.




    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 13 Mart 2023; 8:41:41 >
  • Buraktı kullanıcısına yanıt

    RTOS kullanılmayan (bazı durumlarda rtosda bile geçerli, onun için osDelay(t) şeklinde rtosa özgü gecikme fonksiyonları bulunur) programlamada delay(t); şeklinde bir kullanımda cpu "t" süre bloke edilir başka bir işlem yapamaz (interrupt ve dma işlemleri hariç).


    Yerinizde olsam şöyle bir yöntem izlerdim.


    - Bekleme yapılacak işlemler için (ör: butona basıldı bir çıkış 400ms H olsun süre sonunda L a dönsün) mcu nun timerlerinden birisini bana lazım olan en küçük zaman biriminde kesme oluşturacak şekilde (1ms veya 100ms) kurardım.

    Not: Eğer gerekli değilse çok düşük sürede kesme üretmek için kurmayın. Performans ve cpunun diğer işlemleri yapmak içinde zamana ihtiyacı var.


    - Timer kesmesinde bana lazım olan diğer zamanlarıda (saniye, dakika..vb) kullanabilirim.

    - Her süre dolduğunda ona ait çıkışı kesme içerisinde LOW a çekerdim.


    - High işlemlerini ana döngü içerisinde yapardım ve bu esnada bunun süre sayacını ne kadar HIGH da kalmasını istiyorsam ona göre set ederdim.


    -Aşağıda tek görev ve 100ms lik adımlarla görev süresini ayarlayabileceğiniz mantığı gösteren pseudecode bulunmaktadır.

    Görevi H yaparsınız süreyi kurarsınız gerisini unutursunuz. Süre dolunda kendiliğinden L olur  


    Pseudocode:


    .....

    // Global değişkenler. Bize lazım olan zaman adım sayaçları

    int _100ms_sayac = 0;


    int gorev1_sure_100ms = 0; // görev 1 in çalışma süresi x100ms lik adımlar şeklinde


    void Tim1INT()

    {

    reset_timer1_counter(); //bir sonraki kesme için ilgili sayaç sıfırlanır

    //---

    her 10ms de bir çalışacak kodlar

    //--

    if (++ _100ms_sayac > 10) //10 adet 10ms kesme oluşursa 100ms eder

    {

    _100ms_sayac = 0; //sonraki 100ms için sayaç yeniden sıfırlanıyor

    //---------

    Her 100ms de bir çalışacak kodlar

    if (gorev1_sure_100ms>0)

    gorev1_sure_100ms--;

    else

    OutputLOW(Gorev1_pin); // süre doldu çıkışı LOW yap

    //--------

    }


    }

    ...........

    Setup()

    {

    SetTimer1Interval(10ms); //10ms de bir kesme üretecek şekilde

    EnableTimerInt(); // Timer kesmesini aktif et

    EnebleGlobalINT(); // Global kesmeyi aktif et

    ...

    }

    .......

    void main()

    {

    while(True)

    {

    if (input(button1))

    {

    gorev1_sure_100ms = 6; // 6x100ms = 600ms H olacak

    OutputHIGH(Gorev1_pin); // Çıkışı H yap.

    // Bu örnekte while döngüsü çok hızlı şekilde çalışacaktır. Geri sayma işlemi buton bırakıldıktan sonra başlayacaktır.

    // buton basılı olduğu sürece kronometre hep 600ms ye set edilecek şekilde düşünebilirsiniz.

    ....

    // button1 e bağlı diğer işlemlerde burada yapılabilir.

    OutputHIGH(Gorev2_pin); // Çıkışı H yap.

    }

    ..... diğer işlemler


    }

    }




    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 13 Mart 2023; 10:32:20 >




  • rafet32 kullanıcısına yanıt
    Sınavlarım vardı onlara yoğunlaştım bir iki gündür girmedim foruma. Vallahi Rafet Hocam şu kadar az bir sürede ne kadar çok bana yardım ettiniz her konuda tarif edemem çok teşekkür ederim. Son bir konum kaldı onun içinde ayrı bir konu açıcam 6 çıkışlı step motor hakkında ona da yardım ederseniz canı gönülden size minnet duyarım.

    < Bu ileti Android uygulamasından atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.