Inhoudsopgave:
- Stap 1: Onderdelenlijst
- Stap 2: Schakelschema
- Stap 3: Theorie
- Stap 4: Ontwerpnotities
- Stap 5: Software
- Stap 6: Bediening
- Stap 7: Samenvatting
Video: Binary Tree Morse Decoder - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:15
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
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
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
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:
- Fasevergrendelde lussen
- Inductor-condensatorfilters
- Weerstand-condensator actieve filters
- 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
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.
Tweede prijs in de Audio Challenge 2020
Aanbevolen:
LabDroid: Morsecode Encoder/Decoder: 4 Stappen
LabDroid: Morsecode Encoder/Decoder: Opmerking: Deze instructie kan niet 1:1 worden gerealiseerd in de nieuwste versie van LabDroid. Ik zal het binnenkort bijwerken. Dit project laat je zien wat je kunt doen met LabDroid. Aangezien een Hello World normaal gesproken gemaakt wordt op basis van tekst, licht of geluid, dacht ik aan LabDr
Easy Christmas Tree Led: 4 stappen
Easy Christmas Tree Led: Het is bijna Kerstmis, dus ik heb dit heel eenvoudig project gemaakt, namelijk het gebruik van een sensor om LED te verlichten om de kerstboom te verlichten. Dit lijkt erg op wat ik de vorige keer heb gemaakt, namelijk de Big Dipper, het is bijna hetzelfde. wilde maken
Tree Charms: 6 stappen (met afbeeldingen)
Tree Charms: met behulp van e-waste of ander knutselmateriaal en buigbaar draad kun je je eigen talisman-achtige creatie maken die wordt gebruikt om een plaats, evenement of tijd te markeren; in de volksmond bekend als boom charmes. Ik had dit idee in mijn laatste jaar van de middelbare school, terwijl de meeste van mijn
IR-ontvanger (iR-decoder) gebruiken: 6 stappen
Hoe de IR-ontvanger (iR-decoder) te gebruiken: In deze tutorial laat ik je stap voor stap zien hoe je de iR-ontvanger van Arduino gebruikt. laat u zien hoe u de bibliotheek installeert, het signaal van de afstandsbediening van de tv ontvangt en dit signaal decodeert. Met de iR-ontvanger kan een infrarood-cont
Infrarood NEC Protocol Encoder en Decoder Board: 5 stappen:
Infrarood NEC-protocol-encoder- en -decoderkaart: ontvangt een onbewerkt gemoduleerd of gedemoduleerd NEC IR-signaal en zet dit om in bytes die via de seriële poort worden verzonden. De seriële baudrate kan worden geselecteerd uit twee standaardsnelheden. De standaard gebruiksmodus zendt een commandoreeks uit met framing byte