Sommario:

Decodificatore Morse ad albero binario: 7 passaggi (con immagini)
Decodificatore Morse ad albero binario: 7 passaggi (con immagini)

Video: Decodificatore Morse ad albero binario: 7 passaggi (con immagini)

Video: Decodificatore Morse ad albero binario: 7 passaggi (con immagini)
Video: UNA GIOSTRA SI STACCA A ROMA! 2024, Dicembre
Anonim
Image
Image
Schema elettrico
Schema elettrico

Questo istruibile spiega come decodificare il codice Morse usando un Arduino Uno R3.

Il decoder, che si adatta automaticamente alla velocità di invio, è in grado di decodificare morse fino ad almeno 80 parole al minuto.

Il codice in arrivo viene visualizzato come testo sul monitor seriale Arduino (o sullo schermo TFT se installato)

È stato incluso un oscillatore di tono se desideri esercitarti nell'invio di morse.

Le caratteristiche del decoder:

  • un modulo display TFT 320 x 240 [1]
  • un filtro passabanda digitale Goertzel per separare i segnali indesiderati.
  • un “Binary Morse Tree” per decodificare il segnale
  • rilevamento automatico della velocità
  • un'uscita udibile quando si pratica morse
  • vengono visualizzati sia il testo in entrata che in uscita.

Vengono riconosciuti i seguenti caratteri e simboli:

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

Il costo stimato dello scudo del decodificatore morse, meno il display TFT, è di $ 25. [1]

immagini

  • La foto di copertina mostra un'unità completamente assemblata
  • Il video mostra il decoder funzionante

Appunti

[1]

  • Il modulo display TFT è opzionale in quanto tutto il testo viene inviato al tuo "Monitor seriale" Arduino.
  • Il modulo TFT è descritto nel mio tutorial

Passaggio 1: elenco delle parti

Le seguenti parti sono state ottenute da

1 solo prototipo shield per Arduino UNO R3, passo 2,54mm

Le seguenti parti sono state ottenute localmente:

  • 1 solo LM358 doppio operazionale
  • 1 solo LED verde
  • 1 solo clip LED
  • 1 sola capsula microfonica elettrete
  • 1 solo pulsante normalmente aperto
  • 1 solo presa DIP a 8 pin
  • 2 solo resistori da 330 ohm
  • 2 solo resistori 2K2
  • 5 solo resistori da 10K ohm
  • 2 solo resistori da 56K ohm
  • 2 solo condensatore da 1uF
  • 1 solo condensatore da 10uF

Le seguenti parti sono facoltative:

  • 1 solo modulo display LCD TFT SPI da 2,2 pollici 240*320 ILI9341 con slot per scheda SD per Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Chiave/pulsante Morse
  • 1 solo transistor BC548 NPN
  • 1 solo altoparlante da 1 pollice
  • 1 solo resistore da 33K ohm
  • 1 solo spinotto mono da 3,5 mm (per chiave morse)
  • 1 solo presa mono da 3,5 mm (per chiave morse)
  • 3 distanziali in nylon filettato M3 solo 9mm
  • 1 solo scatola in plastica ABS da 130 x 68 x 44 mm
  • 5 soli connettori ad angolo retto a 2 pin

Il costo stimato dello scudo del decodificatore morse, meno il display TFT opzionale, è di $ 25. [1]

Appunti

[1]

L'elenco delle parti per il modulo display TFT 320 x 240 opzionale è elencato nel mio

[2]

Se si desidera utilizzare il mittente è necessaria una chiave morse o un pulsante robusto.

Passaggio 2: schema elettrico

Schema elettrico
Schema elettrico
Schema elettrico
Schema elettrico
Schema elettrico
Schema elettrico

immagini

La foto 1 mostra lo schema elettrico del decoder morse. La resistenza da 330 ohm in serie con il tasto morse limita la corrente di uscita del D4 in caso di cortocircuito verso massa accidentale… aumentando il suo valore diminuisce l'uscita audio dall'altoparlante. Per questo motivo non l'ho aggiunto allo shield ma l'ho attaccato direttamente al jack morse-key per facilità di regolazione

La foto 2 mostra uno scudo abbinato. Lo scudo è dal mio istruibile https://www.instructables.com/id/Arduino-TFT-Grap… a cui ho aggiunto l'amplificatore del microfono e l'oscillatore di tono. [1]

La foto 3 mostra lo shield completato collegato a un Arduino. Non sono necessari altri componenti se il testo deve essere visualizzato sul tuo "Monitor seriale" Arduino

La foto 4 mostra il decoder parzialmente in scatola. Nel coperchio è stato praticato un foro per la visualizzazione del display. L'altoparlante e il microfono sono stati incollati a caldo alla custodia. Praticare alcuni fori per gli altoparlanti nel coperchio prima di montare l'altoparlante. La presa centrale sul coperchio è per un microfono di estensione… senza questo il decoder deve essere posizionato vicino all'altoparlante che non è sempre possibile

La foto 5 mostra lo schermo TFT. Ai bordi del display è stato applicato del nastro isolante nero… questo nastro previene la perdita di luce e maschera qualsiasi disallineamento tra il display e l'apertura nel coperchio

Importante

[1]

Gli Arduino con un connettore USB di grandi dimensioni richiedono uno strato di nastro isolante tra il connettore USB e lo shield Arduino. I cortometraggi accidentali sono possibili senza il nastro poiché lo spazio è ridotto. Il nastro non è necessario per Arduino che hanno connettori piccoli

Passaggio 3: teoria

Teoria
Teoria
Teoria
Teoria
Teoria
Teoria

Ogni lettera in codice morse comprende una serie di toni di breve e lunga durata chiamati "punti" e "trattini".

  • un punto (.) è lungo 1 unità
  • un trattino (_) è lungo 3 unità
  • lo spazio tra gli elementi delle lettere è 1 unità
  • lo spazio tra le lettere è di 3 unità
  • lo spazio tra le parole è di 7 unità

Possiamo determinare se il tono in arrivo è un punto o un trattino confrontando la sua durata con un tono di riferimento di 2 unità di lunghezza.

  • un punto è inferiore a 2 unità
  • un trattino è maggiore di 2 unità

Esistono due metodi nettamente diversi per decodificare il modello in entrata di punti e trattini:

  • ricerca lineare
  • albero binario (noto anche come ricerca dicotomica)

Ricerca lineare

Un metodo comune consiste nel creare una serie di caratteri e i relativi modelli morse corrispondenti. Ad esempio, ciascuno dei seguenti caratteri verrebbe salvato come:

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

Ogni lettera richiede 6 celle … 1 per la lettera stessa e 5 per (.) e (_). Per fare ciò abbiamo bisogno di un array di caratteri lettere[36][6] con un totale di 216 celle. Le celle non utilizzate sono normalmente riempite con uno zero o uno spazio vuoto.

Per decodificare i punti e i trattini in arrivo dobbiamo confrontare lo schema punto/trattino di ogni lettera in arrivo con i nostri modelli di caratteri di riferimento.

Sebbene questo metodo funzioni, è estremamente lento.

Supponiamo di avere 26 lettere ('A',..' Z') e le cifre ('0', … '9') memorizzate in un array, quindi dobbiamo eseguire 36 ricerche, ciascuna con un massimo di 5 sottoricerche, che è un totale di 36*5=180 ricerche per decodificare il numero '9'.

Albero binario

Una ricerca binaria è molto più veloce poiché non sono necessarie ricerche.

A differenza della ricerca lineare, che richiede la memorizzazione sia del carattere che dei modelli morse, l'albero binario memorizza solo i caratteri, il che significa che la dimensione dell'array è inferiore.

Ho diviso il mio albero binario (foto1) in due metà (foto 2 e 3) per renderlo più leggibile.

Per trovare un carattere spostiamo un puntatore a sinistra ogni volta che sentiamo un punto e spostiamo il puntatore a destra ogni volta che sentiamo un trattino. Dopo ogni mossa dimezziamo la distanza del puntatore per la prossima mossa… da qui il nome albero binario.

Per decodificare la lettera '9' (trattino, trattino, trattino, trattino, punto) sono necessarie 5 mosse … 4 a destra e 1 a sinistra che lascia il puntatore direttamente sopra il '9'.

Cinque mosse è significativamente più veloce di 180 ricerche !!!!!

Anche l'array di caratteri binari è più piccolo … 26 lettere e 10 numeri richiedono solo un array di 64 x 1. Ho scelto di creare un array di 128 caratteri in modo da poter decodificare la punteggiatura.

Passaggio 4: note di progettazione

Note di progettazione
Note di progettazione
Note di progettazione
Note di progettazione
Note di progettazione
Note di progettazione
Note di progettazione
Note di progettazione

Morse è difficile da decodificare in presenza di segnali interferenti. I segnali indesiderati devono essere respinti… questo richiede una sorta di filtro.

Ci sono molte possibilità:

  1. Anelli ad aggancio di fase
  2. Filtri induttore-condensatore
  3. Filtri attivi resistore-condensatore
  4. Elaborazione del segnale digitale come la trasformata di Fourier veloce o il filtro di Goertzel.

I metodi 1, 2, 3 richiedono componenti esterni ingombranti.

Il metodo 4 non richiede componenti esterni… le frequenze vengono rilevate utilizzando algoritmi matematici.

Trasformata di Fourier veloce (FFT)

Un metodo per rilevare la presenza di un tono in una forma d'onda complessa consiste nell'utilizzare la trasformata di Fourier veloce

La foto 1 mostra come la FFT (Fast Fourier Transform) divide lo spettro audio in “bin”.

La foto 2 mostra come i “bin” FFT rispondono a un segnale … in questo caso 800Hz. Se fosse presente un secondo segnale, diciamo, di 1500Hz, vedremmo due risposte… una a 800Hz e un'altra a 1500Hz.

In teoria un decodificatore di codice morse può essere realizzato monitorando il livello di uscita di un particolare bin di frequenza FFT … un numero grande rappresenta la presenza di un punto o un trattino … un numero piccolo rappresenta nessun segnale.

Un tale decodificatore di codice morse potrebbe essere realizzato monitorando "bin 6" nella foto 2, ma ci sono un certo numero di cose che non vanno in questo approccio:

  • vogliamo solo un bin di frequenza … il resto sono calcoli sprecati
  • i bin di frequenza potrebbero non apparire esattamente sulla frequenza di interesse
  • è relativamente lento (20 mS per loop Arduino()

Un altro metodo consiste nell'utilizzare un filtro Goertzel.

Filtro Goertzel

Il filtro Goertzel è simile a FFT ma ha solo un singolo bin di frequenza.

La foto3 mostra la risposta in frequenza di un filtro Goertzel a passaggi audio discreti.

La foto 4 è una scansione dello stesso filtro sulla stessa gamma di frequenze.

Ho deciso di "andare" con l'algoritmo di Goertzel come:

  • Il tempo di loop() di Arduino utilizzando l'algoritmo Goertzel era di 14 mS (millisecondi) rispetto a 20 mS (millisecondi) per una soluzione FFT che utilizzava la libreria Arduino "fix_FFT".
  • È facile impostare la frequenza centrale di un filtro passa-banda Goertzel.
  • La larghezza di banda è di circa 190Hz.

La foto 5 mostra l'uscita numerica di un filtro Goertzel a 900Hz quando viene rilevato un tono. Ho impostato la mia soglia di tono su un valore di 4000 … i valori superiori a 4000 indicano un tono.

In teoria è sufficiente sintonizzare il filtro su una frequenza di ascolto confortevole. Sfortunatamente l'uscita audio dal mio altoparlante di monitoraggio da 1 pollice scende rapidamente sotto i 900Hz. Per evitare problemi sto usando una frequenza di filtro di 950Hz. Le formule necessarie per calcolare le frequenze di filtro alternative si trovano nell'intestazione del mio codice.

decodifica

Decodificare punti e trattini non è così facile come sembra a prima vista.

Morse perfetto è definito come:

  • punto = 1 unità
  • spazi all'interno della lettera = 1 unità
  • trattino = 3 unità
  • spazio tra le lettere = 3 unità
  • spazio tra le parole = 7 unità

Per decodificare il morse perfetto abbiamo semplicemente bisogno di una durata del tono di riferimento di 2 unità

  • punto < 2 unità
  • spazio elemento < 2 unità
  • trattino > 2 unità
  • lettera _spazio > 2 unità
  • spazio_parole > 6 unità (cioè 3 x unità di riferimento)

Funziona per la macchina morse ma nel "mondo reale":

  • la velocità di invio varia
  • la durata di ogni punto varia
  • la durata di ogni trattino varia
  • le lettere E, I, S, H, 5 contengono solo punti che mediano la durata del punto
  • le lettere T, M, O, 0 contengono solo trattini che mediano la durata del trattino
  • le lacune di parole potrebbero non arrivare
  • lo sbiadimento crea errori dai quali il decoder deve riprendersi.
  • segnali corrotti a causa di interferenze

Le lettere che contengono solo punti e trattini sono parzialmente risolte se:

stimiamo la durata di riferimento fino a quando non abbiamo ricevuto un punto valido e un trattino valido. Uso 200 millisecondi che è valido se la velocità di invio è compresa tra 6 WPM (parole al minuto) e 17 WPM. Potrebbe essere necessario aumentare questo valore se stai imparando il morse. Una tabella di velocità è inclusa nel software

Le variazioni di velocità sono risolte se:

  • eseguiamo una media mobile su ogni punto e ogni trattino e
  • ricalcolare la durata di riferimento dopo la ricezione di ogni simbolo

Le lacune di parole e le lacune di parole che non arrivano vengono risolte se:

  • ricorda il tempo dell'ultima transizione dal bordo d'uscita (da tono a nessun tono),
  • riavviare l'algoritmo dopo ogni lettera,
  • calcolare il tempo trascorso durante l'attesa della prossima transizione del bordo d'attacco (nessun tono a tono) e
  • inserire uno spazio se sono state superate 6 unità di tempo.

Oscillatore Morse

Inizialmente ho provato alcuni cicalini Piezo ma ho trovato:

  • la frequenza era fissa
  • la frequenza di uscita era troppo alta per un ascolto prolungato
  • i piezo tendevano a uscire dalla banda passante di Goertzel

Ho quindi provato a pilotare un trasduttore acustico con un'onda quadra a 750Hz, ma ho scoperto che aveva una risonanza che filtrava la prima e la terza armonica. La foto 6 mostra l'uscita dell'amplificatore del microfono ad un'onda quadra a 750Hz … stiamo vedendo la 5a armonica !!!

Ho quindi fatto ricorso a un utilizzando un piccolo altoparlante. La foto 7 mostra l'uscita del microfono a un'onda quadra a 750Hz che è stata inviata a un piccolo altoparlante … questa volta stiamo vedendo la fondamentale … non la quinta armonica. Il filtro Goertzel ignora qualsiasi armonica.

Appunti

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Passaggio 5: software

Software
Software
Software
Software
Software
Software

Installazione

  • Scarica il file allegato MorseCodeDecoder.ino [1]
  • Copia il contenuto di questo file in un nuovo sketch Arduino
  • Salva lo schizzo come "MorseCodeDecoder" (senza le virgolette)
  • Compila e carica lo schizzo sul tuo Arduino

Aggiornamento software 23 luglio 2020

Le seguenti funzionalità sono state aggiunte al file allegato "MorseCodeDecoder6.ino"

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

Regolazione:

  • aumentare il livello audio del ricevitore finché il LED non inizia a lampeggiare, quindi si spegne
  • ora sintonizza il tuo ricevitore finché il LED non lampeggia al passo con il morse in arrivo
  • il Noise_blanker è stato impostato per ignorare i burst di rumore fino a 8 ms (un tempo di loop)
  • la soglia del rumore può essere regolata impostando Debug=true e guardando il tuo plotter seriale

Nota

[1]

Imposta il tuo monitor seriale Arduino a 115200 baud se desideri visualizzare anche il testo.

[2]

  • Foto 1 … Finestra esatta di Blackman
  • Foto 2 … Filtro Goertzel senza finestra Exact Blackman
  • Foto 3,,, Filtro Goertzel con finestra Exact Blackman applicata

Passaggio 6: operazione

decodificatore

Posiziona l'unità accanto al tuo altoparlante quando ascolti morse.

  • La capsula microfonica a elettrete capta il segnale morse dall'altoparlante.
  • L'uscita del microfono elettrete viene quindi amplificata 647 volte (56 dB) prima di essere passata all'Arduino per l'elaborazione.
  • Un filtro passabanda digitale Goertzel estrae il segnale morse dal rumore.
  • La decodifica viene eseguita utilizzando un albero binario.
  • L'uscita del decoder viene visualizzata come testo su un display TFT da 320 x 240 pixel. Viene anche inviato al tuo "Monitor seriale" Arduino se non desideri utilizzare un display.

Mittente Morse

È stato incluso anche un mittente morse. Ciò consente di esercitarsi nell'invio di morse e funziona come segue:

  • Viene generato un tono udibile costante sul pin 4 di Arduino.
  • Sentiamo questo tono tramite l'altoparlante del decoder ogni volta che premiamo il tasto morse.
  • Il tono è impostato sulla stessa frequenza del filtro Goertzel che inganna il decoder facendogli credere di ascoltare un vero morse… qualunque cosa invii apparirà come testo stampato sul display.

Il tuo invio migliorerà poiché il decoder rileva errori comuni come:

  • troppo spazio tra i simboli. (esempio: Q contrassegnato come MA)
  • troppo spazio tra le lettere (esempio: ORA stampato come NO W)
  • codice non corretto

Passaggio 7: riepilogo

decodificatore

Questa istruzione descrive come creare un decodificatore morse che converta il codice morse in testo stampato.

  • Il decoder è in grado di decodificare morse fino ad almeno 80 WPM (parole al minuto)
  • Il decoder tiene traccia automaticamente delle variazioni della velocità di invio ricevuta.
  • Il testo viene visualizzato sul monitor seriale (o su un modulo display TFT 320 x 240 se installato) [1]

Mittente

È stato incluso anche un mittente morse

  • Il mittente ti aiuta a migliorare la qualità del tuo invio morse.
  • Il decoder conferma che quanto inviato è corretto

Costo delle parti

Il costo stimato dello scudo del decodificatore morse, meno il display TFT opzionale, è di $ 25.

Fai clic qui per visualizzare gli altri miei istruttori.

Sfida audio 2020
Sfida audio 2020
Sfida audio 2020
Sfida audio 2020

Secondo Premio nell'Audio Challenge 2020

Consigliato: