Cuprins:
- Pasul 1: Lista pieselor
- Pasul 2: Diagrama circuitului
- Pasul 3: Teorie
- Pasul 4: Note de proiectare
- Pasul 5: Software
- Pasul 6: Operațiune
- Pasul 7: Rezumat
Video: Arborele binar Morse Decoder: 7 pași (cu imagini)
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:41
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
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
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
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:
- Bucle blocate în fază
- Filtre inductor-condensator
- Filtre active rezistor-condensator
- 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
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.
Premiul II la Audio Challenge 2020
Recomandat:
Arborele firului RGB-LED: 9 pași (cu imagini)
Arborele firului RGB-LED: vreau să vă împărtășesc arborele firului RGB-LED. Într-o seară mi-am amintit că am construit copaci de sârmă în copilărie. În zilele noastre îmi place foarte mult să construiesc mici proiecte electronice cu microcontrolere similare cu arduino, în special cu LED-uri. Așa că m-am gândit la mine
Arborele spiralat LED: 4 pași (cu imagini)
Arborele spiralat LED: Ador tot felul de benzi LED. Am făcut cu ei o lumină curcubeu drăguță. Chiar și cele care nu sunt adresabile sunt utile. Am făcut o umbrelă strălucitoare de lumină în aer liber, atașându-le de coastele unbrella, așa că, când arborele meu spiralat a suflat, am decis să vă
Arborele RGB LED Maker: 15 pași (cu imagini)
RGB LED Maker Tree: Makerspace-ul nostru local a sponsorizat un copac care să fie afișat pe Main Street pentru luna decembrie (2018). În timpul sesiunii noastre de brainstorming, am venit cu ideea de a pune o cantitate ridicolă de LED-uri pe copac în locul ornamentului tradițional
Arborele de Crăciun Charlieplexing: 7 pași (cu imagini)
Charlieplexing Xmas Tree: Xmas vine și avem nevoie de hardware nou. Hardware-ul Xmas trebuie să fie verde + alb + roșu + intermitent. Deci PCB este verde + alb, apoi adăugați câteva LED-uri intermitente și am terminat. Am o mulțime de „Unghi drept Vedere laterală Roșu Clear Ultra luminos SMD 0806 LED-uri & quo
Arborele de Crăciun LED: 4 pași (cu imagini)
LED Xmas Tree !: Crăciunul nu este același lucru fără un pom de Crăciun; dar fundul locuiesc într-un dormitor, nu am spațiul pentru a pune unul real. De aceea, am decis să-mi fac propriul brad de Crăciun! Am vrut să experimentez cu acrilic edge iluminat pentru o vreme nu