Talaan ng mga Nilalaman:

Binary Tree Morse Decoder: 7 Hakbang (na may Mga Larawan)
Binary Tree Morse Decoder: 7 Hakbang (na may Mga Larawan)

Video: Binary Tree Morse Decoder: 7 Hakbang (na may Mga Larawan)

Video: Binary Tree Morse Decoder: 7 Hakbang (na may Mga Larawan)
Video: CS50 Live, Episode 007 2024, Nobyembre
Anonim
Image
Image
Diagram ng Circuit
Diagram ng Circuit

Ang itinuturo na ito ay nagpapaliwanag kung paano mai-decode ang Morse Code gamit ang isang Arduino Uno R3.

Ang decoder, na awtomatikong inaayos sa bilis ng pagpapadala, ay may kakayahang mag-decode ng morse hanggang sa hindi bababa sa 80 mga salita bawat minuto.

Ang papasok na code ay ipinapakita bilang teksto sa iyong Arduino Serial Monitor (o TFT screen kung nilagyan)

Ang isang tone oscillator ay isinama kung nais mong sanayin ang pagpapadala ng morse.

Nagtatampok ang decoder:

  • isang 320 x 240 TFT module ng pagpapakita [1]
  • isang Goertzel digital bandpass filter para sa paghihiwalay ng mga hindi nais na signal.
  • isang "Binary Morse Tree" para sa pag-decode ng signal
  • awtomatikong pagsubaybay sa bilis
  • isang naririnig na output kapag nagsasanay ng morse
  • kapwa papasok at papalabas na teksto ay ipinapakita.

Ang mga sumusunod na character at simbolo ay kinikilala:

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

Ang tinatayang halaga ng kalasag ng morse decoder, mas mababa sa display na TFT, ay $ 25. [1]

Mga imahe

  • Ipinapakita ng larawan sa pabalat ang isang kumpletong yunit
  • Ipinapakita ng video na gumagana ang decoder

Mga tala

[1]

  • Ang module ng pagpapakita ng TFT ay opsyonal dahil ang lahat ng teksto ay ipinadala sa iyong Arduino na "Serial Monitor".
  • Ang module ng TFT ay inilarawan sa aking itinuturo

Hakbang 1: Listahan ng Mga Bahagi

Ang mga sumusunod na bahagi ay nakuha mula sa

1 prototype lang para sa Arduino UNO R3, 2.54mm Pitch

Ang mga sumusunod na bahagi ay nakuha nang lokal:

  • 1 lamang na LM358 dual opamp
  • 1 lamang ang berde na LED
  • 1 clip lang ng LED
  • 1 lamang ang electret microphone capsule
  • 1 lamang ang normal-bukas na pindutan ng itulak
  • 1 lamang ang 8-pin na socket ng DIP
  • 2 lamang ng 330 ohm resistors
  • 2 resistors lamang ng 2K2
  • 5 lang 10K ohm resistors
  • 2 lang 56K ohm resistors
  • 2 capacitor lamang ng 1uF
  • 1 capacitor lamang ng 10uF

Ang mga sumusunod na bahagi ay opsyonal:

  • 1 lamang 2.2 Inch TFT SPI LCD Display Module 240 * 320 ILI9341 na may SD Card Slot para sa Arduino Raspberry Pi 51 / AVR / STM32 / ARM / PIC [1]
  • Morse key / push-button
  • 1 lamang BC548 NPN transistor
  • 1 pulgada lang ang speaker
  • 1 resistor lamang ng 33K ohm
  • 1 lamang na 3.5mm mono plug (para sa Morse key)
  • 1 lamang na 3.5mm mono socket (para sa Morse key)
  • 3 lamang na 9mm M3 ang nag-tap ng mga naylon spacer
  • 1 lamang 130 x 68 x 44mm ABS plastic box
  • 5 lamang ang 2-pin na konektor ng kanang-anggulo

Ang tinantyang halaga ng kalasag ng morse decoder, mas mababa sa opsyonal na pagpapakita ng TFT, ay $ 25. [1]

Mga tala

[1]

Ang listahan ng mga bahagi para sa opsyonal na 320 x 240 TFT module ng pagpapakita ay nakalista sa aking itinuturo

[2]

Ang isang Morse key o matibay na push-button ay kinakailangan kung nais mong gamitin ang nagpadala.

Hakbang 2: Diagram ng Circuit

Diagram ng Circuit
Diagram ng Circuit
Diagram ng Circuit
Diagram ng Circuit
Diagram ng Circuit
Diagram ng Circuit

Mga imahe

Ipinapakita ang larawan 1 sa circuit diagram para sa decoder ng morse. Ang 330 ohm risistor sa serye na may key ng morse ay naglilimita sa kasalukuyang output ng D4 sa kaganapan ng hindi sinasadyang maikli sa lupa … ang pagtaas ng halaga nito ay bumabawas ng audio output mula sa speaker. Para sa kadahilanang ito hindi ko naidagdag ito sa kalasag ngunit idikit ito nang direkta sa morse-key jack para sa kadalian ng pagsasaayos

Ipinapakita ng Larawan 2 ang isang katugmang kalasag. Ang kalasag ay mula sa aking itinuturo na https://www.instructables.com/id/Arduino-TFT-Grap… kung saan naidagdag ko ang microphone amplifier at tone oscillator. [1]

Ipinapakita sa larawan 3 ang nakumpletong kalasag na nakakabit sa isang Arduino. Walang ibang mga sangkap ang kinakailangan kung ang teksto ay titingnan sa iyong Arduino "Serial Monitor"

Ipinapakita ng larawan 4 ang decoder na bahagyang boxed. Ang isang butas ay pinutol sa talukap ng mata para sa pagtingin sa display. Ang nagsasalita at mikropono ay na-nakadikit sa kaso. Mag-drill ng ilang mga hole-speaker sa talukap ng mata bago i-mount ang speaker. Ang gitnang socket sa talukap ng mata ay para sa isang extension na mikropono … nang wala ito ang decoder ay dapat na mailagay malapit sa speaker na hindi laging posible

Ipinapakita ng Larawan 5 ang TFT screen. Ang itim na elektrikal na tape ay nakakabit sa mga gilid ng display … pinipigilan ng tape na ito ang light leakage at mask para sa anumang hindi pagkakatugma sa pagitan ng display at ng pagbubukas sa talukap ng mata

Mahalaga

[1]

Ang mga Arduino na may isang malaking konektor ng USB ay nangangailangan ng isang layer ng electrical tape sa pagitan ng USB konektor at ng Arduino Shield. Ang mga aksidenteng shorts ay posible nang wala ang tape dahil maliit ang clearance. Hindi kinakailangan ang tape para sa Arduinos na mayroong maliit na konektor

Hakbang 3: Teorya

Teorya
Teorya
Teorya
Teorya
Teorya
Teorya

Ang bawat titik ng morse code ay binubuo ng isang serye ng maikli at mahabang tagal ng mga tono na tinatawag na "tuldok" at "gitling".

  • ang isang tuldok (.) ay 1 yunit ang haba
  • ang isang dash (_) ay 3 unit ang haba
  • ang puwang sa pagitan ng mga elemento ng letra ay 1 yunit
  • ang puwang sa pagitan ng mga titik ay 3 unit
  • ang puwang sa pagitan ng mga salita ay 7 mga yunit

Maaari naming matukoy kung ang papasok na tono ay tuldok o isang dash sa pamamagitan ng paghahambing ng tagal nito sa isang sangguniang tono ng 2 yunit ang haba.

  • ang isang tuldok ay mas mababa sa 2 mga yunit
  • ang isang dash ay mas malaki sa 2 mga yunit

Mayroong dalawang malinaw na magkakaibang pamamaraan para sa pag-decode ng papasok na pattern ng mga tuldok at gitling:

  • linear na paghahanap
  • binary tree (kilala rin bilang isang dichotomic search)

Paghahanap sa Linear

Ang isang karaniwang pamamaraan ay upang lumikha ng isang hanay ng mga character at ang kanilang pagtutugma ng mga pattern ng morse. Halimbawa ang bawat isa sa mga sumusunod na character ay mai-save bilang:

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

Ang bawat titik ay nangangailangan ng 6 na mga cell … 1 para sa letra mismo at 5 para sa mga (.) At (_)’s. Upang magawa ito kailangan namin ng isang letra na [36] [6] character array na may kabuuang 216 cells. Ang mga hindi ginagamit na cell ay karaniwang puno ng isang zero o isang blangko.

Upang mai-decode ang mga papasok na tuldok at gitling dapat naming ihambing ang dot / dash pattern ng bawat papasok na titik sa aming mga pattern ng character na sanggunian.

Habang gumagana ang pamamaraang ito, napakabagal nito.

Sabihin na mayroon kaming 26 titik ('A',.. 'Z') at mga digit ('0', … '9') na nakaimbak sa isang array, pagkatapos ay dapat kaming magsagawa ng 36 na paghahanap, bawat isa ay may hanggang sa 5 sub-search, na kung saan ay isang kabuuang 36 * 5 = 180 mga paghahanap upang ma-decode ang numerong '9'.

Punong Binary

Ang isang binary na paghahanap ay mas mabilis dahil walang mga paghahanap ang kinakailangan.

Hindi tulad ng linear na paghahanap, na nangangailangan ng parehong character at mga pattern ng morse na maiimbak, ang binary tree ay nag-iimbak lamang ng mga character na nangangahulugang ang laki ng array ay mas maliit.

Hinati ko ang aking binary tree (photo1) sa dalawang halves (larawan 2 at 3) upang mas mabasa ito.

Upang makahanap ng isang character na inililipat namin ang isang pointer pakaliwa sa tuwing nakakakarinig tayo ng isang tuldok at ilipat ang tama ang pointer tuwing nakakakarinig tayo ng isang dash. Pagkatapos ng bawat paglipat ay hinahati namin ang distansya ng pointer para sa susunod na paglipat … kaya't ang pangalan na puno ng binary.

Upang mai-decode ang titik na '9' (dash, dash, dash, dash, dot) ay nangangailangan ng 5 galaw … 4 sa kanan, at 1 sa kaliwa na umalis nang direkta sa pointer sa '9'.

Limang galaw ay makabuluhang mas mabilis kaysa sa 180 paghahanap !!!!!

Ang binary character array ay mas maliit din … 26 mga titik at 10 mga numero ay nangangailangan lamang ng isang 64 x 1 linya na array. Pinili kong lumikha ng isang 128 character array upang makapag-decode ako ng bantas.

Hakbang 4: Mga Tala ng Disenyo

Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo
Mga Tala ng Disenyo

Mahirap basahin ang Morse sa pagkakaroon ng mga nakakagambalang signal. Ang mga hindi ginustong signal ay dapat na tanggihan … nangangailangan ito ng ilang uri ng filter.

Maraming mga posibilidad:

  1. Mga loop na naka-lock ng phase
  2. Mga filter ng inductor-capacitor
  3. Mga aktibong filter ng resistor-capacitor
  4. Pagproseso ng digital signal tulad ng Fast Fourier Transform, o ang filter ng Goertzel.

Ang mga pamamaraan na 1, 2, 3 ay nangangailangan ng panlabas na mga sangkap na malaki

Ang pamamaraan 4 ay hindi nangangailangan ng mga panlabas na bahagi … ang mga frequency ay napansin gamit ang mga matematika algorithm.

Mabilis na Fourier Transform (FFT)

Ang isang paraan ng pagtuklas ng pagkakaroon ng isang tono sa isang kumplikadong form ng alon ay ang paggamit ng Mabilis na Fourier Transform

Ipinapakita ng Larawan 1 kung paano hinahati ng FFT (Fast Fourier Transform) ang audio spectrum sa "mga bin".

Ipinapakita ng Larawan 2 kung paano tumugon ang FFT "mga bin" sa isang senyas … sa kasong ito 800Hz. Kung ang isang pangalawang senyas ng pagsabing 1500Hz ay naroroon makikita namin ang dalawang tugon … isa sa 800Hz at isa pa sa 1500Hz.

Sa teorya ang isang decode ng morse code ay maaaring gawin sa pamamagitan ng pagsubaybay sa antas ng output ng isang partikular na FFT frequency bin… isang malaking bilang ang kumakatawan sa pagkakaroon ng isang tuldok o dash … isang maliit na bilang ay kumakatawan sa walang signal.

Ang nasabing isang decode ng morse code ay maaaring gawin sa pamamagitan ng pagsubaybay sa "bin 6" sa larawan 2 ngunit maraming mga bagay na mali sa pamamaraang ito:

  • nais lamang namin ang isang dalas ng dalas … ang natitira ay nasayang na mga kalkulasyon
  • ang mga dalas ng dalas ay maaaring hindi lumitaw nang eksakto sa dalas ng interes
  • medyo mabagal ito (20mS bawat Arduino loop ()

Ang isa pang pamamaraan ay ang paggamit ng isang filter ng Goertzel.

Filter ng Goertzel

Ang Goertzel filter ay katulad ng FFT ngunit mayroon lamang isang solong dalas ng basurahan.

Ipinapakita ng Photo3 ang tugon sa dalas ng isang filter ng Goertzel sa discrete na mga hakbang sa audio.

Ang Larawan 4 ay isang walis ng parehong filter sa parehong saklaw ng dalas.

Nagpasya akong "pumunta" kasama ang Goertzel algorithm bilang:

  • Ang Arduino loop () na oras gamit ang Goertzel algorithm ay 14mS (milliseconds) kumpara sa 20mS (milliseconds) para sa isang FFT solution gamit ang Arduino "fix_FFT" library.
  • Madaling itakda ang dalas ng gitna ng isang Goertzel bandpass filter.
  • Ang bandwidth ay humigit-kumulang na 190Hz.

Ipinapakita ng Larawan 5 ang output na bilang mula sa isang 900Hz Goertzel filter kapag nakita ang isang tono. Itinakda ko ang aking tono threshold sa halagang 4000… ang mga halagang higit sa 4000 ay nagpapahiwatig ng isang tono.

Sa teorya kakailanganin mo lamang na ibagay ang iyong filter sa isang komportableng dalas ng pakikinig. Sa kasamaang palad ang audio output mula sa aking 1 inch monitoring speaker ay mabilis na bumaba sa ibaba 900Hz. Upang maiwasan ang anumang mga isyu gumagamit ako ng isang dalas ng filter na 950Hz. Ang mga kinakailangang pormula para sa pagkalkula ng mga kahaliling frequency ng filter ay matatagpuan sa aking header ng code.

Pag-decode

Ang pag-decode ng mga tuldok at gitling ay hindi kasing dali ng unang hitsura nito.

Ang perpektong morse ay tinukoy bilang:

  • tuldok = 1 yunit
  • mga puwang sa loob ng letra = 1 yunit
  • dash = 3 mga yunit
  • puwang sa pagitan ng mga letra = 3 mga yunit
  • puwang sa pagitan ng mga salita = 7 mga yunit

Upang mai-decode ang perpektong morse kailangan lang namin ng isang tagal ng sangguniang tono ng 2 mga yunit

  • tuldok <2 na mga yunit
  • elemento ng puwang <2 yunit
  • dash> 2 unit
  • titik _space> 2 unit
  • word_space> 6 na mga yunit (ie 3 x mga sanggunian na yunit)

Gumagana ito para sa machine morse ngunit sa "totoong mundo":

  • nag-iiba ang bilis ng pagpapadala
  • ang tagal ng bawat tuldok ay magkakaiba
  • ang tagal ng bawat dash ay magkakaiba
  • ang mga letrang E, I, S, H, 5 ay naglalaman lamang ng mga tuldok na average sa tagal ng tuldok
  • ang mga titik na T, M, O, 0 ay naglalaman lamang ng mga gitling na average sa tagal ng dash
  • salitang may mga puwang ay maaaring hindi dumating
  • lumilikha ang pagkupas ng mga error kung saan dapat mabawi ang decoder.
  • sira signal dahil sa panghihimasok

Ang mga titik na naglalaman lamang ng mga tuldok at gitling ay bahagyang nalulutas kung:

tantyahin namin ang tagal ng sanggunian hanggang sa makatanggap kami ng wastong tuldok at isang wastong dash. Gumagamit ako ng 200 milliseconds na wasto kung ang bilis ng pagpapadala ay nasa pagitan ng 6 WPM (mga salita bawat minuto) at 17 WPM. Maaaring kailanganin mong taasan ang halagang ito kung natututo ka ng morse. Ang isang talahanayan ng bilis ay kasama sa software

Malulutas ang mga pagkakaiba-iba ng bilis kung:

  • nagsasagawa kami ng rolling average sa bawat tuldok at bawat dash at
  • muling kalkulahin ang tagal ng sanggunian matapos matanggap ang bawat simbolo

Malulutas ang mga puwang sa salita at puwang ng salita kung tayo ay:

  • alalahanin ang oras ng huling trailing-edge (tone to no-tone) paglipat,
  • i-restart ang algorithm pagkatapos ng bawat titik,
  • kalkulahin ang lumipas na oras habang naghihintay para sa susunod na nangungunang gilid (walang tono sa tono) na paglipat at
  • maglagay ng puwang kung ang 6 na yunit ng oras ay lumampas.

Morse Oscillator

Sa una ay sinubukan ko ang ilang mga Piezo buzzer ngunit natagpuan:

  • ang dalas ay naayos
  • ang dalas ng output ay masyadong mataas para sa matagal na pakikinig
  • ang mga piezos ay may kaugaliang naaanod palabas ng Goertzel passband

Sinubukan ko pagkatapos ang pagmamaneho ng isang acoustic transducer na may 750Hz squarewave ngunit natagpuan na mayroon itong isang resonance na sinala ang ika-1 at ika-3 na harmonika. Ipinapakita ng Larawan 6 ang output ng microphone amplifier sa isang 750Hz square-wave … nakikita namin ang ika-5 maharmonya !!!

Gumawa ako pagkatapos ng paggamit ng isang maliit na speaker. Ipinapakita ng Larawan 7 ang output ng mikropono sa isang 750Hz squarewave na ipinadala sa isang maliit na nagsasalita … sa oras na ito nakikita na natin ang pangunahing… hindi ang ika-5 magkatugma. Hindi pinapansin ng filter na Goertzel ang anumang mga harmonika.

Mga tala

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Hakbang 5: Software

Software
Software
Software
Software
Software
Software

Pag-install

  • I-download ang nakalakip na file na MorseCodeDecoder.ino [1]
  • Kopyahin ang mga nilalaman ng file na ito sa isang bagong Arduino sketch
  • I-save ang sketch bilang "MorseCodeDecoder" (nang walang mga quote)
  • Compile at i-upload ang sketch sa iyong Arduino

Pag-update ng Software noong Hulyo 23, 2020

Ang mga sumusunod na tampok ay naidagdag sa naka-attach na file na "MorseCodeDecoder6.ino"

  • isang window na "Exact Blackman" [2]
  • isang "Noise_blanker"

Pagsasaayos:

  • taasan ang antas ng audio ng iyong receiver hanggang sa magsimulang mag-flicker ang LED pagkatapos ay mag-back off
  • ibagay ngayon ang iyong tatanggap hanggang sa ang LED flashes sa hakbang sa papasok na morse
  • ang Noise_blanker ay naitakda upang huwag pansinin ang pagsabog ng ingay hanggang sa 8mS (isang loop time)
  • maaaring maiayos ang threshold ng Ingay sa pamamagitan ng pagtatakda ng Debug = totoo at panonood ng iyong Serial Plotter

Tandaan

[1]

Itakda ang iyong Arduino Serial Monitor sa 115200 bauds kung nais mo ring tingnan ang teksto.

[2]

  • Larawan 1… Eksakto sa bintana ng Blackman
  • Larawan 2… Goertzel filter nang walang Eksak na bintana ng Blackman
  • Larawan 3,,, Goertzel filter na may inilapat na Exact Blackman window

Hakbang 6: Pagpapatakbo

Decoder

Ilagay ang unit sa tabi ng iyong tagapagsalita kapag nakikinig sa morse.

  • Kinukuha ng electret microphone capsule ang morse signal mula sa iyong speaker.
  • Ang output ng electret microphone ay pagkatapos ay pinalakas ng 647 beses (56dB) bago ipasa sa Arduino para sa pagproseso.
  • Ang isang Goertzel digital bandpass filter ay kumukuha ng signal ng morse mula sa ingay.
  • Ang pag-decode ay ginagawa gamit ang isang puno ng binary.
  • Ang output ng decoder ay ipinapakita bilang teksto sa isang 320 x 240 pixel na TFT display. Ipinadala din ito sa iyong Arduino na "Serial Monitor" kung hindi mo nais na gumamit ng isang display.

Morse Sender

Ang isang nagpadala ng morse ay isinama din. Pinapayagan ka nitong magsanay sa pagpapadala ng morse at gumagana tulad ng sumusunod:

  • Ang isang pare-pareho na naririnig na tono ay nabuo sa Arduino pin 4.
  • Naririnig namin ang tono na ito sa pamamagitan ng malakas na speaker ng decoder tuwing pinindot namin ang morse-key.
  • Ang tono ay nakatakda sa parehong dalas ng filter ng Goertzel na niloloko ang decoder sa pag-iisip ng pakikinig nito sa totoong morse … anuman ang ipadala mo ay lilitaw bilang naka-print na teksto sa display.

Mapapabuti ang iyong pagpapadala habang nakakakuha ang decoder ng mga karaniwang error tulad ng:

  • masyadong maraming puwang sa pagitan ng mga simbolo. (halimbawa: Q na pin bilang MA)
  • masyadong maraming puwang sa pagitan ng mga titik (halimbawa: NGAYON naka-print bilang WALANG W)
  • maling code

Hakbang 7: Buod

Decoder

Ang itinuturo na ito ay naglalarawan kung paano gumawa ng isang decoder ng morse na nag-convert ng morse code sa naka-print na teksto.

  • Ang decoder ay may kakayahang mag-decode ng morse hanggang sa halos 80 WPM (mga salita bawat minuto)
  • Awtomatikong sinusubaybayan ng decoder ang mga pagkakaiba-iba sa natanggap na bilis ng pagpapadala.
  • Ang teksto ay ipinapakita sa iyong Serial Monitor (o sa isang 320 x 240 TFT display module kung nilagyan) [1]

Nagpapadala

Ang isang nagpadala ng morse ay isinama din

  • Tinutulungan ka ng nagpadala na mapabuti ang kalidad ng iyong pagpapadala ng morse.
  • Kinukumpirma ng decoder na tama ang iyong ipinadala

Gastos ng mga piyesa

Ang tinantyang halaga ng kalasag ng morse decoder, mas mababa sa opsyonal na pagpapakita ng TFT, ay $ 25.

Mag-click dito upang matingnan ang aking iba pang mga itinuturo.

Paghamon sa Audio 2020
Paghamon sa Audio 2020
Paghamon sa Audio 2020
Paghamon sa Audio 2020

Pangalawang Gantimpala sa Audio Hamon 2020

Inirerekumendang: