İçindekiler:

Eksiksiz Bir Arduino Döner Çözümü: 5 Adım
Eksiksiz Bir Arduino Döner Çözümü: 5 Adım

Video: Eksiksiz Bir Arduino Döner Çözümü: 5 Adım

Video: Eksiksiz Bir Arduino Döner Çözümü: 5 Adım
Video: ÇOK UCUZA Oyuncu Ses Mixeri Yaptık ! | Arduino Projeleri | DIY 2024, Kasım
Anonim
Eksiksiz Bir Arduino Döner Çözümü
Eksiksiz Bir Arduino Döner Çözümü

Döner kodlayıcılar, genellikle Arduino ailesi mikro denetleyicileri ile kullanılan elektronik projeler için döndürülebilir kontrol düğmeleridir. Parametrelerde ince ayar yapmak, menülerde gezinmek, ekrandaki nesneleri hareket ettirmek, her türlü değeri ayarlamak için kullanılabilirler. Potansiyometreler için yaygın olarak değiştirilirler, çünkü daha doğru ve sonsuz döndürülebilirler, bir seferde bir ayrık değeri artırır veya azaltırlar ve genellikle seçim türü işlevler için basılabilir bir anahtarla entegre edilirler. Tüm şekil ve boyutlarda gelirler, ancak aşağıda açıklandığı gibi en düşük fiyat aralığıyla arayüz oluşturmak zordur.

Rotary kodlayıcıların çalışma detayları ve kullanım modları hakkında sayısız makale ve bunların nasıl kullanılacağına dair sayısız örnek kod ve kitaplık bulunmaktadır. Tek sorun, hiçbirinin en düşük fiyat aralığındaki Çin döner modülleriyle %100 doğru çalışmamasıdır.

Adım 1: İçerideki Döner Kodlayıcılar

İçeride Döner Enkoderler
İçeride Döner Enkoderler
İçeride Döner Enkoderler
İçeride Döner Enkoderler
İçeride Döner Enkoderler
İçeride Döner Enkoderler

Enkoderin döner parçasının üç pimi vardır (ve isteğe bağlı anahtar parçası için iki tane daha). Biri ortak zemindir (siyah GND), diğer ikisi düğme çevrildiğinde yönü belirlemek içindir (genellikle mavi CLK ve kırmızı DT olarak adlandırılırlar). Bunların her ikisi de mikrodenetleyicinin PULLUP giriş pinine bağlıdır ve YÜKSEK seviyeyi varsayılan okumaları yapar. Düğme ileri (veya saat yönünde) çevrildiğinde, önce mavi CLK DÜŞÜK seviyeye düşer, ardından kırmızı DT gelir. Daha ileri dönersek, mavi CLK tekrar YÜKSEK'e yükselir, ardından ortak GND yaması her iki bağlantı pimini terk ettiğinden, kırmızı DT de YÜKSEK'e yükselir. Böylece bir tam tik FWD (veya saat yönünde) tamamlanır. Aynısı diğer BWD yönüne (veya saat yönünün tersine) gider, ancak şimdi sırasıyla iki seviyeli görüntüde gösterildiği gibi önce kırmızı düşer ve mavi en son yükselir.

2. Adım: Birçokları İçin Gerçek Acıya Neden Olan Sefalet

Birçokları İçin Gerçek Acıya Neden Olan Sefalet
Birçokları İçin Gerçek Acıya Neden Olan Sefalet
Birçokları İçin Gerçek Acıya Neden Olan Sefalet
Birçokları İçin Gerçek Acıya Neden Olan Sefalet
Birçokları İçin Gerçek Acıya Neden Olan Sefalet
Birçokları İçin Gerçek Acıya Neden Olan Sefalet

Arduino meraklıları için ortak sorun, ucuz Rotary kodlayıcı modüllerinin çıkış seviyelerinde fazladan değişiklikler yaparak fazladan ve yanlış yön sayım okumalarına neden olmasıdır. Bu, kusursuz sayımı önler ve bu modüllerin doğru döner projelere entegre edilmesini imkansız hale getirir. Bu ekstra sıçramalar, bağlantı pimleri üzerindeki yamaların mekanik hareketlerinden kaynaklanır ve ekstra kapasitörler uygulamak bile bunları tamamen ortadan kaldıramaz. Sıçramalar, tam onay döngülerinin herhangi bir yerinde görünebilir ve görüntülerde gerçek hayat senaryolarıyla gösterilmektedir.

Adım 3: Sonlu Durum Makinesi (FSM) Çözümü

Sonlu Durum Makinesi (FSM) Çözümü
Sonlu Durum Makinesi (FSM) Çözümü

Resim, hem doğru hem de yanlış sıçramalar için iki pim (mavi CLK ve kırmızı DT) için olası seviye değişikliklerinin tam durum alanını gösterir. Bu durum makinesine dayanarak, her zaman %100 doğru çalışan eksiksiz bir çözüm programlanabilir. Bu çözümde filtreleme gecikmesi gerekmediğinden, aynı zamanda mümkün olan en hızlı çözümdür. Pinlerin durum uzayını çalışma modundan ayırmanın bir başka yararı da, kişinin hem yoklama hem de kesme modlarını kendi beğenisine uygulayabilmesidir. Yoklama veya kesintiler, pinlerdeki seviye değişikliklerini algılayabilir ve ayrı bir rutin, mevcut durumu ve gerçek seviye değişiklikleri olaylarını temel alarak yeni durumu hesaplar.

Adım 4: Arduino Kodu

Arduino Kodu
Arduino Kodu

Aşağıdaki kod, seri monitördeki FWD ve BWD işaretlerini sayar ve ayrıca isteğe bağlı anahtar işlevini entegre eder.

// Peter Csurgay 2019-04-10

// Arduino portlarına eşlenen döner pinler

#define SW 21 #define CLK 22 #define DT 23

// Döner tarafından ayarlanan sayacın mevcut ve önceki değeri

int eğriVal = 0; int öncekiDeğer = 0;

// FSM'nin yedi durumu (sonlu durum makinesi)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int durum = IDLE_11;

geçersiz kurulum() {

Seri.başla(250000); Serial.println("Başlat…"); // Seviye YÜKSEK tüm pinler için varsayılan olacak pinMode(SW, INPUT_PULLUP); pinMode(CLK, INPUT_PULLUP); pinMode(DT, INPUT_PULLUP); // Hem CLK hem de DT, tüm düzey değişiklikleri için kesmeleri tetikler AttachInterrupt(digitalPinToInterrupt(CLK), rotaryCLK, CHANGE); ataşeKesme(dijitalPinToInterrupt(DT), rotaryDT, CHANGE); }

boşluk döngüsü () {

// Bazı döner kodlayıcılara entegre isteğe bağlı anahtarın kullanımı if (digitalRead(SW)==LOW) { Serial.println("Pressed"); while(!digitalRead(SW)); } // Sayaç değerindeki herhangi bir değişiklik Seri Monitörde görüntülenir if (curVal != prevVal) { Serial.println(curVal); öncekiVal = eğriVal; } }

// CLK seviyesi değişiklikleri için State Machine geçişleri

void rotaryCLK() { if (digitalRead(CLK)==LOW) { if (durum==IDLE_11) durum = SCLK_01; else if (durum==SCLK_10) durum = SCLK_00; else if (durum==SDT_10) durum = SDT_00; } else { if (durum==SCLK_01) durum = IDLE_11; else if (durum==SCLK_00) durum = SCLK_10; else if (durum==SDT_00) durum = SDT_10; else if (durum==SDT_01) { durum = IDLE_11; curVal--; } } }

// DT seviye değişiklikleri için State Machine geçişleri

void rotaryDT() { if (digitalRead(DT)==LOW) { if (durum==IDLE_11) durum = SDT_10; else if (durum==SDT_01) durum = SDT_00; else if (durum==SCLK_01) durum = SCLK_00; } else { if (durum==SDT_10) durum = IDLE_11; else if (durum==SDT_00) durum = SDT_01; else if (durum==SCLK_00) durum = SCLK_01; else if (durum==SCLK_10) { durum = IDLE_11; curVal++; } } }

Adım 5: Kusursuz Entegrasyon

Ekli videoda, çeşitli düzensiz sıçrama efektlerine sahip düşük aralıklı döner kodlayıcılar durumunda bile FSM çözümünün doğru ve hızlı çalıştığını kontrol edebilirsiniz.

Önerilen: