Inhoudsopgave:

Binary Tree Morse Decoder - Ajarnpa
Binary Tree Morse Decoder - Ajarnpa

Video: Binary Tree Morse Decoder - Ajarnpa

Video: Binary Tree Morse Decoder - Ajarnpa
Video: Binary Tree Morse Decoder 2024, November
Anonim
Image
Image
Schakelschema
Schakelschema

Deze instructable legt uit hoe je morsecode kunt decoderen met behulp van een Arduino Uno R3.

De decoder, die zich automatisch aanpast aan de zendsnelheid, kan morse decoderen tot minimaal 80 woorden per minuut.

De binnenkomende code wordt weergegeven als tekst op uw Arduino Serial Monitor (of TFT-scherm indien aanwezig)

Er is een toonoscillator meegeleverd als je het sturen van morse wilt oefenen.

De decoderfuncties:

  • een 320 x 240 TFT-displaymodule [1]
  • een Goertzel digitaal banddoorlaatfilter voor het scheiden van ongewenste signalen.
  • een "Binaire Morse Tree" voor het decoderen van het signaal
  • automatische snelheidsregistratie
  • een hoorbare output bij het oefenen van morse
  • zowel inkomende als uitgaande tekst wordt weergegeven.

De volgende tekens en symbolen worden herkend:

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

De geschatte kosten van het schild van de morsedecoder, minus het TFT-scherm, bedragen $ 25. [1]

Afbeeldingen

  • De omslagfoto toont een volledig gemonteerde unit
  • De video laat zien hoe de decoder werkt

Opmerkingen:

[1]

  • De TFT-displaymodule is optioneel omdat alle tekst naar uw Arduino "Serial Monitor" wordt verzonden.
  • De TFT-module wordt beschreven in mijn instructable

Stap 1: Onderdelenlijst

De volgende onderdelen zijn verkregen van

1 prototype schild voor Arduino UNO R3, 2,54 mm pitch

De volgende onderdelen werden lokaal verkregen:

  • 1 alleen LM358 dubbele opamp
  • 1 alleen LED groen
  • 1 alleen LED-clip
  • 1 alleen electret microfooncapsule
  • 1 alleen normaal open drukknop
  • 1 alleen 8-pins DIP-aansluiting
  • 2 slechts 330 ohm weerstanden
  • 2 alleen 2K2 weerstanden
  • 5 alleen weerstanden van 10K ohm
  • 2 slechts 56K ohm weerstanden
  • 2 alleen 1uF condensator
  • 1 alleen 10uF condensator

De volgende onderdelen zijn optioneel:

  • 1 alleen 2.2 Inch TFT SPI LCD Display Module 240*320 ILI9341 met SD-kaartsleuf voor Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Morsesleutel / drukknop
  • 1 alleen BC548 NPN-transistor
  • 1 slechts 1 inch luidspreker
  • 1 alleen 33K ohm weerstand
  • 1 monoplug van 3,5 mm (voor morsesleutel)
  • 1 alleen 3,5 mm mono-aansluiting (voor morsesleutel)
  • 3 alleen 9 mm M3 getapte nylon afstandhouders
  • 1 alleen 130 x 68 x 44 mm ABS plastic doos
  • 5 alleen 2-pins haakse connectoren

De geschatte kosten van het morsedecoder-schild, minus het optionele TFT-scherm, bedragen $ 25. [1]

Opmerkingen:

[1]

De onderdelenlijst voor de optionele 320 x 240 TFT-displaymodule staat in mijn instructable

[2]

Een morsesleutel of stevige drukknop is nodig als je de zender wilt gebruiken.

Stap 2: Schakelschema

Schakelschema
Schakelschema
Schakelschema
Schakelschema
Schakelschema
Schakelschema

Afbeeldingen

Foto 1 toont het schakelschema voor de morse-decoder. De weerstand van 330 ohm in serie met de morsesleutel begrenst de uitgangsstroom van de D4 in het geval van een onbedoelde kortsluiting naar aarde … als de waarde ervan wordt verhoogd, neemt de audio-uitvoer van de luidspreker af. Om deze reden heb ik het niet aan het schild toegevoegd, maar rechtstreeks aan de morsesleutel-aansluiting bevestigd voor eenvoudige aanpassing

Foto 2 toont een bijpassend schild. Het schild is van mijn instructable https://www.instructables.com/id/Arduino-TFT-Grap… waaraan ik de microfoonversterker en toonoscillator heb toegevoegd. [1]

Foto 3 toont het voltooide schild bevestigd aan een Arduino. Er zijn geen andere componenten nodig als de tekst op uw Arduino "Serial Monitor" moet worden bekeken

Foto 4 toont de decoder gedeeltelijk verpakt. In het deksel is een gat gesneden om het display te bekijken. De luidspreker en microfoon zijn warmgelijmd op de behuizing. Boor enkele luidsprekergaten in het deksel voordat u de luidspreker monteert. De middelste aansluiting op het deksel is voor een verlengmicrofoon … zonder deze moet de decoder dicht bij de luidspreker worden geplaatst, wat niet altijd mogelijk is

Foto 5 toont het TFT-scherm. Aan de randen van het scherm is zwarte elektrische tape bevestigd … deze tape voorkomt lekkage van licht en maskeert elke verkeerde uitlijning tussen het scherm en de opening in het deksel

Belangrijk

[1]

Arduino's met een grote USB-connector hebben een laag isolatietape nodig tussen de USB-connector en het Arduino-schild. Per ongeluk shorten is mogelijk zonder de tape, omdat de speling klein is. De tape is niet vereist voor Arduino's met kleine connectoren

Stap 3: Theorie

Theorie
Theorie
Theorie
Theorie
Theorie
Theorie

Elke morsecodeletter bestaat uit een reeks korte en lange tonen die "punten" en "streepjes" worden genoemd.

  • een punt (.) is 1 eenheid lang
  • een streepje (_) is 3 eenheden lang
  • de spatie tussen letterelementen is 1 eenheid
  • de spatie tussen letters is 3 eenheden
  • de spatie tussen woorden is 7 eenheden

We kunnen bepalen of de binnenkomende toon een punt of een streepje is door de duur ervan te vergelijken met een referentietoon van 2 eenheden lang.

  • een punt is minder dan 2 eenheden
  • een streepje is groter dan 2 eenheden

Er zijn twee duidelijk verschillende methoden voor het decoderen van het inkomende patroon van punten en streepjes:

  • lineair zoeken
  • binaire boom (ook bekend als een dichotomische zoekopdracht)

Lineair zoeken

Een veelgebruikte methode is om een reeks karakters en hun bijpassende morsepatronen te creëren. Elk van de volgende tekens wordt bijvoorbeeld opgeslagen als:

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

Elke letter heeft 6 cellen nodig … 1 voor de letter zelf en 5 voor de (.)'s en (_)'s. Om dit te doen hebben we een array van letters[36][6] nodig met in totaal 216 cellen. Ongebruikte cellen worden normaal gesproken gevuld met een nul of een spatie.

Om de binnenkomende punten en streepjes te decoderen, moeten we het punt-/streeppatroon van elke inkomende letter vergelijken met onze referentietekenpatronen.

Hoewel deze methode werkt, is deze extreem traag.

Stel dat we 26 letters ('A',..'Z') en de cijfers ('0', … '9') in een array hebben opgeslagen, dan moeten we 36 zoekopdrachten uitvoeren, elk met maximaal 5 subzoekopdrachten, dat is een totaal van 36*5=180 zoekopdrachten om het cijfer '9' te decoderen.

Binaire boom

Een binaire zoekopdracht is veel sneller omdat er geen zoekopdrachten nodig zijn.

In tegenstelling tot het lineaire zoeken, waarbij zowel het karakter als de morsepatronen moeten worden opgeslagen, slaat de binaire boom alleen de karakters op, wat betekent dat de array kleiner is.

Ik heb mijn binaire boom (foto 1) in twee helften (foto's 2 en 3) gesplitst om het leesbaarder te maken.

Om een teken te vinden, verplaatsen we een aanwijzer naar links elke keer dat we een punt horen en verplaatsen we de aanwijzer naar rechts elke keer dat we een streepje horen. Na elke zet halveren we de wijzerafstand voor de volgende zet … vandaar de naam binaire boom.

Om de letter '9' (streepje, streepje, streepje, streepje, punt) te decoderen, zijn 5 zetten nodig … 4 naar rechts en 1 naar links, waardoor de aanwijzer direct boven de '9' blijft.

Vijf zetten is aanzienlijk sneller dan 180 zoekopdrachten !!!!!

De array met binaire tekens is ook kleiner … 26 letters en 10 cijfers vereisen slechts een array van 64 x 1 regel. Ik heb ervoor gekozen om een array van 128 tekens te maken, zodat ik leestekens kan decoderen.

Stap 4: Ontwerpnotities

Ontwerpnotities
Ontwerpnotities
Ontwerpnotities
Ontwerpnotities
Ontwerpnotities
Ontwerpnotities
Ontwerpnotities
Ontwerpnotities

Morse is moeilijk te decoderen in aanwezigheid van storende signalen. De ongewenste signalen moeten worden afgewezen … dit vereist een soort filter.

Er zijn veel mogelijkheden:

  1. Fasevergrendelde lussen
  2. Inductor-condensatorfilters
  3. Weerstand-condensator actieve filters
  4. Digitale signaalverwerking zoals Fast Fourier Transform of het Goertzel-filter.

Methoden 1, 2, 3 vereisen externe componenten die omvangrijk zijn.

Methode 4 vereist geen externe componenten … de frequenties worden gedetecteerd met behulp van wiskundige algoritmen.

Snelle Fourier-transformatie (FFT)

Een methode om de aanwezigheid van een toon in een complexe golfvorm te detecteren, is door gebruik te maken van de Fast Fourier Transform

Foto 1 laat zien hoe FFT (Fast Fourier Transform) het audiospectrum opdeelt in “bins”.

Foto 2 laat zien hoe de FFT “bins” reageren op een signaal … in dit geval 800Hz. Als er een tweede signaal van bijvoorbeeld 1500 Hz aanwezig was, zouden we twee reacties zien … een op 800 Hz en een andere op 1500 Hz.

In theorie kan een morsecode-decoder worden gemaakt door het uitgangsniveau van een bepaalde FFT-frequentiebak te bewaken … een groot getal vertegenwoordigt de aanwezigheid van een punt of streepje … een klein getal vertegenwoordigt geen signaal.

Zo'n morsecode-decoder zou kunnen worden gemaakt door "bin 6" op foto 2 te monitoren, maar er zijn een aantal dingen mis met deze aanpak:

  • we willen maar één frequentiebak … de rest zijn verspilde berekeningen
  • de frequentievakken verschijnen mogelijk niet precies op de frequentie van interesse
  • het is relatief traag (20mS per Arduino-lus()

Een andere methode is het gebruik van een Goertzel-filter.

Goertzel-filter

Het Goertzel-filter is vergelijkbaar met FFT, maar heeft slechts een enkele frequentiebak.

Foto3 toont de frequentierespons van een Goertzel-filter op discrete audiostappen.

Foto 4 is een sweep van hetzelfde filter over hetzelfde frequentiebereik.

Ik besloot om met het Goertzel-algoritme te "gaan" als:

  • De Arduino-loop()-tijd met behulp van het Goertzel-algoritme was 14 mS (milliseconden) versus 20 mS (milliseconden) voor een FFT-oplossing met behulp van de Arduino "fix_FFT" -bibliotheek.
  • Het is eenvoudig om de middenfrequentie van een Goertzel banddoorlaatfilter in te stellen.
  • De bandbreedte is ongeveer 190 Hz.

Foto 5 toont de numerieke uitvoer van een 900Hz Goertzel-filter wanneer een toon wordt gedetecteerd. Ik heb mijn toondrempel ingesteld op een waarde van 4000 … waarden boven 4000 geven een toon aan.

In theorie hoeft u alleen uw filter af te stemmen op een comfortabele luisterfrequentie. Helaas zakt de audio-output van mijn 1 inch monitorspeaker snel onder de 900Hz. Om problemen te voorkomen, gebruik ik een filterfrequentie van 950 Hz. De benodigde formules voor het berekenen van alternatieve filterfrequenties zijn te vinden in mijn codekop.

decoderen

Het decoderen van de punten en streepjes is niet zo eenvoudig als het op het eerste gezicht lijkt.

Perfect morse wordt gedefinieerd als:

  • punt = 1 eenheid
  • spaties binnen letter = 1 eenheid
  • streepje = 3 eenheden
  • spatie tussen letters = 3 eenheden
  • spatie tussen woorden = 7 eenheden

Om perfecte morse te decoderen, hebben we gewoon een referentietoonduur van 2 eenheden nodig

  • punt < 2 eenheden
  • elementruimte < 2 eenheden
  • streepje > 2 eenheden
  • letter _spatie > 2 eenheden
  • word_space > 6 eenheden (d.w.z. 3 x referentie-eenheden)

Dit werkt voor machine morse, maar in de "echte wereld":

  • de verzendsnelheid varieert
  • de duur van elke stip varieert
  • de duur van elk streepje varieert
  • de letters E, I, S, H, 5 bevatten alleen punten die gemiddeld zijn tot de puntduur
  • de letters T, M, O, 0 bevatten alleen streepjes die gemiddeld zijn tot de duur van het streepje
  • woordhiaten komen mogelijk niet aan
  • fading creëert fouten waarvan de decoder moet herstellen.
  • corrupte signalen door interferentie

Letters die alleen punten en streepjes bevatten, worden gedeeltelijk opgelost als:

we schatten de referentieduur totdat we een geldige punt en een geldig streepje hebben ontvangen. Ik gebruik 200 milliseconden, wat geldig is als de verzendsnelheid tussen 6 WPM (woorden per minuut) en 17 WPM ligt. Mogelijk moet u deze waarde verhogen als u morse leert. In de software is een snelheidstabel opgenomen

Snelheidsvariaties worden opgelost als:

  • we voeren een voortschrijdend gemiddelde uit op elke stip en elk streepje en
  • herbereken de referentieduur nadat elk symbool is ontvangen

Woordhiaten en niet-aankomende woordhiaten worden opgelost als we:

  • onthoud de tijd van de laatste trailing-edge (toon naar geen-toon) overgang,
  • herstart het algoritme na elke letter,
  • bereken de verstreken tijd tijdens het wachten op de volgende overgang van toon naar toon en
  • vul een spatie in als 6 tijdseenheden zijn overschreden.

Morse-oscillator

Ik heb aanvankelijk wat piëzo-zoemers geprobeerd, maar vond:

  • de frequentie was vast
  • de uitgangsfrequentie was te hoog voor langdurig luisteren
  • de piëzo's hadden de neiging om uit de Goertzel-passband te drijven

Ik probeerde toen een akoestische transducer aan te sturen met een blokgolf van 750 Hz, maar ontdekte dat deze een resonantie had die de 1e en 3e harmonischen uitfilterde. Foto 6 toont de output van de microfoonversterker naar een 750Hz blokgolf … we zien de 5e harmonische !!!

Ik nam toen mijn toevlucht tot het gebruik van een kleine luidspreker. Foto 7 toont de microfoonuitgang naar een 750Hz-blokgolf die naar een kleine luidspreker werd gestuurd … deze keer zien we de fundamentele … niet de 5e harmonische. Het Goertzel-filter negeert eventuele harmonischen.

Opmerkingen:

[1]

en.wikipedia.org/wiki/Goertzel_algoritme

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

Stap 5: Software

Software
Software
Software
Software
Software
Software

Installatie

  • Download het bijgevoegde bestand MorseCodeDecoder.ino [1]
  • Kopieer de inhoud van dit bestand naar een nieuwe Arduino-schets
  • Sla de schets op als "MorseCodeDecoder" (zonder de aanhalingstekens)
  • Compileer en upload de schets naar je Arduino

Software-update 23 juli 2020

De volgende functies zijn toegevoegd aan het bijgevoegde bestand "MorseCodeDecoder6.ino"

  • een "Exact Blackman"-venster [2]
  • een "Noise_blaker"

Aanpassing:

  • verhoog het audioniveau van uw ontvanger totdat de LED begint te flikkeren en dan weer uit
  • stem nu uw ontvanger af totdat de LED knippert in de pas met de inkomende morse
  • de Noise_blaker is ingesteld om ruisuitbarstingen tot 8 mS (één lustijd) te negeren
  • de ruisdrempel kan worden aangepast door Debug=true in te stellen en uw seriële plotter te bekijken

Opmerking

[1]

Stel uw Arduino Serial Monitor in op 115200 bauds als u de tekst ook wilt bekijken.

[2]

  • Foto 1 … Exact Blackman-venster
  • Foto 2 … Goertzel-filter zonder Exact Blackman-venster
  • Foto 3,,, Goertzel-filter met Exact Blackman-venster toegepast

Stap 6: Bediening

Decoder

Plaats het apparaat naast uw luidspreker wanneer u naar morse luistert.

  • De electret-microfooncapsule vangt het morsesignaal van je speaker op.
  • De output van de electret-microfoon wordt vervolgens 647 keer (56dB) versterkt voordat het wordt doorgegeven aan de Arduino voor verwerking.
  • Een Goertzel digitaal banddoorlaatfilter haalt het morsesignaal uit de ruis.
  • Decodering gebeurt met behulp van een binaire boom.
  • De uitvoer van de decoder wordt als tekst weergegeven op een TFT-scherm van 320 x 240 pixels. Het wordt ook naar uw Arduino "Serial Monitor" gestuurd als u geen display wilt gebruiken.

Morse afzender

Er is ook een morsezender toegevoegd. Hiermee kun je het sturen van morse oefenen en werkt als volgt:

  • Een constante hoorbare toon wordt gegenereerd op Arduino pin 4.
  • We horen deze toon via de luidspreker van de decoder wanneer we op de morse-toets drukken.
  • De toon is ingesteld op dezelfde frequentie als het Goertzel-filter dat de decoder voor de gek houdt door te denken dat hij naar echte morse luistert … wat je ook verzendt, verschijnt als gedrukte tekst op het display.

Uw verzending zal verbeteren naarmate de decoder veelvoorkomende fouten oppikt, zoals:

  • te veel ruimte tussen symbolen. (voorbeeld: Q aangegeven als MA)
  • te veel ruimte tussen letters (voorbeeld: NU afgedrukt als NO W)
  • foute code

Stap 7: Samenvatting

Decoder

Deze instructable beschrijft hoe je een morse-decoder maakt die morsecode omzet in gedrukte tekst.

  • De decoder kan morse decoderen tot minimaal 80 WPM (woorden per minuut)
  • De decoder volgt automatisch variaties in de ontvangen verzendsnelheid.
  • De tekst wordt weergegeven op uw seriële monitor (of op een 320 x 240 TFT-displaymodule, indien aanwezig) [1]

Afzender

Er is ook een morsezender toegevoegd

  • De afzender helpt u de kwaliteit van uw morse-verzending te verbeteren.
  • De decoder bevestigt dat wat je hebt verzonden correct is

Kosten van onderdelen

De geschatte kosten van het morsedecoder-schild, minus het optionele TFT-scherm, bedragen $ 25.

Klik hier om mijn andere instructables te bekijken.

Audio-uitdaging 2020
Audio-uitdaging 2020
Audio-uitdaging 2020
Audio-uitdaging 2020

Tweede prijs in de Audio Challenge 2020

Aanbevolen: