Índice:
- Etapa 1: Lista de peças
- Etapa 2: Diagrama de Circuito
- Etapa 3: Teoria
- Etapa 4: notas de design
- Etapa 5: Software
- Etapa 6: Operação
- Etapa 7: Resumo
Vídeo: Decodificador Morse de árvore binária: 7 etapas (com imagens)
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:35
Este instrutível explica como decodificar o código Morse usando um Arduino Uno R3.
O decodificador, que se ajusta automaticamente à velocidade de envio, é capaz de decodificar mais de 80 palavras por minuto.
O código de entrada é exibido como texto em seu Monitor Serial Arduino (ou tela TFT, se instalada)
Um oscilador de tom foi incluído, caso deseje praticar o envio de morse.
Os recursos do decodificador:
- um módulo de exibição 320 x 240 TFT [1]
- um filtro passa-banda digital Goertzel para separar sinais indesejados.
- uma “Árvore de Morse Binária” para decodificar o sinal
- rastreamento de velocidade automática
- uma saída audível ao praticar morse
- tanto o texto de entrada quanto o de saída são exibidos.
Os seguintes caracteres e símbolos são reconhecidos:
- [A.. Z]
- [0..9]
- [., ? ' ! / () &:; = + - _ " @]
O custo estimado do escudo do decodificador Morse, menos o display TFT, é de $ 25. [1]
Imagens
- A foto da capa mostra uma unidade totalmente montada
- O vídeo mostra o decodificador funcionando
Notas
[1]
- O módulo de exibição TFT é opcional, pois todo o texto é enviado para o seu Arduino “Serial Monitor”.
- O módulo TFT é descrito em meu instrutível
Etapa 1: Lista de peças
As seguintes partes foram obtidas em
1 único protetor de protótipo para Arduino UNO R3, passo de 2,54 mm
As seguintes peças foram obtidas localmente:
- 1 único LM358 dual opamp
- 1 apenas LED verde
- 1 apenas clipe de LED
- 1 cápsula de microfone de eletreto apenas
- 1 apenas botão normalmente aberto
- 1 soquete DIP de 8 pinos
- 2 apenas resistores de 330 ohms
- 2 resistores apenas 2K2
- 5 apenas resistores de 10K ohm
- 2 apenas resistores de 56K ohm
- 2 apenas 1uF capacitor
- 1 capacitor apenas 10uF
As seguintes partes são opcionais:
- 1 apenas Módulo de display LCD TFT SPI de 2,2 polegadas 240 * 320 ILI9341 com slot de cartão SD para Arduino Raspberry Pi 51 / AVR / STM32 / ARM / PIC [1]
- Chave / botão Morse
- 1 apenas transistor NPN BC548
- 1 alto-falante de apenas 1 polegada
- 1 resistor de apenas 33K ohm
- 1 plugue mono de 3,5 mm (para chave morse)
- 1 tomada mono de 3,5 mm (para chave morse)
- 3 espaçadores de náilon com rosca M3 de apenas 9 mm
- 1 caixa de plástico ABS apenas 130 x 68 x 44 mm
- 5 conectores de ângulo reto de 2 pinos apenas
O custo estimado do escudo do decodificador Morse, menos o display TFT opcional, é de $ 25. [1]
Notas
[1]
A lista de peças para o módulo de exibição TFT 320 x 240 opcional está listada em meu
[2]
É necessária uma chave Morse ou um botão de pressão robusto se desejar usar o remetente.
Etapa 2: Diagrama de Circuito
Imagens
A foto 1 mostra o diagrama de circuito do decodificador Morse. O resistor de 330 ohm em série com a tecla de morse limita a corrente de saída D4 no caso de um curto acidental ao aterramento … aumentar seu valor diminui a saída de áudio do alto-falante. Por esse motivo, não o adicionei ao escudo, mas o conectei diretamente ao conector da chave de morse para facilitar o ajuste
A foto 2 mostra um escudo correspondente. O escudo é do meu https://www.instructables.com/id/Arduino-TFT-Grap … ao qual adicionei o amplificador de microfone e o oscilador de tom. [1]
A foto 3 mostra o escudo completo conectado a um Arduino. Nenhum outro componente é necessário se o texto for visualizado no “Monitor Serial” do Arduino
A foto 4 mostra o decodificador parcialmente encaixotado. Um orifício foi feito na tampa para a visualização da tela. O alto-falante e o microfone foram colados ao gabinete. Faça alguns orifícios para alto-falantes na tampa antes de montá-los. O soquete central na tampa é para um microfone de extensão … sem isso, o decodificador deve ser colocado perto do alto-falante, o que nem sempre é possível
A foto 5 mostra a tela TFT. Fita isolante preta foi fixada nas bordas da tela … essa fita evita vazamento de luz e mascara qualquer desalinhamento entre a tela e a abertura na tampa
Importante
[1]
Arduinos com um grande conector USB requerem uma camada de fita isolante entre o conector USB e a blindagem do Arduino. Shorts acidentais são possíveis sem a fita, pois a folga é pequena. A fita não é necessária para Arduinos que possuem conectores pequenos
Etapa 3: Teoria
Cada letra do código morse compreende uma série de tons de curta e longa duração denominados “pontos” e “travessões”.
- um ponto (.) tem 1 unidade de comprimento
- um traço (_) tem 3 unidades de comprimento
- o espaço entre os elementos da letra é de 1 unidade
- o espaço entre as letras é de 3 unidades
- o espaço entre as palavras é de 7 unidades
Podemos determinar se o tom de entrada é um ponto ou um traço, comparando sua duração com um tom de referência de 2 unidades de comprimento.
- um ponto é menor que 2 unidades
- um traço é maior que 2 unidades
Existem dois métodos distintos para decodificar o padrão de entrada de pontos e traços:
- busca linear
- árvore binária (também conhecida como pesquisa dicotômica)
Pesquisa Linear
Um método comum é criar uma série de personagens e seus padrões morse correspondentes. Por exemplo, cada um dos seguintes caracteres seria salvo como:
- UMA. _
- B _…
- C _. _.
- 0 _ _ _ _ _
- 1. _ _ _ _
- 2.. _ _ _
Cada letra requer 6 células … 1 para a própria letra e 5 para os (.) 'Se (_)' s. Para fazer isso, precisamos de um array de caracteres letters [36] [6] com um total de 216 células. As células não utilizadas são normalmente preenchidas com um zero ou um espaço em branco.
Para decodificar os pontos e traços que chegam, devemos comparar o padrão de pontos / traços de cada letra que chega com nossos padrões de caracteres de referência.
Embora esse método funcione, é extremamente lento.
Digamos que temos 26 letras ('A',.. 'Z') e os dígitos ('0', … '9') armazenados em uma matriz, então devemos realizar 36 pesquisas, cada uma com até 5 sub-pesquisas, que é um total de 36 * 5 = 180 pesquisas para decodificar o numeral '9'.
Árvore Binária
Uma pesquisa binária é muito mais rápida, pois nenhuma pesquisa é necessária.
Ao contrário da pesquisa linear, que requer que os padrões de caractere e morse sejam armazenados, a árvore binária armazena apenas os caracteres, o que significa que o tamanho do array é menor.
Eu dividi minha árvore binária (foto1) em duas metades (fotos 2 e 3) para torná-la mais legível.
Para encontrar um caractere, movemos um ponteiro para a esquerda cada vez que ouvimos um ponto e movemos o ponteiro para a direita sempre que ouvimos um traço. Depois de cada movimento, dividimos pela metade a distância do ponteiro para o próximo movimento … daí o nome árvore binária.
Para decodificar a letra '9' (traço, traço, traço, traço, ponto) são necessários 5 movimentos … 4 para a direita e 1 para a esquerda, o que deixa o ponteiro diretamente sobre o '9'.
Cinco movimentos são significativamente mais rápidos do que 180 pesquisas !!!!!
A matriz de caracteres binários também é menor … 26 letras e 10 algarismos requer apenas uma matriz de linha de 64 x 1. Eu escolhi criar uma matriz de 128 caracteres para que eu possa decodificar a pontuação.
Etapa 4: notas de design
O Morse é difícil de decodificar na presença de sinais de interferência. Os sinais indesejados devem ser rejeitados … isso requer algum tipo de filtro.
Existem muitas possibilidades:
- Loops com bloqueio de fase
- Filtros indutor-capacitor
- Filtros ativos de resistor-capacitor
- Processamento de sinal digital, como Fast Fourier Transform ou o filtro Goertzel.
Os métodos 1, 2, 3 requerem componentes externos que são volumosos.
O método 4 não requer componentes externos … as frequências são detectadas usando algoritmos matemáticos.
Transformada rápida de Fourier (FFT)
Um método para detectar a presença de um tom em uma forma de onda complexa é usar a Transformada Rápida de Fourier
A foto 1 mostra como FFT (Fast Fourier Transform) divide o espectro de áudio em “bins”.
A foto 2 mostra como os “bins” FFT respondem a um sinal … neste caso 800Hz. Se um segundo sinal de, digamos, 1500Hz estivesse presente, veríamos duas respostas … uma a 800Hz e outra a 1500Hz.
Em teoria, um decodificador de código Morse pode ser feito monitorando o nível de saída de um determinado compartimento de frequência FFT … um grande número representa a presença de um ponto ou traço … um pequeno número representa nenhum sinal.
Esse decodificador de código morse poderia ser feito monitorando o "compartimento 6" na foto 2, mas há uma série de coisas erradas com essa abordagem:
- queremos apenas um compartimento de frequência … o resto são cálculos perdidos
- os bins de frequência podem não aparecer exatamente na frequência de interesse
- é relativamente lento (20 ms por loop Arduino ()
Outro método é usar um filtro Goertzel.
Filtro Goertzel
O filtro Goertzel é semelhante ao FFT, mas possui apenas um compartimento de frequência único.
Photo3 mostra a resposta de frequência de um filtro Goertzel para etapas de áudio discretas.
A foto 4 é uma varredura do mesmo filtro na mesma faixa de frequência.
Decidi “ir” com o algoritmo Goertzel como:
- O tempo de loop do Arduino () usando o algoritmo Goertzel foi de 14 ms (milissegundos) versus 20 ms (milissegundos) para uma solução FFT usando a biblioteca “fix_FFT” do Arduino.
- É fácil definir a frequência central de um filtro passa-banda Goertzel.
- A largura de banda é de aproximadamente 190Hz.
A foto 5 mostra a saída numérica de um filtro Goertzel de 900 Hz quando um tom é detectado. Eu configurei meu limite de tom para um valor de 4000 … valores acima de 4000 indicam um tom.
Em teoria, você só precisa ajustar o filtro para uma frequência de escuta confortável. Infelizmente, a saída de áudio do meu alto-falante de monitoramento de 1 polegada cai rapidamente abaixo de 900Hz. Para evitar qualquer problema, estou usando uma frequência de filtro de 950 Hz. As fórmulas necessárias para calcular frequências de filtro alternativas são encontradas no cabeçalho do meu código.
Decodificação
Decodificar os pontos e travessões não é tão fácil quanto parece à primeira vista.
Morse perfeito é definido como:
- ponto = 1 unidade
- espaços dentro da letra = 1 unidade
- traço = 3 unidades
- espaço entre letras = 3 unidades
- espaço entre palavras = 7 unidades
Para decodificar o morse perfeito, simplesmente precisamos de uma duração de tom de referência de 2 unidades
- ponto <2 unidades
- espaço do elemento <2 unidades
- traço> 2 unidades
- letra _space> 2 unidades
- word_space> 6 unidades (ou seja, 3 x unidades de referência)
Isso funciona para a máquina morse, mas no "mundo real":
- a velocidade de envio varia
- a duração de cada ponto varia
- a duração de cada traço varia
- as letras E, I, S, H, 5 contêm apenas pontos cuja média é a duração do ponto
- as letras T, M, O, 0 contêm apenas travessões cuja média para a duração do traço
- as lacunas de palavras podem não chegar
- o desbotamento cria erros dos quais o decodificador deve se recuperar.
- sinais corrompidos devido à interferência
Letras contendo apenas pontos e traços são parcialmente resolvidas se:
estimamos a duração de referência até recebermos um ponto válido e um travessão válido. Eu uso 200 milissegundos, o que é válido se a velocidade de envio estiver entre 6 WPM (palavras por minuto) e 17 WPM. Você pode precisar aumentar esse valor se estiver aprendendo mais. Uma tabela de velocidade está incluída no software
As variações de velocidade são resolvidas se:
- realizamos uma média contínua em cada ponto e cada traço e
- recalcular a duração de referência após cada símbolo ser recebido
As lacunas de palavras e as que não chegam são resolvidas se:
- lembre-se do tempo da última transição final (tom para sem tom),
- reinicie o algoritmo após cada letra,
- calcular o tempo decorrido enquanto espera pela próxima transição de ponta (sem tom para tom) e
- insira um espaço se 6 unidades de tempo tiverem sido excedidas.
Oscilador Morse
Eu tentei inicialmente algumas campainhas Piezo, mas encontrei:
- a frequência foi fixada
- a frequência de saída estava muito alta para escuta prolongada
- os piezos tendiam a se desviar da banda passante de Goertzel
Em seguida, tentei acionar um transdutor acústico com uma onda quadrada de 750 Hz, mas descobri que ele tinha uma ressonância que filtrava o primeiro e o terceiro harmônicos. A foto 6 mostra a saída do amplificador do microfone para uma onda quadrada de 750 Hz … estamos vendo o 5º harmônico !!!
Então, recorri a um alto-falante pequeno. A foto 7 mostra a saída do microfone para uma onda quadrada de 750 Hz que foi enviada para um pequeno alto-falante … desta vez, estamos vendo o fundamental … não o 5º harmônico. O filtro Goertzel ignora quaisquer harmônicos.
Notas
[1]
en.wikipedia.org/wiki/Goertzel_algorithm
www.embedded.com/the-goertzel-algorithm/
Etapa 5: Software
Instalação
- Baixe o arquivo anexo MorseCodeDecoder.ino [1]
- Copie o conteúdo deste arquivo para um novo esboço do Arduino
- Salve o esboço como "MorseCodeDecoder" (sem as aspas)
- Compile e envie o esboço para o seu Arduino
Atualização de software 23 de julho de 2020
Os seguintes recursos foram adicionados ao arquivo anexado "MorseCodeDecoder6.ino"
- uma janela "Exact Blackman" [2]
- um "Noise_blanker"
Ajustamento:
- aumente o nível de áudio do receptor até que o LED comece a piscar e depois desligue
- agora sintonize seu receptor até que o LED pisque em sincronia com o morse de entrada
- o Noise_blanker foi configurado para ignorar picos de ruído de até 8 ms (um tempo de loop)
- o limite de ruído pode ser ajustado definindo Debug = true e observando seu Serial Plotter
Observação
[1]
Defina o seu monitor serial Arduino para 115200 bauds se desejar visualizar o texto.
[2]
- Foto 1 … Janela exata do Blackman
- Foto 2 … Filtro Goertzel sem janela Exact Blackman
- Foto 3,,, filtro Goertzel com janela Exact Blackman aplicada
Etapa 6: Operação
Decodificador
Coloque a unidade próxima ao alto-falante ao ouvir Morse.
- A cápsula do microfone de eletreto capta o sinal morse do alto-falante.
- A saída do microfone de eletreto é então amplificada 647 vezes (56dB) antes de ser passada para o Arduino para processamento.
- Um filtro passa-banda digital Goertzel extrai o sinal morse do ruído.
- A decodificação é feita usando uma árvore binária.
- A saída do decodificador é exibida como texto em uma tela TFT de 320 x 240 pixels. Ele também é enviado para o "Monitor Serial" do Arduino se você não quiser usar um monitor.
Morse Sender
Um remetente morse também foi incluído. Isso permite que você pratique o envio de morse e funciona da seguinte forma:
- Um tom audível constante é gerado no pino 4 do Arduino.
- Ouvimos este tom através do alto-falante do decodificador sempre que pressionamos a tecla Morse.
- O tom é definido com a mesma frequência do filtro Goertzel, que engana o decodificador e faze-o pensar que está ouvindo Morse real … tudo o que você enviar aparecerá como texto impresso no visor.
Seu envio melhorará conforme o decodificador detecta erros comuns, como:
- muito espaço entre os símbolos. (exemplo: Q pintado como MA)
- muito espaço entre as letras (exemplo: AGORA impresso como NÃO W)
- Código incorreto
Etapa 7: Resumo
Decodificador
Este instrutível descreve como fazer um decodificador Morse que converte o código Morse em texto impresso.
- O decodificador é capaz de decodificar morse até pelo menos 80 WPM (palavras por minuto)
- O decodificador rastreia automaticamente as variações na velocidade de envio recebida.
- O texto é exibido em seu monitor serial (ou em um módulo de exibição 320 x 240 TFT, se instalado) [1]
Remetente
Um remetente morse também foi incluído
- O remetente ajuda a melhorar a qualidade do envio do Morse.
- O decodificador confirma que o que você enviou está correto
Custo das peças
O custo estimado do escudo do decodificador Morse, menos o display TFT opcional, é de $ 25.
Clique aqui para ver meus outros instructables.
Segundo Prêmio no Desafio de Áudio 2020
Recomendado:
LabDroid: codificador / decodificador de código Morse: 4 etapas
LabDroid: Codificador / Decodificador de Código Morse: Nota: Esta instrução não pode ser realizada 1: 1 na versão mais recente do LabDroid. Vou atualizá-lo em breve. Este projeto vai mostrar o que você pode fazer com o LabDroid. Como um Hello World normalmente é feito com base em texto, luz ou som, pensei no LabDr
Calculadora binária de 4 bits: 11 etapas (com imagens)
Calculadora binária de 4 bits: Desenvolvi um interesse na forma como os computadores funcionam em um nível fundamental. Eu queria entender o uso de componentes discretos e os circuitos necessários para realizar tarefas mais complexas. Um componente fundamental importante em uma CPU é o
Decodificador Basys 3 Morse: 11 etapas
Decodificador Basys 3 Morse: Este é um projeto para uma aula de faculdade. Este projeto está escrito em VHDL em um programa chamado Vivado. As tarefas para criar todos os módulos necessários para implementar um Decodificador Morse usando a placa Basys 3. O quadro é usado para receber o código morse de um swi
Decodificador de tarja magnética Arduino: 4 etapas (com imagens)
Decodificador de tarja magnética Arduino: este instrutível mostra como usar alguns códigos disponíveis gratuitamente, um arduino e um leitor de tarja magnética padrão para digitalizar e exibir os dados armazenados em cartões de tarja magnética, como cartões de crédito, carteiras de estudante, etc. poste isso depois
Cartão de visita do decodificador - Mensagem secreta codificada por QR: 6 etapas (com imagens)
Cartão de visita decodificador - Mensagem secreta codificada por QR: Ter um bom cartão de visita pode ajudá-lo a manter contatos, promover a si mesmo e sua empresa e fazer amigos. Ao criar um cartão de visita pessoal que envolva o destinatário, traduzindo ativamente o seu cartão, ele terá mais chances de se lembrar de você