Taula de continguts:

Descodificador Morse d'arbre binari: 7 passos (amb imatges)
Descodificador Morse d'arbre binari: 7 passos (amb imatges)

Vídeo: Descodificador Morse d'arbre binari: 7 passos (amb imatges)

Vídeo: Descodificador Morse d'arbre binari: 7 passos (amb imatges)
Vídeo: Иком 7300 | MRP40 CW Декодер Морзе 2024, De novembre
Anonim
Image
Image
Esquema de connexions
Esquema de connexions

Aquest instructiu explica com descodificar el codi Morse mitjançant un Arduino Uno R3.

El descodificador, que s’ajusta automàticament a la velocitat d’enviament, és capaç de descodificar morse fins a 80 paraules per minut com a mínim.

El codi entrant es mostra com a text al monitor sèrie Arduino (o a la pantalla TFT, si hi ha instal·lat)

S'ha inclòs un oscil·lador de to si voleu practicar l'enviament de morse.

El descodificador inclou:

  • un mòdul de pantalla TFT de 320 x 240 [1]
  • un filtre de banda digital Goertzel per separar senyals no desitjats.
  • un "Arbre morse binari" per descodificar el senyal
  • seguiment de velocitat automàtica
  • una sortida audible quan es practica el morse
  • es visualitza tant el text entrant com el de sortida.

Es reconeixen els següents caràcters i símbols:

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

El cost estimat de l’escut del descodificador morse, menys la pantalla TFT, és de 25 dòlars. [1]

Imatges

  • La foto de portada mostra una unitat totalment muntada
  • El vídeo mostra com funciona el descodificador

Notes

[1]

  • El mòdul de visualització TFT és opcional, ja que tot el text s’envia al vostre “monitor sèrie” Arduino.
  • El mòdul TFT es descriu a la meva instrucció

Pas 1: llista de peces

Les següents parts es van obtenir a

1 únic escut prototip per a Arduino UNO R3, pitch de 2,54 mm

Es van obtenir localment les següents parts:

  • 1 només LM358 dual opamp
  • 1 només LED verd
  • 1 sol clip LED
  • 1 càpsula de micròfon només electret
  • 1 només polsador obert normalment
  • 1 sol endoll DIP de 8 pins
  • 2 resistències de només 330 ohms
  • 2 només resistències 2K2
  • 5 resistències de només 10K ohm
  • 2 només resistències de 56K ohm
  • 2 només condensador 1uF
  • 1 condensador de només 10uF

Les següents parts són opcionals:

  • 1 només mòdul de pantalla LCD TFT SPI de 2,2 polzades 240 * 320 ILI9341 amb ranura per a targetes SD per a Arduino Raspberry Pi 51 / AVR / STM32 / ARM / PIC [1]
  • Tecla Morse / polsador
  • 1 només transistor NPN BC548
  • 1 altaveu de només 1 polzada
  • 1 resistència de només 33K ohm
  • 1 només endoll mono de 3,5 mm (per a clau morse)
  • 1 sòcol mono de 3,5 mm (per a clau morse)
  • 3 separadors de niló amb rosca M3 de només 9 mm
  • 1 només caixa de plàstic ABS de 130 x 68 x 44 mm
  • 5 només connectors d'angle recte de 2 pins

El cost estimat de l’escut del descodificador morse, menys la pantalla TFT opcional, és de 25 dòlars. [1]

Notes

[1]

La llista de peces del mòdul de pantalla TFT opcional de 320 x 240 apareix a la meva instrucció

[2]

Es requereix una tecla morse o un polsador robust si voleu utilitzar el remitent.

Pas 2: diagrama del circuit

Esquema de connexions
Esquema de connexions
Esquema de connexions
Esquema de connexions
Esquema de connexions
Esquema de connexions

Imatges

La foto 1 mostra el diagrama del circuit per al descodificador morse. La resistència de 330 ohm en sèrie amb la tecla morse limita el corrent de sortida D4 en cas de curtcircuit a terra accidental … augmentar el seu valor disminueix la sortida d'àudio de l'altaveu. Per aquest motiu, no l’he afegit a l’escut, sinó que l’he connectat directament a la presa de clau morse per facilitar l’ajust

La foto 2 mostra un escut a joc. L’escut prové del meu instructiu https://www.instructables.com/id/Arduino-TFT-Grap … al qual he afegit l’amplificador de micròfon i l’oscil·lador de to. [1]

La foto 3 mostra l’escut complet adjunt a un Arduino. No es requereixen altres components si es vol visualitzar el text al vostre "Monitor de sèrie" Arduino

La foto 4 mostra el descodificador parcialment encapsulat. S'ha tallat un forat a la tapa per veure la pantalla. L’altaveu i el micròfon s’han enganxat a la caixa. Practicar alguns forats de l’altaveu a la tapa abans de muntar-lo. La presa central de la tapa és per a un micròfon d’extensió … sense això, el descodificador s’ha de col·locar a prop de l’altaveu, cosa que no sempre és possible

La foto 5 mostra la pantalla TFT. S'ha unit cinta elèctrica negra a les vores de la pantalla … aquesta cinta evita fuites de llum i emmascara qualsevol desalineació entre la pantalla i l'obertura de la tapa

Important

[1]

Els arduinos amb un connector USB gran requereixen una capa de cinta elèctrica entre el connector USB i el blindatge Arduino. Els pantalons curts accidentals són possibles sense la cinta, ja que el joc és petit. La cinta no és necessària per als Arduinos que tinguin connectors petits

Pas 3: teoria

Teoria
Teoria
Teoria
Teoria
Teoria
Teoria

Cada lletra de codi morse comprèn una sèrie de tons de curta i llarga durada anomenats "punts" i "guions".

  • un punt (.) fa 1 unitat de longitud
  • un guió (_) fa 3 unitats de longitud
  • l'espai entre els elements de les lletres és d'1 unitat
  • l’espai entre lletres és de 3 unitats
  • l’espai entre paraules és de 7 unitats

Podem determinar si el to entrant és un punt o un guió comparant la seva durada amb un to de referència de 2 unitats de longitud.

  • un punt és inferior a 2 unitats
  • un guió és superior a 2 unitats

Hi ha dos mètodes diferents per descodificar el patró entrant de punts i guions:

  • cerca lineal
  • arbre binari (també conegut com a cerca dicotòmica)

Cerca lineal

Un mètode comú és crear una matriu de caràcters i els seus patrons morse coincidents. Per exemple, cadascun dels caràcters següents es desarà com:

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

Cada lletra requereix 6 cel·les … 1 per a la mateixa lletra i 5 per a la (.)’S i (_)’ s. Per fer-ho necessitem una matriu de caràcters de lletres [36] [6] amb un total de 216 cel·les. Les cel·les que no s’utilitzen normalment s’omplen amb un zero o un blanc.

Per descodificar els punts i guions entrants hem de comparar el patró de punts / guions de cada lletra entrant amb els nostres patrons de caràcters de referència.

Tot i que aquest mètode funciona, és extremadament lent.

Suposem que tenim 26 lletres ('A',.. 'Z') i els dígits ('0', … '9') emmagatzemats en una matriu, llavors hem de fer 36 cerques, cadascuna amb fins a cinc cerques secundàries, que és un total de 36 * 5 = 180 cerques per descodificar el número '9'.

Arbre binari

Una cerca binària és molt més ràpida, ja que no cal fer cap cerca.

A diferència de la cerca lineal, que requereix emmagatzemar tant els caràcters com els patrons morse, l'arbre binari només emmagatzema els caràcters, cosa que significa que la mida de la matriu és més petita.

He dividit el meu arbre binari (foto1) en dues meitats (fotos 2 i 3) per fer-lo més llegible.

Per trobar un personatge, movem un punter cap a l'esquerra cada vegada que sentim un punt i movem el punter cap a la dreta cada vegada que sentim un guió. Després de cada moviment, reduïm a la meitat la distància del punter per al següent moviment … d'aquí el nom d'arbre binari.

Per descodificar la lletra '9' (guió, guió, guió, guió, punt) calen 5 moviments … 4 a la dreta i 1 a l'esquerra, que deixa el punter directament sobre el '9'.

Cinc moviments és significativament més ràpid que 180 cerques !!!!!

La matriu de caràcters binaris també és més petita … 26 lletres i 10 xifres només requereixen una matriu de 64 x 1 línia. He triat crear una matriu de 128 caràcters per poder descodificar la puntuació.

Pas 4: Notes de disseny

Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny
Notes de disseny

El morse és difícil de descodificar en presència de senyals interferents. Els senyals no desitjats s'han de rebutjar … això requereix una mena de filtre.

Hi ha moltes possibilitats:

  1. Bucles de fase
  2. Filtres inductor-condensador
  3. Filtres actius resistència-condensador
  4. Processament de senyals digitals com la transformada ràpida de Fourier o el filtre Goertzel.

Els mètodes 1, 2, 3 requereixen components externs que són voluminosos.

El mètode 4 no requereix components externs … les freqüències es detecten mitjançant algoritmes matemàtics.

Transformada de Fourier ràpida (FFT)

