Indholdsfortegnelse:
- Trin 1: Deleliste
- Trin 2: Kredsløbsdiagram
- Trin 3: Teori
- Trin 4: Designnotater
- Trin 5: Software
- Trin 6: Betjening
- Trin 7: Resumé
Video: Binary Tree Morse Decoder: 7 trin (med billeder)
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:26
Denne instruktive forklarer, hvordan man afkoder Morse -kode ved hjælp af en Arduino Uno R3.
Dekoderen, der automatisk tilpasser sig sendehastigheden, er i stand til at afkode morse op til mindst 80 ord i minuttet.
Den indgående kode vises som tekst på din Arduino Serial Monitor (eller TFT -skærm, hvis den er monteret)
En tonoscillator er inkluderet, hvis du ønsker at øve på at sende morse.
Dekoderen har:
- et 320 x 240 TFT displaymodul [1]
- et digitalt båndpasfilter fra Goertzel til adskillelse af uønskede signaler.
- et "Binary Morse Tree" til afkodning af signalet
- automatisk hastighedssporing
- et hørbart output ved øvelse af morse
- både indgående og udgående tekst vises.
Følgende tegn og symboler genkendes:
- [A.. Z]
- [0..9]
- [., ? ' ! / () &:; = + - _ " @]
De anslåede omkostninger ved morsedekoder -skjoldet, minus TFT -skærmen, er $ 25. [1]
Billeder
- Forsidefotoet viser en færdigmonteret enhed
- Videoen viser dekoderen, der fungerer
Noter
[1]
- TFT -displaymodulet er valgfrit, da al tekst sendes til din Arduino "Serial Monitor".
- TFT-modulet er beskrevet i min instruerbare
Trin 1: Deleliste
Følgende dele blev hentet fra
1 eneste prototypeskærm til Arduino UNO R3, 2,54 mm pitch
Følgende dele blev hentet lokalt:
- 1 kun LM358 dobbelt opamp
- 1 kun LED grøn
- 1 kun LED -klip
- 1 kun electret mikrofon kapsel
- 1 kun normalt åben trykknap
- 1 kun 8-benet DIP-stik
- 2 kun 330 ohm modstande
- 2 kun 2K2 modstande
- 5 kun 10K ohm modstande
- 2 kun 56K ohm modstande
- 2 kun 1uF kondensator
- 1 kun 10uF kondensator
Følgende dele er valgfrie:
- 1 kun 2,2 tommer TFT SPI LCD -skærmmodul 240*320 ILI9341 med SD -kortplads til Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
- Morsetast / trykknap
- 1 kun BC548 NPN -transistor
- 1 kun 1 tommer højttaler
- 1 kun 33K ohm modstand
- 1 kun 3,5 mm mono stik (til morse key)
- 1 kun 3,5 mm mono stik (til morse key)
- 3 kun 9 mm M3 tapede nylon afstandsstykker
- 1 kun 130 x 68 x 44 mm ABS plastkasse
- 5 kun 2-benede vinkelstik
De anslåede omkostninger ved morse -dekoder -skjoldet, minus det valgfrie TFT -display, er $ 25. [1]
Noter
[1]
Delelisten til det valgfrie 320 x 240 TFT-displaymodul er angivet i min instruerbare
[2]
En morse-nøgle eller robust trykknap er påkrævet, hvis du ønsker at bruge afsenderen.
Trin 2: Kredsløbsdiagram
Billeder
Foto 1 viser kredsløbsdiagrammet for morse -dekoderen. 330 ohm -modstanden i serie med morse -tasten begrænser D4 -udgangsstrømmen i tilfælde af utilsigtet kortslutning til jorden … forøgelse af dens værdi reducerer lydoutput fra højttaleren. Af denne grund har jeg ikke tilføjet det til skjoldet, men fastgjort det direkte til morsetasten for at lette justeringen
Foto 2 viser et matchende skjold. Skjoldet er fra min instruerbare https://www.instructables.com/id/Arduino-TFT-Grap … hvortil jeg har tilføjet mikrofonforstærkeren og tonoscillatoren. [1]
Foto 3 viser det færdige skjold fastgjort til en Arduino. Der kræves ingen andre komponenter, hvis teksten skal ses på din Arduino "Serial Monitor"
Foto 4 viser dekoderen delvist i boks. Der er skåret et hul i låget for visning af displayet. Højttaleren og mikrofonen er blevet limet fast til sagen. Bor nogle højttalerhuller i låget, før du monterer højttaleren. Midterstikket på låget er til en forlængelsesmikrofon … uden dette skal dekoderen placeres tæt på højttaleren, hvilket ikke altid er muligt
Foto 5 viser TFT -skærmen. Sort elektrisk tape er blevet fastgjort til skærmkanterne … dette bånd forhindrer lyslækage og dækker enhver fejljustering mellem displayet og åbningen i låget
Vigtig
[1]
Arduinos med et stort USB -stik kræver et lag elektrisk tape mellem USB -stikket og Arduino -skjoldet. Utilsigtede shorts er mulige uden båndet, da afstanden er lille. Båndet er ikke påkrævet til Arduinos, der har små stik
Trin 3: Teori
Hvert morse -kodebogstav indeholder en række toner med kort og lang varighed kaldet "prikker" og "bindestreger".
- en prik (.) er 1 enhed i længden
- et bindestreg (_) er 3 enheder i længden
- mellemrummet mellem bogstavelementer er 1 enhed
- mellemrummet mellem bogstaver er 3 enheder
- mellemrummet mellem ord er 7 enheder
Vi kan afgøre, om den indgående tone er prik eller et bindestreg ved at sammenligne dens varighed med en referencetone på 2 enheder i længden.
- en prik er mindre end 2 enheder
- et bindestreg er større end 2 enheder
Der er to klart forskellige metoder til afkodning af det indgående mønster af prikker og bindestreger:
- lineær søgning
- binært træ (også kendt som en dikotomisk søgning)
Lineær søgning
En almindelig metode er at oprette en række tegn og deres matchende morse -mønstre. For eksempel vil hvert af følgende tegn blive gemt som:
- A. _
- B _…
- C _. _.
- 0 _ _ _ _ _
- 1. _ _ _ _
- 2.. _ _ _
Hvert bogstav kræver 6 celler … 1 for selve bogstavet og 5 for (.) Og (_) s. For at gøre dette har vi brug for et bogstav [36] [6] tegn array med i alt 216 celler. Ubrugte celler fyldes normalt med et nul eller et tomt.
For at afkode de indkommende prikker og bindestreger skal vi sammenligne prik/bindestregmønsteret for hvert indgående bogstav med vores referencetegnmønstre.
Selvom denne metode virker, er den ekstremt langsom.
Sig, at vi har 26 bogstaver ('A',.. 'Z') og cifrene ('0', … '9') gemt i et array, så skal vi udføre 36 søgninger, hver med op til 5 undersøgninger, hvilket er i alt 36*5 = 180 søgninger for at afkode tallet '9'.
Binært træ
En binær søgning er langt hurtigere, da ingen søgninger er påkrævet.
I modsætning til den lineære søgning, der kræver, at både tegnet og morse -mønstre gemmes, gemmer det binære træ kun tegnene, hvilket betyder, at matrixstørrelsen er mindre.
Jeg har delt mit binære træ (foto1) i to halvdele (fotos 2 og 3) for at gøre det mere læseligt.
For at finde et tegn flytter vi en markør til venstre hver gang vi hører en prik og flytter markøren til højre hver gang vi hører et bindestreg. Efter hvert træk halverer vi markørafstanden til det næste træk … deraf navnet binærtræ.
For at afkode bogstavet '9' (bindestreg, bindestreg, bindestreg, prik) kræver 5 træk … 4 til højre og 1 til venstre, hvilket efterlader markøren direkte over '9'.
Fem træk er betydeligt hurtigere end 180 søgninger !!!!!
Det binære tegn array er også mindre … 26 bogstaver og 10 tal kræver kun en 64 x 1 line array. Jeg har valgt at oprette et 128 tegn array, så jeg kan afkode tegnsætning.
Trin 4: Designnotater
Morse er vanskelig at afkode i nærvær af forstyrrende signaler. De uønskede signaler skal afvises … dette kræver en slags filter.
Der er mange muligheder:
- Faselåste sløjfer
- Induktor-kondensatorfiltre
- Modstandskondensator aktive filtre
- Digital signalbehandling såsom Fast Fourier Transform eller Goertzel -filteret.
Metode 1, 2, 3 kræver eksterne komponenter, der er omfangsrige.
Metode 4 kræver ingen eksterne komponenter … frekvenserne detekteres ved hjælp af matematiske algoritmer.
Fast Fourier Transform (FFT)
En metode til at detektere tilstedeværelsen af en tone i en kompleks bølgeform er at bruge Fast Fourier -transformen
Foto 1 viser, hvordan FFT (Fast Fourier Transform) opdeler lydspektret i “bakker”.
Foto 2 viser, hvordan FFT "bakkerne" reagerer på et signal … i dette tilfælde 800Hz. Hvis et andet signal på f.eks. 1500Hz var til stede, ville vi se to svar … et ved 800Hz og et andet ved 1500Hz.
I teorien kan der laves en morse -kode -dekoder ved at overvåge udgangsniveauet for en bestemt FFT -frekvensbakke … et stort tal repræsenterer tilstedeværelsen af en prik eller bindestreg … et lille tal repræsenterer intet signal.
Sådan en morse -kode dekoder kan laves ved at overvåge "bin 6" i foto 2, men der er en række ting, der er galt med denne tilgang:
- vi vil kun have en frekvensbakke … resten er spildte beregninger
- frekvensbakkerne vises muligvis ikke nøjagtigt på frekvensen af interesse
- det er relativt langsomt (20mS pr. Arduino loop)
En anden metode er at bruge et Goertzel -filter.
Goertzel filter
Goertzel -filteret ligner FFT, men har kun en enkelt frekvensbakke.
Foto3 viser frekvensresponsen fra et Goertzel -filter til diskrete lydtrin.
Foto 4 er en sweep af det samme filter over det samme frekvensområde.
Jeg besluttede at "gå" med Goertzel -algoritmen som:
- Arduino loop () -tiden ved hjælp af Goertzel -algoritmen var 14mS (millisekunder) versus 20mS (millisekunder) for en FFT -løsning ved hjælp af Arduino "fix_FFT" -biblioteket.
- Det er let at indstille centerfrekvensen for et Goertzel båndpasfilter.
- Båndbredden er cirka 190 Hz.
Foto 5 viser det numeriske output fra et 900 Hz Goertzel -filter, når der registreres en tone. Jeg har indstillet min tonetærskel til en værdi på 4000 … værdier over 4000 angiver en tone.
I teorien skal du bare indstille dit filter til en behagelig lyttefrekvens. Desværre falder lydudgangen fra min 1 tommer overvågningshøjttaler hurtigt under 900Hz. For at undgå problemer bruger jeg en filterfrekvens på 950Hz. De nødvendige formler til beregning af alternative filterfrekvenser findes i mit kodehoved.
Afkodning
Afkodning af prikker og streger er ikke så let, som det ser ud først.
Perfekt morse defineres som:
- prik = 1 enhed
- mellemrum i bogstav = 1 enhed
- bindestreg = 3 enheder
- mellemrum mellem bogstaver = 3 enheder
- mellemrum mellem ord = 7 enheder
For at afkode perfekt morse har vi simpelthen brug for en referencetonvarighed på 2 enheder
- prik <2 enheder
- elementrum <2 enheder
- bindestreg> 2 enheder
- bogstav _rum> 2 enheder
- word_space> 6 enheder (dvs. 3 x referenceenheder)
Dette fungerer for maskinmors, men i den "virkelige verden":
- afsendelseshastigheden varierer
- varigheden af hver prik varierer
- varigheden af hvert bindestreg varierer
- bogstaverne E, I, S, H, 5 indeholder kun prikker, der er gennemsnitlige til punktets varighed
- bogstaverne T, M, O, 0 indeholder kun streger, der er gennemsnitlige til bindestregets varighed
- ordgab ankommer muligvis ikke
- fading skaber fejl, hvorfra dekoderen skal gendanne.
- korrupte signaler på grund af interferens
Bogstaver, der kun indeholder prikker og bindestreger, løses delvist, hvis:
vi estimerer referencens varighed, indtil vi har modtaget en gyldig prik og et gyldigt bindestreg. Jeg bruger 200 millisekunder, hvilket er gyldigt, hvis sendehastigheden er mellem 6 WPM (ord i minuttet) og 17 WPM. Du skal muligvis øge denne værdi, hvis du lærer morse. En hastighedstabel er inkluderet i softwaren
Hastighedsvariationer løses, hvis:
- vi udfører et rullende gennemsnit på hver prik og hvert bindestreg og
- genberegne referencens varighed efter hvert symbol er modtaget
Ordgab og ordgab, der ikke ankommer, løses, hvis vi:
- husk tidspunktet for den sidste bagkant (tone til no-tone) overgang,
- genstart algoritmen efter hvert bogstav,
- beregne den forløbne tid, mens du venter på den næste overgang (ingen tone til tone) og
- indsæt et mellemrum, hvis 6 tidsenheder er overskredet.
Morse -oscillator
Jeg prøvede oprindeligt nogle Piezo -summer, men fandt:
- frekvensen var fast
- udgangsfrekvensen var for høj til længerevarende lytning
- piezoer havde en tendens til at glide ud af Goertzel -passbåndet
Jeg forsøgte derefter at køre en akustisk transducer med en 750Hz firkantbølge, men fandt ud af, at den havde en resonans, der filtrerede den 1. og 3. harmoniske ud. Foto 6 viser mikrofonforstærkerens output til en 750Hz firkantbølge … vi ser den 5. harmoniske !!!
Jeg tyede derefter til en ved hjælp af en lille højttaler. Foto 7 viser mikrofonudgangen til en 750Hz firkantbølge, der blev sendt til en lille højttaler … denne gang ser vi det grundlæggende … ikke den 5. harmoniske. Goertzel -filteret ignorerer eventuelle harmoniske.
Noter
[1]
da.wikipedia.org/wiki/Goertzel_algorithm
www.embedded.com/the-goertzel-algorithm/
Trin 5: Software
Installation
- Download den vedhæftede fil MorseCodeDecoder.ino [1]
- Kopier indholdet af denne fil til en ny Arduino -skitse
- Gem skitsen som "MorseCodeDecoder" (uden citater)
- Kompilér og upload skitsen til din Arduino
Softwareopdatering 23. juli 2020
Følgende funktioner er tilføjet til den vedhæftede fil "MorseCodeDecoder6.ino"
- et "Exact Blackman" vindue [2]
- en "Noise_blanker"
Justering:
- øge lydstyrken på din modtager, indtil lysdioden begynder at blinke, og derefter slukke
- indstil nu din modtager, indtil LED'en blinker i takt med den indkommende morse
- Noise_blanker er indstillet til at ignorere støjbrud op til 8mS (en sløjfe tid)
- Støjgrænsen kan justeres ved at indstille Debug = true og se din Serial Plotter
Bemærk
[1]
Indstil din Arduino Serial Monitor til 115200 bauds, hvis du også vil se teksten.
[2]
- Foto 1… Præcist Blackman -vindue
- Foto 2 … Goertzel -filter uden Exact Blackman -vindue
- Foto 3,,, Goertzel filter med Exact Blackman vindue påført
Trin 6: Betjening
Dekoder
Placer enheden ved siden af din højttaler, når du lytter til morse.
- Elektretmikrofonkapslen opfanger morsesignalet fra din højttaler.
- Udgangen af elektretmikrofonen forstærkes derefter 647 gange (56dB), før den sendes til Arduino til behandling.
- Et digitalt båndpasfilter fra Goertzel udtrækker morsesignalet fra støjen.
- Afkodning udføres ved hjælp af et binært træ.
- Dekoderudgangen vises som tekst på et 320 x 240 pixel TFT -display. Det sendes også til din Arduino "Serial Monitor", hvis du ikke ønsker at bruge et display.
Morse afsender
En morse afsender er også inkluderet. Dette giver dig mulighed for at øve på at sende morse og fungerer som følger:
- En konstant hørbar tone genereres på Arduino pin 4.
- Vi hører denne tone via dekoderens højttaler, når vi trykker på morse-tasten.
- Tonen er indstillet til den samme frekvens som Goertzel -filteret, der lader dekoderen til at tro, at den lytter til den rigtige morse … uanset hvad du sender, vises som udskrevet tekst på displayet.
Din afsendelse forbedres, når dekoderen opfanger almindelige fejl, såsom:
- for meget mellemrum mellem symbolerne. (eksempel: Q udskrives som MA)
- for meget plads mellem bogstaver (eksempel: NU udskrevet som NO W)
- forkert kode
Trin 7: Resumé
Dekoder
Denne instruktive beskriver, hvordan man laver en morse -dekoder, der konverterer morse -kode til trykt tekst.
- Dekoderen er i stand til at afkode morse op til mindst 80 WPM (ord pr. Minut)
- Dekoderen sporer automatisk variationer i modtaget sendehastighed.
- Teksten vises på din serielle skærm (eller på et 320 x 240 TFT -displaymodul, hvis monteret) [1]
Afsender
En morse afsender er også inkluderet
- Afsenderen hjælper dig med at forbedre kvaliteten af din morsesendelse.
- Dekoderen bekræfter, at det, du har sendt, er korrekt
Omkostninger ved dele
De anslåede omkostninger ved morse -dekoder -skjoldet, minus det valgfrie TFT -display, er $ 25.
Klik her for at se mine andre instruktioner.
Anden pris i Audio Challenge 2020
Anbefalede:
LabDroid: Morse Code Encoder/Decoder: 4 trin
LabDroid: Morse Code Encoder/Decoder: Bemærk: Denne instruktion kan ikke realiseres 1: 1 i den nyeste version af LabDroid. Jeg opdaterer det snart. Dette projekt viser dig, hvad du kan gøre med LabDroid. Da en Hello World normalt er lavet baseret på tekst, lys eller lyd, tænkte jeg på LabDr
The Ultimate Binary Watch: 12 trin (med billeder)
The Ultimate Binary Watch: Jeg blev for nylig introduceret til konceptet med binære ure og begyndte at undersøge, om jeg kunne bygge et til mig selv. Jeg kunne dog ikke finde et eksisterende design, der var både funktionelt og stilfuldt på samme tid. Så besluttede jeg mig
Escape Room Decoder Box: 7 trin (med billeder)
Escape Room Decoder Box: Escape Rooms er uhyre sjove aktiviteter, som er meget engagerende og gode til teamwork. Har du nogensinde tænkt på at oprette dit eget Escape Room? Nå med denne dekoderboks kan du være godt på vej! Endnu bedre har du tænkt på at bruge es
Mho Better Resistor Value Decoder Plushie: 4 trin (med billeder)
Mho Better Resistor Value Decoder Plushie: Modstand er forgæves, i det mindste i forsøget på at regne ud værdien af din modstand, hvis du ikke har farvekoden udenad. Jeg havde en af disse elektroniske komponentplyser fra Adafruit Circuit Playground, der lå og ventede på at blive hacke
Arduino Magnetic Stripe Decoder: 4 trin (med billeder)
Arduino Magnetic Stripe Decoder: Denne instruktør viser, hvordan man bruger nogle frit tilgængelige kode, en arduino og en standard magnetstribe læser til at scanne og vise data, der er gemt på magnetstribe -kort, såsom kreditkort, student -id'er osv. Jeg blev inspireret til at post dette efter