Indholdsfortegnelse:

Binary Tree Morse Decoder: 7 trin (med billeder)
Binary Tree Morse Decoder: 7 trin (med billeder)

Video: Binary Tree Morse Decoder: 7 trin (med billeder)

Video: Binary Tree Morse Decoder: 7 trin (med billeder)
Video: Кемпинг под дождем у лесного ручья с собакой - Дождь ASMR 2024, November
Anonim
Image
Image
Kredsløbsdiagram
Kredsløbsdiagram

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

Kredsløbsdiagram
Kredsløbsdiagram
Kredsløbsdiagram
Kredsløbsdiagram
Kredsløbsdiagram
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

Teori
Teori
Teori
Teori
Teori
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

Design noter
Design noter
Design noter
Design noter
Design noter
Design noter
Design noter
Design noter

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:

  1. Faselåste sløjfer
  2. Induktor-kondensatorfiltre
  3. Modstandskondensator aktive filtre
  4. 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

Software
Software
Software
Software
Software
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.

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

Anden pris i Audio Challenge 2020

Anbefalede: