Sisällysluettelo:

Binaarinen puumorse -dekooderi: 7 vaihetta (kuvilla)
Binaarinen puumorse -dekooderi: 7 vaihetta (kuvilla)

Video: Binaarinen puumorse -dekooderi: 7 vaihetta (kuvilla)

Video: Binaarinen puumorse -dekooderi: 7 vaihetta (kuvilla)
Video: All Gay Series in 2023 and Where You Can Watch 2024, Marraskuu
Anonim
Image
Image
Piirikaavio
Piirikaavio

Tässä ohjeessa selitetään, kuinka Morse -koodi puretaan Arduino Uno R3: lla.

Dekooderi, joka mukautuu automaattisesti lähetysnopeuteen, kykenee dekoodaamaan morseen vähintään 80 sanaa minuutissa.

Saapuva koodi näkyy tekstinä Arduino -sarjamonitorissa (tai TFT -näytössä, jos sellainen on)

Mukana on äänioskillaattori, jos haluat harjoitella morsen lähettämistä.

Dekooderin ominaisuudet:

  • 320 x 240 TFT -näyttömoduuli [1]
  • Goertzelin digitaalinen kaistanpäästösuodatin ei -toivottujen signaalien erottamiseen.
  • "Binaarinen Morse Tree" signaalin dekoodaamiseksi
  • automaattinen nopeuden seuranta
  • äänimerkki, kun harjoitellaan morse
  • sekä saapuva että lähtevä teksti näytetään.

Seuraavat merkit ja symbolit tunnistetaan:

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

Morse -dekooderin kilven arvioitu hinta, vähennettynä TFT -näytöllä, on 25 dollaria. [1]

Kuvat

  • Kansikuvassa näkyy täysin koottu yksikkö
  • Videolla näkyy dekooderi

Huomautuksia

[1]

  • TFT -näyttömoduuli on valinnainen, koska kaikki teksti lähetetään Arduino -sarjanäyttöön.
  • TFT-moduuli on kuvattu ohjeessa

Vaihe 1: Osaluettelo

Seuraavat osat on hankittu osoitteesta

Vain yksi prototyyppisuojus Arduino UNO R3: lle, 2,54 mm: n piki

Seuraavat osat on hankittu paikallisesti:

  • 1 vain LM358 dual opamp
  • 1 vain vihreä LED
  • 1 vain LED -pidike
  • 1 vain elektreettimikrofonikapseli
  • 1 vain normaalisti auki oleva painike
  • 1 vain 8-nastainen DIP-liitäntä
  • 2 vain 330 ohmin vastukset
  • 2 vain 2K2 vastukset
  • 5 vain 10K ohmin vastukset
  • 2 vain 56K ohmin vastukset
  • 2 vain 1uF kondensaattori
  • 1 vain 10uF kondensaattori

Seuraavat osat ovat valinnaisia:

  • Vain 1 2,2 tuuman TFT SPI LCD -näyttömoduuli 240*320 ILI9341 SD -korttipaikalla Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC -laitteelle [1]
  • Morse-avain / painike
  • 1 vain BC548 NPN -transistori
  • 1 vain 1 tuuman kaiutin
  • 1 vain 33K ohmin vastus
  • 1 vain 3,5 mm: n monopistoke (morse -avaimelle)
  • 1 vain 3,5 mm: n monopistorasia (morse -avaimelle)
  • 3 vain 9 mm: n M3 -kierteiset nylonvälikkeet
  • 1 vain 130 x 68 x 44 mm ABS -muovilaatikko
  • 5 vain 2-nastaista kulmaliitintä

Morse -dekooderin kilven arvioitu hinta ilman lisävarusteena saatavaa TFT -näyttöä on 25 dollaria. [1]

Huomautuksia

[1]

Valinnaisen 320 x 240 TFT -näyttömoduulin osaluettelo on luettavissa ohjeessa

[2]

Morse-avain tai tukeva painike vaaditaan, jos haluat käyttää lähetintä.

Vaihe 2: Piirikaavio

Piirikaavio
Piirikaavio
Piirikaavio
Piirikaavio
Piirikaavio
Piirikaavio

Kuvat

Kuva 1 näyttää morse -dekooderin kytkentäkaavion. Sarjassa oleva 330 ohmin vastus, jossa on morse -avain, rajoittaa D4 -lähtövirtaa vahingossa tapahtuvan maadoitusvian sattuessa… sen arvon lisääminen pienentää kaiuttimen äänilähtöä. Tästä syystä en ole lisännyt sitä suojaan, vaan kiinnittänyt sen suoraan morse-avaimen liitäntään säätämisen helpottamiseksi

Kuva 2 esittää vastaavan kilven. Kilpi on ohjeistamastani https://www.instructables.com/id/Arduino-TFT-Grap… johon olen lisännyt mikrofonivahvistimen ja sävyoskillaattorin. [1]

Kuva 3 esittää Arduinoon kiinnitetyn valmiin kilven. Muita komponentteja ei tarvita, jos tekstiä halutaan katsella Arduino -sarjamonitorissa

Kuva 4 esittää dekooderin osittain laatikossa. Kannessa on reikä näytön katselua varten. Kaiutin ja mikrofoni on liimattu kuoreen. Poraa kanteen kaiutinreiät ennen kaiuttimen asentamista. Kannen keskipistoke on jatko -mikrofonille… ilman tätä dekooderi on sijoitettava kaiuttimen lähelle, mikä ei aina ole mahdollista

Kuva 5 näyttää TFT -näytön. Näytön reunoihin on kiinnitetty musta sähköteippi… tämä teippi estää valovuotoja ja peittää kaikki vääristymät näytön ja kannen aukon välillä

Tärkeä

[1]

Arduinot, joissa on suuri USB -liitin, vaativat kerros sähköteippiä USB -liittimen ja Arduino -suojan väliin. Tahattomat shortsit ovat mahdollisia ilman teippiä, koska välys on pieni. Nauhaa ei tarvita Arduinolle, jossa on pienet liittimet

Vaihe 3: Teoria

Teoria
Teoria
Teoria
Teoria
Teoria
Teoria

Jokainen morsekoodikirjain sisältää sarjan lyhyitä ja pitkiä ääniä, joita kutsutaan pisteiksi ja viivoiksi.

  • piste (.) on 1 yksikön pituinen
  • viiva (_) on 3 yksikköä pitkä
  • kirjainelementtien välinen tila on 1 yksikkö
  • kirjainten välinen tila on 3 yksikköä
  • sanojen väli on 7 yksikköä

Voimme määrittää, onko saapuva ääni piste vai viiva, vertaamalla sen kestoa kahden yksikön pituiseen viiteääniin.

  • piste on alle 2 yksikköä
  • viiva on suurempi kuin 2 yksikköä

Pisteiden ja viivojen saapuvan kuvion dekoodaamiseen on kaksi selvästi erilaista menetelmää:

  • lineaarinen haku
  • binaaripuu (tunnetaan myös nimellä dichotomic search)

Lineaarinen haku

Yksi yleinen tapa on luoda joukko merkkejä ja niitä vastaavia morse -kuvioita. Esimerkiksi jokainen seuraavista merkeistä tallennetaan muodossa:

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

Jokainen kirjain vaatii kuusi solua… 1 itse kirjaimelle ja 5 (.): Lle ja (_): lle. Tätä varten tarvitsemme kirjainten [36] [6] merkkijonon, jossa on yhteensä 216 solua. Käyttämättömät solut täytetään yleensä nollalla tai tyhjällä.

Saapuvien pisteiden ja väliviivojen purkamiseksi meidän on vertailtava jokaisen saapuvan kirjaimen piste/viiva -kuviota viitemerkkikuvioihimme.

Vaikka tämä menetelmä toimii, se on erittäin hidas.

Oletetaan, että taulukkoon on tallennettu 26 kirjainta ("A", "Z") ja numerot ("0", … "9"), sitten meidän on suoritettava 36 hakua, joista jokaisella on enintään 5 alihakua, joka on yhteensä 36*5 = 180 hakua dekoodata numero '9'.

Binaarinen puu

Binaarihaku on paljon nopeampi, koska hakuja ei tarvita.

Toisin kuin lineaarinen haku, joka edellyttää sekä merkkien että morsekuvioiden tallentamista, binääripuu tallentaa vain merkit, mikä tarkoittaa, että taulukon koko on pienempi.

Olen jakanut binääripuuni (kuva1) kahteen osaan (valokuvat 2 ja 3) luettavuuden parantamiseksi.

Hahmon löytämiseksi siirrämme osoitinta vasemmalle aina, kun kuulemme pisteen, ja siirrämme osoitinta oikealle aina, kun kuulemme viivan. Jokaisen liikkeen jälkeen puolitamme osoittimen etäisyyden seuraavaan siirtoon… tästä syystä nimi binaarinen puu.

Kirjaimen”9” (viiva, viiva, viiva, viiva, piste) purkaminen vaatii 5 liikettä… 4 oikealle ja 1 vasemmalle, mikä jättää osoittimen suoraan”9”: n yli.

Viisi liikettä on huomattavasti nopeampi kuin 180 hakua !!!!!

Binaarinen merkkijono on myös pienempi… 26 kirjainta ja 10 numeroa vaatii vain 64 x 1 rivin. Olen päättänyt luoda 128 merkkijonon, jotta voin purkaa välimerkit.

Vaihe 4: Huomautuksia suunnittelusta

Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia
Suunnittelu Huomautuksia

Morse on vaikea purkaa häiriösignaalien läsnä ollessa. Ei -toivotut signaalit on hylättävä … tämä vaatii jonkinlaisen suodattimen.

Mahdollisuuksia on monia:

  1. Vaihelukitut silmukat
  2. Induktori-kondensaattorin suodattimet
  3. Vastus-kondensaattorin aktiiviset suodattimet
  4. Digitaalinen signaalinkäsittely, kuten Fast Fourier Transform tai Goertzel -suodatin.

Menetelmät 1, 2, 3 edellyttävät ulkoisia komponentteja, jotka ovat suuria.

Menetelmä 4 ei vaadi ulkoisia komponentteja… taajuudet havaitaan matemaattisilla algoritmeilla.

Nopea Fourier -muunnos (FFT)

Yksi tapa havaita sävyn läsnäolo monimutkaisessa aaltomuodossa on käyttää Fast Fourier -muunnosta

Kuva 1 osoittaa, kuinka FFT (Fast Fourier Transform) jakaa äänispektrin "säiliöiksi".

Kuva 2 osoittaa, kuinka FFT -lokit reagoivat signaaliin… tässä tapauksessa 800 Hz. Jos toinen signaali, esimerkiksi 1500 Hz, olisi läsnä, näkisimme kaksi vastausta… yhden 800 Hz: n ja toisen 1500 Hz: n taajuudella.

Teoriassa morse -koodin dekooderi voidaan tehdä seuraamalla tietyn FFT -taajuusalueen lähtötasoa … suuri luku edustaa pisteen tai viivan olemassaoloa … pieni luku ei ole signaalia.

Tällainen morse -koodin dekooderi voitaisiin tehdä seuraamalla kuvassa 2 olevaa bin 6: ta, mutta tässä lähestymistavassa on useita asioita:

  • haluamme vain yhden taajuusalueen … loput ovat hukkaan laskettuja laskelmia
  • taajuusastiat eivät välttämättä näy täsmälleen haluamallasi taajuudella
  • se on suhteellisen hidas (20 mS per Arduino -silmukka ()

Toinen tapa on käyttää Goertzel -suodatinta.

Goertzel -suodatin

Goertzel -suodatin on samanlainen kuin FFT, mutta siinä on vain yksi taajuusastia.

Kuva 3 esittää Goertzel -suodattimen taajuusvasteen erillisiin äänivaiheisiin.

Kuva 4 on saman suodattimen pyyhkäisy samalla taajuusalueella.

Päätin "mennä" Goertzel -algoritmilla seuraavasti:

  • Arduino -silmukan () aika Goertzel -algoritmin avulla oli 14 mS (millisekuntia) verrattuna 20 mS: ään (millisekuntia) FFT -ratkaisulle käyttäen Arduino “fix_FFT” -kirjastoa.
  • Goertzel -kaistanpäästösuodattimen keskitaajuus on helppo asettaa.
  • Kaistanleveys on noin 190 Hz.

Kuva 5 näyttää 900 Hz: n Goertzel -suodattimen numeerisen lähdön, kun ääni havaitaan. Olen asettanut äänikynnyksen arvoksi 4000… arvot yli 4000 osoittavat äänen.

Teoriassa sinun tarvitsee vain virittää suodatin mukavaan kuuntelutaajuuteen. Valitettavasti 1 tuuman valvontakaiuttimeni äänilähtö putoaa nopeasti alle 900 Hz: n. Ongelmien välttämiseksi käytän suodatintaajuutta 950 Hz. Tarvittavat kaavat vaihtoehtoisten suodattimen taajuuksien laskemiseksi löytyvät koodini otsikosta.

Dekoodaus

Pisteiden ja viivojen dekoodaus ei ole niin helppoa kuin miltä se näyttää.

Täydellinen morse määritellään seuraavasti:

  • piste = 1 yksikkö
  • välilyöntejä kirjaimen sisällä = 1 yksikkö
  • viiva = 3 yksikköä
  • kirjainten välinen väli = 3 yksikköä
  • sanojen väli = 7 yksikköä

Täydellisen morsen dekoodaamiseksi tarvitsemme yksinkertaisesti 2 yksikön viiteäänen keston

  • piste <2 yksikköä
  • elementtitila <2 yksikköä
  • viiva> 2 yksikköä
  • kirjain _avaruutta> 2 yksikköä
  • word_space> 6 yksikköä (eli 3 x viiteyksikköä)

Tämä toimii konemorselle, mutta "todellisessa maailmassa":

  • lähetysnopeus vaihtelee
  • kunkin pisteen kesto vaihtelee
  • jokaisen viivan kesto vaihtelee
  • kirjaimet E, I, S, H, 5 sisältävät vain pisteitä, joiden keskimääräinen kesto on piste
  • kirjaimet T, M, O, 0 sisältävät vain viivoja, joiden keskimääräinen pituus on viiva
  • sanavarat eivät ehkä tule
  • häipyminen luo virheitä, joista dekooderin on palaututtava.
  • vioittuneet signaalit häiriöiden vuoksi

Vain pisteitä ja viivoja sisältävät kirjaimet ratkaistaan osittain, jos:

Arvioimme viiteajan, kunnes olemme saaneet kelvollisen pisteen ja kelvollisen viivan. Käytän 200 millisekuntia, mikä on voimassa, jos lähetysnopeus on 6 WPM (sanaa minuutissa) - 17 WPM. Saatat joutua lisäämään tätä arvoa, jos opit morse. Ohjelmisto sisältää nopeustaulukon

Nopeuden vaihtelut ratkaistaan, jos:

  • teemme liukuvan keskiarvon jokaiselle pisteelle ja jokaiselle viivalle ja
  • laske viiteaika uudelleen jokaisen symbolin vastaanottamisen jälkeen

Sanavarat ja sanat, jotka eivät tule, ratkaistaan, jos:

  • muistaa viimeisen reunan (äänestä ei sävyyn) siirtymisen ajan,
  • käynnistä algoritmi uudelleen jokaisen kirjaimen jälkeen,
  • laske kulunut aika odottaessa seuraavaa etureunan (ei sävystä sävyyn) siirtymistä ja
  • lisää välilyönti, jos 6 aikayksikköä on ylitetty.

Morse -oskillaattori

Kokeilin aluksi Piezo -summeria, mutta löysin:

  • taajuus oli kiinteä
  • lähtötaajuus oli liian korkea pitkäaikaiseen kuunteluun
  • piezoilla oli taipumus ajautua ulos Goertzelin passbandista

Yritin sitten ajaa akustista kaikuanturia 750 Hz: n neliöaallolla, mutta huomasin, että sillä oli resonanssi, joka suodatti ensimmäisen ja kolmannen yliaallon. Kuva 6 näyttää mikrofonivahvistimen lähdön 750 Hz: n neliöaallolle … näemme viidennen harmonisen !!!

Käytin sitten pienen kaiuttimen käyttöä. Valokuva 7 näyttää mikrofonin ulostulon 750 Hz: n neliöaallolle, joka lähetettiin pienelle kaiuttimelle … tällä kertaa näemme perustavanlaatuisen … ei viidennen harmonisen. Goertzel -suodatin jättää yliaallot huomiotta.

Huomautuksia

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Vaihe 5: Ohjelmisto

Ohjelmisto
Ohjelmisto
Ohjelmisto
Ohjelmisto
Ohjelmisto
Ohjelmisto

Asennus

  • Lataa liitteenä oleva tiedosto MorseCodeDecoder.ino [1]
  • Kopioi tämän tiedoston sisältö uuteen Arduino -luonnokseen
  • Tallenna luonnos nimellä "MorseCodeDecoder" (ilman lainausmerkkejä)
  • Kokoa ja lähetä luonnos Arduinoosi

Ohjelmistopäivitys 23.7.2020

Seuraavat ominaisuudet on lisätty liitteenä olevaan tiedostoon "MorseCodeDecoder6.ino"

  • "Tarkka Blackman" -ikkuna [2]
  • "melun tyhjentäjä"

Säätö:

  • lisää vastaanottimen äänitasoa, kunnes merkkivalo alkaa vilkkua ja sammuu sitten
  • viritä nyt vastaanotinta, kunnes LED -valo vilkkuu saapuvan morsen kanssa
  • Noise_blanker on asetettu jättämään huomiotta jopa 8 mS (yksi silmukka)
  • Kohinakynnystä voidaan säätää asettamalla Debug = true ja katsomalla sarjaplotteriasi

Huomautus

[1]

Aseta Arduino -sarjamonitori 115200 baudiin, jos haluat myös katsoa tekstiä.

[2]

  • Kuva 1… Tarkka Blackman -ikkuna
  • Kuva 2… Goertzel -suodatin ilman tarkkaa Blackman -ikkunaa
  • Kuva 3,,, Goertzel -suodatin ja tarkka Blackman -ikkuna käytössä

Vaihe 6: Käyttö

Dekooderi

Aseta laite kaiuttimen viereen, kun kuuntelet morse -ääntä.

  • Elektreettimikrofonikapseli ottaa kaiuttimesi morse -signaalin.
  • Elektreettimikrofonin lähtö vahvistetaan sitten 647 kertaa (56 dB) ennen kuin se siirretään Arduinolle käsiteltäväksi.
  • Goertzelin digitaalinen kaistanpäästösuodatin erottaa morsesignaalin kohinasta.
  • Dekoodaus tehdään binääripuulla.
  • Dekooderin ulostulo näkyy tekstinä 320 x 240 pikselin TFT -näytössä. Se lähetetään myös Arduino -sarjamonitoriin, jos et halua käyttää näyttöä.

Morse Lähettäjä

Mukana on myös morse -lähettäjä. Tämän avulla voit harjoitella morsen lähettämistä ja toimii seuraavasti:

  • Arduino -nasta 4 tuottaa jatkuvan äänimerkin.
  • Kuulemme tämän äänen dekooderin kaiuttimen kautta aina, kun painamme morse-näppäintä.
  • Sävy on asetettu samaan taajuuteen kuin Goertzel -suodatin, joka huijaa dekooderin ajattelemaan kuuntelevansa todellista morsia … kaikki lähettämäsi teksti näkyy näytöllä.

Lähetyksesi paranee, kun dekooderi havaitsee yleisiä virheitä, kuten:

  • symbolien välissä on liikaa tilaa. (esimerkki: Q on merkitty MA: ksi)
  • liian paljon tilaa kirjainten välillä (esimerkki: NYT painettuna NO W)
  • väärä koodi

Vaihe 7: Yhteenveto

Dekooderi

Tässä ohjeessa kuvataan, miten tehdään morse -dekooderi, joka muuntaa morsekoodin painetuksi tekstiksi.

  • Dekooderi pystyy dekoodaamaan morseen jopa vähintään 80 WPM (sanat minuutissa)
  • Dekooderi seuraa automaattisesti vastaanotetun lähetysnopeuden vaihteluja.
  • Teksti näkyy sarjamonitorissa (tai 320 x 240 TFT -näyttömoduulissa, jos sellainen on) [1]

Lähettäjä

Mukana on myös morse -lähettäjä

  • Lähettäjä auttaa sinua parantamaan morse -lähetyksen laatua.
  • Dekooderi vahvistaa, että lähettämäsi tiedot ovat oikein

Osien hinta

Morse -dekooderin kilven arvioitu hinta ilman lisävarusteena saatavaa TFT -näyttöä on 25 dollaria.

Napsauta tätä nähdäksesi muut ohjeeni.

Audiohaaste 2020
Audiohaaste 2020
Audiohaaste 2020
Audiohaaste 2020

Toinen palkinto Audio Challenge 2020 -kilpailussa

Suositeltava: