Turinys:
- 1 žingsnis: dalių sąrašas
- 2 žingsnis: grandinės schema
- 3 žingsnis: teorija
- 4 žingsnis: dizaino pastabos
- 5 žingsnis: programinė įranga
- 6 žingsnis: veikimas
- 7 žingsnis: santrauka
Video: Dvejetainis medžio morzės dekoderis: 7 žingsniai (su paveikslėliais)
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:44
Š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
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
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
Morzę sunku iššifruoti esant trukdantiems signalams. Nepageidaujami signalai turi būti atmesti … tam reikia tam tikro filtro.
Yra daug galimybių:
- Fazės užrakintos kilpos
- Induktoriaus-kondensatoriaus filtrai
- Rezistoriaus-kondensatoriaus aktyvūs filtrai
- 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
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.
Antrasis prizas „Audio Challenge 2020“
Rekomenduojamas:
PCB mirksinčio medžio dekoravimas: 5 žingsniai (su paveikslėliais)
PCB mirksinčių medžių dekoravimas: Šioje pamokoje sužinosite, kaip efektyviai sukurti elektronikos projektą. Pavyzdžiui, aš pagaminsiu PCB su mirksinčiomis lemputėmis nuo pradžios iki pabaigos. Visa elektronika veikia savarankiškai, nereikia koduoti. Viskas, ką jums reikia padaryti, tai prijungti
„LabDroid“: Morzės kodo koduotojas/dekoderis: 4 žingsniai
LabDroid: Morzės kodo koduotojas/dekoderis: Pastaba: šios instrukcijos negalima įgyvendinti 1: 1 naujausioje „LabDroid“versijoje. Netrukus jį atnaujinsiu. Šis projektas parodys, ką galite padaryti naudodami „LabDroid“. Kadangi „Hello World“paprastai kuriamas remiantis tekstu, šviesa ar garsu, aš galvojau apie „LabDr“
Daugiausia 3D spausdintas dvejetainis kodavimo įrenginys: 4 žingsniai (su paveikslėliais)
Dažniausiai 3D spausdintas dvejetainis kodavimo įrenginys: koduotojas konvertuoja informaciją iš vieno formato ar kodo į kitą. Šioje instrukcijoje pateiktas įrenginys dešimtainius skaičius nuo 0 iki 9 pavers tik dvejetainiais atitikmenimis. Tačiau čia pateiktos sąvokos gali būti naudojamos kuriant
Dvejetainis LED marmurinis laikrodis: 6 žingsniai (su paveikslėliais)
Dvejetainis LED marmurinis laikrodis: Dabar manau, kad beveik visi turi dvejetainį laikrodį, ir čia yra mano versija. Man patiko tai, kad šis projektas apjungė medžio darbus, programavimą, mokymąsi, elektroniką ir galbūt tik menką kūrybiškumą. Tai rodo laiką, mėnesį, datą, dieną
Dvejetainis žaidimas: 9 žingsniai (su paveikslėliais)
Dvejetainis žaidimas: tai žaidimas, kurį sukūriau „Tinkercad Circuits“, kad išmokčiau dvejetainius skaičius. https://www.tinkercad.com/things/erDquXcpyW8 Jei norite sekti šį vadovą ir susikurti savo, failus ir kodą galite rasti mano „github“adresu https://github.com/kee