Video: Basit Döner Şifre Çözücü: 4 Adım
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Bu talimat, bir Arduino Uno R3 kullanarak sıralı bir döner kodlayıcının kodunu çözmenin basit bir yöntemini açıklar.
Geçişlerin sayısını saymak, temas sıçramasını ortadan kaldırmak ve dönüş yönünü belirlemek için kompakt yazılım rutinleri kullanılır. Ek bileşenler ve arama tabloları gerekli değildir.
Kodun kesintili ve kesintisiz sürümleri sağlanır.
Kodun kesme versiyonu sadece tek bir kesme pini gerektirir.
Görüntüler:
- Açılış fotoğrafı, monte edilmiş kodlayıcıyı gösterir.
- Ekran görüntüsü, kesme versiyonunun kodunu ve enkoder şaftının saat yönünde ve saat yönünün tersine döndürülmesinin sayısını gösterir.
- Video, hızlı dönüş sırasında sayımı gösterir.
Adım 1: Devre Şeması
Enkoder bağlantı şeması şekil 1'de gösterilmiştir.
Atlama telleri doğrudan kodlayıcı pinlerine lehimlenmiştir.
Sayım yönü ters ise iki mavi kabloyu değiştirin.
Adım 2: Parça Listesi
Aşağıdaki parçalar https://www.aliexpress.com/ adresinden alınmıştır.
- 1 sadece USB Kablolu Arduino UNO R3.
- 1 sadece anahtarlı sıralı döner kodlayıcı (EC11 veya eşdeğeri).
- 1 sadece şafta uygun düğme.
- 3 sadece Arduino erkekten erkeğe atlama kablosu.
3. Adım: Teori
Sıralı döner kodlayıcılar, Şekil 1'de gösterildiği gibi her biri 90 derece yer değiştiren iki kare dalga üretir.
Şaft 1 ila 6 konumları arasında saat yönünde (CW) ve saat yönünün tersine (CCW) döndürüldüğünde Kontak A ve Kontak B'deki mantık düzenleri farklıdır.
Dönme yönünü belirlemenin yaygın yöntemleri şunları içerir:
- donanım
- ikiz kesintiler
- desen arama tabloları
Bu proje, arama tabloları gerektirmeyen bir yazılım yöntemi kullanır. [1]
Yön
A Kişisi ve B Kişisinden gelen çıktı modellerine bakmak yerine, A Kişisine odaklanalım.
Her A Kişisi geçişinden sonra B Kişisini örnek alırsak şunları not ederiz:
- Enkoder CW döndürüldüğünde A Kontağı ve B Kontağı zıt mantık durumlarına sahiptir.
- Enkoder CCW döndürüldüğünde A Kontağı ve B Kontağı aynı mantık durumuna sahiptir
Gerçek kod:
// ----- Geçişleri say
CurrentStateA = stateContactA(); if (CurrentStateA != LastStateA) { CurrentStateB = digitalRead(ContactB); if (CurrentStateA == CurrentStateB) Count++; if (CurrentStateA != CurrentStateB) Sayım--; LastStateA = CurrentStateA; }
Bu yöntem aşağıdaki avantajları sunar:
- arama tabloları gerekli değildir
- sadece tek bir kesme hattı gereklidir
geri tepme
Tüm mekanik kodlayıcılar "temas sıçramasından" muzdariptir.
Bir anahtar kontağı temiz bir şekilde yapmaz/kesmezse, mantık durumu, anahtar kontağı yerleşene kadar YÜKSEK'ten DÜŞÜK'e hızla salınır. Bu yanlış sayımlara neden olur.
Kontak sıçramasını bastırmak için bir yöntem, her bir anahtar kontağı boyunca küçük bir kapasitör eklemektir. Kondansatör ve ilgili çekme direnci, yüksek frekansları etkin bir şekilde kısaltan ve anahtar voltajının zarif bir şekilde yükselmesine/düşüşüne izin veren bir entegratör oluşturur.
Bu yaklaşımın dezavantajı, enkoder şaftı hızla döndürülürse geçişlerin kaçırılabilmesidir.
Yazılım Geri Dönme
Bu yöntem, sıfıra ayarlanmış iki sayaç (Açık, Kapalı) kullanır. [2]
A Kişisinde bir geçiş algılandığında:
- Sürekli anket A Kişisi.
- Kontak A YÜKSEK olduğunda Açık sayacını artırın ve Kapalı sayacı sıfırlayın.
- A Kontağı DÜŞÜK olduğunda Kapalı sayacı artırın ve Açık sayacı sıfırlayın.
- Sayaçlardan biri önceden belirlenmiş bir sayıma ulaştığında döngüden çıkın. Herhangi bir temas sıçramasının ardından etkin bir şekilde kararlı durum periyodunu arıyoruz.
Gerçek kod:
// ----- A Kişisini Geri Döndür
while (1) { if (digitalRead(ContactA)) { // ----- ContactA Açık Kapalı = 0; // Boş karşıt entegratör Open++; // Eğer (Aç > MaxCount) HIGH döndürürse entegre et; } else { // ----- ContactA Kapalı Açık = 0; // Boş karşıt entegratör Kapalı++; // Eğer (Kapalı > MaxCount) LOW dönerse entegre et; } }
Kontak A ve Kontak B geçişleri çakışmadığından B Kontağının geri dönmesine gerek yoktur.
sayma
Mekanik bir "tetik", tıklamalar arasında iki sayı kaydedildiği için sayınızı etkili bir şekilde ikiye katlar (bkz. şekil 1).
"Detant" sayısı, aşağıda gösterildiği gibi modulo 2 aritmetiği kullanılarak belirlenebilir.
Gerçek kod:
// ----- "tutukları" say
if (Sayı % 2 == 0) { Serial.print("Sayı: "); Seri.println(Sayı / 2); }
Referanslar
Daha fazla bilgi şurada bulunabilir:
[1]
howtomechatronics.com/tutorials/arduino/ro…
[2]
newbiehack.com/ButtonorSwitchDebounceinSof…
4. Adım: Yazılım
Bu proje, https://www.arduino.cc/en/main/software adresinde bulunan Ardino Uno R3 IDE'nin (entegre geliştirme ortamı) yeni bir sürümünü gerektirir.
Aşağıdaki iki Arduino çiziminin her birini indirin (ekli)
- rotary_encoder_1.ino (yoklama versiyonu)
- rotary_encoder_2.no (kesme versiyonu)
Tercih ettiğiniz sürüme çift tıklayın ve ekrandaki talimatları izleyin.
Eğlence …
Diğer talimatlarımı görüntülemek için buraya tıklayın.