Cuprins:

Arborele binar Morse Decoder: 7 pași (cu imagini)
Arborele binar Morse Decoder: 7 pași (cu imagini)

Video: Arborele binar Morse Decoder: 7 pași (cu imagini)

Video: Arborele binar Morse Decoder: 7 pași (cu imagini)
Video: Stațiune de fantezie abandonată cu tematică junglă din Turcia - O poveste de dragoste 2024, Noiembrie
Anonim
Image
Image
Diagrama circuitului
Diagrama circuitului

Acest instructiv explică modul de decodare a codului Morse folosind un Arduino Uno R3.

Decodorul, care se ajustează automat la viteza de trimitere, este capabil să decodeze morse până la cel puțin 80 de cuvinte pe minut.

Codul de intrare este afișat ca text pe Arduino Serial Monitor (sau ecran TFT, dacă este instalat)

Un oscilator de ton a fost inclus în cazul în care doriți să exersați trimiterea de morse.

Caracteristica decodorului:

  • un modul de afișare TFT de 320 x 240 [1]
  • un filtru digital bandpass Goertzel pentru separarea semnalelor nedorite.
  • un „Arbore Morse Binar” pentru decodarea semnalului
  • urmărirea automată a vitezei
  • o ieșire sonoră atunci când practici morse
  • sunt afișate atât textul de intrare, cât și cel de ieșire.

Sunt recunoscute următoarele caractere și simboluri:

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

Costul estimat al scutului de decodare morse, mai puțin afișajul TFT, este de 25 USD. [1]

Imagini

  • Fotografia de copertă prezintă o unitate complet asamblată
  • Videoclipul arată decodorul funcționând

Note

[1]

  • Modulul de afișare TFT este opțional, deoarece tot textul este trimis la „Monitorul Serial” Arduino.
  • Modulul TFT este descris în

Pasul 1: Lista pieselor

Următoarele părți au fost obținute de la

1 singur scut prototip pentru Arduino UNO R3, pitch de 2,54 mm

Următoarele părți au fost obținute local:

  • 1 numai LM358 dual opamp
  • 1 LED doar verde
  • 1 doar clip LED
  • 1 capsulă numai cu microfon electret
  • 1 doar buton deschis normal
  • 1 priză DIP cu 8 pini
  • 2 rezistențe de numai 330 ohmi
  • 2 rezistoare doar 2K2
  • 5 rezistențe doar 10K ohm
  • 2 rezistențe numai 56K ohm
  • 2 doar 1uF condensator
  • 1 condensator de numai 10uF

Următoarele părți sunt opționale:

  • 1 numai modul de afișaj LCD TFT SPI de 2,2 inci 240 * 320 ILI9341 cu slot pentru card SD pentru Arduino Raspberry Pi 51 / AVR / STM32 / ARM / PIC [1]
  • Tasta Morse / butonul
  • 1 doar tranzistor BC548 NPN
  • 1 difuzor de doar 1 inch
  • 1 rezistor de numai 33K ohm
  • 1 numai mufă mono de 3,5 mm (pentru cheie morse)
  • 1 priză mono de 3,5 mm (pentru cheie morse)
  • 3 distanțieri din nailon cu filet M3 de 9 mm
  • 1 doar cutie din plastic ABS 130 x 68 x 44 mm
  • 5 numai conectori cu unghi drept cu 2 pini

Costul estimat al scutului de decodare morse, mai puțin afișajul TFT opțional, este de 25 USD. [1]

Note

[1]

Lista pieselor pentru modulul opțional de afișare TFT 320 x 240 este listată în

[2]

Este necesară o tastă morse sau un buton robust dacă doriți să utilizați expeditorul.

Pasul 2: Diagrama circuitului

Diagrama circuitului
Diagrama circuitului
Diagrama circuitului
Diagrama circuitului
Diagrama circuitului
Diagrama circuitului

Imagini

Fotografia 1 arată schema circuitului pentru decodificatorul morse. Rezistorul de 330 ohmi în serie cu tasta morse limitează curentul de ieșire D4 în cazul unui scurtcircuit accidental la masă … creșterea valorii sale scade ieșirea audio din difuzor. Din acest motiv, nu l-am adăugat la scut, ci l-am atașat direct la mufa cu cheie morse pentru o ușurință de reglare

Fotografia 2 prezintă un scut asortat. Scutul provine de la https://www.instructables.com/id/Arduino-TFT-Grap… instructabil la care am adăugat amplificatorul de microfon și oscilatorul de ton. [1]

Fotografia 3 prezintă scutul complet atașat la un Arduino. Nu sunt necesare alte componente dacă textul trebuie vizualizat pe „Monitorul serial” Arduino

Fotografia 4 arată decodorul parțial în cutie. O gaură a fost tăiată în capac pentru vizualizarea afișajului. Difuzorul și microfonul au fost lipite la cald de carcasă. Găuriți niște orificii ale difuzoarelor în capac înainte de a monta difuzorul. Priza centrală de pe capac este destinată unui microfon prelungitor … fără acesta decodorul trebuie așezat aproape de difuzor, ceea ce nu este întotdeauna posibil

Fotografia 5 arată ecranul TFT. Banda electrică neagră a fost atașată la marginile afișajului … această bandă previne scurgerile de lumină și maschează orice nealiniere între afișaj și deschiderea din capac

Important

[1]

Arduino-urile cu un conector USB mare necesită un strat de bandă electrică între conectorul USB și scutul Arduino. Pantaloni scurți accidentali sunt posibili fără bandă, deoarece jocul este mic. Banda nu este necesară pentru Arduinos care au conectori mici

Pasul 3: Teorie

Teorie
Teorie
Teorie
Teorie
Teorie
Teorie

Fiecare literă de cod morse cuprinde o serie de tonuri de durată scurtă și lungă numite „puncte” și „liniuțe”.

  • un punct (.) are o unitate de lungime
  • o liniuță (_) are o lungime de 3 unități
  • spațiul dintre elementele literelor este de 1 unitate
  • spațiul dintre litere este de 3 unități
  • spațiul dintre cuvinte este de 7 unități

Putem determina dacă tonul de intrare este punct sau o liniuță comparând durata acestuia cu un ton de referință de 2 unități în lungime.

  • un punct este mai mic de 2 unități
  • o liniuță este mai mare de 2 unități

Există două metode distincte pentru decodarea tiparului de puncte și liniuțe:

  • căutare liniară
  • arbore binar (cunoscut și sub numele de căutare dihotomică)

Căutare liniară

O metodă obișnuită este de a crea o serie de caractere și modelele morse potrivite ale acestora. De exemplu, fiecare dintre următoarele caractere ar fi salvat ca:

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

Fiecare literă necesită 6 celule … 1 pentru litera în sine și 5 pentru literele (.) Și (_). Pentru a face acest lucru, avem nevoie de o matrice de caractere [36] [6] cu un total de 216 celule. Celulele neutilizate sunt în mod normal umplute cu un zero sau un gol.

Pentru a decoda punctele și liniuțele primite trebuie să comparăm modelul punct / liniuță al fiecărei litere primite cu modelele noastre de caractere de referință.

În timp ce această metodă funcționează, este extrem de lentă.

Să presupunem că avem 26 de litere („A”,.. „Z”) și cifrele („0”,… „9”) stocate într-o matrice, atunci trebuie să efectuăm 36 de căutări, fiecare cu până la 5 sub-căutări, care este un total de 36 * 5 = 180 de căutări pentru a decoda cifra '9'.

Arborele binar

O căutare binară este mult mai rapidă, deoarece nu sunt necesare căutări.

Spre deosebire de căutarea liniară, care necesită stocarea atât a caracterelor, cât și a modelelor morse, arborele binar stochează numai caracterele, ceea ce înseamnă că dimensiunea matricei este mai mică.

Am împărțit arborele meu binar (foto1) în două jumătăți (fotografiile 2 și 3) pentru a-l face mai ușor de citit.

Pentru a găsi un personaj, mutăm un indicator spre stânga de fiecare dată când auzim un punct și mutăm indicatorul spre dreapta de fiecare dată când auzim o liniuță. După fiecare mișcare înjumătățim distanța indicatorului pentru următoarea mișcare … de aici și numele arborelui binar.

Pentru a decoda litera ‘9’ (liniuță, liniuță, liniuță, liniuță, punct) necesită 5 mișcări … 4 spre dreapta și 1 spre stânga, care lasă indicatorul direct peste ‘9’.

Cinci mișcări sunt semnificativ mai rapide decât 180 de căutări !!!!!

Matricea de caractere binare este de asemenea mai mică … 26 de litere și 10 cifre necesită doar o matrice de 64 x 1 linie. Am ales să creez o matrice de 128 de caractere, astfel încât să pot decoda punctuația.

Pasul 4: Note de proiectare

Note de proiectare
Note de proiectare
Note de proiectare
Note de proiectare
Note de proiectare
Note de proiectare
Note de proiectare
Note de proiectare

Morse este greu de decodat în prezența semnalelor care interferează. Semnalele nedorite trebuie respinse … acest lucru necesită un fel de filtru.

Există multe posibilități:

  1. Bucle blocate în fază
  2. Filtre inductor-condensator
  3. Filtre active rezistor-condensator
  4. Procesarea semnalului digital, cum ar fi Transformarea Fourier rapidă sau filtrul Goertzel.

Metodele 1, 2, 3 necesită componente externe voluminoase.

Metoda 4 nu necesită componente externe … frecvențele sunt detectate folosind algoritmi matematici.

Transformată Fourier rapidă (FFT)

O metodă de detectare a prezenței unui ton într-o formă de undă complexă este utilizarea Transformatei Fourier rapide

Fotografia 1 arată cum FFT (Fast Fourier Transform) împarte spectrul audio în „pubele”.

Fotografia 2 arată cum reacționează „coșurile” FFT la un semnal … în acest caz 800Hz. Dacă ar fi prezent un al doilea semnal de 1500Hz, am vedea două răspunsuri … unul la 800Hz și altul la 1500Hz.

În teorie, un decodificator de cod morse poate fi realizat prin monitorizarea nivelului de ieșire al unui anumit coș de frecvență FFT … un număr mare reprezintă prezența unui punct sau a unei liniuțe … un număr mic nu reprezintă semnal.

Un astfel de decodificator de cod morse ar putea fi realizat prin monitorizarea „coșului 6” din fotografia 2, dar există o serie de lucruri în neregulă cu această abordare:

  • vrem doar un coș de frecvență … restul sunt calcule irosite
  • este posibil ca liniile de frecvență să nu apară exact pe frecvența de interes
  • este relativ lent (20mS pe buclă Arduino ()

O altă metodă este utilizarea unui filtru Goertzel.

Filtru Goertzel

Filtrul Goertzel este similar cu FFT, dar are doar un singur coș de frecvență.

Foto3 arată răspunsul în frecvență al unui filtru Goertzel la pași audio discreți.

Fotografia 4 este o mișcare a aceluiași filtru pe același interval de frecvență.

Am decis să „merg” cu algoritmul Goertzel ca:

  • Timpul de buclă Arduino () utilizând algoritmul Goertzel a fost de 14mS (milisecunde) versus 20mS (milisecunde) pentru o soluție FFT care utilizează biblioteca Arduino „fix_FFT”.
  • Este ușor să setați frecvența centrală a unui filtru de bandă Goertzel.
  • Lățimea de bandă este de aproximativ 190Hz.

Fotografia 5 arată ieșirea numerică dintr-un filtru Goertzel de 900Hz atunci când este detectat un ton. Am setat pragul de ton la o valoare de 4000 … valorile peste 4000 indică un ton.

În teorie, trebuie doar să reglați filtrul la o frecvență de ascultare confortabilă. Din păcate, ieșirea audio de la difuzorul meu de monitorizare de 1 inch scade rapid sub 900Hz. Pentru a evita orice probleme, folosesc o frecvență de filtrare de 950Hz. Formulele necesare pentru calcularea frecvențelor de filtrare alternative se găsesc în antetul codului meu.

Decodare

Decodarea punctelor și a liniuțelor nu este la fel de ușoară pe cât arată prima dată.

Morse perfecte sunt definite ca:

  • punct = 1 unitate
  • spații în interiorul literei = 1 unitate
  • liniuță = 3 unități
  • spațiu între litere = 3 unități
  • spațiu între cuvinte = 7 unități

Pentru a decoda morse perfecte, avem nevoie pur și simplu de o durată de referință a tonului de 2 unități

  • punct <2 unități
  • spațiu element <2 unități
  • liniuță> 2 unități
  • litera _spatiul> 2 unitati
  • spațiu_cuvânt> 6 unități (adică 3 x unități de referință)

Acest lucru funcționează pentru mașina morse, dar în „lumea reală”:

  • viteza de trimitere variază
  • durata fiecărui puncte variază
  • durata fiecărei liniuțe variază
  • literele E, I, S, H, 5 conțin doar puncte care mediază cu durata punctului
  • literele T, M, O, 0 conțin numai liniuțe care mediază cu durata liniuței
  • este posibil ca lacunele dintre cuvinte să nu ajungă
  • decolorarea creează erori din care decodorul trebuie să se recupereze.
  • semnale corupte datorate interferențelor

Scrisorile care conțin doar puncte și liniuțe se rezolvă parțial dacă:

estimăm durata de referință până când am primit un punct valid și o liniuță validă. Folosesc 200 de milisecunde, care este valabil dacă viteza de trimitere este între 6 WPM (cuvinte pe minut) și 17 WPM. Este posibil să trebuiască să măriți această valoare dacă învățați morse. Un software de viteză este inclus în tabel

Variațiile de viteză sunt rezolvate dacă:

  • realizăm o medie rulantă pe fiecare punct și pe fiecare liniuță și
  • recalculați durata de referință după primirea fiecărui simbol

Lacunele de cuvinte și golurile de cuvinte care nu ajung sunt rezolvate dacă:

  • amintiți-vă ora ultimei tranziții de la marginea finală (ton la ton)
  • reporniți algoritmul după fiecare literă,
  • calculați timpul scurs în timp ce așteptați următoarea tranziție de vârf (fără ton la ton) și
  • introduceți un spațiu dacă s-au depășit 6 unități de timp.

Oscilator Morse

Am încercat inițial câteva sonerii Piezo, dar am găsit:

  • frecvența a fost fixată
  • frecvența de ieșire a fost prea mare pentru o ascultare prelungită
  • piezii aveau tendința de a ieși din banda de trecere Goertzel

Am încercat apoi să conduc un traductor acustic cu unda pătrată de 750Hz, dar am constatat că are o rezonanță care a filtrat armonia 1 și 3. Fotografia 6 arată ieșirea amplificatorului microfonului la o undă pătrată de 750Hz … vedem a 5-a armonică !!!

Apoi am recurs la un difuzor mic. Fotografia 7 arată ieșirea microfonului la o undă pătrată de 750Hz care a fost trimisă către un difuzor mic … de data aceasta vedem fundamentalul … nu cea de-a 5-a armonică. Filtrul Goertzel ignoră orice armonică.

Note

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Pasul 5: Software

Software
Software
Software
Software
Software
Software

Instalare

  • Descărcați fișierul atașat MorseCodeDecoder.ino [1]
  • Copiați conținutul acestui fișier într-o nouă schiță Arduino
  • Salvați schița ca „MorseCodeDecoder” (fără ghilimele)
  • Compilați și încărcați schița pe Arduino

Actualizare software 23 iulie 2020

Următoarele caracteristici au fost adăugate la fișierul atașat „MorseCodeDecoder6.ino”

  • o fereastră „Exact Blackman” [2]
  • un „Noise_blanker”

Ajustare:

  • creșteți nivelul audio al receptorului până când LED-ul începe să pâlpâie, apoi să se stingă
  • acum reglați receptorul până când LED-ul clipește în pas cu morse-ul primit
  • Noise_blanker a fost setat să ignore exploziile de zgomot de până la 8mS (o singură buclă)
  • pragul de zgomot poate fi ajustat setând Debug = true și urmărind Serial Plotter

Notă

[1]

Setați Arduino Serial Monitor la 115200 bauds dacă doriți să vizualizați și textul.

[2]

  • Foto 1 … Fereastra exactă Blackman
  • Foto 2 … Filtru Goertzel fără fereastra Exact Blackman
  • Foto 3,,, Filtru Goertzel cu fereastra Exact Blackman aplicată

Pasul 6: Operațiune

Decodor

Așezați unitatea lângă difuzor atunci când ascultați morse.

  • Capsula de microfon electret preia semnalul morse de la difuzor.
  • Ieșirea microfonului electret este apoi amplificată de 647 de ori (56dB) înainte de a fi transmisă la Arduino pentru procesare.
  • Un filtru digital bandpass Goertzel extrage semnalul morse din zgomot.
  • Decodarea se face folosind un arbore binar.
  • Ieșirea decodorului este afișată ca text pe un afișaj TFT de 320 x 240 pixeli. De asemenea, este trimis la „Monitorul serial” Arduino dacă nu doriți să utilizați un afișaj.

Expeditor Morse

De asemenea, a fost inclus un expeditor morse. Acest lucru vă permite să exersați trimiterea morse și funcționează după cum urmează:

  • Un ton audibil constant este generat pe pinul Arduino 4.
  • Auzim acest ton prin intermediul difuzorului decodorului de fiecare dată când apăsăm tasta morse.
  • Tonul este setat la aceeași frecvență ca și filtrul Goertzel, care păcălește decodorul să creadă că ascultă morse reale … orice ai trimite va apărea ca text tipărit pe ecran.

Trimiterea dvs. se va îmbunătăți pe măsură ce decodorul detectează erori frecvente, cum ar fi:

  • prea mult spațiu între simboluri. (exemplu: Q pictat ca MA)
  • prea mult spațiu între litere (exemplu: ACUM tipărit ca NO W)
  • Cod incorect

Pasul 7: Rezumat

Decodor

Această instrucțiune descrie cum se realizează un decodificator morse care convertește codul morse în text tipărit.

  • Decodorul este capabil să decodeze morse până la cel puțin 80 WPM (cuvinte pe minut)
  • Decodorul urmărește automat variațiile în viteza de trimitere primită.
  • Textul este afișat pe monitorul dvs. serial (sau pe un modul de afișare TFT de 320 x 240, dacă este instalat) [1]

Expeditor

De asemenea, a fost inclus un expeditor morse

  • Expeditorul vă ajută să îmbunătățiți calitatea trimiterii dvs. de morse.
  • Decodorul confirmă că ceea ce ați trimis este corect

Costul pieselor

Costul estimat al scutului de decodare morse, mai puțin afișajul TFT opțional, este de 25 USD.

Faceți clic aici pentru a vedea celelalte instructabile ale mele.

Provocarea audio 2020
Provocarea audio 2020
Provocarea audio 2020
Provocarea audio 2020

Premiul II la Audio Challenge 2020

Recomandat: