Innehållsförteckning:

Binary Tree Morse Decoder: 7 steg (med bilder)
Binary Tree Morse Decoder: 7 steg (med bilder)

Video: Binary Tree Morse Decoder: 7 steg (med bilder)

Video: Binary Tree Morse Decoder: 7 steg (med bilder)
Video: CS50 Live, Episode 007 2024, November
Anonim
Image
Image
Kretsdiagram
Kretsdiagram

Denna instruerbara förklarar hur man avkodar Morse Code med en Arduino Uno R3.

Avkodaren, som automatiskt anpassar sig till sändningshastigheten, kan avkoda morse upp till minst 80 ord per minut.

Den inkommande koden visas som text på din Arduino Serial Monitor (eller TFT -skärm om sådan finns)

En tonoscillator har inkluderats om du vill öva på att skicka morse.

Avkodaren har:

  • en 320 x 240 TFT -displaymodul [1]
  • ett digitalt bandpassfilter från Goertzel för att separera oönskade signaler.
  • ett "Binary Morse Tree" för avkodning av signalen
  • automatisk hastighetsspårning
  • en hörbar utsignal när man övar morse
  • både inkommande och utgående text visas.

Följande tecken och symboler känns igen:

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

Den uppskattade kostnaden för morse -avkodarskärmen, minus TFT -skärmen, är $ 25. [1]

Bilder

  • Omslagsbilden visar en färdigmonterad enhet
  • Videon visar hur avkodaren fungerar

Anteckningar

[1]

  • TFT -displaymodulen är valfri eftersom all text skickas till din Arduino "Serial Monitor".
  • TFT-modulen beskrivs i min instruerbara

Steg 1: Dellista

Följande delar erhölls från

1 enda prototypsköld för Arduino UNO R3, 2,54 mm delning

Följande delar erhölls lokalt:

  • 1 endast LM358 dubbel opamp
  • 1 endast LED grön
  • 1 endast LED -klipp
  • 1 enda elektretmikrofonkapsel
  • 1 endast normalt öppen tryckknapp
  • 1 endast 8-stifts DIP-uttag
  • 2 endast 330 ohm motstånd
  • 2 endast 2K2 motstånd
  • 5 endast 10K ohm motstånd
  • 2 endast 56K ohm motstånd
  • 2 endast 1uF kondensator
  • 1 endast 10uF kondensator

Följande delar är valfria:

  • 1 endast 2,2 tums TFT SPI LCD -displaymodul 240*320 ILI9341 med SD -kortplats för Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Morse-knapp / tryckknapp
  • 1 endast BC548 NPN -transistor
  • 1 endast 1 tum högtalare
  • 1 endast 33K ohm motstånd
  • 1 endast 3,5 mm monokontakt (för morse -nyckel)
  • 1 endast 3,5 mm monouttag (för morse -nyckel)
  • 3 endast 9 mm M3 knackade nylon distanser
  • 1 endast 130 x 68 x 44 mm ABS -plastlåda
  • 5 endast 2-stifts rätvinkliga kontakter

Den uppskattade kostnaden för morse -avkodarskärmen, minus den valfria TFT -skärmen, är $ 25. [1]

Anteckningar

[1]

Dellistan för den valfria 320 x 240 TFT-displaymodulen finns i min instruerbara

[2]

En morse-nyckel eller robust tryckknapp krävs om du vill använda avsändaren.

Steg 2: Kretsdiagram

Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram

Bilder

Foto 1 visar kretsdiagrammet för morse -avkodaren. 330 ohm -motståndet i serie med morse -tangenten begränsar D4 -utströmmen vid oavsiktlig kortslutning till jord … ökar dess värde minskar ljudutmatningen från högtalaren. Av den anledningen har jag inte lagt till den på skölden utan fäst den direkt på morse-key-kontakten för enkel justering

Bild 2 visar en matchande sköld. Skölden är från min instruerbara https://www.instructables.com/id/Arduino-TFT-Grap… till vilken jag har lagt till mikrofonförstärkaren och tonoscillatorn. [1]

Bild 3 visar den färdiga skölden som är fäst vid en Arduino. Inga andra komponenter krävs om texten ska visas på din Arduino "Serial Monitor"

Bild 4 visar avkodaren delvis boxad. Ett hål har skurits i locket för visning av displayen. Högtalaren och mikrofonen har varmlimmats på fodralet. Borra några högtalarhål i locket innan du monterar högtalaren. Mittuttaget på locket är för en förlängningsmikrofon … utan detta måste avkodaren placeras nära högtalaren vilket inte alltid är möjligt

Bild 5 visar TFT -skärmen. Svart eltejp har fästs på bildskärmens kanter … detta tejp förhindrar ljusläckage och döljer eventuell felriktning mellan displayen och öppningen i locket

Viktig

[1]

Arduinos med en stor USB -kontakt kräver ett lager av tejp mellan USB -kontakten och Arduino -skärmen. Oavsiktliga shorts är möjliga utan tejpen eftersom spelrummet är litet. Tejpen behövs inte för Arduinos som har små kontakter

Steg 3: Teori

Teori
Teori
Teori
Teori
Teori
Teori

Varje morskodbokstav består av en serie korta och långa toner som kallas "prickar" och "streck".

  • en prick (.) är 1 enhet lång
  • ett streck (_) är 3 enheter långt
  • avståndet mellan bokstavselement är 1 enhet
  • avståndet mellan bokstäverna är 3 enheter
  • mellanrummet mellan ord är 7 enheter

Vi kan avgöra om den inkommande tonen är punkt eller streck genom att jämföra dess varaktighet med en referens ton på 2 enheter i längd.

  • en prick är mindre än 2 enheter
  • ett streck är större än 2 enheter

Det finns två tydligt olika metoder för avkodning av inkommande mönster av prickar och streck:

  • linjär sökning
  • binärt träd (även känt som en dikotomisk sökning)

Linjär sökning

En vanlig metod är att skapa en rad tecken och deras matchande morse -mönster. Till exempel skulle var och en av följande tecken sparas som:

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

Varje bokstav kräver 6 celler … 1 för själva bokstaven och 5 för (.) Och (_). För att göra detta behöver vi en bokstäver [36] [6] teckenuppsättning med totalt 216 celler. Oanvända celler fylls normalt med en nolla eller ett tomt.

För att avkoda inkommande prickar och streck måste vi jämföra prick/streckmönstret för varje inkommande bokstav med våra referensteckenmönster.

Även om denna metod fungerar är den extremt långsam.

Säg att vi har 26 bokstäver ('A',.. 'Z') och siffrorna ('0', … '9') lagrade i en array, då måste vi utföra 36 sökningar, var och en med upp till 5 undersökningar, vilket är totalt 36*5 = 180 sökningar för att avkoda siffran '9'.

Binärt träd

En binär sökning är mycket snabbare eftersom inga sökningar krävs.

Till skillnad från den linjära sökningen, som kräver att både tecknet och morse -mönstren lagras, lagrar det binära trädet bara tecknen vilket innebär att matrisstorleken är mindre.

Jag har delat upp mitt binära träd (foto1) i två halvor (foton 2 och 3) för att göra det mer läsbart.

För att hitta ett tecken flyttar vi en pekare åt vänster varje gång vi hör en prick och flyttar pekaren åt höger varje gång vi hör ett streck. Efter varje drag halverar vi pekaravståndet för nästa drag … därav namnet binärt träd.

För att avkoda bokstaven "9" (streck, streck, streck, streck, punkt) krävs 5 drag … 4 till höger och 1 till vänster som lämnar pekaren direkt över "9".

Fem drag är betydligt snabbare än 180 sökningar !!!!!

Den binära teckenuppsättningen är också mindre … 26 bokstäver och 10 siffror kräver bara en 64 x 1 radmatris. Jag har valt att skapa en array med 128 tecken så att jag kan avkoda skiljetecken.

Steg 4: Designanteckningar

Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar
Designanteckningar

Morse är svår att avkoda i närvaro av störande signaler. De oönskade signalerna måste avvisas … detta kräver något slags filter.

Det finns många möjligheter:

  1. Faslåsta öglor
  2. Induktor-kondensatorfilter
  3. Motståndskondensator aktiva filter
  4. Digital signalbehandling som Fast Fourier Transform eller Goertzel -filtret.

Metod 1, 2, 3 kräver externa komponenter som är skrymmande.

Metod 4 kräver inga externa komponenter … frekvenserna detekteras med hjälp av matematiska algoritmer.

Fast Fourier Transform (FFT)

En metod för att detektera närvaron av en ton i en komplex vågform är att använda Fast Fourier -transformen

Bild 1 visar hur FFT (Fast Fourier Transform) delar upp ljudspektrumet i”fack”.

Bild 2 visar hur FFT "facken" svarar på en signal … i det här fallet 800Hz. Om en andra signal på säg 1500Hz var närvarande skulle vi se två svar … en vid 800Hz och en annan vid 1500Hz.

I teorin kan en morse -kodavkodare göras genom att övervaka utgångsnivån för ett visst FFT -frekvensfack … ett stort tal representerar närvaron av en prick eller streck … ett litet tal representerar ingen signal.

En sådan morse -kodavkodare kan göras genom att övervaka "bin 6" i foto 2 men det finns ett antal saker som är fel med detta tillvägagångssätt:

  • vi vill bara ha ett frekvensfack … resten är bortkastade beräkningar
  • frekvensfacken kanske inte visas exakt på frekvensen av intresse
  • det är relativt långsamt (20mS per Arduino loop ()

En annan metod är att använda ett Goertzel -filter.

Goertzel -filter

Goertzel -filtret liknar FFT men har bara ett enda frekvensfack.

Foto3 visar frekvenssvaret för ett Goertzel -filter för diskreta ljudsteg.

Foto 4 är en svepning av samma filter över samma frekvensområde.

Jag bestämde mig för att "gå" med Goertzel -algoritmen som:

  • Arduino loop () -tiden med Goertzel -algoritmen var 14mS (millisekunder) kontra 20mS (millisekunder) för en FFT -lösning med Arduino "fix_FFT" -bibliotek.
  • Det är enkelt att ställa in mittfrekvensen för ett Goertzel bandpassfilter.
  • Bandbredden är cirka 190 Hz.

Bild 5 visar den numeriska utsignalen från ett 900 Hz Goertzel -filter när en ton detekteras. Jag har satt min tongräns till ett värde på 4000 … värden över 4000 anger en ton.

I teorin behöver du bara ställa in ditt filter på en bekväm lyssningsfrekvens. Tyvärr sjunker ljudutmatningen från min 1 tums övervakningshögtalare snabbt under 900 Hz. För att undvika problem använder jag en filterfrekvens på 950Hz. De nödvändiga formlerna för att beräkna alternativa filterfrekvenser finns i mitt kodhuvud.

Avkodning

Avkodning av prickar och streck är inte så lätt som det först ser ut.

Perfekt morse definieras som:

  • prick = 1 enhet
  • mellanslag inuti bokstaven = 1 enhet
  • streck = 3 enheter
  • mellanrum mellan bokstäver = 3 enheter
  • mellanrum mellan ord = 7 enheter

För att avkoda perfekt morse behöver vi helt enkelt en referenstonvaraktighet på 2 enheter

  • prick <2 enheter
  • elementutrymme <2 enheter
  • streck> 2 enheter
  • bokstav _utrymme> 2 enheter
  • word_space> 6 enheter (dvs 3 x referensenheter)

Detta fungerar för maskinmorse men i den "riktiga världen":

  • sändningshastigheten varierar
  • varaktigheten för varje prick varierar
  • varaktigheten för varje streck varierar
  • bokstäverna E, I, S, H, 5 innehåller bara punkter som är genomsnittliga till punktens varaktighet
  • bokstäverna T, M, O, 0 innehåller endast streck som är genomsnittliga till streckets varaktighet
  • ordluckor kanske inte kommer
  • blekning skapar fel från vilka avkodaren måste återställa.
  • korrupta signaler på grund av störningar

Bokstäver som endast innehåller punkter och streck löses delvis om:

vi uppskattar referenslängden tills vi har fått en giltig prick och ett giltigt bindestreck. Jag använder 200 millisekunder vilket är giltigt om sändningshastigheten är mellan 6 WPM (ord per minut) och 17 WPM. Du kan behöva öka detta värde om du lär dig morse. En hastighetstabell ingår i programvaran

Hastighetsvariationer löses om:

  • vi utför ett rullande medelvärde för varje prick och varje streck och
  • beräkna referenslängden efter att varje symbol har tagits emot

Ordluckor och ordluckor som inte kommer löses om vi:

  • kom ihåg tiden för den sista bakkant (ton till no-ton) övergången,
  • starta om algoritmen efter varje bokstav,
  • beräkna förfluten tid i väntan på nästa övergång (ingen ton till ton) och
  • sätt in ett blanksteg om 6 tidsenheter har överskridits.

Morse Oscillator

Jag försökte inledningsvis några Piezo -summer men hittade:

  • frekvensen var fast
  • utgångsfrekvensen var för hög för långvarig lyssning
  • piezos tenderade att glida ut ur Goertzel passband

Jag försökte sedan köra en akustisk givare med en 750Hz fyrkantvåg men fann att den hade en resonans som filtrerade bort den första och tredje harmoniken. Bild 6 visar mikrofonförstärkarens utgång till en 750Hz fyrkantvåg … vi ser den femte övertonen !!!

Jag tog då till en med en liten högtalare. Bild 7 visar mikrofonutgången till en 750Hz fyrkantvåg som skickades till en liten högtalare … den här gången ser vi det grundläggande … inte den femte övertonen. Goertzel -filtret ignorerar alla övertoner.

Anteckningar

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Steg 5: Programvara

programvara
programvara
programvara
programvara
programvara
programvara

Installation

  • Ladda ner den bifogade filen MorseCodeDecoder.ino [1]
  • Kopiera innehållet i den här filen till en ny Arduino -skiss
  • Spara skissen som "MorseCodeDecoder" (utan citattecken)
  • Kompilera och ladda upp skissen till din Arduino

Programuppdatering 23 juli 2020

Följande funktioner har lagts till i den bifogade filen "MorseCodeDecoder6.ino"

  • ett "Exakt Blackman" -fönster [2]
  • en "Noise_blanker"

Justering:

  • öka mottagarens ljudnivå tills lysdioden börjar flimra och sedan slockna
  • ställ in din mottagare tills lysdioden blinkar i takt med den inkommande morsen
  • Noise_blanker har ställts in för att ignorera brusstörningar upp till 8 ms (en slingtid)
  • brusgränsen kan justeras genom att ställa in Debug = true och titta på din serieplotter

Notera

[1]

Ställ in din Arduino Serial Monitor på 115200 bauds om du också vill se texten.

[2]

  • Foto 1… Exakt Blackman -fönster
  • Foto 2 … Goertzel -filter utan Exact Blackman -fönster
  • Foto 3,,, Goertzel -filter med Exact Blackman -fönster applicerat

Steg 6: Drift

Avkodare

Placera enheten bredvid högtalaren när du lyssnar på morse.

  • Elektretmikrofonkapseln tar upp morsesignalen från din högtalare.
  • Utsignalen från elektretmikrofonen förstärks sedan 647 gånger (56dB) innan den skickas till Arduino för bearbetning.
  • Ett Goertzel digitalt bandpassfilter extraherar morsesignalen från bruset.
  • Avkodning sker med ett binärt träd.
  • Avkodarens utmatning visas som text på en 320 x 240 pixel TFT -skärm. Den skickas också till din Arduino "Serial Monitor" om du inte vill använda en display.

Morse Avsändare

En morsesändare har också inkluderats. Detta låter dig öva på att skicka morse och fungerar enligt följande:

  • En konstant hörbar ton genereras på Arduino pin 4.
  • Vi hör den här tonen via avkodarens högtalare när vi trycker på morse-knappen.
  • Tonen är inställd på samma frekvens som Goertzel -filtret som lurar avkodaren att tro att den lyssnar på verklig morse … vad du än skickar kommer att visas som tryckt text på displayen.

Din sändning kommer att förbättras när avkodaren plockar upp vanliga fel som:

  • för mycket utrymme mellan symbolerna. (exempel: Q pinted as MA)
  • för mycket utrymme mellan bokstäver (exempel: NU skrivs ut som NO W)
  • Inkorrekt kod

Steg 7: Sammanfattning

Avkodare

Denna instruerbara beskriver hur man gör en morse -avkodare som konverterar morse -kod till utskriven text.

  • Avkodaren kan avkoda morse upp till minst 80 WPM (ord per minut)
  • Avkodaren spårar automatiskt variationer i mottagen sändningshastighet.
  • Texten visas på din seriella bildskärm (eller på en 320 x 240 TFT -displaymodul om sådan finns) [1]

Avsändare

En morsesändare har också inkluderats

  • Avsändaren hjälper dig att förbättra kvaliteten på din morse -sändning.
  • Avkodaren bekräftar att det du har skickat är korrekt

Kostnad för delar

Den uppskattade kostnaden för morse -avkodarskärmen, minus den valfria TFT -skärmen, är $ 25.

Klicka här för att se mina andra instruktioner.

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

Andra pris i Audio Challenge 2020

Rekommenderad: