Kazalo:

Morsejev dekoder za binarno drevo: 7 korakov (s slikami)
Morsejev dekoder za binarno drevo: 7 korakov (s slikami)

Video: Morsejev dekoder za binarno drevo: 7 korakov (s slikami)

Video: Morsejev dekoder za binarno drevo: 7 korakov (s slikami)
Video: Брайан Китинг и Ли Кронин: Жизнь во Вселенной 2024, November
Anonim
Image
Image
Shema vezja
Shema vezja

Ta navodila pojasnjujejo, kako dekodirati Morsejevo kodo z uporabo Arduino Uno R3.

Dekoder, ki se samodejno prilagodi hitrosti pošiljanja, lahko dekodira morse do najmanj 80 besed na minuto.

Dohodna koda je prikazana kot besedilo na vašem serijskem monitorju Arduino (ali na zaslonu TFT, če je nameščen)

Tonski oscilator je vključen, če želite vaditi pošiljanje morza.

Značilnosti dekoderja:

  • zaslonski modul 320 x 240 TFT [1]
  • Goertzelov digitalni pasovni filter za ločevanje neželenih signalov.
  • "Binary Morse Tree" za dekodiranje signala
  • samodejno sledenje hitrosti
  • slišni izhod pri vadbi morsa
  • prikaže se tako dohodno kot odhodno besedilo.

Prepoznajo se naslednji znaki in simboli:

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

Ocenjeni stroški dekodirnega ščita Morse, zmanjšani za zaslon TFT, so 25 USD. [1]

Slike

  • Naslovna fotografija prikazuje popolnoma sestavljeno enoto
  • Video prikazuje, kako dekoder deluje

Opombe

[1]

  • Zaslonski modul TFT ni obvezen, saj se vse besedilo pošlje na vaš Arduino "Serijski monitor".
  • Modul TFT je opisan v mojih navodilih

Korak: Seznam delov

Naslednji deli so bili pridobljeni s spletnega mesta

1 samo prototipni ščit za Arduino UNO R3, nagib 2,54 mm

Lokalno so bili pridobljeni naslednji deli:

  • 1 samo dvojni opam LM358
  • 1 le zelena LED
  • 1 samo LED sponka
  • 1 samo kapsula z elektronskim mikrofonom
  • 1 samo normalno odprt gumb
  • 1 samo 8-polna DIP vtičnica
  • 2 samo 330 ohmski upori
  • 2 samo 2K2 upori
  • 5 samo 10K ohmski upori
  • 2 samo 56K ohmski upori
  • 2 samo 1uF kondenzator
  • 1 samo 10uF kondenzator

Naslednji deli so neobvezni:

  • 1, samo 2,2 -palčni TFT SPI LCD zaslon, modul 240*320 ILI9341 z režo za SD kartico za Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Morsejev ključ / gumb
  • 1 samo tranzistor BC548 NPN
  • 1 samo 1 -palčni zvočnik
  • 1 samo 33K ohmski upor
  • 1 samo 3,5 mm mono vtič (za Morsejev ključ)
  • 1 samo 3,5 mm mono vtičnica (za morzejev ključ)
  • 3 samo 9 mm najlonski distančniki z izrezom M3
  • 1 samo plastična škatla ABS 130 x 68 x 44 mm
  • 5 samo 2-polni pravokotni konektorji

Ocenjeni stroški dekodirnega ščita Morse, zmanjšani za opcijski zaslon TFT, so 25 USD. [1]

Opombe

[1]

Seznam delov za dodatni modul zaslona 320 x 240 TFT je naveden v mojih navodilih

[2]

Morsejev ključ ali trden gumb je potreben, če želite uporabiti pošiljatelja.

2. korak: Shema vezja

Shema vezja
Shema vezja
Shema vezja
Shema vezja
Shema vezja
Shema vezja

Slike

Fotografija 1 prikazuje shemo vezja za Morsejev dekoder. 330 ohmski upor zaporedoma z morzejevo tipko omejuje izhodni tok D4 v primeru nenamernega kratkega stika z maso … povečanje njegove vrednosti zmanjša avdio izhod zvočnika. Zaradi tega ga nisem dodal k ščitu, ampak sem ga zaradi lažje nastavitve pritrdil neposredno na vtičnico za Morsejeve ključe

Fotografija 2 prikazuje ustrezen ščit. Ščit je iz mojega učnega https://www.instructables.com/id/Arduino-TFT-Grap…, ki sem mu dodal mikrofonski ojačevalnik in tonski oscilator. [1]

Fotografija 3 prikazuje dokončan ščit, pritrjen na Arduino. Druge komponente niso potrebne, če si želite ogledati besedilo na svojem Arduino "Serijskem monitorju"

Na fotografiji 4 je dekodirnik delno zapakiran. V pokrovu je izrezana luknja za ogled zaslona. Zvočnik in mikrofon sta vroče prilepljena na ohišje. Pred namestitvijo zvočnika izvrtajte nekaj lukenj za zvočnike. Središčna vtičnica na pokrovu je za podaljšek mikrofona … brez tega mora biti dekoder nameščen blizu zvočnika, kar ni vedno mogoče

Fotografija 5 prikazuje zaslon TFT. Na robove zaslona je pritrjen črni električni trak… ta trak preprečuje uhajanje svetlobe in prikriva kakršno koli neskladje med zaslonom in odprtino na pokrovu

Pomembno

[1]

Arduinos z velikim priključkom USB zahteva plast električnega traku med priključkom USB in ščitom Arduino. Nenamerne kratke hlače so možne brez traku, saj je zračnost majhna. Trak ni potreben za Arduinos z majhnimi priključki

3. korak: Teorija

Teorija
Teorija
Teorija
Teorija
Teorija
Teorija

Vsaka črka Morsejeve kode vsebuje vrsto kratkih in dolgih tonov, imenovanih "pike" in "pomišljaji".

  • pika (.) je dolga 1 enota
  • pomišljaj (_) je dolg 3 enote
  • razmik med črkovnimi elementi je 1 enota
  • presledek med črkami je 3 enote
  • presledek med besedami je 7 enot

Ali je dohodni ton pika ali pomišljaj, lahko ugotovimo tako, da primerjamo njegovo trajanje z referenčnim tonom dolžine 2 enoti.

  • pika je manj kot 2 enoti
  • pomišljaj je večji od 2 enot

Obstajata dve izrazito različni metodi za dekodiranje dohodnega vzorca pik in črtic:

  • linearno iskanje
  • binarno drevo (znano tudi kot dihotomično iskanje)

Linearno iskanje

Ena pogosta metoda je ustvarjanje niza znakov in njihovih ujemajočih se vzorcev Morseja. Na primer, vsak od naslednjih znakov bi bil shranjen kot:

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

Vsaka črka zahteva 6 celic… 1 za samo črko in 5 za (.) In (_). Za to potrebujemo črko [36] [6] niz znakov s skupaj 216 celicami. Neuporabljene celice so običajno napolnjene z ničlo ali prazno.

Za dekodiranje dohodnih pik in pomišljajev moramo primerjati vzorec pik/črtic vsake dohodne črke z našimi vzorci referenčnih znakov.

Čeprav ta metoda deluje, je zelo počasna.

Recimo, da imamo v črki shranjenih 26 črk ('A',.. 'Z') in številke ('0', … '9'), potem moramo opraviti 36 iskanj, od katerih ima vsaka največ 5 podiziskav, kar je skupaj 36*5 = 180 iskanj za dekodiranje številke '9'.

Binarno drevo

Binarno iskanje je veliko hitrejše, saj iskanje ni potrebno.

Za razliko od linearnega iskanja, ki zahteva shranjevanje znakov in vzorcev Morse, binarno drevo shrani samo znake, kar pomeni, da je velikost matrike manjša.

Binarno drevo (fotografija 1) sem razdelil na dve polovici (fotografiji 2 in 3), da bo bolj berljivo.

Če želimo poiskati znak, premaknemo kazalec levo vsakič, ko slišimo piko, in premaknemo kazalec desno vsakič, ko slišimo pomišljaj. Po vsakem premiku prepolovimo razdaljo kazalca za naslednji premik … zato ime binarno drevo.

Za dekodiranje črke '9' (črtica, črtica, črtica, črtica, pika) je potrebno 5 premikov … 4 v desno in 1 v levo, kar pušča kazalec neposredno nad '9'.

Pet potez je bistveno hitrejše od 180 iskanj !!!!!

Niz binarnih znakov je tudi manjši … Za 26 črk in 10 številk je potrebnih le matrika vrstice 64 x 1. Odločil sem se za ustvarjanje matrike s 128 znaki, da bom lahko dekodiral ločila.

4. korak: Oblikovalske opombe

Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju
Opombe o oblikovanju

Morse je težko dekodirati ob prisotnosti motečih signalov. Neželene signale je treba zavrniti … to zahteva nekakšen filter.

Obstaja veliko možnosti:

  1. Fazno zaklenjene zanke
  2. Induktorsko-kondenzatorski filtri
  3. Aktivni filtri upor-kondenzator
  4. Digitalna obdelava signala, kot je Fast Fourier Transform ali Goertzel filter.

Metode 1, 2, 3 zahtevajo obsežne zunanje komponente.

Metoda 4 ne zahteva zunanjih komponent … frekvence se zaznajo z uporabo matematičnih algoritmov.

Hitra Fourierjeva transformacija (FFT)

Eden od načinov odkrivanja prisotnosti tona v kompleksni valovni obliki je uporaba hitre Fourierjeve transformacije

Fotografija 1 prikazuje, kako FFT (hitra Fourierjeva transformacija) razdeli zvočni spekter na "posode".

Fotografija 2 prikazuje, kako se "zabojniki" FFT odzivajo na signal … v tem primeru 800Hz. Če bi bil prisoten drugi signal, recimo 1500Hz, bi videli dva odziva … enega pri 800Hz in drugega pri 1500Hz.

V teoriji lahko dekoder Morsejeve kode naredimo s spremljanjem izhodne ravni določenega frekvenčnega polja FFT … veliko število predstavlja prisotnost pike ali pomišljaja … majhno število ne predstavlja signala.

Takšen dekoder Morsejeve kode bi lahko naredili s spremljanjem »zabojnika 6« na fotografiji 2, vendar je s tem pristopom nekaj stvari narobe:

  • želimo samo en frekvenčni koš … ostalo so zapravljeni izračuni
  • frekvence se morda ne prikažejo točno na frekvenci, ki nas zanima
  • je relativno počasen (20 ms na zanko Arduino ()

Druga metoda je uporaba Goertzelovega filtra.

Goertzelov filter

Goertzelov filter je podoben FFT, vendar ima samo eno frekvenčno polje.

Fotografija 3 prikazuje frekvenčni odziv Goertzelovega filtra na diskretne zvočne korake.

Fotografija 4 je brisanje istega filtra v istem frekvenčnem območju.

Odločil sem se, da grem z Goertzelovim algoritmom kot:

  • Čas zanke Arduino () z uporabo algoritma Goertzel je bil 14mS (milisekunde) v primerjavi z 20mS (milisekunde) za rešitev FFT z uporabo knjižnice »fix_FFT« Arduino.
  • Sredinsko frekvenco Goertzelovega pasovnega filtra je enostavno nastaviti.
  • Pasovna širina je približno 190Hz.

Fotografija 5 prikazuje numerični izhod iz 900 Hz Goertzelovega filtra, ko zazna ton. Prag tona sem nastavil na vrednost 4000… vrednosti nad 4000 označujejo ton.

Teoretično morate filter nastaviti na udobno frekvenco poslušanja. Na žalost zvočni izhod iz mojega 1 -palčnega zvočnika za nadzor hitro pade pod 900Hz. Da bi se izognili težavam, uporabljam frekvenco filtra 950Hz. Potrebne formule za izračun nadomestnih frekvenc filtra najdete v moji glavi kode.

Dešifriranje

Dešifriranje pik in črtic ni tako enostavno, kot se zdi na prvi pogled.

Popoln morze je opredeljen kot:

  • pika = 1 enota
  • presledki znotraj črke = 1 enota
  • pomišljaj = 3 enote
  • presledek med črkami = 3 enote
  • presledek med besedami = 7 enot

Za dekodiranje popolnega morza potrebujemo le referenčni ton, ki traja 2 enoti

  • pika <2 enoti
  • prostor elementov <2 enoti
  • pomišljaj> 2 enoti
  • črka _prostor> 2 enoti
  • word_space> 6 enot (tj. 3 x referenčne enote)

To deluje za stroj Morse, vendar v "resničnem svetu":

  • hitrost pošiljanja je različna
  • trajanje posameznih pik je različno
  • trajanje vsakega pomišljaja je različno
  • črke E, I, S, H, 5 vsebujejo le pike, ki so povprečne za trajanje pik
  • črke T, M, O, 0 vsebujejo samo pomišljaje, ki so povprečni do trajanja pomišljaja
  • besedne vrzeli morda ne bodo prišle
  • fading ustvarja napake, ki jih mora dekoder obnoviti.
  • poškodovani signali zaradi motenj

Črke, ki vsebujejo samo pike in črtice, so delno rešene, če:

ocenjujemo referenčno trajanje, dokler ne prejmemo veljavne pike in veljavne pomišljaja. Uporabljam 200 milisekund, kar velja, če je hitrost pošiljanja med 6 WPM (besede na minuto) in 17 WPM. To vrednost boste morda morali povečati, če se učite morzejevo. V programsko opremo je vključena tabela hitrosti

Spremembe hitrosti so odpravljene, če:

  • izvedemo drseče povprečje za vsako piko in vsako pomišljaj in
  • ponovno izračunajte referenčno trajanje po prejemu vsakega simbola

Besedne vrzeli in besedne vrzeli, ki ne prispejo, se rešijo, če:

  • zapomnite si čas zadnjega prehoda (ton v brez tona),
  • po vsaki črki znova zaženite algoritem,
  • izračunajte pretečeni čas, medtem ko čakate na naslednji prehod na vodilni rob (brez tona v ton) in
  • vstavite presledek, če ste presegli 6 časovnih enot.

Morsejev oscilator

Sprva sem poskusil nekaj Piezo brenčal, vendar sem ugotovil:

  • frekvenca je bila fiksna
  • izhodna frekvenca je bila previsoka za dolgotrajno poslušanje
  • piezos se je ponavadi oddaljil od pasu Goertzel

Nato sem poskusil zagnati zvočni pretvornik s 750 Hz kvadratnim valom, vendar sem ugotovil, da ima resonanco, ki je izločila prvi in tretji harmonik. Fotografija 6 prikazuje izhod mikrofonskega ojačevalnika na 750Hz kvadratni val … vidimo peti harmonik !!!

Nato sem uporabil majhen zvočnik. Fotografija 7 prikazuje izhod mikrofona na 750Hz kvadratni val, ki je bil poslan na majhen zvočnik … tokrat vidimo temeljni … ne 5. harmonik. Goertzelov filter ne upošteva vseh harmonikov.

Opombe

[1]

en.wikipedia.org/wiki/Goertzel_algoritem

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

5. korak: Programska oprema

Programska oprema
Programska oprema
Programska oprema
Programska oprema
Programska oprema
Programska oprema

Namestitev

  • Prenesite priloženo datoteko MorseCodeDecoder.ino [1]
  • Kopirajte vsebino te datoteke v novo skico Arduino
  • Skico shranite kot "MorseCodeDecoder" (brez narekovajev)
  • Sestavite in naložite skico v svoj Arduino

Posodobitev programske opreme 23. julija 2020

V priloženo datoteko "MorseCodeDecoder6.ino" so bile dodane naslednje funkcije

  • okno "Natančen Blackman" [2]
  • "Noise_blanker"

Prilagoditev:

  • povečajte raven zvoka sprejemnika, dokler LED ne začne utripati, nato pa se ugasne
  • zdaj nastavite sprejemnik, dokler LED ne utripa v koraku z vhodno Morse
  • Noise_blanker je nastavljen tako, da prezre šume do 8 mS (čas ene zanke)
  • prag hrupa lahko prilagodite tako, da nastavite Debug = true in gledate serijski ploter

Opomba

[1]

Če želite, si oglejte besedilo vašega serijskega monitorja Arduino na 115200 baudov.

[2]

  • Fotografija 1 … Natančno okno Blackman
  • Fotografija 2… Goertzelov filter brez okna Exact Blackman
  • Fotografija 3,,, Goertzel filter z uporabljenim oknom Exact Blackman

6. korak: Delovanje

Dekoder

Ko poslušate morzejevo enoto, jo postavite poleg zvočnika.

  • Kapsula z elektronskim mikrofonom pobere morzejev signal iz vašega zvočnika.
  • Izhod elektronskega mikrofona se nato poveča 647 -krat (56 dB), preden se pošlje v Arduino za obdelavo.
  • Goertzelov digitalni pasovni filter ekstrahira Morsejev signal iz hrupa.
  • Dekodiranje se izvede z uporabo binarnega drevesa.
  • Izhod dekoderja je prikazan kot besedilo na TFT zaslonu 320 x 240 slikovnih pik. Pošlje se tudi na vaš serijski monitor Arduino, če ne želite uporabljati zaslona.

Morse pošiljatelj

Vključen je tudi pošiljatelj Morse. To vam omogoča, da vadite pošiljanje morsejev in deluje na naslednji način:

  • Na Arduino pin 4 se ustvari stalen zvočni ton.
  • Ta ton slišimo prek zvočnika dekodirnika vsakič, ko pritisnemo tipko Morse.
  • Ton je nastavljen na isto frekvenco kot Goertzelov filter, ki zavede dekodirnika, da misli, da posluša po resničnem morzeju … karkoli pošljete, se bo na zaslonu prikazalo kot natisnjeno besedilo.

Vaše pošiljanje se bo izboljšalo, ko dekoder zazna pogoste napake, kot so:

  • preveč prostora med simboli. (primer: Q natisnjen kot MA)
  • preveč prostora med črkami (primer: ZDAJ natisnjeno kot NO W)
  • napačna koda

7. korak: Povzetek

Dekoder

Ta navodila opisujejo, kako narediti morzejev dekoder, ki pretvori morzejevo kodo v tiskano besedilo.

  • Dekodirnik lahko dekodira Morse do najmanj 80 WPM (besed na minuto)
  • Dekoder samodejno sledi spremembam v hitrosti prejema.
  • Besedilo se prikaže na vašem serijskem monitorju (ali na zaslonskem modulu velikosti 320 x 240 TFT, če je nameščen) [1]

Pošiljatelj

Vključen je tudi pošiljatelj Morse

  • Pošiljatelj vam pomaga izboljšati kakovost pošiljanja po Morzeju.
  • Dekoder potrjuje, da je tisto, kar ste poslali, pravilno

Stroški delov

Ocenjeni stroški ščitnika dekoderja Morse, zmanjšani za opcijski zaslon TFT, so 25 USD.

Kliknite tukaj, če si želite ogledati moja druga navodila.

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

Druga nagrada na avdio izzivu 2020

Priporočena: