Innehållsförteckning:
- Steg 1: Dellista
- Steg 2: Kretsdiagram
- Steg 3: Teori
- Steg 4: Designanteckningar
- Steg 5: Programvara
- Steg 6: Drift
- Steg 7: Sammanfattning
Video: Binary Tree Morse Decoder: 7 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:38
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
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
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
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:
- Faslåsta öglor
- Induktor-kondensatorfilter
- Motståndskondensator aktiva filter
- 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
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.
Andra pris i Audio Challenge 2020
Rekommenderad:
LabDroid: Morse Code Encoder/Decoder: 4 steg
LabDroid: Morse Code Encoder/Decoder: Obs! Denna instruktion kan inte realiseras 1: 1 i den senaste versionen av LabDroid. Jag uppdaterar det snart. Detta projekt visar dig vad du kan göra med LabDroid. Eftersom en Hello World normalt görs baserat på text, ljus eller ljud, tänkte jag för LabDr
The Ultimate Binary Watch: 12 steg (med bilder)
The Ultimate Binary Watch: Jag blev nyligen introducerad till konceptet binära klockor och började undersöka om jag kunde bygga en för mig själv. Jag kunde dock inte hitta en befintlig design som var både funktionell och snygg samtidigt. Så jag bestämde
Escape Room Decoder Box: 7 steg (med bilder)
Escape Room Decoder Box: Escape Rooms är otroligt roliga aktiviteter som är mycket engagerande och bra för lagarbete. Har du någonsin tänkt på att skapa ditt eget Escape Room? Med den här dekoderboxen kan du vara på god väg! Ännu bättre har du tänkt på att använda es
Mho Better Resistor Value Decoder Plushie: 4 steg (med bilder)
Mho Better Resistor Value Decoder Plushie: Motstånd är meningslöst, åtminstone för att försöka räkna ut värdet på ditt motstånd om du inte har färgkoden i minnet. Jag hade en av dessa Adafruit Circuit Playground elektroniska komponentplyscher som låg och väntade på att bli hacke
Binary Marble Clock: 9 steg (med bilder)
Binary Marble Clock: Detta är en enkel klocka som visar tiden (timmar/minuter) i binär med hjälp av lysdioder dolda under glasmarmor. För en genomsnittlig person ser det ut som ett gäng lampor, men du kommer att kunna berätta tiden med bara en snabb blick på den här klockan. Den