Turinys:

Dvejetainis medžio morzės dekoderis: 7 žingsniai (su paveikslėliais)
Dvejetainis medžio morzės dekoderis: 7 žingsniai (su paveikslėliais)

Video: Dvejetainis medžio morzės dekoderis: 7 žingsniai (su paveikslėliais)

Video: Dvejetainis medžio morzės dekoderis: 7 žingsniai (su paveikslėliais)
Video: CS50 2015 - Week 5, continued 2024, Liepa
Anonim
Image
Image
Grandinės schema
Grandinės schema

Šioje instrukcijoje paaiškinama, kaip iššifruoti Morzės kodą naudojant „Arduino Uno R3“.

Dekoderis, kuris automatiškai prisitaiko prie siuntimo greičio, gali iššifruoti morzę iki mažiausiai 80 žodžių per minutę.

Įeinantis kodas rodomas kaip tekstas „Arduino“serijos monitoriuje (arba TFT ekrane, jei yra)

Įtrauktas toninis osciliatorius, jei norite praktikuoti morzės siuntimą.

Dekoderio savybės:

  • 320 x 240 TFT ekrano modulis [1]
  • „Goertzel“skaitmeninis pralaidumo filtras nepageidaujamiems signalams atskirti.
  • „Dvejetainis Morzės medis“, skirtas signalo dekodavimui
  • automatinis greičio sekimas
  • girdimas garsas praktikuojant morzę
  • rodomas tiek gaunamas, tiek siunčiamas tekstas.

Atpažįstami šie simboliai ir simboliai:

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

Numatoma morzės dekoderio skydo kaina, atėmus TFT ekraną, yra 25 USD. [1]

Vaizdai

  • Viršelio nuotraukoje rodomas visiškai surinktas įrenginys
  • Vaizdo įraše parodyta, kaip veikia dekoderis

Pastabos

[1]

  • TFT ekrano modulis yra neprivalomas, nes visas tekstas siunčiamas į jūsų „Arduino“serijinį monitorių.
  • TFT modulis aprašytas mano instrukcijoje

1 žingsnis: dalių sąrašas

Šios dalys buvo gautos iš

1 tik „Arduino UNO R3“, 2,54 mm pikio, prototipo skydas

Šios dalys buvo gautos vietoje:

  • 1 tik LM358 dvigubas opampas
  • 1 tik žalias šviesos diodas
  • 1 tik LED spaustukas
  • 1 tik elektreto mikrofono kapsulė
  • 1 tik paprastai atidaromas mygtukas
  • 1 tik 8 kontaktų DIP lizdas
  • 2 tik 330 omų rezistoriai
  • 2 tik 2K2 rezistoriai
  • 5 tik 10K omų rezistoriai
  • 2 tik 56K omų rezistoriai
  • 2 tik 1uF kondensatorius
  • 1 tik 10uF kondensatorius

Šios dalys yra neprivalomos:

  • Tik vienas 2,2 colio TFT SPI LCD ekrano modulis 240*320 ILI9341 su SD kortelės lizdu, skirtas „Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC“[1]
  • Morzės klavišas / mygtukas
  • 1 tik BC548 NPN tranzistorius
  • 1 tik 1 colio garsiakalbis
  • 1 tik 33K omų rezistorius
  • 1 tik 3,5 mm monofoninis kištukas (Morzės raktui)
  • 1 tik 3,5 mm monofoninis lizdas (Morzės raktui)
  • 3 tik 9 mm nailoninės tarpinės M3
  • 1 tik 130 x 68 x 44 mm ABS plastiko dėžutė
  • 5 tik 2 kontaktų stačiojo kampo jungtys

Numatoma morzės dekoderio skydo kaina, atėmus papildomą TFT ekraną, yra 25 USD. [1]

Pastabos

[1]

Papildomo 320 x 240 TFT ekrano modulio dalių sąrašas pateiktas mano instrukcijoje

[2]

Jei norite naudoti siuntėją, reikalingas morzės raktas arba tvirtas mygtukas.

2 žingsnis: grandinės schema

Grandinės schema
Grandinės schema
Grandinės schema
Grandinės schema
Grandinės schema
Grandinės schema

Vaizdai

1 nuotrauka rodo morzės dekoderio schemą. 330 omų serijos rezistorius su Morzės raktu riboja D4 išėjimo srovę atsitiktinio trumpojo įžeminimo atveju … padidinus jo vertę, garsas iš garsiakalbio sumažėja. Dėl šios priežasties aš nepridėjau jo prie skydo, bet pritvirtinau tiesiai prie morzės klavišo, kad būtų lengviau reguliuoti

2 nuotraukoje parodytas atitinkamas skydas. Skydas yra iš mano pamokomo https://www.instructables.com/id/Arduino-TFT-Grap…, prie kurio pridėjau mikrofono stiprintuvą ir toninį osciliatorių. [1]

3 nuotraukoje parodytas užbaigtas skydas, pritvirtintas prie „Arduino“. Nereikia jokių kitų komponentų, jei tekstą norite peržiūrėti „Arduino“serijos monitoriuje

4 nuotraukoje parodytas iš dalies supakuotas dekoderis. Dangtelyje išpjauta skylė ekranui peržiūrėti. Garsiakalbis ir mikrofonas buvo karštai priklijuoti prie korpuso. Prieš montuodami garsiakalbį, dangtyje išgręžkite kai kurias garsiakalbio angas. Centrinis dangtelio lizdas skirtas išplėstiniam mikrofonui… be jo dekoderis turi būti pastatytas arti garsiakalbio, o tai ne visada įmanoma

5 nuotraukoje pavaizduotas TFT ekranas. Prie ekrano kraštų pritvirtinta juoda elektros juosta … ši juosta apsaugo nuo šviesos nutekėjimo ir užmaskuoja bet kokius neatitikimus tarp ekrano ir dangčio angos

Svarbu

[1]

„Arduinos“su didele USB jungtimi reikia elektros juostos sluoksnio tarp USB jungties ir „Arduino“skydo. Atsitiktiniai šortai yra įmanomi be juostos, nes atstumas yra mažas. Juosta nereikalinga „Arduinos“, turinčioms mažas jungtis

3 žingsnis: teorija

Teorija
Teorija
Teorija
Teorija
Teorija
Teorija

Kiekvieną Morzės kodo raidę sudaro trumpos ir ilgos trukmės tonai, vadinami „taškais“ir „brūkšneliais“.

  • taškas (.) yra 1 vieneto ilgio
  • brūkšnys (_) yra 3 vienetų ilgio
  • tarpas tarp raidžių elementų yra 1 vienetas
  • tarpas tarp raidžių yra 3 vienetai
  • tarpas tarp žodžių yra 7 vienetai

Galime nustatyti, ar gaunamas tonas yra taškas, ar brūkšnys, palyginę jo trukmę su 2 vienetų ilgio atskaitos tonu.

  • taškas yra mažesnis nei 2 vienetai
  • brūkšnys yra didesnis nei 2 vienetai

Yra du akivaizdžiai skirtingi gaunamų taškų ir brūkšnių šifravimo būdai:

  • linijinė paieška
  • dvejetainis medis (dar žinomas kaip dichotominė paieška)

Linijinė paieška

Vienas įprastas metodas yra sukurti simbolių masyvą ir juos atitinkančius morzės modelius. Pavyzdžiui, kiekvienas iš šių simbolių bus išsaugotas kaip:

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

Kiekvienai raidei reikia 6 langelių … 1 pačiai raidei ir 5 (.) Ir (_) raidėms. Norėdami tai padaryti, mums reikia raidžių [36] [6] masyvo, kuriame yra 216 langelių. Nepanaudotos ląstelės paprastai užpildomos nuliu arba tuščiu.

Norėdami iššifruoti gaunamus taškus ir brūkšnius, turime palyginti kiekvienos gaunamos raidės taško/brūkšnio modelį su mūsų nuorodų simbolių modeliais.

Nors šis metodas veikia, jis yra labai lėtas.

Tarkime, kad masyve yra 26 raidės („A“, „Z“) ir skaitmenys („0“,… „9“), tada turime atlikti 36 paieškas, kurių kiekvienoje turi būti iki 5 antrinių paieškų, tai iš viso 36*5 = 180 paieškų iššifruoti skaičių „9“.

Dvejetainis medis

Dvejetainė paieška yra daug greitesnė, nes nereikia jokių paieškų.

Skirtingai nuo linijinės paieškos, kuriai reikia išsaugoti ir simbolių, ir morzės modelius, dvejetainis medis saugo tik simbolius, o tai reiškia, kad masyvo dydis yra mažesnis.

Padalinau savo dvejetainį medį (1 nuotrauka) į dvi dalis (2 ir 3 nuotraukos), kad jis būtų lengviau skaitomas.

Norėdami rasti simbolį, kiekvieną kartą, kai išgirstame tašką, perkeliame žymeklį į kairę, o kiekvieną kartą, kai išgirstame brūkšnį, perkeliame žymeklį į dešinę. Po kiekvieno judesio perpus sumažiname rodyklės atstumą kitam žingsniui … taigi ir dvejetainio medžio pavadinimas.

Norint iššifruoti raidę „9“(brūkšnys, brūkšnys, brūkšnys, brūkšnys, taškas) reikia 5 judesių… 4 į dešinę ir 1 į kairę, o žymeklis paliekamas tiesiai virš „9“.

Penki judesiai yra žymiai greitesni nei 180 paieškų !!!!!

Dvejetainis simbolių masyvas taip pat yra mažesnis… 26 raidėms ir 10 skaitmenų reikia tik 64 x 1 eilučių masyvo. Aš nusprendžiau sukurti 128 simbolių masyvą, kad galėčiau iššifruoti skyrybos ženklus.

4 žingsnis: dizaino pastabos

Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos
Dizaino pastabos

Morzę sunku iššifruoti esant trukdantiems signalams. Nepageidaujami signalai turi būti atmesti … tam reikia tam tikro filtro.

Yra daug galimybių:

  1. Fazės užrakintos kilpos
  2. Induktoriaus-kondensatoriaus filtrai
  3. Rezistoriaus-kondensatoriaus aktyvūs filtrai
  4. Skaitmeninis signalų apdorojimas, pvz., Greitas Furjė transformacija arba „Goertzel“filtras.

1, 2, 3 metodai reikalauja didelių išorinių komponentų.

4 metodui nereikia jokių išorinių komponentų… dažniai aptinkami naudojant matematinius algoritmus.

Greita Furjė transformacija (FFT)

Vienas iš būdų nustatyti toną sudėtingoje bangos formoje yra greito Furjė transformacijos naudojimas

1 nuotraukoje parodyta, kaip FFT (greita Furjė transformacija) padalija garso spektrą į „dėžes“.

2 nuotraukoje parodyta, kaip FFT „dėžės“reaguoja į signalą … šiuo atveju 800 Hz. Jei būtų antras signalas, pvz., 1500 Hz, matytume du atsakymus … vieną 800 Hz, o kitą 1500 Hz dažniu.

Teoriškai morzės kodo dekoderį galima sukurti stebint tam tikros FFT dažnių dėžės išvesties lygį … didelis skaičius reiškia tašką ar brūkšnį … mažas skaičius nereiškia jokio signalo.

Toks morzės kodo dekoderis gali būti sukurtas stebint 2 -ąją dėžę 2 nuotraukoje, tačiau taikant šį metodą yra daug dalykų:

  • mes norime tik vieno dažnio dėžės … likusieji yra švaistomi skaičiavimai
  • dažnių dėžės gali būti rodomos ne tiksliai pagal dominančio dažnio dažnį
  • jis palyginti lėtas (20 mS už „Arduino“kilpą ()

Kitas būdas yra naudoti „Goertzel“filtrą.

Goertzelio filtras

„Goertzel“filtras yra panašus į FFT, tačiau turi tik vieną dažnio dėžę.

Nuotraukoje 3 parodyta Goertzelio filtro dažnio reakcija į atskirus garso žingsnius.

4 nuotrauka yra to paties filtro peržiūra tame pačiame dažnių diapazone.

Aš nusprendžiau „eiti“su Goertzelio algoritmu taip:

  • „Arduino“ciklo () laikas naudojant Goertzelio algoritmą buvo 14 mS (milisekundės), palyginti su 20 mS (milisekundėmis) FFT tirpalui, naudojant „Arduino“fix_FFT “biblioteką.
  • Lengva nustatyti centrinį „Goertzel“pralaidumo filtro dažnį.
  • Juostos plotis yra maždaug 190 Hz.

5 nuotraukoje parodyta 900 Hz Goertzel filtro išvestis, kai aptinkamas tonas. Aš nustatiau savo tono slenkstį į 4000 vertę… vertės virš 4000 rodo toną.

Teoriškai jums tereikia sureguliuoti filtrą iki patogaus klausymosi dažnio. Deja, mano 1 colio stebėjimo garsiakalbio garso išvestis greitai nukrenta žemiau 900 Hz. Norėdami išvengti problemų, naudoju 950 Hz filtro dažnį. Būtinos formulės alternatyviems filtrų dažniams apskaičiuoti yra mano kodo antraštėje.

Dekodavimas

Taškų ir brūkšnių iššifravimas nėra toks lengvas, kaip atrodo iš pirmo žvilgsnio.

Tobula morzė apibrėžiama kaip:

  • taškas = 1 vienetas
  • tarpai raidės viduje = 1 vienetas
  • brūkšnys = 3 vienetai
  • tarpas tarp raidžių = 3 vienetai
  • tarpas tarp žodžių = 7 vienetai

Norint iššifruoti tobulą morzę, mums tiesiog reikia etaloninio 2 vienetų trukmės

  • taškas <2 vienetai
  • elemento erdvė <2 vienetai
  • brūkšnys> 2 vienetai
  • raidė _ erdvė> 2 vienetai
  • word_space> 6 vienetai (t. y. 3 x atskaitos vienetai)

Tai tinka mašinos morzei, bet „realiame pasaulyje“:

  • siuntimo greitis skiriasi
  • kiekvieno taško trukmė skiriasi
  • kiekvieno brūkšnio trukmė skiriasi
  • raidėse E, I, S, H, 5 yra tik taškai, kurių trukmė yra vidutinė
  • raidėse T, M, O, 0 yra tik brūkšneliai, kurių trukmė yra vidutinė
  • žodžių spragos gali neatsirasti
  • išblukimas sukuria klaidas, kurias dekoderis turi atkurti.
  • sugadinti signalai dėl trukdžių

Raidės, kuriose yra tik taškai ir brūkšniai, iš dalies išspręstos, jei:

mes apskaičiuojame orientacinę trukmę, kol gausime galiojantį tašką ir galiojantį brūkšnelį. Aš naudoju 200 milisekundžių, tai galioja, jei siuntimo greitis yra nuo 6 WPM (žodžiai per minutę) iki 17 WPM. Jums gali tekti padidinti šią vertę, jei mokotės morzės. Į programinę įrangą įtraukta greičio lentelė

Greičio pokyčiai išsprendžiami, jei:

  • mes atliekame slenkantį vidurkį kiekvienam taškui ir kiekvienam brūkšniui ir
  • perskaičiuokite atskaitos trukmę po kiekvieno simbolio gavimo

Žodžių spragos ir nepasiekiamos žodžių spragos pašalinamos, jei:

  • prisiminti paskutinio perėjimo nuo galo (tonas į be toną) laiką,
  • po kiekvienos raidės iš naujo paleiskite algoritmą,
  • apskaičiuoti prabėgusį laiką laukiant kito perėjimo į priekinį kraštą (be tono į toną) ir
  • įterpkite tarpą, jei viršyti 6 laiko vienetai.

Morzės osciliatorius

Iš pradžių išbandžiau keletą Piezo signalų, bet radau:

  • dažnis buvo fiksuotas
  • išėjimo dažnis buvo per didelis ilgai klausantis
  • pjezai buvo linkę ištrūkti iš Goertzelio praėjimo juostos

Tada aš bandžiau vairuoti akustinį keitiklį su 750 Hz kvadratine banga, bet pastebėjau, kad jis turi rezonansą, kuris išfiltruoja 1 ir 3 harmonikas. 6 nuotraukoje pavaizduotas mikrofono stiprintuvo išėjimas į 750 Hz kvadratinę bangą … matome penktąją harmoniką !!!

Tada kreipiausi į mažą garsiakalbį. 7 nuotraukoje parodyta mikrofono išvestis į 750 Hz kvadratinę bangą, kuri buvo išsiųsta į mažą garsiakalbį … šį kartą matome pagrindinę … ne penktąją harmoniką. „Goertzel“filtras ignoruoja bet kokias harmonikas.

Pastabos

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

5 žingsnis: programinė įranga

Programinė įranga
Programinė įranga
Programinė įranga
Programinė įranga
Programinė įranga
Programinė įranga

Montavimas

  • Atsisiųskite pridėtą failą MorseCodeDecoder.ino [1]
  • Nukopijuokite šio failo turinį į naują „Arduino“eskizą
  • Išsaugokite eskizą kaip „MorseCodeDecoder“(be kabučių)
  • Sudarykite ir įkelkite eskizą į „Arduino“

Programinės įrangos atnaujinimas 2020 m. Liepos 23 d

Prie pridėto failo „MorseCodeDecoder6.ino“pridėtos šios funkcijos

  • langas „Tikslus juodaodis“[2]
  • "Triukšmo tuščias"

Koregavimas:

  • padidinkite imtuvo garso lygį, kol šviesos diodas pradės mirksėti, tada išsijungs
  • Dabar sureguliuokite savo imtuvą, kol šviesos diodas mirksės kartu su gaunamu morze
  • „Noise_blanker“nustatytas ignoruoti triukšmo pliūpsnius iki 8 mS (vienos kilpos laikas)
  • Triukšmo slenkstį galima reguliuoti nustatant Debug = true ir žiūrint serijinį braižytuvą

Pastaba

[1]

Jei norite peržiūrėti tekstą, nustatykite „Arduino“serijos monitorių į 115200 baudų.

[2]

  • 1 nuotrauka… Tikslus „Blackman“langas
  • 2 nuotrauka… „Goertzel“filtras be „Exact Blackman“lango
  • 3 nuotrauka,,, „Goertzel“filtras su „Exact Blackman“langu

6 žingsnis: veikimas

Dekoderis

Klausydami morzės, padėkite įrenginį šalia garsiakalbio.

  • Elektreto mikrofono kapsulė priima garsiakalbio morzės signalą.
  • Tada elektreto mikrofono išvestis sustiprinama 647 kartus (56 dB), prieš perduodant „Arduino“apdoroti.
  • „Goertzel“skaitmeninis pralaidumo filtras išskiria morzės signalą iš triukšmo.
  • Dekodavimas atliekamas naudojant dvejetainį medį.
  • Dekoderio išvestis 320 x 240 pikselių TFT ekrane rodoma kaip tekstas. Jis taip pat siunčiamas į jūsų „Arduino“serijinį monitorių, jei nenorite naudoti ekrano.

Morzės siuntėjas

Taip pat įtrauktas morzės siuntėjas. Tai leidžia jums praktikuoti morzės siuntimą ir veikia taip:

  • „Arduino 4“kaištyje sukuriamas nuolatinis garsinis tonas.
  • Šį toną girdime per dekoderio garsiakalbį, kai paspaudžiame Morzės klavišą.
  • Tonas nustatytas tokiu pat dažniu kaip ir Goertzelio filtras, kuris priverčia dekoderį manyti, kad jis klausosi tikros morzės … viskas, ką siunčiate, bus rodoma ekrane kaip spausdintas tekstas.

Jūsų siuntimas pagerės, nes dekoderis suras įprastas klaidas, tokias kaip:

  • per daug vietos tarp simbolių. (pavyzdys: Q pažymėtas kaip MA)
  • per daug tarpo tarp raidžių (pavyzdys: DABAR atspausdintas kaip NO W)
  • Neteisingas kodas

7 žingsnis: santrauka

Dekoderis

Šioje instrukcijoje aprašoma, kaip sukurti morzės dekoderį, kuris morzės kodą paverčia atspausdintu tekstu.

  • Dekoderis gali iššifruoti morzę iki mažiausiai 80 WPM (žodžių per minutę)
  • Dekoderis automatiškai seka gauto siuntimo greičio pokyčius.
  • Tekstas rodomas serijiniame monitoriuje (arba 320 x 240 TFT ekrano modulyje, jei yra) [1]

Siuntėjas

Taip pat įtrauktas morzės siuntėjas

  • Siuntėjas padeda pagerinti jūsų morzės siuntimo kokybę.
  • Dekoderis patvirtina, kad tai, ką išsiuntėte, yra teisinga

Dalių kaina

Numatoma morzės dekoderio skydo kaina, atėmus papildomą TFT ekraną, yra 25 USD.

Spustelėkite čia, jei norite peržiūrėti kitus mano nurodymus.

Garso iššūkis 2020 m
Garso iššūkis 2020 m
Garso iššūkis 2020 m
Garso iššūkis 2020 m

Antrasis prizas „Audio Challenge 2020“

Rekomenduojamas: