Tabla de contenido:

Decodificador Morse de árbol binario: 7 pasos (con imágenes)
Decodificador Morse de árbol binario: 7 pasos (con imágenes)

Video: Decodificador Morse de árbol binario: 7 pasos (con imágenes)

Video: Decodificador Morse de árbol binario: 7 pasos (con imágenes)
Video: CURIOSIDADES SOBRE EL CÓDIGO MORSE | Draw My Life 2024, Noviembre
Anonim
Image
Image
Diagrama de circuito
Diagrama de circuito

Este instructivo explica cómo decodificar el código Morse usando un Arduino Uno R3.

El decodificador, que se ajusta automáticamente a la velocidad de envío, es capaz de decodificar morse hasta al menos 80 palabras por minuto.

El código entrante se muestra como texto en su monitor serial Arduino (o pantalla TFT si está instalado)

Se ha incluido un oscilador de tono si desea practicar el envío de morse.

Características del decodificador:

  • un módulo de pantalla TFT de 320 x 240 [1]
  • un filtro de paso de banda digital Goertzel para separar señales no deseadas.
  • un "árbol morse binario" para decodificar la señal
  • seguimiento de velocidad automática
  • una salida audible al practicar morse
  • se muestran tanto el texto entrante como el saliente.

Se reconocen los siguientes caracteres y símbolos:

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

El costo estimado del protector del decodificador Morse, menos la pantalla TFT, es de $ 25. [1]

Imagenes

  • La foto de portada muestra una unidad completamente ensamblada.
  • El video muestra el decodificador funcionando

Notas

[1]

  • El módulo de pantalla TFT es opcional ya que todo el texto se envía a su "Monitor serial" Arduino.
  • El módulo TFT se describe en mi instructable

Paso 1: Lista de piezas

Las siguientes piezas se obtuvieron de

1 único escudo prototipo para Arduino UNO R3, paso de 2,54 mm

Las siguientes partes se obtuvieron localmente:

  • 1 solo opamp dual LM358
  • 1 solo LED verde
  • 1 solo clip LED
  • 1 única cápsula de micrófono electret
  • 1 solo pulsador normalmente abierto
  • 1 conector DIP de solo 8 pines
  • 2 resistencias de solo 330 ohmios
  • 2 solo resistencias 2K2
  • 5 resistencias de solo 10K ohmios
  • 2 resistencias de solo 56K ohmios
  • 2 solo condensador de 1uF
  • 1 solo condensador de 10uF

Las siguientes partes son opcionales:

  • 1 módulo de pantalla LCD TFT SPI de solo 2,2 pulgadas 240 * 320 ILI9341 con ranura para tarjeta SD para Arduino Raspberry Pi 51 / AVR / STM32 / ARM / PIC [1]
  • Tecla morse / pulsador
  • 1 solo transistor BC548 NPN
  • 1 solo altavoz de 1 pulgada
  • 1 solo resistencia de 33K ohmios
  • 1 conector mono de solo 3,5 mm (para tecla morse)
  • 1 toma mono de solo 3,5 mm (para tecla morse)
  • 3 espaciadores de nailon roscados M3 de solo 9 mm
  • 1 solo caja de plástico ABS de 130 x 68 x 44 mm
  • 5 conectores en ángulo recto de solo 2 pines

El costo estimado del protector del decodificador Morse, menos la pantalla TFT opcional, es de $ 25. [1]

Notas

[1]

La lista de piezas para el módulo de pantalla TFT opcional de 320 x 240 se encuentra en mi instructable

[2]

Se requiere una llave morse o un pulsador resistente si desea utilizar el remitente.

Paso 2: diagrama de circuito

Diagrama de circuito
Diagrama de circuito
Diagrama de circuito
Diagrama de circuito
Diagrama de circuito
Diagrama de circuito

Imagenes

La foto 1 muestra el diagrama de circuito del decodificador Morse. La resistencia de 330 ohmios en serie con la tecla morse limita la corriente de salida D4 en caso de un cortocircuito accidental a tierra … al aumentar su valor, disminuye la salida de audio del altavoz. Por esta razón, no lo agregué al protector, sino que lo adjunté directamente al conector morse-key para facilitar el ajuste

La foto 2 muestra un escudo a juego. El escudo es de mi instructable https://www.instructables.com/id/Arduino-TFT-Grap… al que he agregado el amplificador de micrófono y el oscilador de tono. [1]

La foto 3 muestra el escudo completo adjunto a un Arduino. No se requieren otros componentes si el texto se va a ver en su “Monitor serial” Arduino

La foto 4 muestra el decodificador parcialmente en caja. Se ha cortado un agujero en la tapa para ver la pantalla. El altavoz y el micrófono se han pegado en caliente a la carcasa. Taladre algunos orificios para los altavoces en la tapa antes de montar el altavoz. La toma central de la tapa es para un micrófono de extensión … sin esto, el decodificador debe colocarse cerca del altavoz, lo que no siempre es posible

La foto 5 muestra la pantalla TFT. Se ha adherido cinta aislante negra a los bordes de la pantalla … esta cinta evita las fugas de luz y enmascara cualquier desalineación entre la pantalla y la abertura de la tapa

Importante

[1]

Los arduinos con un conector USB grande requieren una capa de cinta aislante entre el conector USB y el escudo Arduino. Es posible que se produzcan cortocircuitos accidentales sin la cinta, ya que el espacio libre es pequeño. La cinta no es necesaria para Arduinos que tienen conectores pequeños

Paso 3: teoría

Teoría
Teoría
Teoría
Teoría
Teoría
Teoría

Cada letra del código morse comprende una serie de tonos de corta y larga duración llamados "puntos" y "guiones".

  • un punto (.) tiene 1 unidad de longitud
  • un guión (_) tiene 3 unidades de longitud
  • el espacio entre elementos de letras es 1 unidad
  • el espacio entre letras es de 3 unidades
  • el espacio entre palabras es de 7 unidades

Podemos determinar si el tono entrante es un punto o un guión comparando su duración con un tono de referencia de 2 unidades de longitud.

  • un punto es menos de 2 unidades
  • un guión es mayor que 2 unidades

Hay dos métodos claramente diferentes para decodificar el patrón entrante de puntos y guiones:

  • búsqueda lineal
  • árbol binario (también conocido como búsqueda dicotómica)

Búsqueda lineal

Un método común es crear una serie de caracteres y sus patrones morse coincidentes. Por ejemplo, cada uno de los siguientes caracteres se guardaría como:

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

Cada letra requiere 6 celdas … 1 para la letra en sí y 5 para las (.) Y (_). Para hacer esto, necesitamos una matriz de caracteres de letras [36] [6] con un total de 216 celdas. Las celdas no utilizadas normalmente se llenan con un cero o un espacio en blanco.

Para decodificar los puntos y guiones entrantes debemos comparar el patrón de puntos / guiones de cada letra entrante con nuestros patrones de caracteres de referencia.

Si bien este método funciona, es extremadamente lento.

Digamos que tenemos 26 letras ('A',.. 'Z') y los dígitos ('0', … '9') almacenados en una matriz, entonces debemos realizar 36 búsquedas, cada una con hasta 5 sub-búsquedas, que es un total de 36 * 5 = 180 búsquedas para decodificar el número '9'.

Árbol binario

Una búsqueda binaria es mucho más rápida ya que no se requieren búsquedas.

A diferencia de la búsqueda lineal, que requiere que se almacenen tanto el carácter como los patrones morse, el árbol binario solo almacena los caracteres, lo que significa que el tamaño de la matriz es menor.

He dividido mi árbol binario (foto 1) en dos mitades (fotos 2 y 3) para hacerlo más legible.

Para encontrar un carácter, movemos un puntero hacia la izquierda cada vez que escuchamos un punto y movemos el puntero hacia la derecha cada vez que escuchamos un guión. Después de cada movimiento, reducimos a la mitad la distancia del puntero para el siguiente movimiento … de ahí el nombre de árbol binario.

Para decodificar la letra "9" (guión, guión, guión, guión, punto) se requieren 5 movimientos … 4 a la derecha y 1 a la izquierda, lo que deja el puntero directamente sobre el "9".

¡Cinco movimientos son significativamente más rápidos que 180 búsquedas!

La matriz de caracteres binarios también es más pequeña … 26 letras y 10 números solo requiere una matriz de líneas de 64 x 1. Elegí crear una matriz de 128 caracteres para poder decodificar la puntuación.

Paso 4: Notas de diseño

Notas de Diseño
Notas de Diseño
Notas de Diseño
Notas de Diseño
Notas de Diseño
Notas de Diseño
Notas de Diseño
Notas de Diseño

Morse es difícil de decodificar en presencia de señales interferentes. Las señales no deseadas deben ser rechazadas … esto requiere algún tipo de filtro.

Hay muchas posibilidades:

  1. Bucles de fase bloqueada
  2. Filtros inductores-condensadores
  3. Filtros activos resistor-condensador
  4. Procesamiento de señales digitales como la Transformada Rápida de Fourier o el filtro Goertzel.

Los métodos 1, 2, 3 requieren componentes externos que son voluminosos.

El método 4 no requiere componentes externos … las frecuencias se detectan mediante algoritmos matemáticos.

Transformada rápida de Fourier (FFT)

Un método para detectar la presencia de un tono en una forma de onda compleja es utilizar la Transformada Rápida de Fourier

La foto 1 muestra cómo FFT (Fast Fourier Transform) divide el espectro de audio en "bins".

La foto 2 muestra cómo los “contenedores” FFT responden a una señal… en este caso 800Hz. Si una segunda señal de digamos 1500Hz estuviera presente, veríamos dos respuestas … una a 800Hz y otra a 1500Hz.

En teoría, se puede hacer un decodificador de código morse monitoreando el nivel de salida de un contenedor de frecuencia FFT en particular … un número grande representa la presencia de un punto o guión … un número pequeño no representa señal.

Un decodificador de código morse de este tipo se podría hacer monitoreando el “contenedor 6” en la foto 2, pero hay varias cosas que no funcionan con este enfoque:

  • solo queremos un intervalo de frecuencia … el resto son cálculos desperdiciados
  • Los contenedores de frecuencia pueden no aparecer exactamente en la frecuencia de interés.
  • es relativamente lento (20 mS por bucle Arduino ()

Otro método es utilizar un filtro Goertzel.

Filtro Goertzel

El filtro Goertzel es similar a FFT pero solo tiene un contenedor de frecuencia única.

La foto 3 muestra la respuesta de frecuencia de un filtro Goertzel a pasos de audio discretos.

La foto 4 es un barrido del mismo filtro en el mismo rango de frecuencia.

Decidí "ir" con el algoritmo de Goertzel como:

  • El tiempo de bucle () de Arduino usando el algoritmo de Goertzel fue de 14 mS (milisegundos) versus 20 mS (milisegundos) para una solución FFT que usa la biblioteca Arduino “fix_FFT”.
  • Es fácil configurar la frecuencia central de un filtro de paso de banda de Goertzel.
  • El ancho de banda es de aproximadamente 190 Hz.

La foto 5 muestra la salida numérica de un filtro Goertzel de 900Hz cuando se detecta un tono. He fijado mi umbral de tono en un valor de 4000 … los valores por encima de 4000 indican un tono.

En teoría, solo necesita sintonizar su filtro a una frecuencia de escucha cómoda. Desafortunadamente, la salida de audio de mi altavoz de monitoreo de 1 pulgada cae rápidamente por debajo de 900Hz. Para evitar problemas, estoy usando una frecuencia de filtro de 950Hz. Las fórmulas necesarias para calcular frecuencias de filtro alternativas se encuentran en el encabezado de mi código.

Descodificación

Decodificar los puntos y guiones no es tan fácil como parece.

El morse perfecto se define como:

  • punto = 1 unidad
  • espacios dentro de la letra = 1 unidad
  • guión = 3 unidades
  • espacio entre letras = 3 unidades
  • espacio entre palabras = 7 unidades

Para decodificar morse perfecto simplemente necesitamos una duración de tono de referencia de 2 unidades

  • punto <2 unidades
  • espacio de elementos <2 unidades
  • guión> 2 unidades
  • letra _espacio> 2 unidades
  • word_space> 6 unidades (es decir, 3 x unidades de referencia)

Esto funciona para máquina morse pero en el "mundo real":

  • la velocidad de envío varía
  • la duración de cada punto varía
  • la duración de cada guión varía
  • las letras E, I, S, H, 5 solo contienen puntos que promedian la duración del punto
  • las letras T, M, O, 0 solo contienen guiones que promedian la duración del guión
  • los espacios entre palabras pueden no llegar
  • el desvanecimiento crea errores de los que el decodificador debe recuperarse.
  • señales corruptas debido a interferencias

Las letras que contienen solo puntos y guiones se resuelven parcialmente si:

estimamos la duración de referencia hasta que hayamos recibido un punto válido y un guión válido. Utilizo 200 milisegundos, que es válido si la velocidad de envío está entre 6 palabras por minuto (palabras por minuto) y 17 palabras por minuto. Es posible que deba aumentar este valor si está aprendiendo morse. Se incluye una tabla de velocidad en el software

Las variaciones de velocidad se resuelven si:

  • realizamos un promedio móvil en cada punto y cada guión y
  • recalcular la duración de referencia después de recibir cada símbolo

Los espacios de palabras y los espacios de palabras que no llegan se solucionan si:

  • recuerde el momento de la última transición del borde posterior (tono a sin tono),
  • reiniciar el algoritmo después de cada letra,
  • calcular el tiempo transcurrido mientras se espera la próxima transición de borde de ataque (sin tono a tono) y
  • inserte un espacio si se han excedido 6 unidades de tiempo.

Oscilador Morse

Inicialmente probé algunos zumbadores piezoeléctricos pero encontré:

  • la frecuencia fue fija
  • la frecuencia de salida era demasiado alta para una escucha prolongada
  • los piezos tendían a salirse de la banda de paso de Goertzel

Luego intenté manejar un transductor acústico con una onda cuadrada de 750Hz pero descubrí que tenía una resonancia que filtraba los armónicos primero y tercero. La foto 6 muestra la salida del amplificador de micrófono a una onda cuadrada de 750Hz … ¡¡¡estamos viendo el 5º armónico !!!

Luego recurrí a usar un pequeño altavoz. La foto 7 muestra la salida del micrófono a una onda cuadrada de 750Hz que se envió a un pequeño altavoz … esta vez estamos viendo lo fundamental … no el quinto armónico. El filtro Goertzel ignora cualquier armónico.

Notas

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Paso 5: software

Software
Software
Software
Software
Software
Software

Instalación

  • Descarga el archivo adjunto MorseCodeDecoder.ino [1]
  • Copie el contenido de este archivo en un nuevo boceto de Arduino
  • Guarde el boceto como "MorseCodeDecoder" (sin las comillas)
  • Compila y sube el boceto a tu Arduino

Actualización de software 23 de julio de 2020

Se han agregado las siguientes características al archivo adjunto "MorseCodeDecoder6.ino"

  • una ventana "Exact Blackman" [2]
  • un "Noise_blanker"

Ajustamiento:

  • aumente el nivel de audio de su receptor hasta que el LED comience a parpadear y luego retroceda
  • ahora sintonice su receptor hasta que el LED parpadee al mismo ritmo que el morse entrante
  • Noise_blanker se ha configurado para ignorar las ráfagas de ruido de hasta 8 mS (un tiempo de bucle)
  • el umbral de ruido se puede ajustar configurando Debug = true y observando su Plotter serial

Nota

[1]

Configure su monitor serial Arduino a 115200 baudios si también desea ver el texto.

[2]

  • Foto 1… Ventana exacta de Blackman
  • Foto 2… Filtro Goertzel sin ventana Exact Blackman
  • Foto 3,,, filtro Goertzel con la ventana Exact Blackman aplicada

Paso 6: Operación

Descifrador

Coloque la unidad junto a su altavoz cuando escuche morse.

  • La cápsula del micrófono electret capta la señal morse de su altavoz.
  • La salida del micrófono electret se amplifica 647 veces (56dB) antes de pasar al Arduino para su procesamiento.
  • Un filtro de paso de banda digital Goertzel extrae la señal morse del ruido.
  • La decodificación se realiza mediante un árbol binario.
  • La salida del decodificador se muestra como texto en una pantalla TFT de 320 x 240 píxeles. También se envía a su "Monitor en serie" Arduino si no desea utilizar una pantalla.

Remitente Morse

También se ha incluido un remitente morse. Esto le permite practicar el envío de morse y funciona de la siguiente manera:

  • Se genera un tono audible constante en el pin 4 de Arduino.
  • Escuchamos este tono a través del altavoz del decodificador cada vez que presionamos la tecla morse.
  • El tono se establece en la misma frecuencia que el filtro Goertzel, lo que engaña al decodificador haciéndole creer que está escuchando morse real … todo lo que envíe aparecerá como texto impreso en la pantalla.

Su envío mejorará a medida que el decodificador detecta errores comunes como:

  • demasiado espacio entre símbolos. (ejemplo: Q anotado como MA)
  • demasiado espacio entre las letras (ejemplo: AHORA impreso como NO W)
  • código incorrecto

Paso 7: Resumen

Descifrador

Este instructivo describe cómo hacer un decodificador morse que convierta el código morse en texto impreso.

  • El decodificador es capaz de decodificar morse hasta al menos 80 palabras por minuto (palabras por minuto)
  • El decodificador rastrea automáticamente las variaciones en la velocidad de envío recibida.
  • El texto se muestra en su monitor serial (o en un módulo de pantalla TFT de 320 x 240 si está instalado) [1]

Remitente

También se ha incluido un remitente morse

  • El remitente le ayuda a mejorar la calidad de su envío morse.
  • El decodificador confirma que lo que ha enviado es correcto

Costo de repuestos

El costo estimado del protector del decodificador Morse, menos la pantalla TFT opcional, es de $ 25.

Haga clic aquí para ver mis otros instructivos.

Desafío de audio 2020
Desafío de audio 2020
Desafío de audio 2020
Desafío de audio 2020

Segundo premio en el Audio Challenge 2020

Recomendado: