Arduino Kesintileri

Kesmeler

Bu, Arduino kodunuz için kesinti uygulama kılavuzudur. Kesintiler hakkında birçok iyi bilgi var, ancak bu kılavuz Arduino'nuzu küçük güç tüketimi ile çalıştırma serisinin bir parçası. Ve küçük demek istiyoruz. Uygulamaya bağlı olarak yıllarca süren operasyondan bahsediyoruz…. Düğme pil üzerinde. Bu, gelecekteki gömülü veya Nesnelerin İnterneti projelerinizi oluşturmak için bilmeniz gereken şeylerdir. Açıkçası, bir stok Arduino'nun ne kadar güç harcadığı çok saçma. Bu kılavuz serisindeki çeşitli numaralar kullanarak, güç tüketimini 1000 kattan fazla azaltabilirsiniz! Kulağa ilginç geliyor mu? O zaman bu rehber tam size göre! Bu kılavuzu beğendiyseniz veya kendi projemizde kesintileri nasıl uyguladığımızı görmek istiyorsanız, web sitemize göz atın:

//doteverything.co/

Neden Kesmelere İhtiyacım Var?

Cevap basit, gerçekten. Kesintilere ihtiyacınız var, çünkü kesintiler olmadan Arduino'nuzu uykuya sokamaz ve tekrar uyanmasını bekleyemezsiniz (genel olarak. Sınırlı durumlarda kesintisiz uykudan uyanmanın yolları vardır). Ve eğer uyuyamazsan, Yaz Vadisi'nin ortasında su mırıldanıyor bir maratoncu gibi şaşırtıcı bir güç olacak. Uyku modu çok, çok az güç tüketir… ancak kurulum için özel çaba gerektirir. Bilmeniz gereken ilk şey, kesintilerden yararlanmak için kodunuzu nasıl yazacağınız, o zaman daha güçlü teknikleri kullanabilirsiniz.

Kesinti nedir?

Bir kesinti birkaç şeydir. Ancak özünde, özel bir eylem gerçekleştiğinde çağrılan bir kod parçası. Hangi özel eylem? Temel olarak, belirli bir pim voltajı değiştiğinde. Duemilanove / UNO'da, yeterlilik kazanabilecek sadece 2 pim var. Ama gördüğünüz gibi, bu çok geniş bir gereklilik. Bu pimlerdeki voltajı değiştirmek için herhangi bir şey kullanabilirsiniz. Bir düğme aracılığıyla kullanıcı girişi olabilir, sensör gibi çevresel bir cihaz olabilir, başka bir mikroçip olabilir, hatta dahili bir zamanlayıcı olabilir. Kesmeleri kullanmaya başlamak için yapmanız gereken ilk şey, uygulamanızın harici bir elektrik tetikleyicisine nasıl dönüştürülebileceğini bulmaktır. Arduino'nuzla arayüz oluşturmak istediğiniz diğer cihazlar genellikle dikkatinizi çekmek için kesintileri kullanır. Önceki talimatımız olan Arduino Projenize Bluetooth Ekleme, harici bir cihazı bu şekilde birbirine bağlamanın mükemmel bir örneğidir.

Bu kılavuzda örnek bir devrenin yangın kesintilerine nasıl bağlanacağı gösterilecektir. Ardından, bazı örnek kodlar vereceğiz. Umarım nasıl yapıldığını gördükten sonra, projenize nasıl kesinti uygulanacağını anlamak için doğru zihin çerçevesine girersiniz.

Güç Tüketimi umrumda değil. Hala kesintilere ihtiyacım var mı?

Evet! İşlemciyi uyku moduna almayı planlamasanız bile kesintilere ihtiyacınız olabilir! Zamanlamaya bağlı bir uygulamanız varsa kesintiler çok önemlidir. Bu, her x milisaniyede bir gerçekleşmesi veya harici bir olay gerçekleştikten hemen sonra gerçekleştirilmesi gereken bir işlem gerektiği anlamına gelebilir. Arduino programlamanın temellerini biliyorsanız, eyleminizi gerçekleştirmenin zamanı geldiğini kontrol etmek için neden bir while döngüsü kullanamayacağınızı merak ediyor olabilirsiniz. Tipik çözüm, while döngünüzün pimin durumunu olabildiğince hızlı "yoklaması" dır. Bu yöntem genellikle işe yarar, ancak güvenilir değildir. Bir düğmeye basmak için oy kullanıyorsanız, while döngünüz tekrar düğme durumunu kontrol etmeye başlamadan önce düğmeye basıp bırakılırsa ne olur? Düğmeye basmayı özleyeceksiniz. Bir sensörden gelen sinyal gibi çok hızlı bir olay arıyorsanız ne olur? Hemen hemen yoklama yapmak zorunda kalacaksınız ve programınız kritik olayı kaçırmaktan korktuğu için başka bir şey yapamaz. Ancak kesintilerle, etkinliği yakalayacağınız% 100 garantilidir. Bir kesinti kullanmak aynı zamanda durumu sürekli kontrol etmek zorunda kalmanıza gerek kalmaz, hesaplama gücünü korur ve while döngünüzün diğer görevlerine daha hızlı ulaşmasına izin verir.

Adım 1: Devreye Genel Bakış

İlk kesmenizi oluşturmak için inşa etmeniz gereken devre:

... ya da en azından inşa etmeniz gereken devre. Neyse ki çoğu Arduino kartı, tam olarak bu yapılandırmada yerleşik LED ve dirence sahiptir. Yazılımda etkinleştirilebilirler. Ne yazık ki, sadece yerleşik işlevselliği kullanmak size olan her şeyi göstermiyor! Yani bu şemayı incelemek ve ne yaptığını anlamak için zaman ayırmaya değer. Bu tam devrenin Arduino'da yerleşik olması, size bunun ne kadar önemli olduğuna dair önemli bir ipucu vermelidir.

Bu devrenin en önemli kısmı + 5V'a bağlı 20k dirençtir. Buna çekme direnci denir. Direnç + 5V yerine GND'ye bağlanmış olsaydı, aşağı çekme direnci denirdi (Arduino'da yerleşik aşağı çekme direnci yok, bunları harici olarak eklemelisiniz). Çekme direnci, normalde + 5V'de ilişkili olduğu pimi tutar. Böylece yalnız bırakılırsa, pim her zaman YÜKSEK olarak okunur. Pimi doğrudan GND'ye bağlarsanız (örneğin düğmeyi kapatarak), pim 0V'a getirilir ve DÜŞÜK okunur. Pull-up olmasaydı, anlamlı bir şey yapmak için düğmeye basamadık. Herhangi bir Arduino pin, pinMode (pin #, INPUT_PULLUP) belirtilerek dahili olarak + 5V'ye bağlanabilir. Çekme işleminin yalnızca pim giriş olarak yapılandırıldığında anlamlı olduğunu unutmayın. Pull-up'lar hakkında daha fazla bilgi için DigitalPins sayfasına göz atın.

INTERRUPT_PIN, Arduino UNO'nuzda (veya diğer 328p tabanlı Arduino) 2 veya 3 numaralı pinlere gitmelidir. Diğer Arduinos için, kesme yeteneğine sahip bir pin bulmak için bu sayfayı kontrol edin. Kod örneğimiz için pimi 2'ye bağlayacağız. ANY_PIN'e bağlı LED basit bir devredir. Arduino'nun zaten pin 13'e bağlı bir LED'i var, bu yüzden bunu kullanacağız, ancak devreyi farklı bir pim üzerinde kendi LED'inizle değiştirmekten çekinmeyin. Arduino LED'in yanında “L” vardır.

Düğmeler genellikle 4 pime sahiptir - genellikle pimlerin ikisi, düğmenin aynı tarafındaki diğer pime dahili olarak bağlanır. Düğmeye basarsanız ve hiçbir şey olmazsa, devrenizi her zaman bağlı olan pimlere değil, düğmeye basıldığında bağlanan pimlere doğru bağladığınızdan emin olun.

Adım 2: Gerçek Kablolama

Tüm bunları göz önünde bulundurarak, dahili Arduino pulluplarını ve yerleşik LED'i kullanmak istiyorsanız, aslında kablolamanız gereken süper basit devre.

3. Adım: Kod

Burada dikkat çekmeye değer birkaç şey var. En ilginç olanı, kesmeyi yapılandırdığımız satır 10'dur. attachInterrupt () 3 bağımsız değişken alır. Birincisi, kesme numarası, pin numarası değil. Bu konuda endişelenmenize gerek yok, her zaman digitalPinToInterrupt (Pin #) kullandığınızdan emin olun ve otomatik olarak çevrilecektir. Unutmayın, sadece belirli pinler kesme pinlerine dönüştürülebilir. İkinci argüman, kesme her tetiklendiğinde kodunuzun atlamasını istediğiniz işlevin adıdır. Bu işlevin 21. satırda nasıl tanımlandığını görebilirsiniz.

AttachInterrupt () yönteminin üçüncü argümanı, bu durumda, FALLING anahtar kelimesidir. Bu, pim 2'deki voltaj YÜKSEK'den DÜŞÜK'e geçtiğinde kesmenin tetikleneceği anlamına gelir. Voltaj DÜŞÜK ila YÜKSEK olduğunda tetiklenecek RISING'i de belirleyebilirsiniz; veya voltaj her iki yönde de değiştiğinde tetiklenecek olan DEĞİŞİM'i kullanabilirsiniz. Devremizde, düğmeye basıldığında, voltaj yüksekten alçağa gider ve düğme bırakıldığında, yüksekten alçağa gider. Düğme her değiştiğinde kodu iki kez tetiklemek istemiyoruz, bu yüzden RISING veya FALLING'i seçiyoruz. Başvurunuz farklı bir şey gerektirebilir.

Denemek

Kodu yüklerseniz, Seri Monitörü çalıştırın ve düğmeyi tıklatarak LED'in tam olarak istediğimiz gibi davranmadığını fark edeceksiniz. Düğmeye her basıldığında LED'in açık ve kapalı arasında geçiş yapmasını istiyoruz. Ancak sizin için, düğmeye her bastığınızda muhtemelen birkaç kez yanıp söner. Bu, düğmelerin mükemmel olmaması nedeniyle olur. Parmağınız düğmeye basıyor olabilir, ancak mikroskobik seviyeye bakarsanız, düğme tamamen kapanmadan önce kontakları birkaç kez zıplıyor. Her sekme bir kesintiyi tetikler. Sistemimiz o kadar hassas ve o kadar hassas ki, aslında yeni bir sorun getirdik! Bunu düzeltmek için, kesme tespitini daha az hassas hale getirmek için çürüyen olarak bilinen bir rutin kullanıyoruz.

4. Adım: Örnek

İşte benim çırptığım. Mükemmel değil, kesinlikle daha iyi yollar var, ancak düğmeleri kullanmaya başlamanız yeterli olmalı.

Temel fikir, düğmeye en son basıldığı zaman millis () işlevi kullanılarak günlüğe kaydedilmesidir. (Milis () işlevi, çizim çalışmaya başladığından bu yana kaç milisaniye geçtiğini gösterir). Önceki kesme tetikleyicisi geçerli olandan 200 milisaniyeden daha kısa bir süre önce gerçekleşmişse, düğmenin sıçraması muhtemeldir, bu nedenle herhangi bir işlem yapılmaz. Aksi takdirde, her şey normal olur. Bir Kesme işlevi içinde değiştirmek istediğiniz değişkenler, kesme ve ana döngünün değere asla katılmaması için geçici olarak bildirilmelidir.

Adım 5: Sırada Ne Var?

Bu kadar! Düğmeye her tıkladığınızda LED'in durumu değişmelidir. Artık bir çalışma kesintiniz var. Kesintileri projenize dahil etmenin yollarını hayal etmek size kalmış. Gördüğünüz gibi, zamanlama ve hesaplama gücü önemli olduğunda kesmeler şarttır. Bir sonraki kılavuzda, ATMega328p'yi ultra düşük güç uyku moduna nasıl geçireceğimizi ele alacağız ve bizi tekrar uyandırmak için kesintilere güveneceğiz. O zamana kadar, Talimatlardan bize abone olun ve www.doteverything.co adresindeki ürün sayfamıza göz atın. Serin ve kullanışlı bulacağınızı umduğumuz Nesnelerin İnterneti cihazı Dot'u inşa ediyoruz ve bu rehber serisi sayesinde size donanımın kendi sürümünün nasıl oluşturulacağını tam olarak göstereceğiz!

İlgi̇li̇ Makaleler