Tartalomjegyzék:

Bináris fa morze dekódoló: 7 lépés (képekkel)
Bináris fa morze dekódoló: 7 lépés (képekkel)

Videó: Bináris fa morze dekódoló: 7 lépés (képekkel)

Videó: Bináris fa morze dekódoló: 7 lépés (képekkel)
Videó: Как избавиться от усталости? Верните свою энергию! Желчь может всё! 2024, November
Anonim
Image
Image
Kördiagramm
Kördiagramm

Ez az utasítás elmagyarázza, hogyan lehet dekódolni a Morse -kódot egy Arduino Uno R3 segítségével.

A dekódoló, amely automatikusan alkalmazkodik a küldési sebességhez, percenként legalább 80 szóig képes morse dekódolására.

A bejövő kód szövegként jelenik meg az Arduino soros monitoron (vagy a TFT képernyőn, ha van)

Hangszóró oszcillátor került bele, ha gyakorolni szeretné a morse küldését.

A dekóder jellemzői:

  • 320 x 240 TFT kijelző modul [1]
  • Goertzel digitális sávszűrő a nem kívánt jelek elválasztására.
  • egy „bináris morzefa” a jel dekódolására
  • automatikus sebességkövetés
  • hallható kimenet a morse gyakorlásakor
  • a bejövő és a kimenő szöveg is megjelenik.

A következő karaktereket és szimbólumokat ismeri fel:

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

A morze -dekódoló pajzs becsült költsége, a TFT kijelzővel csökkentve, 25 dollár. [1]

Képek

  • A borítóképen egy teljesen összeszerelt egység látható
  • A videón látható a dekóder működése

Megjegyzések

[1]

  • A TFT kijelzőmodul opcionális, mivel az összes szöveget elküldi az Arduino „Soros monitor” -ra.
  • A TFT modult az oktatható

1. lépés: Alkatrészlista

A következő részeket a https://www.aliexpress.com/ webhelyről szerezték be

Csak 1 prototípus pajzs az Arduino UNO R3, 2,54 mm -es hangmagassághoz

A következő alkatrészeket szerezték be helyben:

  • 1 csak LM358 kettős opamp
  • 1 csak zöld LED
  • 1 csak LED klip
  • 1 csak elektret mikrofon kapszula
  • 1 csak normálisan nyitott nyomógomb
  • 1 csak 8 tűs DIP aljzat
  • 2 csak 330 ohmos ellenállás
  • 2 csak 2K2 ellenállás
  • 5 db 10K ohmos ellenállás
  • 2 db 56K ohmos ellenállás
  • 2 csak 1uF kondenzátor
  • 1 csak 10uF kondenzátor

A következő részek nem kötelezőek:

  • Csak 1 2,2 hüvelykes TFT SPI LCD kijelzőmodul 240*320 ILI9341 SD kártya foglalattal az Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC számára [1]
  • Morse kulcs / nyomógomb
  • 1 csak BC548 NPN tranzisztor
  • 1 csak 1 hüvelykes hangszóró
  • 1 csak 33K ohmos ellenállás
  • 1 csak 3,5 mm -es mono dugó (morse kulcshoz)
  • 1 csak 3,5 mm -es mono aljzat (morse kulcshoz)
  • 3 csak 9 mm -es M3 -as csapos nylon távtartó
  • 1 csak 130 x 68 x 44 mm -es ABS műanyag doboz
  • 5 csak 2 tűs derékszögű csatlakozó

A morze -dekódoló pajzs becsült költsége, kivéve az opcionális TFT -kijelzőt, 25 dollár. [1]

Megjegyzések

[1]

Az opcionális 320 x 240 TFT kijelzőmodul alkatrészlistája az oktatható

[2]

Morse kulcs vagy erős nyomógomb szükséges, ha használni szeretné a feladót.

2. lépés: Áramköri diagram

Kördiagramm
Kördiagramm
Kördiagramm
Kördiagramm
Kördiagramm
Kördiagramm

Képek

Az 1. fotó a morze -dekóder kapcsolási rajzát mutatja. A soros 330 ohmos ellenállás a morse -gombbal korlátozza a D4 kimeneti áramot véletlen testzárlat esetén… értékének növelése csökkenti a hangszóró hangkimenetét. Emiatt nem a pajzshoz adtam, hanem közvetlenül a morze kulcsos csatlakozóhoz rögzítettem a könnyű beállítás érdekében

A 2. képen egy megfelelő pajzs látható. A pajzs az oktatható https://www.instructables.com/id/Arduino-TFT-Grap…, amelyhez hozzáadtam a mikrofonerősítőt és a hangoszcillátort. [1]

A 3. fotó az Arduino -hoz csatolt kész pajzsot mutatja. Nincs szükség más komponensekre, ha a szöveget az Arduino „Soros monitoron” szeretné megtekinteni

A 4. képen a dekóder részben dobozos. A fedélben lyukat vágtak a kijelző megtekintéséhez. A hangszórót és a mikrofont melegen ragasztották a tokhoz. A hangszóró felszerelése előtt fúrjon néhány lyukat a fedélbe. A fedél középső aljzata egy hosszabbító mikrofonhoz készült … e nélkül a dekódert a hangszóró közelében kell elhelyezni, ami nem mindig lehetséges

Az 5. fotó a TFT képernyőt mutatja. Fekete elektromos szalagot rögzítettek a kijelző széleire … ez a szalag megakadályozza a fényszivárgást, és elfedi a kijelző és a fedél nyílása közötti eltéréseket

Fontos

[1]

A nagy USB -csatlakozóval rendelkező Arduino -khoz egy réteg elektromos szalag szükséges az USB -csatlakozó és az Arduino -pajzs között. Véletlen rövidnadrág lehetséges szalag nélkül, mivel a hézag kicsi. A szalag nem szükséges az Arduino -khoz, amelyek kis csatlakozókkal rendelkeznek

3. lépés: Elmélet

Elmélet
Elmélet
Elmélet
Elmélet
Elmélet
Elmélet

Minden morze kód betű rövid és hosszú hangok sorozatát tartalmazza, amelyeket „pontoknak” és „kötőjeleknek” neveznek.

  • egy pont (.) 1 egység hosszú
  • egy kötőjel (_) 3 egység hosszú
  • a betűelemek közötti tér 1 egység
  • a betűk közötti távolság 3 egység
  • a szavak közötti távolság 7 egység

Meg tudjuk határozni, hogy a bejövő hang pont vagy kötőjel, ha összehasonlítjuk annak időtartamát egy 2 egység hosszúságú referenciahanggal.

  • egy pont kevesebb, mint 2 egység
  • egy kötőjel 2 egységnél nagyobb

Két egyértelmű módszer létezik a bejövő pontok és kötőjelek mintájának dekódolására:

  • lineáris keresés
  • bináris fa (más néven dichotómiai keresés)

Lineáris keresés

Az egyik gyakori módszer a karakterek tömbjének és a hozzájuk tartozó morze mintáknak a létrehozása. Például az alábbi karakterek mindegyike a következőképpen kerül mentésre:

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

Minden betűhöz 6 cella szükséges… 1 magához a betűhöz és 5 a (.) És (_) karakterhez. Ehhez szükségünk van egy betűkre [36] [6], összesen 216 cellával. A fel nem használt cellákat általában nulla vagy üres elem tölti ki.

A bejövő pontok és kötőjelek dekódolásához össze kell hasonlítanunk minden bejövő betű pont/kötőjele mintáját a referencia karaktermintáinkkal.

Bár ez a módszer működik, rendkívül lassú.

Tegyük fel, hogy 26 betűt („A”, „Z”) és számjegyeit („0”,… „9”) tároljuk egy tömbben, majd 36 keresést kell végrehajtanunk, egyenként legfeljebb 5 alkereséssel, ami összesen 36*5 = 180 keresés a „9” szám dekódolására.

Bináris fa

A bináris keresés sokkal gyorsabb, mivel nincs szükség keresésekre.

Ellentétben a lineáris kereséssel, amely mind a karakter, mind a morse minták tárolását igényli, a bináris fa csak a karaktereket tárolja, ami azt jelenti, hogy a tömb mérete kisebb.

A bináris fámat (fotó1) két részre osztottam (2. és 3. fotó), hogy jobban olvasható legyen.

A karakter megtalálásához mozgassunk balra egy mutatót, amikor meghallunk egy pontot, és jobbra mozgatjuk a mutatót, amikor kötőjelet hallunk. Minden lépés után felére csökkentjük a mutató távolságát a következő lépéshez… innen a bináris fa neve.

A „9” betű dekódolásához (kötőjel, kötőjel, kötőjel, kötőjel, pont) 5 mozdulat szükséges… 4 jobbra, és 1 balra, ami közvetlenül a „9” fölött hagyja a mutatót.

Öt lépés jelentősen gyorsabb, mint 180 keresés !!!!!

A bináris karakter tömb is kisebb… 26 betű és 10 szám csak 64 x 1 soros tömböt igényel. 128 karakter tömb létrehozását választottam, hogy dekódolhassam az írásjeleket.

4. lépés: Tervezési megjegyzések

Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések
Tervezési megjegyzések

A Morse -t zavaró jelek jelenlétében nehéz dekódolni. A nem kívánt jeleket el kell utasítani… ehhez valamiféle szűrő szükséges.

Sok lehetőség van:

  1. Fáziszárolt hurkok
  2. Induktor-kondenzátor szűrők
  3. Ellenállás-kondenzátor aktív szűrők
  4. Digitális jelfeldolgozás, például a gyors Fourier -transzformáció vagy a Goertzel -szűrő.

Az 1., 2., 3. módszerhez külső alkatrészekre van szükség, amelyek terjedelmesek.

A 4. módszer nem igényel külső komponenseket… a frekvenciákat matematikai algoritmusok segítségével észlelik.

Gyors Fourier -transzformáció (FFT)

Az egyik módszer a hang jelenlétének kimutatására egy komplex hullámformában a gyors Fourier -transzformáció használata

Az 1. fénykép azt mutatja be, hogy az FFT (Fast Fourier Transform) hogyan osztja fel az audio spektrumot „tartályokra”.

A 2. fotó azt mutatja, hogy az FFT „tartályok” hogyan reagálnak egy jelre… ebben az esetben 800 Hz. Ha egy második, mondjuk 1500 Hz -es jel is jelen lenne, két választ látnánk… az egyik 800 Hz -en, a másik 1500 Hz -en.

Elméletileg morze -kód dekódoló készíthető egy adott FFT frekvenciatartály kimeneti szintjének figyelésével … nagy szám egy pont vagy kötőjel jelenlétét jelzi … kis szám nem jel.

Ilyen morzekód dekódoló a 2. képen látható „6 -os bin” figyelésével készíthető el, de ezzel a megközelítéssel számos dolog nem stimmel:

  • csak egy frekvenciatartályt szeretnénk… a többi elpazarolt számítás
  • előfordulhat, hogy a frekvenciatartályok nem pontosan az érdeklődési gyakoriságon jelennek meg
  • viszonylag lassú (20mS / Arduino hurok ()

Egy másik módszer a Goertzel -szűrő használata.

Goertzel szűrő

A Goertzel -szűrő hasonló az FFT -hez, de csak egyetlen frekvenciatartóval rendelkezik.

A 3. fotó egy Goertzel -szűrő frekvenciaválaszát mutatja a különálló audio lépésekhez.

A 4. fotó ugyanazon szűrő leképezése ugyanazon frekvenciatartományban.

Úgy döntöttem, hogy a Goertzel -algoritmussal "megyek":

  • Az Arduino ciklus () ideje a Goertzel -algoritmust használva 14 mS (ezredmásodperc) volt, szemben az Arduino „fix_FFT” könyvtárat használó FFT -megoldás 20 mS (ezredmásodperce) értékével.
  • Könnyű beállítani a Goertzel sávszűrő középső frekvenciáját.
  • A sávszélesség körülbelül 190 Hz.

Az 5. fotó egy 900 Hz -es Goertzel -szűrő számkimenetét mutatja, amikor hangot észlel. A hangküszöböt 4000 -re állítottam be … a 4000 feletti értékek hangot jeleznek.

Elméletileg csak be kell hangolnia a szűrőt egy kényelmes hallgatási frekvenciára. Sajnos az 1 hüvelykes figyelő hangszóróm hangkimenete gyorsan 900 Hz alá csökken. A problémák elkerülése érdekében 950 Hz -es szűrőfrekvenciát használok. Az alternatív szűrőfrekvenciák kiszámításához szükséges képletek megtalálhatók a kódfejlécemben.

Dekódolás

A pontok és kötőjelek dekódolása nem olyan egyszerű, mint amilyennek látszik.

A tökéletes morse a következő:

  • pont = 1 egység
  • szóköz betű = 1 egység
  • kötőjel = 3 egység
  • szóköz a betűk között = 3 egység
  • szóköz = 7 egység

A tökéletes morse dekódolásához egyszerűen szükségünk van 2 egység referenciahang időtartamra

  • pont <2 egység
  • elemtér <2 egység
  • kötőjel> 2 egység
  • betű _tér> 2 egység
  • word_space> 6 egység (azaz 3 x referencia egység)

Ez működik a gépmorse esetében, de a „való világban”:

  • a küldési sebesség változik
  • az egyes pontok időtartama változó
  • minden kötőjel időtartama változó
  • az E, I, S, H, 5 betűk csak olyan pontokat tartalmaznak, amelyek átlagos időtartama a pont
  • a T, M, O, 0 betűk csak olyan kötőjeleket tartalmaznak, amelyek átlagosan a kötőjelig terjednek
  • a szóközök esetleg nem érkeznek meg
  • az elhalványodás hibákat hoz létre, amelyekből a dekódolónak helyre kell állnia.
  • interferencia miatt sérült jelek

A csak pontokat és kötőjeleket tartalmazó betűk részben megoldódnak, ha:

becsüljük a referencia időtartamát, amíg meg nem kapunk egy érvényes pontot és egy érvényes kötőjelet. 200 ezredmásodpercet használok, ami akkor érvényes, ha a küldési sebesség 6 WPM (szó percenként) és 17 WPM között van. Lehet, hogy növelnie kell ezt az értéket, ha morse -t tanul. A szoftver tartalmaz egy sebességtáblázatot

A sebességváltozások megoldódnak, ha:

  • gördülő átlagot hajtunk végre minden ponton és kötőjelnél és
  • számolja újra a referencia időtartamát minden szimbólum fogadása után

A szóközök és a nem érkező szóközök megoldódnak, ha:

  • emlékezzen a legutóbbi átlépés idejére (hangról hangra)
  • indítsa újra az algoritmust minden betű után,
  • számítsa ki az eltelt időt, miközben várja a következő élvonalbeli (nincs hangról hangra) átmenetet, és
  • helyezzen be szóközt, ha túllépte a 6 időegységet.

Morse oszcillátor

Kezdetben kipróbáltam néhány Piezo hangjelzőt, de találtam:

  • a frekvenciát rögzítették
  • a kimeneti frekvencia túl magas volt a hosszú hallgatáshoz
  • a piezók inkább kisodródtak a Goertzel -sávból

Ezután megpróbáltam egy 750 Hz -es négyszöghullámú akusztikus jeladót vezetni, de azt találtam, hogy rezonanciája kiszűri az első és a harmadik felharmonikusokat. A 6. fotó a mikrofonerősítő 750 Hz-es négyszöghullámú kimenetét mutatja … látjuk az ötödik harmonikát !!!

Ezután egy kis hangszóróhoz folyamodtam. A 7. fotó a mikrofon kimenetét mutatja egy 750 Hz -es négyszöghullámra, amelyet egy kis hangszóróra küldtek … ezúttal az alapvető… nem az ötödik harmonikát látjuk. A Goertzel -szűrő figyelmen kívül hagyja a felharmonikusokat.

Megjegyzések

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

5. lépés: Szoftver

Szoftver
Szoftver
Szoftver
Szoftver
Szoftver
Szoftver

Telepítés

  • Töltse le a csatolt MorseCodeDecoder.ino fájlt [1]
  • Másolja a fájl tartalmát egy új Arduino -vázlatba
  • Mentse a vázlatot "MorseCodeDecoder" néven (idézőjelek nélkül)
  • Fordítsa össze és töltse fel a vázlatot Arduino készülékére

Szoftverfrissítés 2020. július 23

A következő funkciókkal bővült a csatolt "MorseCodeDecoder6.ino" fájl

  • "Exact Blackman" ablak [2]
  • "zajszűrő"

Beállítás:

  • növelje a vevő hangerejét, amíg a LED villogni nem kezd, majd vissza nem kapcsol
  • hangolja most a rádióerősítőt, amíg a LED villogni kezd a bejövő morzsával
  • a Noise_blanker úgy lett beállítva, hogy figyelmen kívül hagyja a zajkitöréseket akár 8 mS -ig (egy ciklusidő)
  • a zajküszöb beállítható a Debug = true beállítással és a Soros Plotter figyelésével

jegyzet

[1]

Ha szeretné megtekinteni a szöveget, állítsa az Arduino soros monitort 115200 baud értékre.

[2]

  • 1. fotó… Pontos Blackman ablak
  • 2. fotó… Goertzel szűrő Exact Blackman ablak nélkül
  • 3. fotó,,, Goertzel szűrő Exact Blackman ablak alkalmazásával

6. lépés: Művelet

Dekódoló

Morse hallgatásakor helyezze a készüléket a hangszóró mellé.

  • Az elektret mikrofon kapszula felveszi a hangszóróból származó morze jelet.
  • Az elektret mikrofon kimenetét ezután 647 -szeresére (56 dB) erősítik, majd továbbítják az Arduino -hoz feldolgozásra.
  • A Goertzel digitális sávszűrő kivonja a morse jelet a zajból.
  • A dekódolás bináris fa segítségével történik.
  • A dekódoló kimenete szövegként jelenik meg a 320 x 240 képpontos TFT kijelzőn. Azt is elküldi az Arduino „Soros Monitorjába”, ha nem kívánja használni a kijelzőt.

Morse küldő

Morse küldő is szerepelt. Ez lehetővé teszi a morse küldésének gyakorlását, és a következőképpen működik:

  • Az Arduino 4 -es tűn állandó hangjelzés hallható.
  • Ezt a hangot a dekóder hangszóróján keresztül halljuk, amikor megnyomjuk a morse gombot.
  • A hangszín ugyanazon a frekvencián van beállítva, mint a Goertzel -szűrő, amely megtéveszti a dekódert, hogy azt gondolja, hogy igazi morse -t hallgat … bármit küld, nyomtatott szövegként jelenik meg a kijelzőn.

A küldés javulni fog, ahogy a dekódoló észleli az olyan gyakori hibákat, mint:

  • túl sok hely van a szimbólumok között. (példa: Q MA -ként ábrázolva)
  • túl sok hely van a betűk között (példa: MOST NO W -ként nyomtatva)
  • Hibás kód

7. lépés: Összefoglalás

Dekódoló

Ez az utasítás leírja, hogyan lehet morze -dekódolót készíteni, amely morse -kódot nyomtatott szöveggé alakít át.

  • A dekódoló képes legalább 80 WPM (szó percenként) morze dekódolására
  • A dekóder automatikusan követi a fogadott küldési sebesség változásait.
  • A szöveg megjelenik a soros monitoron (vagy 320 x 240 TFT kijelzőmodulon, ha van) [1]

Feladó

Morse küldő is szerepelt

  • A feladó segít javítani a morse küldés minőségét.
  • A dekóder megerősíti, hogy az Ön által küldött adatok helyesek

Az alkatrészek költsége

A morze -dekódoló pajzs becsült költsége, kivéve az opcionális TFT -kijelzőt, 25 dollár.

Kattintson ide a többi utasításom megtekintéséhez.

Audio Challenge 2020
Audio Challenge 2020
Audio Challenge 2020
Audio Challenge 2020

Második díj az Audio Challenge 2020 versenyen

Ajánlott: