Rotary Encoder Nasıl Çalışır ve Arduino
Döner kodlayıcı, bir düğmenin açısal konumunu (dönüşünü), düğmenin hangi yönde döndürüldüğünü belirlemek için kullanılan bir çıkış sinyaline dönüştüren bir tür konum sensörüdür.
Sağlamlıkları ve hassas dijital kontrolleri sayesinde; robotik, CNC makineleri ve yazıcılar dahil birçok uygulamada kullanılmaktadır.
İki tür döner kodlayıcı vardır - mutlak ve artımlı. Mutlak kodlayıcı bize topuzun derece cinsinden tam konumunu verirken artımlı kodlayıcı milin kaç artım hareket ettiğini bildirir.Bu eğitimde kullanılan döner kodlayıcı artımlı tiptedir.
Rotary Enkoderler Vs Potansiyometreler
Döner Kodlayıcılar, potansiyometrenin modern dijital eşdeğeridir ve bir potansiyometreden daha çok yönlüdür.Potansiyometre dairenin yalnızca 3 / 4'ünü dönerken, uç durdurucular olmadan tamamen dönebilirler.Potansiyometreler, düğmenin tam konumunu bilmeniz gereken durumlarda en iyisidir. Bununla birlikte, döner kodlayıcılar, kesin konum yerine konumdaki değişikliği bilmeniz gereken durumlarda en iyisidir.
Rotary Enkoderler Nasıl Çalışır?
Kodlayıcının içinde, aşağıda gösterildiği gibi, ortak toprak pimi C'ye ve iki kontak pini A ve B'ye bağlı yarıklı bir disk bulunur.
Düğmeyi çevirdiğinizde, A ve B, düğmeyi çevirdiğiniz yöne göre belirli bir sırada ortak toprak pimi C ile temas eder.Ortak zemine temas ettiklerinde sinyaller üretirler. Bir pim diğer pinden önce temas ettiğinden, bu sinyaller birbirleriyle 90 ° faz dışına kaydırılır. Buna karesel kodlama denir .
Düğmeyi saat yönünde çevirdiğinizde, önce A pini, ardından B pini bağlanır. Düğmeyi saat yönünün tersine çevirdiğinizde, önce B pini, ardından A pini bağlanır.Her bir pimin ne zaman toprağa bağlandığını ve bağlantısını kestiğini izleyerek, düğmenin hangi yönde döndürüldüğünü belirlemek için bu sinyal değişikliklerini kullanabiliriz. Bunu, A durumu değiştiğinde B'nin durumunu gözlemleyerek yapabilirsiniz.
A durumu değiştiğinde:
- B! = A ise, düğme saat yönünde çevrilmiştir.
- B = A ise, düğme saat yönünün tersine çevrildi.
Döner Kodlayıcı Pin Çıkışı
Döner kodlayıcının pimleri aşağıdaki gibidir:
GND Toprak bağlantısıdır.
VCC pozitif besleme voltajıdır, genellikle 3,3 veya 5 Volttur.
SWaktif düşük basmalı düğme anahtarı çıkışıdır. Düğmeye basıldığında voltaj DÜŞÜK olur.
DT (B Çıkışı)CLK çıkışı ile aynıdır, ancak CLK'yi 90 ° faz kayması ile geride bırakır. Bu çıktı, dönüş yönünü belirlemek için kullanılabilir.
CLK (Çıkış A)dönüş miktarını belirlemek için birincil çıkış darbesidir. Düğme her iki yönde de bir kilit (tıklama) döndürüldüğünde, 'CLK' çıkışı bir döngüde YÜKSEK ve ardından DÜŞÜK konuma geçer.
Kablolama - Döner Kodlayıcıyı Arduino ya Bağlama
Rotary Encoder'ı Arduino'ya bağlayalım. Bağlantılar oldukça basit. Modül üzerindeki + V pinini Arduino'daki 5V'a ve GND pinini toprağa bağlayarak başlayın.Şimdi CLK ve DT pinlerini sırasıyla dijital pin # 2 ve # 3'e bağlayın. Son olarak, SW pinini 4 numaralı dijital pime bağlayın.Aşağıdaki çizim bağlantıyı göstermektedir.
Arduino Kodu - Döner Kodlayıcıları Okuma
Aşağıdaki çizim, kodlayıcının ne zaman döndürüldüğünü algılar, hangi yöne döndürüldüğünü ve düğmeye basılıp basılmadığını belirler.Krokiyi deneyin; ve sonra onu biraz ayrıntılı olarak inceleyeceğiz.
Her şey yolundaysa, aşağıdaki çıktıyı seri monitörde görmelisiniz.
Rapor edilen dönüş beklediğinizin tersi ise, CLK ve DT hatlarını değiştirmeyi deneyin.
Kod Açıklaması:
Taslak, kodlayıcının CLK, DT ve SW pinlerinin bağlı olduğu Arduino pinlerinin bildirimi ile başlar.
Daha sonra birkaç tam sayı tanımlanır. counter
Değişken topuzu döndürülmüş bir tetik (tıklama) olduğunu her seferinde değiştirilmiş olacaktır sayımı temsil eder.
currentStateCLK
Ve lastStateCLK
değişkenler CLK çıkış durumunu tutmak ve dönme miktarını belirlemek için kullanılır.
currentDir
Seri monitörde geçerli dönüş yönü yazdırılırken çağrılan bir dizi kullanılacaktır.
lastButtonPress
Değişken bir anahtarı sektirilmesini için kullanılır.
Şimdi Kurulum bölümünde, önce enkodere olan bağlantıları giriş olarak tanımlıyoruz, ardından SW pininde giriş pullup direncini etkinleştiriyoruz. Seri monitörü de kurduk.
Sonunda CLK pininin o anki değerini okur ve lastStateCLK
değişkende saklarız .
Döngü bölümünde CLK durumunu tekrar kontrol edip lastStateCLK
değer ile karşılaştırıyoruz . Farklılarsa, bu, düğmenin döndüğü ve bir nabızın meydana geldiği anlamına gelir. currentStateCLK
Çift sayımı önlemek için tek bir durum değişikliğine tepki vermek için değerinin 1 olup olmadığını da kontrol ederiz .
İf ifadesinin içinde dönüş yönünü belirleriz. Bunu yapmak için, kodlayıcı modülündeki DT pinini okur ve CLK pininin mevcut durumu ile karşılaştırırız.Farklı olmaları, düğmenin saat yönünün tersine döndürüldüğü anlamına gelir. Daha sonra sayacı azaltıyoruz ve currentDir
"CCW" olarak ayarlıyoruz.İki değer aynı ise, düğme saat yönünde döndürülmüş demektir. Daha sonra sayacı artırıyoruz ve currentDir
"CW" ye ayarlıyoruz .
Daha sonra sonuçlarımızı seri monitöre yazdırıyoruz.
İf ifadesinin dışında lastStateCLK
mevcut CLK durumuyla güncelliyoruz.
Ardından, basmalı düğmeyi okuma ve geri alma mantığı gelir. Önce mevcut düğme durumunu okuruz, DÜŞÜK ise, basma düğmeyi geri almak için 50 ms beklenir.Düğme 50 ms'den daha uzun süre DÜŞÜK kalırsa, "Düğmeye basıldı!" seri monitörde mesaj.
Sonra her şeyi yeniden yapıyoruz.
Arduino Kodu - Kesmeleri Kullanma
Döner kodlayıcının çalışması için DT ve CLK sinyallerindeki değişiklikleri sürekli izlememiz gerekir.Bu tür değişikliklerin ne zaman gerçekleştiğini belirlemek için, onları sürekli olarak sorgulayabiliriz (önceki taslakta yaptığımız gibi). Ancak, aşağıdaki nedenlerden dolayı bu en iyi çözüm değildir.
- Bir değerin değişip değişmediğini görmek için yoğun bir şekilde kontrol yapmak zorundayız. Sinyal seviyesi değişmezse döngü israfı olacaktır.
- Olayın gerçekleştiği andan kontrol ettiğimiz ana kadar gecikme olacaktır. Derhal tepki vermemiz gerekirse, bu gecikmeyle gecikeceğiz.
- Değişiklik süresi kısaysa, sinyal değişikliğini tamamen kaçırmak mümkündür.
Yaygın olarak benimsenen bir çözüm, bir kesintinin kullanılmasıdır .
Bağlantılar
Çoğu Arduino (Arduino UNO dahil) yalnızca iki harici kesintiye sahip olduğundan, yalnızca DT ve CLK sinyallerindeki değişiklikleri izleyebiliriz. Bu yüzden önceki bağlantı şemasından SW pimi bağlantısını kaldırdık.
Şimdi kablolama şuna benziyor:
Bazı kartlar (Arduino Mega 2560 gibi) daha fazla harici kesintiye sahiptir. Bunlardan birine sahipseniz, SW pin bağlantısını koruyabilir ve düğme kodunu dahil etmek için taslağın altına uzatabilirsiniz.
Arduino Kodu
Döner kodlayıcı okurken kesintilerin kullanımını gösteren taslak burada.
Bu programın ana döngüsünün boş tutulduğuna dikkat edin, böylece Arduino hiçbir şey yapmakla meşgul olacak.Bu arada, bu program dijital pin 2'yi (kesinti 0'a karşılık gelir) ve dijital pin 3'ü (kesinti 1'e karşılık gelir) bir değer değişikliği için izler. Başka bir deyişle, düğmeyi çevirdiğinizde HIGH'dan LOW'a veya LOW'dan HIGH'a giden bir voltaj değişikliği arar.
Bu olduğunda, işlev updateEncoder
(genellikle kesme hizmeti rutini veya yalnızca ISR olarak adlandırılır) çağrılır. Bu işlev içindeki kod çalıştırılır ve ardından program daha önce yaptığı şeye geri döner.
Tüm bunlardan iki satırın altında sorumludur. İşlev attachInterrupt()
, Arduino'ya hangi pinin izleneceğini, kesinti tetiklendiğinde hangi ISR'nin çalıştırılacağını ve ne tür bir tetikleyicinin aranacağını söyler.
Döner Enkoderli Kontrol Servo Motor
Bir sonraki projemizde, bir servo motorun konumunu kontrol etmek için bir döner kodlayıcı kullanacağız.
Bu proje, birçok durumda çok yararlı olabilir, örneğin, bir robot kolu çalıştırmak istediğinizde, kolu ve tutuşunu tam olarak konumlandırmanıza izin vereceği için.
Bağlantı şemasının gösterdiği gibi bir servo motora ihtiyacınız olacak. Servo motorun Kırmızı kablosunu harici 5V beslemeye, Siyah / Kahverengi kabloyu toprağa ve Turuncu / Sarı kabloyu PWM etkin pim 9'a bağlayın.
Elbette Arduino 5V çıkışını kullanabilirsiniz, ancak servonun Arduino'nun kullandığı 5V hattına elektriksel gürültüye neden olabileceğini unutmayın, ki bu istediğinizi olmayabilir.
Bu nedenle, harici bir güç kaynağı kullanmanız önerilir.
Arduino Kodu
Döner kodlayıcı ile servo motoru hassas bir şekilde kontrol etmek için çizim burada. Düğme her bir kilit (klik) döndürüldüğünde, servo kolun konumu bir derece değiştirilecektir.
Bu çizimi ilkiyle karşılaştırırsanız, birkaç şey dışında birçok benzerlik fark edeceksiniz.
Başlangıçta yerleşik Arduino Servo kitaplığını dahil ediyoruz ve servo motorumuzu temsil edecek bir servo nesnesi oluşturuyoruz.
Kurulumda, servo nesnesini pin 9'a (servo motorun kontrol piminin bağlı olduğu) bağlarız.
Döngüde, bir servo motor yalnızca bu aralık arasındaki bir değeri kabul ettiğinden, sayacı 0 ila 179 aralığına sınırlandırırız.
Son olarak sayaç değeri servo motoru konumlandırmak için kullanılır.