Un mètode per detectar la presència d’un to en una forma d’ona complexa és utilitzar la transformada de Fourier ràpida

La foto 1 mostra com FFT (Fast Fourier Transform) divideix l'espectre d'àudio en "contenidors".

La foto 2 mostra com responen els "contenidors" FFT a un senyal … en aquest cas 800Hz. Si hi hagués un segon senyal de 1500Hz, veuríem dues respostes … una a 800Hz i una altra a 1500Hz.

En teoria, es pot fer un descodificador de codi morse monitoritzant el nivell de sortida d'un contenidor de freqüència FFT particular … un gran nombre representa la presència d'un punt o guió … un nombre petit no representa cap senyal.

Aquest descodificador de codi morse es podria fer monitoritzant la "safata 6" de la foto 2, però hi ha diverses coses que no funcionen en aquest enfocament:

  • només volem un contenidor de freqüències … la resta són càlculs desaprofitats
  • és possible que els contenidors de freqüència no apareguin exactament a la freqüència d’interès
  • és relativament lent (20 mS per bucle Arduino ()

Un altre mètode és utilitzar un filtre Goertzel.

Filtre Goertzel

El filtre Goertzel és similar al FFT però només té una safata de freqüència única.

Photo3 mostra la resposta de freqüència d’un filtre Goertzel a passos d’àudio discrets.

La foto 4 és una escombrada del mateix filtre sobre el mateix rang de freqüència.

Vaig decidir "anar" amb l'algorisme de Goertzel com:

  • El temps del bucle Arduino () mitjançant l'algorisme Goertzel va ser de 14 mS (mil·lisegons) enfront de 20 mS (mil·lisegons) per a una solució FFT que utilitza la biblioteca Arduino "fix_FFT".
  • És fàcil establir la freqüència central d’un filtre de banda Goertzel.
  • L'amplada de banda és d'aproximadament 190Hz.

La foto 5 mostra la sortida numèrica d’un filtre Goertzel de 900Hz quan es detecta un to. He establert el meu llindar de to en un valor de 4000 … els valors superiors a 4000 indiquen un to.

En teoria, només cal ajustar el filtre a una freqüència d’escolta còmoda. Malauradament, la sortida d'àudio del meu altaveu de monitorització d'1 polzada baixa ràpidament per sota dels 900Hz. Per evitar problemes, estic fent servir una freqüència de filtre de 950 Hz. Les fórmules necessàries per calcular freqüències de filtre alternatives es troben a la capçalera del meu codi.

Descodificació

Descodificar els punts i els guions no és tan fàcil com es veu per primera vegada.

El morse perfecte es defineix com:

  • punt = 1 unitat
  • espais dins de la lletra = 1 unitat
  • guió = 3 unitats
  • espai entre lletres = 3 unitats
  • espai entre paraules = 7 unitats

Per descodificar el morse perfecte, simplement necessitem una durada de to de referència de 2 unitats

  • punt <2 unitats
  • espai d'elements <2 unitats
  • guió> 2 unitats
  • _espai de lletra> 2 unitats
  • word_space> 6 unitats (és a dir, 3 x unitats de referència)

Això funciona per a màquina morse, però al "món real":

  • la velocitat d’enviament varia
  • la durada de cada punt varia
  • la durada de cada guió varia
  • les lletres E, I, S, H, 5 només contenen punts de mitjana fins a la durada del punt
  • les lletres T, M, O, 0 només contenen guions de mitjana fins a la durada del guió
  • és possible que no arribin les llacunes de paraules
  • la decoloració crea errors a partir dels quals s'ha de recuperar el descodificador.
  • senyals corruptes a causa d’interferències

Les lletres que només contenen punts i guions es resolen parcialment si:

estimem la durada de la referència fins que rebem un punt i un guió vàlids. Faig servir 200 mil·lisegons, que és vàlid si la velocitat d’enviament està entre 6 WPM (paraules per minut) i 17 WPM. És possible que hàgiu d’augmentar aquest valor si esteu aprenent morse. El programari inclou una taula de velocitat

Les variacions de velocitat es resolen si:

  • realitzem una mitjana variable a cada punt i cada guió i
  • torneu a calcular la durada de la referència després de rebre cada símbol

Els buits de paraules i els buits de paraules que no arriben es resolen si:

  • recorda l'hora de l'última transició de la vora final (to a no to),
  • reinicieu l'algorisme després de cada lletra,
  • calculeu el temps transcorregut mentre espereu la propera transició d’avantguarda (sense to a to) i
  • inseriu un espai si s'han superat les 6 unitats de temps.

Oscil·lador Morse

Inicialment, vaig provar alguns brunzidors Piezo, però vaig trobar:

  • la freqüència estava fixada
  • la freqüència de sortida era massa alta per a una escolta prolongada
  • els piezos solien sortir de la banda de passos de Goertzel

Llavors vaig provar de conduir un transductor acústic amb una ona quadrada de 750 Hz, però vaig trobar que tenia una ressonància que filtrava el 1r i el 3r harmònics. La foto 6 mostra la sortida de l'amplificador del micròfon a una ona quadrada de 750Hz … estem veient el cinquè harmònic !!!

Llavors vaig recórrer a un amb un altaveu petit. La foto 7 mostra la sortida del micròfon a una ona quadrada de 750 Hz que es va enviar a un petit altaveu … aquesta vegada estem veient el fonamental … no el 5è harmònic. El filtre Goertzel ignora qualsevol harmònic.

Notes

[1]

ca.wikipedia.org/wiki/Goertzel_algorithm

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

Pas 5: programari

Programari
Programari
Programari
Programari
Programari
Programari

Instal·lació

  • Descarregueu el fitxer adjunt MorseCodeDecoder.ino [1]
  • Copieu el contingut d’aquest fitxer a un nou esbós d’Arduino
  • Deseu l'esbós com a "MorseCodeDecoder" (sense les cometes)
  • Compileu i pengeu l’esbós al vostre Arduino

Actualització de programari el 23 de juliol de 2020

S'han afegit les següents funcions al fitxer adjunt "MorseCodeDecoder6.ino"

  • una finestra "Blackman exacta" [2]
  • un "Noise_blanker"

Ajust:

  • Augmenteu el nivell d’àudio del receptor fins que el LED comenci a parpellejar i es torni a apagar
  • ara sintonitzeu el receptor fins que el LED parpellegi al pas del morse entrant
  • el Noise_blanker s'ha configurat per ignorar les ràfegues de soroll de fins a 8 mS (un temps de bucle)
  • el llindar de soroll es pot ajustar configurant Debug = true i observant el vostre traçador de sèries

Nota

[1]

Configureu el vostre monitor sèrie Arduino a 115200 bauds si voleu veure també el text.

[2]

  • Foto 1 … Finestra de Blackman exacta
  • Foto 2 … Filtre Goertzel sense finestra Exacte de Blackman
  • Foto 3,,, filtre Goertzel amb la finestra Exacta de Blackman aplicada

Pas 6: operació

Descodificador

Col·loqueu la unitat al costat de l’altaveu quan escolteu morse.

  • La càpsula de micròfon electret capta el senyal morse del vostre altaveu.
  • La sortida del micròfon electret s’amplifica 647 vegades (56dB) abans de passar a l’Arduino per processar-la.
  • Un filtre digital passa banda de Goertzel extreu el senyal morse del soroll.
  • La descodificació es fa mitjançant un arbre binari.
  • La sortida del descodificador es mostra com a text en una pantalla TFT de 320 x 240 píxels. També s’envia al vostre “monitor de sèrie” Arduino si no voleu utilitzar una pantalla.

Remitent Morse

També s'ha inclòs un remitent de mors. Això us permet practicar l’enviament de morse i funciona de la següent manera:

  • Es genera un to audible constant al pin 4 d’Arduino.
  • Sentim aquest to a través de l’altaveu del descodificador sempre que premem la tecla morse.
  • El to s'estableix a la mateixa freqüència que el filtre Goertzel, que enganya el descodificador pensant que escolta el morse real … el que envieu apareixerà com a text imprès a la pantalla.

El vostre enviament millorarà a mesura que el descodificador detecti errors habituals com:

  • massa espai entre símbols. (exemple: Q pintat com a MA)
  • massa espai entre lletres (exemple: ARA imprès com NO W)
  • codi incorrecte

Pas 7: resum

Descodificador

Aquesta instrucció descriu com fer un descodificador de mors que converteixi el codi mors en text imprès.

  • El descodificador és capaç de descodificar morse fins a almenys 80 WPM (paraules per minut)
  • El descodificador fa un seguiment automàtic de les variacions de la velocitat d’enviament rebuda.
  • El text es mostra al monitor de sèrie (o en un mòdul de pantalla TFT de 320 x 240 si hi ha instal·lat) [1]

Remitent

També s'ha inclòs un remitent de mors

  • El remitent us ajuda a millorar la qualitat del vostre enviament de mors.
  • El descodificador confirma que el que heu enviat és correcte

Cost de les peces

El cost estimat de l’escut del descodificador morse, menys la pantalla TFT opcional, és de 25 dòlars.

Feu clic aquí per veure les meves altres instruccions.

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

Accèssit al Audio Challenge 2020

Recomanat: