İçindekiler:

Basit Döner Şifre Çözücü: 4 Adım
Basit Döner Şifre Çözücü: 4 Adım

Video: Basit Döner Şifre Çözücü: 4 Adım

Video: Basit Döner Şifre Çözücü: 4 Adım
Video: Python ile 1 Dakikada Bütün Şifreleri Kır 2024, Kasım
Anonim
Image
Image
Basit Döner Şifre Çözücü
Basit Döner Şifre Çözücü

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ı

Devre şeması
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

teori
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.

Önerilen: