İçindekiler:

İkili Ağaç Mors Dekoderi: 7 Adım (Resimlerle)
İkili Ağaç Mors Dekoderi: 7 Adım (Resimlerle)

Video: İkili Ağaç Mors Dekoderi: 7 Adım (Resimlerle)

Video: İkili Ağaç Mors Dekoderi: 7 Adım (Resimlerle)
Video: Mini Bilgi'sel #1 - Mors Alfabesi Nedir? 2024, Kasım
Anonim
Image
Image
Devre şeması
Devre şeması

Bu talimat, bir Arduino Uno R3 kullanarak Mors Kodunun nasıl çözüleceğini açıklar.

Gönderme hızını otomatik olarak ayarlayan kod çözücü, dakikada en az 80 kelimeye kadar mors kodunu çözme yeteneğine sahiptir.

Gelen kod, Arduino Seri Monitörünüzde (veya takılıysa TFT ekranınızda) metin olarak görüntülenir.

Mors gönderme alıştırması yapmak isterseniz bir ton osilatörü dahil edilmiştir.

Kod çözücünün özellikleri:

  • 320 x 240 TFT ekran modülü [1]
  • İstenmeyen sinyalleri ayırmak için bir Goertzel dijital bant geçiren filtre.
  • sinyalin kodunu çözmek için bir "İkili Mors Ağacı"
  • otomatik hız takibi
  • mors pratiği yaparken sesli bir çıkış
  • hem gelen hem de giden metin görüntülenir.

Aşağıdaki karakterler ve semboller tanınır:

  • [A.. Z]
  • [0..9]
  • [., ? ' ! / () &:; = + - _ " @]

Mors kod çözücü kalkanının tahmini maliyeti, TFT ekranı çıkarıldığında 25 dolardır. [1]

Görüntüler

  • Kapak fotoğrafı tamamen monte edilmiş bir üniteyi göstermektedir
  • Video, kod çözücünün çalıştığını gösteriyor

Notlar

[1]

  • Tüm metin Arduino “Seri Monitörünüze” gönderildiğinden TFT ekran modülü isteğe bağlıdır.
  • TFT modülü, talimat verebilirim

Adım 1: Parça Listesi

Aşağıdaki parçalar https://www.aliexpress.com/ adresinden alınmıştır.

Arduino UNO R3, 2.54mm Pitch için sadece 1 prototip kalkan

Aşağıdaki parçalar yerel olarak elde edildi:

  • 1 sadece LM358 çift opamp
  • 1 sadece LED yeşil
  • 1 sadece LED klip
  • 1 sadece elektret mikrofon kapsülü
  • 1 sadece normalde açık buton
  • 1 sadece 8 pinli DIP soketi
  • 2 sadece 330 ohm direnç
  • 2 sadece 2K2 direnç
  • 5 sadece 10K ohm direnç
  • 2 sadece 56K ohm direnç
  • 2 sadece 1uF kapasitör
  • 1 sadece 10uF kapasitör

Aşağıdaki parçalar isteğe bağlıdır:

  • 1 sadece 2,2 inç TFT SPI LCD Ekran Modülü 240*320 ILI9341, Arduino Raspberry Pi için SD Kart Yuvalı 51/AVR/STM32/ARM/PIC [1]
  • Mors tuşu / basma düğmesi
  • 1 yalnızca BC548 NPN transistör
  • 1 sadece 1 inç hoparlör
  • 1 sadece 33K ohm direnç
  • 1 yalnızca 3,5 mm mono fiş (mors tuşu için)
  • 1 adet sadece 3,5 mm mono soket (mors tuşu için)
  • 3 sadece 9 mm M3 dişli naylon ara parçası
  • 1 sadece 130 x 68 x 44 mm ABS plastik kutu
  • 5 yalnızca 2 pimli dik açılı konektör

Mors kod çözücü kalkanının tahmini maliyeti, isteğe bağlı TFT ekranı çıkarıldığında 25 dolardır. [1]

Notlar

[1]

İsteğe bağlı 320 x 240 TFT ekran modülü için parça listesi, talimatımda listelenmiştir

[2]

Göndericiyi kullanmak istiyorsanız bir mors tuşu veya sağlam bir basma düğmesi gereklidir.

Adım 2: Devre Şeması

Devre şeması
Devre şeması
Devre şeması
Devre şeması
Devre şeması
Devre şeması

Görüntüler

Fotoğraf 1, mors kod çözücünün devre şemasını göstermektedir. Mors tuşuyla seri olarak bağlanan 330 ohm'luk direnç, yanlışlıkla toprağa kısa devre olması durumunda D4 çıkış akımını sınırlar… değerini artırmak hoparlörden gelen ses çıkışını azaltır. Bu nedenle, kalkana eklemedim, ayarlama kolaylığı için doğrudan mors anahtarı jakına bağladım

Fotoğraf 2, eşleşen bir kalkanı göstermektedir. Kalkan, mikrofon yükselticisini ve ton osilatörünü eklediğim https://www.instructables.com/id/Arduino-TFT-Grap… talimatımdan geliyor. [1]

Fotoğraf 3, bir Arduino'ya bağlı tamamlanmış kalkanı gösterir. Metin Arduino “Seri Monitörünüzde” görüntülenecekse başka hiçbir bileşen gerekmez

Fotoğraf 4, kod çözücünün kısmen kutulu olduğunu göstermektedir. Ekranı görüntülemek için kapakta bir delik açılmıştır. Hoparlör ve mikrofon kasaya sıcak yapıştırılmıştır. Hoparlörü monte etmeden önce kapağa bazı hoparlör delikleri açın. Kapaktaki orta soket bir uzatma mikrofonu içindir … bu olmadan dekoder hoparlöre yakın yerleştirilmelidir ki bu her zaman mümkün değildir

Fotoğraf 5, TFT ekranını göstermektedir. Ekran kenarlarına siyah elektrik bandı yapıştırılmıştır … bu bant ışık sızıntısını önler ve ekran ile kapaktaki açıklık arasındaki herhangi bir yanlış hizalamayı maskeler

Önemli

[1]

Büyük bir USB konektörü olan Arduino'lar, USB konektörü ve Arduino kalkanı arasında bir elektrik bandı katmanı gerektirir. Boşluk küçük olduğu için bant olmadan kazara şortlar mümkündür. Küçük konektörleri olan Arduino'lar için bant gerekli değildir

3. Adım: Teori

teori
teori
teori
teori
teori
teori

Her mors alfabesi harfi, "nokta" ve "tire" adı verilen bir dizi kısa ve uzun süreli ton içerir.

  • nokta (.) 1 birim uzunluğundadır
  • tire (_) 3 birim uzunluğundadır
  • harf elemanları arasındaki boşluk 1 birimdir
  • Harfler arasındaki boşluk 3 birimdir
  • kelimeler arasındaki boşluk 7 birimdir

Gelen tonun nokta mı çizgi mi olduğunu 2 birim uzunluğundaki bir referans tonuyla süresini karşılaştırarak belirleyebiliriz.

  • bir nokta 2 birimden küçüktür
  • bir tire 2 birimden büyüktür

Gelen nokta ve tire deseninin kodunu çözmek için birbirinden tamamen farklı iki yöntem vardır:

  • doğrusal arama
  • ikili ağaç (iki yönlü arama olarak da bilinir)

Doğrusal Arama

Yaygın bir yöntem, bir dizi karakter ve bunların eşleşen mors kalıplarını oluşturmaktır. Örneğin, aşağıdaki karakterlerin her biri şu şekilde kaydedilir:

  • A. _
  • B _…
  • C _. _.
  • 0 _ _ _ _ _
  • 1. _ _ _ _
  • 2.. _ _ _

Her harf 6 hücre gerektirir… 1 harfin kendisi için ve (.)'ler ve (_)'ler için 5 hücre. Bunu yapmak için toplam 216 hücreli bir harf[36][6] karakter dizisine ihtiyacımız var. Kullanılmayan hücreler normalde sıfır veya boşlukla doldurulur.

Gelen noktaların ve tirelerin kodunu çözmek için, gelen her harfin nokta/çizgi desenini referans karakter desenlerimizle karşılaştırmalıyız.

Bu yöntem işe yarasa da son derece yavaştır.

Diyelim ki bir dizide 26 harf ('A',..' Z') ve rakamlar ('0', … '9') var, o zaman her biri 5'e kadar alt arama içeren 36 arama yapmalıyız, yani '9' rakamının kodunu çözmek için toplam 36*5=180 arama.

İkili ağaç

Arama gerektirmediğinden ikili arama çok daha hızlıdır.

Hem karakterin hem de mors desenlerinin saklanmasını gerektiren doğrusal aramanın aksine, ikili ağaç yalnızca karakterleri depolar, bu da dizi boyutunun daha küçük olduğu anlamına gelir.

İkili ağacımı (fotoğraf1) daha okunabilir hale getirmek için iki yarıya (fotoğraf 2 ve 3) böldüm.

Bir karakter bulmak için, her nokta duyduğumuzda bir işaretçiyi sola hareket ettiririz ve bir kısa çizgi duyduğumuzda işaretçiyi sağa hareket ettiririz. Her hareketten sonra, bir sonraki hamle için işaretçi mesafesini yarıya indiririz… bu nedenle ikili ağaç adı verilir.

'9' harfinin (tire, tire, tire, tire, nokta) kodunu çözmek için 5 hamle gerekir … 4 sağa ve 1 sola doğru işaretçiyi doğrudan '9' üzerinde bırakır.

Beş hamle, 180 aramadan çok daha hızlıdır !!!!!

İkili karakter dizisi de daha küçüktür … 26 harf ve 10 rakam yalnızca 64 x 1 satır dizisi gerektirir. Noktalama işaretlerini çözebilmek için 128 karakterlik bir dizi oluşturmayı seçtim.

Adım 4: Tasarım Notları

Tasarım Notları
Tasarım Notları
Tasarım Notları
Tasarım Notları
Tasarım Notları
Tasarım Notları
Tasarım Notları
Tasarım Notları

Girişim yapan sinyallerin varlığında Morse kodunun çözülmesi zordur. İstenmeyen sinyaller reddedilmelidir… bu bir çeşit filtre gerektirir.

Birçok olasılık var:

  1. Faz kilitli döngüler
  2. İndüktör-kapasitör filtreleri
  3. Direnç-kapasitör aktif filtreler
  4. Hızlı Fourier Dönüşümü veya Goertzel filtresi gibi dijital sinyal işleme.

Yöntem 1, 2, 3, hacimli olan harici bileşenler gerektirir.

Yöntem 4 harici bileşen gerektirmez … frekanslar matematiksel algoritmalar kullanılarak tespit edilir.

Hızlı Fourier Dönüşümü (FFT)

Karmaşık bir dalga biçiminde bir tonun varlığını saptamanın bir yöntemi, Hızlı Fourier Dönüşümünü kullanmaktır.

Fotoğraf 1, FFT'nin (Hızlı Fourier Dönüşümü) ses spektrumunu "binlere" nasıl böldüğünü gösterir.

Fotoğraf 2, FFT “kutularının” bir sinyale nasıl tepki verdiğini gösterir… bu durumda 800Hz. 1500 Hz'lik ikinci bir sinyal mevcut olsaydı, biri 800 Hz'de ve diğeri 1500 Hz'de olmak üzere iki yanıt görürdük.

Teoride, belirli bir FFT frekans bölmesinin çıkış seviyesini izleyerek bir mors kodu kod çözücüsü yapılabilir … büyük bir sayı bir nokta veya tire varlığını temsil eder … küçük bir sayı sinyal olmadığını gösterir.

Böyle bir mors kodu kod çözücü, fotoğraf 2'deki “bin 6” izlenerek yapılabilir, ancak bu yaklaşımda yanlış olan birkaç şey var:

  • sadece bir frekans kutusu istiyoruz… gerisi boşa giden hesaplamalar
  • frekans kutuları tam olarak ilgilenilen frekansta görünmeyebilir
  • nispeten yavaştır (Arduino döngüsü başına 20mS()

Başka bir yöntem de bir Goertzel filtresi kullanmaktır.

Goertzel Filtresi

Goertzel filtresi FFT'ye benzer, ancak yalnızca tek bir frekans bölmesine sahiptir.

Photo3, bir Goertzel filtresinin ayrık ses adımlarına frekans yanıtını gösterir.

Fotoğraf 4, aynı frekans aralığında aynı filtrenin bir taramasıdır.

Goertzel algoritmasıyla “gitmeye” karar verdim:

  • Goertzel algoritmasını kullanan Arduino loop() süresi, Arduino “fix_FFT” kitaplığını kullanan bir FFT çözümü için 14mS (milisaniye) ile 20mS (milisaniye) idi.
  • Bir Goertzel bant geçiren filtrenin merkez frekansını ayarlamak kolaydır.
  • Bant genişliği yaklaşık 190Hz'dir.

Fotoğraf 5, bir ton algılandığında 900Hz Goertzel filtresinden sayısal çıktıyı gösterir. Ton eşiğimi 4000 değerine ayarladım… 4000'in üzerindeki değerler bir tonu belirtir.

Teoride, filtrenizi rahat bir dinleme frekansına ayarlamanız yeterlidir. Maalesef 1 inçlik izleme hoparlörümden gelen ses çıkışı hızla 900 Hz'nin altına düşüyor. Herhangi bir sorunu önlemek için 950Hz filtre frekansı kullanıyorum. Alternatif filtre frekanslarını hesaplamak için gerekli formüller kod başlığımda bulunur.

kod çözme

Noktaların ve tirelerin kodunun çözülmesi ilk göründüğü kadar kolay değildir.

Mükemmel mors şu şekilde tanımlanır:

  • nokta = 1 birim
  • harf içindeki boşluklar = 1 birim
  • tire = 3 birim
  • harfler arasındaki boşluk = 3 birim
  • kelimeler arasındaki boşluk = 7 birim

Mükemmel mors kodunu çözmek için sadece 2 birimlik bir referans ton süresine ihtiyacımız var.

  • nokta < 2 birim
  • eleman uzayı < 2 birim
  • tire > 2 birim
  • harf _space > 2 birim
  • word_space > 6 birim (yani 3 x referans birimi)

Bu, makine morsesi için çalışır ancak “gerçek dünyada”:

  • gönderme hızı değişir
  • her noktanın süresi değişir
  • her çizginin süresi değişir
  • E, I, S, H, 5 harfleri yalnızca nokta süresinin ortalaması olan noktalar içerir
  • T, M, O, 0 harfleri yalnızca tire süresinin ortalaması olan tireler içerir
  • kelime boşlukları gelmeyebilir
  • solma, kod çözücünün kurtarması gereken hatalar yaratır.
  • parazit nedeniyle bozuk sinyaller

Yalnızca nokta ve tire içeren harfler aşağıdaki durumlarda kısmen çözülür:

geçerli bir nokta ve geçerli bir tire alana kadar referans süresini tahmin ederiz. Gönderme hızı 6 WPM (kelime/dakika) ile 17 WPM arasındaysa geçerli olan 200 milisaniye kullanıyorum. Mors öğreniyorsanız bu değeri artırmanız gerekebilir. Yazılıma bir hız tablosu dahildir

Hız değişimleri şu durumlarda çözülür:

  • her nokta ve her çizgi üzerinde yuvarlanan bir ortalama uygularız ve
  • her sembol alındıktan sonra referans süresini yeniden hesaplayın

Kelime boşlukları ve gelmeyen kelime boşlukları aşağıdaki durumlarda çözülür:

  • son uçtan (tondan tona) geçişin zamanını hatırlayın,
  • her harften sonra algoritmayı yeniden başlatın,
  • bir sonraki ön uç (tonsuzdan tona) geçişi beklerken geçen süreyi hesaplayın ve
  • 6 zaman birimi aşılmışsa bir boşluk ekleyin.

Mors Osilatörü

Başlangıçta bazı Piezo buzzerlerini denedim ama şunu buldum:

  • frekans sabitlendi
  • çıkış frekansı uzun süreli dinleme için çok yüksekti
  • Piezolar Goertzel geçiş bandından çıkma eğilimindeydi

Daha sonra 750 Hz kare dalgalı bir akustik dönüştürücü sürmeyi denedim ama 1. ve 3. harmonikleri filtreleyen bir rezonansa sahip olduğunu gördüm. Fotoğraf 6, 750Hz kare dalgaya mikrofon amplifikatör çıkışını gösteriyor… 5. harmoniği görüyoruz !!!

Daha sonra küçük bir hoparlör kullanarak başvurdum. Fotoğraf 7, küçük bir hoparlöre gönderilen 750 Hz kare dalgaya mikrofon çıkışını gösteriyor… bu sefer temel olanı görüyoruz… 5. harmoniği değil. Goertzel filtresi harmonikleri yok sayar.

Notlar

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

www.embedded.com/the-goertzel-algorithm/

Adım 5: Yazılım

Yazılım
Yazılım
Yazılım
Yazılım
Yazılım
Yazılım

Kurulum

  • Ekli dosyayı indirin MorseCodeDecoder.ino [1]
  • Bu dosyanın içeriğini yeni bir Arduino çizimine kopyalayın
  • Çizimi "MorseCodeDecoder" olarak kaydedin (tırnak işaretleri olmadan)
  • Çizimi derleyin ve Arduino'nuza yükleyin

Yazılım Güncellemesi 23 Temmuz 2020

Ekli "MorseCodeDecoder6.ino" dosyasına aşağıdaki özellikler eklenmiştir.

  • bir "Tam Blackman" penceresi [2]
  • bir "Noise_blanker"

Ayarlama:

  • LED yanıp sönmeye başlayana kadar alıcınızın ses seviyesini artırın ve ardından geri dönün
  • şimdi alıcınızı, gelen mors ile adım adım LED yanıp sönene kadar ayarlayın
  • Noise_blanker, 8mS'ye kadar olan gürültü patlamalarını yok sayacak şekilde ayarlanmıştır (bir döngü süresi)
  • Gürültü eşiği, Debug=true ayarlanarak ve Seri Plotter'ınızı izleyerek ayarlanabilir

Not

[1]

Metni de görmek isterseniz Arduino Seri Monitörünüzü 115200 baud'a ayarlayın.

[2]

  • Fotoğraf 1 … Tam Blackman penceresi
  • Fotoğraf 2 … Exact Blackman penceresi olmayan Goertzel filtresi
  • Fotoğraf 3,,, Exact Blackman penceresi uygulanmış Goertzel filtresi

Adım 6: Çalıştırma

kod çözücü

Morse dinlerken üniteyi hoparlörünüzün yanına yerleştirin.

  • Elektret mikrofon kapsülü, hoparlörünüzden gelen mors sinyalini alır.
  • Elektret mikrofonun çıkışı daha sonra işlenmek üzere Arduino'ya geçmeden önce 647 kez (56dB) yükseltilir.
  • Bir Goertzel dijital bant geçiren filtre, gürültüden mors sinyalini çıkarır.
  • Kod çözme, ikili bir ağaç kullanılarak yapılır.
  • Kod çözücü çıkışı, 320 x 240 piksel TFT ekranda metin olarak görüntülenir. Ayrıca ekran kullanmak istemiyorsanız Arduino “Seri Monitörünüze” gönderilir.

Mors Gönderici

Bir mors gönderici de dahil edilmiştir. Bu, mors gönderme alıştırması yapmanızı sağlar ve aşağıdaki gibi çalışır:

  • Arduino pin 4'te sabit bir sesli ton üretilir.
  • Mors tuşuna her bastığımızda bu tonu dekoderin hoparlöründen duyarız.
  • Ton Goertzel filtresi ile aynı frekansa ayarlanmıştır, bu da kod çözücüyü gerçek mors sesini dinlediğini sanması için kandırır… Gönderdiğiniz her şey ekranda basılı metin olarak görünecektir.

Kod çözücü aşağıdakiler gibi yaygın hataları aldığından gönderme işleminiz iyileşir:

  • semboller arasında çok fazla boşluk var. (örnek: Q, MA olarak sabitlendi)
  • harfler arasında çok fazla boşluk var (örnek: NOW NO W olarak yazdırıldı)
  • Yanlış kod

7. Adım: Özet

kod çözücü

Bu talimat, mors kodunu basılı metne dönüştüren bir mors kod çözücünün nasıl yapıldığını açıklar.

  • Kod çözücü, en az 80 WPM'ye (dakikada sözcük) kadar mors kodunu çözebilir
  • Kod çözücü, alınan gönderme hızındaki değişiklikleri otomatik olarak izler.
  • Metin, Seri Monitörünüzde (veya takılıysa 320 x 240 TFT ekran modülünde) görüntülenir [1]

Gönderen

Bir mors gönderici de dahil edilmiştir

  • Gönderici, mors gönderiminizin kalitesini artırmanıza yardımcı olur.
  • Kod çözücü, gönderdiğiniz şeyin doğru olduğunu onaylar

Parça maliyeti

Mors kod çözücü kalkanının tahmini maliyeti, isteğe bağlı TFT ekranı çıkarıldığında 25 dolardır.

Diğer talimatlarımı görüntülemek için buraya tıklayın.

Ses Yarışması 2020
Ses Yarışması 2020
Ses Yarışması 2020
Ses Yarışması 2020

Audio Challenge 2020'de İkincilik Ödülü

Önerilen: