Sisällysluettelo:
- Vaihe 1: Osaluettelo
- Vaihe 2: Piirikaavio
- Vaihe 3: Teoria
- Vaihe 4: Huomautuksia suunnittelusta
- Vaihe 5: Ohjelmisto
- Vaihe 6: Käyttö
- Vaihe 7: Yhteenveto
Video: Binaarinen puumorse -dekooderi: 7 vaihetta (kuvilla)
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
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
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
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
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:
- Vaihelukitut silmukat
- Induktori-kondensaattorin suodattimet
- Vastus-kondensaattorin aktiiviset suodattimet
- 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
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.
Toinen palkinto Audio Challenge 2020 -kilpailussa
Suositeltava:
DIY Arduino -binaarinen herätyskello: 14 vaihetta (kuvilla)
DIY Arduino Binary Herätyskello: Se on klassinen binaarikello jälleen! Mutta tällä kertaa vielä enemmän lisätoimintoja! Tässä ohjeessa näytän sinulle, kuinka rakentaa binäärinen herätyskello Arduinolla, joka voi näyttää sinulle paitsi ajan, myös päivämäärän, kuukauden, jopa ajastimen ja herätyksen kanssa
Binaarinen työpöytäkello: 9 vaihetta (kuvilla)
Binaarinen työpöytäkello: Binaarikellot ovat mahtavia ja yksinomaan binaarin (digitaalisten laitteiden kieli) tuntevalle henkilölle. Jos olet tekninen kaveri, tämä outo kello on sinua varten. Joten tee yksi itse ja pidä aikasi salassa! Löydät paljon binaarista c
Binaarinen LED -marmorikello: 6 vaihetta (kuvilla)
Binaarinen LED -marmorikello: Nyt luulen, että melkein kaikilla on binaarikello ja tässä on minun versioni. Nautin siitä, että tämä projekti yhdisti puutöitä, ohjelmointia, oppimista, elektroniikkaa ja ehkä vain pienen taiteellisen luovuuden. Se näyttää ajan, kuukauden, päivämäärän, päivän
Arduino -pohjainen binaarinen herätyskello: 13 vaihetta (kuvilla)
Arduino -pohjainen binaarinen herätyskello: Hei, tänään haluaisin näyttää sinulle, kuinka rakentaa yksi uusimmista projekteistani, binäärinen herätyskelloni. Internetissä on paljon erilaisia binaarikelloja, mutta tämä saattaa olla ensimmäinen, joka on valmistettu värikkäiden osoitettavien LED -valojen nauhasta
Binaarinen marmorikello: 9 vaihetta (kuvilla)
Binaarinen marmorikello: Tämä on yksinkertainen kello, joka näyttää kellonajan (tunnit/minuutit) binäärinä käyttäen lasimallien alle piilotettuja ledejä. vain nopea vilkaisu tähän kelloon. Se