Mündəricat:

İkili Ağacı Mors Dekoder: 7 Adım (Şəkillərlə birlikdə)
İkili Ağacı Mors Dekoder: 7 Adım (Şəkillərlə birlikdə)

Video: İkili Ağacı Mors Dekoder: 7 Adım (Şəkillərlə birlikdə)

Video: İkili Ağacı Mors Dekoder: 7 Adım (Şəkillərlə birlikdə)
Video: İkili Arama Ağaçları (Binary Search Tree) Veri Yapıları 10 2024, Noyabr
Anonim
Image
Image
Dövrə diaqramı
Dövrə diaqramı

Bu təlimat, bir Arduino Uno R3 istifadə edərək Mors Kodunu necə deşifr etməyi izah edir.

Göndərmə sürətini avtomatik tənzimləyən dekoder, dəqiqədə ən az 80 sözə qədər morsun kodunu aça bilir.

Gələn kod Arduino Serial Monitorunuzda (və ya varsa TFT ekranında) mətn olaraq göstərilir.

Mors göndərməklə məşğul olmaq istəsəniz bir ton osilator daxil edilmişdir.

Dekoderin xüsusiyyətləri:

  • 320 x 240 TFT ekran modulu [1]
  • istenmeyen siqnalları ayırmaq üçün Goertzel rəqəmsal bant filtri.
  • siqnalın deşifr edilməsi üçün "İkili Mors Ağacı"
  • avtomatik sürət izləmə
  • morse tətbiq edərkən səsli bir çıxış
  • həm gələn, həm də gedən mətn göstərilir.

Aşağıdakı simvollar və simvollar tanınır:

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

TFT ekranından çıxarılan mors dekoder qalxanının təxmini dəyəri 25 dollardır. [1]

Şəkillər

  • Qapaq fotoşəkili tam yığılmış bir qurğunu göstərir
  • Videoda dekoderin işlədiyi görünür

Qeydlər

[1]

  • TFT ekran modulu isteğe bağlıdır, çünki bütün mətn Arduino "Serial Monitorunuza" göndərilir.
  • TFT modulu mənim göstərişli

Addım 1: Parça siyahısı

Aşağıdakı hissələr https://www.aliexpress.com/ saytından əldə edilmişdir.

Arduino UNO R3, 2.54mm Pitch üçün yalnız 1 prototip qalxan

Aşağıdakı hissələr yerli olaraq alındı:

  • 1 yalnız LM358 ikili opamp
  • 1 yalnız yaşıl LED
  • Yalnız 1 LED klipi
  • Yalnız 1 elektret mikrofon kapsulu
  • 1 yalnız normal olaraq açılan düymə
  • 1 yalnız 8 pinli DIP yuvası
  • 2 cəmi 330 ohm rezistor
  • 2 yalnız 2K2 rezistor
  • 5 yalnız 10K ohm rezistor
  • Yalnız 56K ohm müqavimət
  • 2 yalnız 1 uF kondansatör
  • 1 yalnız 10 uF kondansatör

Aşağıdakı hissələr isteğe bağlıdır:

  • 1 Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC üçün SD Kart Yuvası olan yalnız 2.2 İnç TFT SPI LCD Ekran Modulu 240*320 ILI9341 [1]
  • Mors düyməsi / düymə
  • 1 yalnız BC548 NPN tranzistor
  • 1 yalnız 1 düymlük dinamik
  • 1 yalnız 33K ohm müqavimət
  • 1 ədəd yalnız 3,5 mm mono fiş (mors düyməsi üçün)
  • 1 yalnız 3,5 mm mono priz (mors düyməsi üçün)
  • 3 ədəd yalnız 9 mm M3 ölçülü neylon boşluqlar
  • 1 ədəd yalnız 130 x 68 x 44 mm ABS plastik qutu
  • 5 yalnız 2 pinli sağ açılı bağlayıcılar

İsteğe bağlı TFT ekranı çıxılmadan, mors dekoder qalxanının təxmini dəyəri 25 dollardır. [1]

Qeydlər

[1]

İsteğe bağlı 320 x 240 TFT ekran modulu üçün hissələr siyahısı mənim göstərişli

[2]

Göndəricidən istifadə etmək istəyirsinizsə, mors düyməsi və ya möhkəm bir düymə tələb olunur.

Addım 2: Dövrə Şeması

Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı

Şəkillər

Şəkil 1, mors dekoderinin dövrə diaqramını göstərir. 330 ohm rezistor, mors açarı ilə birlikdə yerə təsadüfən qısaqalma halında D4 çıxış cərəyanını məhdudlaşdırır… dəyərinin artması dinamikdən gələn səs çıxışını azaldır. Bu səbəbdən onu qalxana əlavə etmədim, ancaq tənzimlənmənin asan olması üçün birbaşa mors açarına bağladım

Şəkil 2 uyğun bir qalxan göstərir. Qalxan, mikrofon gücləndiricisini və ton osilatorunu əlavə etdiyim təlimatlı https://www.instructables.com/id/Arduino-TFT-Grap…. [1]

Şəkil 3, bir Arduinoya bağlanmış tamamlanmış qalxanı göstərir. Mətn Arduino "Serial Monitorunuzda" görünəcəksə, digər komponentlərə ehtiyac yoxdur

Şəkil 4, dekoderin qismən qutulu olduğunu göstərir. Qapaqda ekrana baxmaq üçün bir çuxur kəsilmişdir. Dinamik və mikrofon çantaya yapışdırılıb. Dinamik quraşdırmadan əvvəl qapaqda bir neçə delik açın. Qapağın ortasındakı yuva uzatma mikrofonu üçündür … bu olmadan dekoder həmişə mümkün olmayan dinamikə yaxın yerləşdirilməlidir

Şəkil 5 TFT ekranını göstərir. Ekranın kənarlarına qara elektrik lenti yapışdırılıb … bu lent işıq sızıntısının qarşısını alır və ekranla qapağın açılması arasındakı hər hansı bir uyğunsuzluğu maskalayır

Əhəmiyyətli

[1]

Böyük bir USB konnektoru olan Arduinos, USB konnektoru ilə Arduino qalxanı arasında bir elektrik lenti qatına ehtiyac duyur. Boşluq kiçik olduğu üçün təsadüfən şort bant olmadan mümkündür. Kiçik bağlayıcıları olan Arduinos üçün bant tələb olunmur

Addım 3: nəzəriyyə

Nəzəriyyə
Nəzəriyyə
Nəzəriyyə
Nəzəriyyə
Nəzəriyyə
Nəzəriyyə

Hər bir morse kodu hərfi, "nöqtələr" və "tire" adlanan qısa və uzun müddətli tonlardan ibarətdir.

  • bir nöqtə (.) 1 vahid uzunluqdadır
  • tire (_) 3 ədəd uzunluqdadır
  • hərf elementləri arasındakı boşluq 1 ədəddir
  • hərflər arasındakı boşluq 3 ədəddir
  • sözlər arasındakı boşluq 7 vahiddir

Gələn tonun nöqtə və ya tire olub olmadığını, müddətini 2 ədəd uzunluqlu istinad tonu ilə müqayisə edərək müəyyən edə bilərik.

  • bir nöqtə 2 ədəddən azdır
  • tire 2 ədəddən çoxdur

Daxil olan nöqtə və tire nümunələrini deşifr etmək üçün iki fərqli fərqli üsul var:

  • xətti axtarış
  • ikili ağac (ikiqat axtarış kimi də tanınır)

Xətti Axtarış

Ümumi bir üsul, bir sıra simvollar və onların uyğun morz nümunələri yaratmaqdır. Məsələn, aşağıdakı simvolların hər biri belə qeyd olunacaq:

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

Hər bir hərf üçün hərfin özü üçün 6,… 1 və (.) Və (_) hərfləri üçün 5 hüceyrə lazımdır. Bunu etmək üçün cəmi 216 xanadan ibarət hərflərə [36] [6] ehtiyac var. İstifadə edilməmiş hüceyrələr ümumiyyətlə sıfır və ya boşluqla doldurulur.

Gələn nöqtələri və tireləri deşifr etmək üçün hər gələn məktubun nöqtə/tire modelini istinad xarakter nümunələrimizlə müqayisə etməliyik.

Bu üsul işləsə də son dərəcə ləngdir.

Deyək ki, 26 hərfimiz var ('A',.. 'Z') və rəqəmlər ('0',… '9') bir sıra içərisində saxlanılır, sonra hər biri 5-ə qədər alt axtarış olan 36 axtarış etməliyik. cəmi 36*5 = 180 '9' rəqəminin kodunu açmaq üçün edilən axtarışlardır.

İkili ağac

Axtarış tələb olunmadığı üçün ikili axtarış daha sürətli olur.

Həm xarakterin, həm də morz nümunələrinin saxlanılmasını tələb edən xətti axtarışdan fərqli olaraq, ikili ağac yalnız simvolları saxlayır, bu da massivin daha kiçik olması deməkdir.

Daha oxunaqlı olması üçün ikili ağacımı (şəkil1) iki yarıya bölmüşəm (şəkillər 2 və 3).

Bir xarakter tapmaq üçün hər dəfə bir nöqtə eşitdiyimiz zaman bir göstərici sola, hər dəfə tire eşitdikdə göstərici sağa hərəkət edirik. Hər hərəkətdən sonra bir sonrakı hərəkət üçün göstərici məsafəsini yarıya endiririk … buna görə də ikili ağac adı verilir.

'9' hərfini deşifrə etmək üçün (tire, tire, tire, tire, nöqtə) 5 sağa doğru hərəkət etmək lazımdır … 4 sağa və 1 işarəni birbaşa '9' üzərində qoyur.

Beş hərəkət 180 axtarışdan xeyli sürətlidir !!!!!

İkili simvol dizisi də kiçikdir … 26 hərf və 10 rəqəm yalnız 64 x 1 sətirlik bir sıra tələb edir. Durğu işarələrini deşifr edə bilmək üçün 128 simvollu bir sıra yaratmağı seçdim.

Addım 4: Dizayn Qeydləri

Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri

Morsun müdaxilə edən siqnalların iştirakı ilə kodunu açmaq çətindir. İstenmeyen siqnallar rədd edilməlidir … bunun üçün bir növ filtr lazımdır.

Bir çox ehtimal var:

  1. Faza kilidli döngələr
  2. İndüktör-kondansatör filtrləri
  3. Rezistor-kondansatör aktiv filtrlər
  4. Fast Fourier Transform və ya Goertzel filtri kimi rəqəmsal siqnal emalı.

Metodlar 1, 2, 3 həcmli xarici komponentlər tələb edir.

Metod 4 heç bir xarici komponent tələb etmir … tezliklər riyazi alqoritmlərdən istifadə etməklə aşkarlanır.

Sürətli Fourier Dönüşümü (FFT)

Mürəkkəb bir dalğa formasında bir tonun varlığını aşkar etməyin bir yolu Fast Fourier Transformunu istifadə etməkdir

Şəkil 1, FFT (Fast Fourier Transform) audio spektrini "zibil qutularına" necə böldüyünü göstərir.

Şəkil 2, FFT "qutularının" bir siqnala necə cavab verdiyini göstərir … bu halda 800Hz. 1500Hz deyən ikinci bir siqnal olsaydı, iki cavab görərdik … biri 800Hz -də, digəri 1500Hz -də.

Teorik olaraq, müəyyən bir FFT tezlik qutusunun çıxış səviyyəsini izləməklə bir mors kodu deşifratoru hazırlana bilər … çox sayda nöqtə və ya tire varlığını ifadə edir… az sayı heç bir siqnalı ifadə etmir.

Belə bir mors kodu kod çözücü, fotoşəkil 2 -də "bin 6" izlənilərək edilə bilər, lakin bu yanaşmanın bir sıra səhvləri var:

  • yalnız bir tezlik qutusu istəyirik … qalanları boş hesablamalardır
  • tezlik qutuları tam olaraq faiz tezliyində görünə bilməz
  • nisbətən yavaşdır (Arduino döngəsi başına 20mS ()

Başqa bir üsul Goertzel filtrindən istifadə etməkdir.

Goertzel Filtri

Goertzel filtri FFT -yə bənzəyir, lakin yalnız bir tezlik qutusuna malikdir.

Photo3, Goertzel filtrinin ayrı -ayrı səs addımlarına tezlik reaksiyasını göstərir.

Şəkil 4, eyni frekans aralığında eyni filtrin silinməsidir.

Goertzel alqoritmi ilə "getmək" qərarına gəldim:

  • Goertzel alqoritmini istifadə edən Arduino loop () vaxtı, Arduino "fix_FFT" kitabxanasından istifadə edərək bir FFT həlli üçün 14mS (milisaniyə) ilə 20mS (milisaniyə) arasında idi.
  • Goertzel bandpass filtrinin mərkəzi tezliyini təyin etmək asandır.
  • Bant genişliyi təxminən 190Hz -dir.

Şəkil 5, bir ton algılandığında 900Hz Goertzel filtrindən gələn rəqəmsal çıxışı göstərir. Ton eşiğimi 4000 olaraq təyin etdim … 4000 -dən yuxarı olan dəyərlər bir tonu göstərir.

Nəzəri olaraq filtrinizi rahat bir dinləmə tezliyinə uyğunlaşdırmalısınız. Təəssüf ki, 1 düymlük monitor dinamikimin səs çıxışı sürətlə 900Hz -dən aşağı düşür. Hər hansı bir problemin qarşısını almaq üçün 950Hz filtr tezliyindən istifadə edirəm. Alternativ filtr tezliklərinin hesablanması üçün lazım olan düsturlar kod başlığımda tapılmışdır.

Kod çözmə

Nöqtələrin və tirelərin deşifr edilməsi ilk göründüyü qədər asan deyil.

Mükəmməl morse aşağıdakı kimi təyin olunur:

  • nöqtə = 1 ədəd
  • məktub daxilində boşluqlar = 1 ədəd
  • tire = 3 ədəd
  • hərflər arasındakı boşluq = 3 ədəd
  • sözlər arasındakı boşluq = 7 ədəd

Mükəmməl morse kodunu deşifrə etmək üçün sadəcə 2 ədədlik bir istinad tonuna ehtiyacımız var

  • nöqtə <2 ədəd
  • element sahəsi <2 ədəd
  • tire> 2 ədəd
  • hərf _ boşluq> 2 ədəd
  • word_space> 6 ədəd (yəni 3 x istinad vahidi)

Bu maşın morsu üçün işləyir, ancaq "real dünyada":

  • göndərmə sürəti dəyişir
  • hər nöqtənin müddəti dəyişir
  • hər tire müddəti dəyişir
  • E, I, S, H, 5 hərflərində yalnız nöqtə müddətinin ortasında olan nöqtələr var
  • T, M, O, 0 hərfləri yalnız tire müddətinin ortasında olan tire işarələrini ehtiva edir
  • söz boşluqları gəlməyə bilər
  • solma, dekoderin bərpa etməli olduğu səhvlər yaradır.
  • müdaxilə səbəbindən pozulmuş siqnallar

Yalnız nöqtələr və tire olan məktublar qismən həll olunur, əgər:

etibarlı bir nöqtə və etibarlı bir tire alana qədər istinad müddətini təxmin edirik. Göndərmə sürəti 6 WPM (dəqiqədə söz) və 17 WPM arasında olduqda etibarlı olan 200 milisaniyədən istifadə edirəm. Mors öyrənirsinizsə bu dəyəri artırmalısınız. Proqramda sürət cədvəli var

Sürət fərqləri aşağıdakı hallarda həll olunur:

  • hər nöqtədə və hər bir tire üzərində yuvarlanan ortalamanı yerinə yetiririk
  • hər bir simvol alındıqdan sonra istinad müddətini yenidən hesablayın

Söz boşluqları və çatmayan söz boşluqları həll edilir, əgər:

  • sonuncu (tondan tonsuz) keçidin vaxtını xatırlayın,
  • hər hərfdən sonra alqoritmi yenidən başladın;
  • Növbəti qabaqcıl (tondan tona keçid) keçidini gözləyərkən keçən vaxtı hesablayın və
  • 6 vaxt vahidi aşıldıqda boşluq qoyun.

Mors Osilatoru

Əvvəlcə bəzi Piezo buzzerlərini sınadım, amma tapdım:

  • tezliyi təyin olundu
  • çıxış tezliyi uzun müddət dinləmək üçün çox yüksək idi
  • piezos Goertzel ötürmə zolağından çıxmağa meylli idi

Daha sonra 750Hz kvadrat dalğası olan bir akustik çeviricini idarə etməyə çalışdım, amma 1 -ci və 3 -cü harmonikləri süzən bir rezonansa sahib olduğunu gördüm. Şəkil 6, 750Hz kvadrat dalğasına mikrofon gücləndiricisinin çıxışını göstərir … 5-ci harmonik görürük !!!

Sonra kiçik bir dinamikdən istifadə etdim. Şəkil 7, mikrofonun çıxışını kiçik bir dinamikə göndərilən 750Hz kvadrat dalğasına göstərir … bu dəfə 5 -ci harmonik deyil, əsasını görürük. Goertzel filtri hər hansı bir harmonikaya məhəl qoymur.

Qeydlər

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Addım 5: Proqram təminatı

Proqram təminatı
Proqram təminatı
Proqram təminatı
Proqram təminatı
Proqram təminatı
Proqram təminatı

Quraşdırma

  • Əlavə edilmiş faylı yükləyin MorseCodeDecoder.ino [1]
  • Bu faylın məzmununu yeni bir Arduino eskizinə kopyalayın
  • Eskizi "MorseCodeDecoder" olaraq qeyd edin (alıntılar olmadan)
  • Eskizi tərtib edin və Arduino -ya yükləyin

Proqram Yeniləməsi 23 İyul 2020

Əlavə edilmiş "MorseCodeDecoder6.ino" faylına aşağıdakı xüsusiyyətlər əlavə edildi

  • "Tam Blackman" pəncərəsi [2]
  • "Noise_blanker"

Düzəliş:

  • LED yanıb -sönməyə başlayana qədər geri dönənə qədər qəbuledicinizin səs səviyyəsini artırın
  • LED daxil olan mors ilə addım -addım yanıp sönənə qədər alıcınızı tənzimləyin
  • Noise_blanker, 8mS -ə qədər səs -küy partlayışlarına məhəl qoymamaq üçün qurulmuşdur (bir döngü vaxtı)
  • səs -küy həddi Debug = true olaraq təyin olunaraq və Serial Plotterinizi izləyərək tənzimlənə bilər

Qeyd

[1]

Mətni də görmək istəyirsinizsə Arduino Serial Monitorunuzu 115200 baud olaraq təyin edin.

[2]

  • Şəkil 1… Tam Blackman pəncərəsi
  • Şəkil 2… Tam Blackman pəncərəsi olmayan Goertzel filtri
  • Şəkil 3,,, Tam Blackman pəncərəsi olan Goertzel filtri tətbiq edildi

Addım 6: Əməliyyat

Dekoder

Morsa qulaq asarkən cihazı dinamikin yanına qoyun.

  • Elektret mikrofon kapsulu dinamikdən mors siqnalını alır.
  • Elektret mikrofonunun çıxışı daha sonra 647 dəfə (56dB) gücləndirilərək Arduino -ya işlənilir.
  • Goertzel rəqəmsal bant keçid filtri səs -küydən mors siqnalını çıxarır.
  • Dekodlaşdırma ikili ağacdan istifadə etməklə aparılır.
  • Dekoder çıxışı 320 x 240 piksel TFT displeydə mətn olaraq göstərilir. Ekrandan istifadə etmək istəmirsinizsə, Arduino "Serial Monitor" a da göndərilir.

Mors göndərən

Mors göndərən də daxil edilmişdir. Bu, mors göndərmək və aşağıdakı kimi işləmək imkanı verir:

  • Arduino pin 4 -də daimi səs tonu yaranır.
  • Mors düyməsini hər dəfə basdığımızda bu tonu dekoderin yüksək dinamikindən eşidirik.
  • Səs, dekoderin əsl morse dinlədiyini düşünməsinə səbəb olan Goertzel filtri ilə eyni tezliyə qurulmuşdur … göndərdiyiniz hər şey ekranda çap edilmiş mətn kimi görünəcək.

Dekoder aşağıdakı kimi ümumi səhvləri aldıqda göndərməyiniz yaxşılaşacaq:

  • simvollar arasında çox boşluq. (məsələn: Q MA kimi yazılıb)
  • məktublar arasında çox yer var (məsələn: NOW W olaraq yazılır)
  • səhv kod

Addım 7: Xülasə

Dekoder

Bu təlimat mors kodunu çap edilmiş mətnə çevirən bir mors dekoderinin necə hazırlanacağını təsvir edir.

  • Dekoder ən az 80 WPM (dəqiqədə sözlər) qədər morsu deşifr edə bilir.
  • Dekoder alınan göndərmə sürətindəki dəyişiklikləri avtomatik olaraq izləyir.
  • Mətn Serial Monitorunuzda (və ya varsa 320 x 240 TFT ekran modulunda) göstərilir [1]

Göndərən

Mors göndərən də daxil edilmişdir

  • Göndərən, mors göndərməyinizin keyfiyyətini yaxşılaşdırmağa kömək edir.
  • Dekoder göndərdiyinizin doğru olduğunu təsdiqləyir

Parçaların dəyəri

İsteğe bağlı TFT ekranı çıxılmadan, mors dekoder qalxanının təxmini dəyəri 25 dollardır.

Digər təlimatlarımı görmək üçün bura vurun.

Audio Challenge 2020
Audio Challenge 2020
Audio Challenge 2020
Audio Challenge 2020

Audio Challenge 2020 -də İkinci Mükafat

Tövsiyə: