Arduinoyu uyutmak ve uykudan uyandırmak
  • Herkese merhaba,
    Öncelikle ne istediğimden bahsedeyim :
    --> sistem uyku modunda çalışmaya başlasın.
    --> dış kesme verildiğinde (bir buton vasıtasıyla digital 2 int 0 ) uykudan uyansın ve diğer butonlardan komut bekleyene kadar birşey yapmasın.
    --> diğer butonlardan herhangi birine basılırsa ilgili işlemi gerçekleştirsin. 1 2saniye bekledikten sonra tekrar kendini uykuya alsın
    --> tekrar bir işlem yapılabilmesi için tekrardan digital 2 ye basılsın uykudan uyanılsın ve buton beklensin
    Bu şekilde bir döngüsü olan basit bir program yazabilir misiniz? (örneğin 3 led, 3buton,1dış kesme buton, sleep kütüphanesi ve dış kesme içeren bir örnek kod)
    ilgilenene şimdiden teşekkürler.
  • Merhaba;
    bu konuda benim de bi sorum olacaktı. Uyku modundaki arduinoyu sensördeki değişiklik uyandırabilir mi? Mesela; toprak nemi ölçerken nem seviyesinde bi değişiklik olmadığı durumda uyusun, nem oranı eşik değerin altına düştüğünde de uyanıp röleyi açıp sulama yapsın. İç kesmeler(Watch Dog Timer) bu tasarım için uygun değil.
    sistem sürekli açık kaldığında 9v'luk piller 2.5 saat anca dayanabiliyor.
  • merhaba ilk açılan konuyu kaçırmışız cevap verememişiz ama genel olarak low power ıle ılgılı şu yazıyı buraya koyayım ne yapılması gerektiği ile ilgili ipuçlarını bulabilirsiniz.

    http://www.home-automation-community.com/arduino-low-power-how-to-run-atmega328p-for-a-year-on-coin-cell-battery/

    ve sleep ile ilgili açıklamalar
    http://playground.arduino.cc/Learning/ArduinoSleepCode
  • saido, bir pin tanımlayıp nem seviyesi düşünce tetiklenmesi için bişiler yapılabilir mi bilmiyorum. Yani uyku modu ve kesmelerle hiç deneme yapmadım.

    Fakat mantık yürütürsek şöyle bişey yapabiliriz.
    1-Senin için nem ve nemsizlik arasındaki ciddi oranı bulman gerek.
    2- diyelim 1 saatte bir sulanırsa nem oranı iyi. hesabın böyle diyelim.
    3-arduinoyu satte sadece bir kere uyandırıp ya sulama yaptırıp tekrar bir saat uyutabilirsin ya da nem oranını ölçtürürsün ona göre sulatırsın.

    ya da;

    10 dakikada bir uyanıp nem kontrol yapması ve eğer gerekli ise sılanması.
  • Biraz mah'i yüksek bir pil buldum bu da 10 saat kadar çalıştı ve bitti. Kablosuz sensör ağlarının en önemli özelliklerinden biri de güç tasarrufu. 10 saatte pil değiştirdikten sonra pek bir anlamı olmuyor sistemin. Eğer sadece nem değeri istenilen seviyenin altına düştüğü anda çalışsa diğer durumlarda uyusa harika olacak. Belki günde bir kez sulama yapacak o da 5 dk. sürse yaklaşık 120 gün gider.
    Biraz araştırdım ama pek de açıklayıcı bir örnek bulamadım. Anladığım kadarıyla wdt ile maksimum 8 saniye uyutabiliyoruz. O da günde 19 saat uyuyup 5 saat çalışması anlamına geliyor(bir örnekte görmüştüm). günde 5 saat çalışırsa pil 2 gün gidecek.
    Ne yapmak lazım bilmiyorum.
    Bu konunun tüm tasarımlarımız için çok önemli olduğunu düşünüyorum, o yüzden konuyla ilgili olan arkadaşlardan destek bekliyorum.
  • dış kesme yöntemiyle arduinoyu uyutabiliyoruz. yani şu butona basılırsa uyusun yapabiliyoruz. nem sensöründen gelen datayı butona basılmış gibi yorumlattırabilirsen istediğini yapabilirsin. benim projemde de başlangıçta arduino uyusun sonra mesafe sensöründe belirlediğim değerin altına düşünce çalışmaya başlasın diye tasarlamıştım ama uyuyan bir daha uyanmadı :)
  • :)
    Ben de sensörden gelen bilgiye göre uyansın istiyorum ama hiç sensörlü örnek bulamadım. Genelde fiziksel olarak uyandırmadan bahsediliyor buton vs. gibi
  • sensör ile buton arasında ne fark var. sensör sürücü devre yi tetikler, devre de buton görevi görür
  • tabii ki fark yok önemli olan dış kesme bacağına istenilen zamanda veya şartta veri gönderebilmek.
  • arduino pinlerine hiç birşey bağlı değilken sadece 13 nolu pindeki ledi yakıp söndüren bir uygulama çalıştığında pil ne kadar dayanıyor. deneme şansınız oldumu
  • birde FTDI USB-Serial çipi 40ma akım çekiyormuş. FTDI USB-Serial çipi olmayan Pro Mini modelini denediniz mi.
  • birde not daha. her ne kadar uyku modu na alsanızda voltaj regülatörü akım çekiyormuş. bu yüzden direk 5 volt ile beslemek daha mantıklı olur. birde pro mini modelinin 3 volt modelleri var. frakansı düşük olduğu için daha az akım çekiyormuş
  • voltaj regulatoru yerıne dcdc smps modullerle beslemek gerekıyor yada 5v regulatorlerın çok düşük akım çeken modelerını araştırıp onunla değiştirmenız lazım bord uzerınde. datashhetlerdeki Quiescent current kısımlarına bakacaksınız. 1uA seviyelerının bıle altında olanı vardır. direk saatpili ıle çalıştıranlar var bu şekılde
  • Selam bende bu konuyla ilgili projemde sıkıntılar yaşıyorum. Bilgili arkadaşların arduinoyu daha dogrusu atmega çipi çıplak çalıştırma, uyku moduna alma, sensör yardımıyla dış kesme ile işi yaptırıp tekrar uyutmayla ilgili açıklayıcı bir yazı veya örnek yapabilseler konuyu daha iyi anlayıp projelerimizde versiyonlarını deneyebiliriz diye düşünüyorum. Okoman beyin paylaşımlarını inceledim güzel bilgiler var ama ben projeme uygulayamadım. Acemilikten olsa gerek :) kewin diye birisinin videosu var baya detaylı video cekmiş ama ingilizce yok maalesef yani nerdeyse uyku ve kesmelerle ilgili yayınlanmıs her yazıyı okudum videoları defalarca izledim ama benim çipi bi uyutup uyandıramadım.
  • thewar
    Uyurken hangi donanımlar çalışacak? Çeşitli modları var bunun. Mesela idle modda sadece cpu stop ederken power down modda sadece wdt ve harici kesme çalışır.

    http://playground.arduino.cc/Learning/ArduinoSleepCode
    Buradaki örnek kodları denedin mi? Denediysen tam olarak neresi çalışmıyor?
  • #include < Servo.h>

    Servo myservo;
    int sensor =2 ;
    int sensordurum;
    void setup()
    {
    myservo.attach(10);
    myservo.write(0);
    }
    void loop()
    {
    Serial.println(sensordurum);
    sensordurum = digitalRead(sensor);
    if(sensordurum == LOW)
    {
    myservo.write(180);
    delay(3000);
    myservo.write(0);
    }}

    amenofis öncelikle teşekkür ederim. sanırım işin mantığını kavrayamadığımdan olsa gerek verdiğiniz bağlantıdaki örnekleri derleyip arduinoya yükleyemedim.
    Power down modda dış kesme ile uyandırmak istiyorum. açıklama yazmadım ama koddan da anlaşılacağı gibi sensörden gelen hıgh bilgisi low olduğunda servo 180 derece yapıp 3 saniye bekleyip tekrar 0 konumuna geliyor sonra 10 saniye daha bekleyip tekrar uyumasını istiyorum. teşekkürler.
  • Sensörden gelen bilgi ne kadar süre LOW konumunda kalıyor? Kesmeden çıktıktan sonra LOW da kalmaya devam ederse aniden tekrar kesmeye gider. Bu yüzden mümkün olduğunca çabuk şekilde HIGH konumuna geri dönmesi gerekir. Eğer bunun için bir işlem yapılması gerekiyorsa bunu kesme fonksiyonunun en başında yapmalısın.

    Sensör girişi INT0 ya da INT1 pinine bağlanmalı. Yapılacak işlemleri kesme fonksiyonuna yazacağız. Yanlız kesme içinde delay kullanmak sıkıntılı bir durum. delay demek cpu'nun uyanık kalması ve sensörden yanıt alamamak demek. Verimli bir enerji yönetimi için delay yerine timer kullanılmalı.

    void ServoCalistir()
    {
    myservo.write(180);
    delay(3000);
    myservo.write(0);
    }

    void setup()
    {
    // ...
    attachInterrupt(0, ServoCalistir, LOW);
    sleep_bod_disable();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sei();
    }

    void loop()
    {
    sleep_cpu();
    }

  • servo ve low power kütüphanelerini yüklememe rağmen '' sleep_bod_disable' was not declared in this scope '' hata veriyor setup altındaki attachınterrupt satırı dışındaki bütün satırlar için bu hatayı veriyor.
  • #include < LowPower.h>
    #include < avr/sleep.h>
    #include < Servo.h>

    Servo myservo;
    int sensor = 3;
    int sensordurum;

    void ServoCalistir()
    {
    myservo.attach(10);
    myservo.write(180);
    // delay(3000);
    myservo.write(0);
    }

    void setup()
    {
    attachInterrupt(1, ServoCalistir, FALLING);
    sleep_bod_disable();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sei();
    }

    void loop()
    {
    sleep_cpu();
    }

    bu kodu derledi attım fakat çalışmadı. bu arada sabah oldu. :)
  • loop içindeki sleep_cpu hep kullanmak gerekıyormu emin değilim. belki setuptaki son satıra koysanız daha ıyı olur ve servoCalistir kodunun sonuna koysanız sleep_cpu daha ıyı olur. yada kalsın :)
  • myservo.attach(10);
    Bunu setup'a koyacaksın çünkü sadece bir kere çalışması gerekiyor.

    attachInterrupt(1, ServoCalistir, FALLING);
    Arduinodaki kısıtlamalardan dolayı bu çalışmayabilir. Şu şekilde dene (dijital pin 2 ya da 3 olmalı)

    attachInterrupt(digitalPinToInterrupt(3), ServoCalistir, LOW);

    Arduino dokümanında kesme içinde delay ve millis çalışmaz diyor. Bu da başka bir kısıtlama. Onun yerine bir libc fonksiyonu olan _delay_ms kullanabilirsin. En tepeye şunu ekle.
    #include <util/delay.h>

    Sonra da delay yerine;
    _delay_ms(3000);

    Bunun da bazı kısıtlamaları var ama oraya girmeyelim şimdi. :)
  • Teşekkürler akşam deneyim. :) sonucu paylasirim
  • selam okoman bey sleep_cpu yu dediğiniz gibi kaldırdım yoksa kod çalışmadı. amenofis emeğiniz için tekrar teşekkürler. şöyle bir durum var kodu dediğiniz şekle getirdim.
    _delay_ms(3000); satırını sensör algılarkende kullanıyor yani cisim gördükten 3 saniye sonra servo 180 derece yapıyor ve öyle kalıyor. reset butonuna basınca servo 0 konuma dönüyor. delay kaldırınca sensör ve servo anında tepki veriyor ama dediğim gibi 180 derecede kalıyor
  • pardon bu arada servo 180 derece degil 90 derece dönüyor.
  • kodda servo açılarını değiştirmeme rağmen çalışmada hiçbirşey farketmiyor
  • İşlemci uyanıp kesmeye gidiyor mu? Gidiyorsa verdiğim kodlar çalışıyor demektir. Hatayı servo kodunda arayacaksın.
  • işlemci uyanıp kesmeye gidiyor. Kesme ve ardından ''servo çalıştır'' altındaki döngü gerçekleşmiyor. servo kütüphanesiyle uyku ve kesme birşekilde uyumsuz çalışıyor. yine de emeğiniz için teşekkür ederim. redüktörlü bir dc motor kullanarak farklı bir kod ve uygulamayla hedefe ulaşmaya çalışacağım.
  • Selam arduino'yu 2 transistör ile açıp işi yaptırdiktan sonra kapatabilirmiyiz. Güç tasarrufu adına kullanışlı olurmu acaba. Sensordeki degisimle 1nci transistör iletime gececek arduinoya güç verecek arduino çalisinca pinlerden birine bagli 2nci transistor iletime gececek ve arduino burdan enerjilenmeye devam edecek ayni anda servoyu 180 derece yapacak 3 saniye bekleyip servoyu 0 derce yapacak ve 2nci transistörü kapatacak boylece arduino enerjisi kesilecek. Bu uygulanabilir mi uygulanirsa mosfet mi kullanmak lazim kondansatör kullanmamizda gerekecek gibi degerini nasil hesaplamaliyim cevaplariniz icin simdiden teşekkürler.
  • Deneyebilirsin. Tek transistor diger transistoru surmek icin kullanman gerekecek sanirim. Her sensorde olmayabilir yeteri kadar uzun sure sensor cikis verebilecekmi. Sensorde calismak icin akim ceker.
  • Sensör Mz80 dusunuyorum. En fazla 2 saniye çikis verecegini saniyorum. Sizce mosfet daha mi mantikli birde atmegayi 4 adet kalem pille çıplak çalistirabilirmiyim tam dolu pil 1.65 x 4 = 6.6v civari yapiyor. Yada baska bir oneriniz olur mu
  • Transistörün kaçak akımı atmega çipinin uykuda çektiği akımdan daha fazla olur diye tahmin ediyorum. Datasheetteki bilgiye göre en derin uykudaki akımı 100 Na.

    Sensör 5v ile çalışıyormuş. Bence en iyi yöntem 3 tane kalem pili 5v DC çeviriciye bağlamak. Böylece zamanla pillerin gerilimi düşsede çıkış gerilimi sabit kalır. Arduinoya da direkt bağla, regulatörleri pas geç.

    MZ80 sensörü, önünde cisim olduğu sürece çıkış 0 veriyor gibi görünüyor. O halde buradan kesmeye gidebilmek için PCINT pinlerinden birine bağlayıp FALLING_EDGE olarak ayarlamak gerekir. Daha önce LOW demiştik ama yanlış olmuş. Programdaki sıkıntı bundan kaynaklanıyor olabilir.
  • düşük güç tüketimi için önce güç katını tasarlamanız lazım. dcdc konvertorle hem buck hem boost ozelliği olması gerekir ayrıca sensorunuz low power değil hele kalem pil bu proje için hiç de ıyı değil 1 adet 2amperlik bir 18650 lion endustriyel pille projenızı yapın yada powerbank kullanın en kolayı
  • #include < LowPower.h>
    #include < avr/sleep.h>
    #include < Servo.h>
    #include < util/delay.h>

    Servo myservo;
    int sensor = 3;
    int sensordurum;

    void ServoCalistir()
    {
    myservo.write(150);
    //_delay_ms(3000);
    myservo.write(0);
    }

    void setup()
    {
    myservo.attach(10);
    attachInterrupt(digitalPinToInterrupt(3),ServoCalistir,FALLING);
    sleep_bod_disable();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sei();
    sleep_cpu();
    }

    void loop()
    {
    myservo.write(150);
    _delay_ms(3000);
    myservo.write(0);
    _delay_ms(2000);
    sleep_bod_disable();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sei();
    sleep_cpu();
    }

  • selam bu kod şuanda çalışıyor. mikrodenetleyiciyi 2 kapasitör ve osilatörle direk 5v uygulayarak çalıştırıyorum. toplamda 6ma akım çekiyor. bunun 2ma ini mz80 sensör çekiyor. 4ma servo ve atmega çekiyor. servo çalıştığında 260ma lere çıkıp geri düşüyor 5-6 ma akımda sabitleniyor
  • sanırım kodda kesmeyi devre dışı bırakmadığımız için olsa gerek sensör algılama yapıp servo 150 dereceye dönüyor ve 3 saniye bekleme süresinde tekrar algılama yaptığında tekrar 0 a dönüyor yani tekrar kesmeye gidiyor :)
  • ölçümleri paylaşayım. kesme ve uyku kullanılmadan aynı sensör ve servo ile bekleme akımı 21ma yani uyku ve kesme kullanılarak pil ömrü teorik olarak 3 katına çıkmış oldu çünkü henüz pille deneme şansım olmadı. yalnız uyku ve kesmede delay satırı stabil çalışmayı engelliyor diye düşünüyorum. sensör düzensiz algılama yaparsa 150 derecede takılıyor bazen 10 ar derecelik hareketler yapıyor

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.