Spisu treści:

Dekoder Morse'a z drzewa binarnego: 7 kroków (ze zdjęciami)
Dekoder Morse'a z drzewa binarnego: 7 kroków (ze zdjęciami)

Wideo: Dekoder Morse'a z drzewa binarnego: 7 kroków (ze zdjęciami)

Wideo: Dekoder Morse'a z drzewa binarnego: 7 kroków (ze zdjęciami)
Wideo: Morse Code Tracing 2024, Listopad
Anonim
Image
Image
Schemat obwodu
Schemat obwodu

Ta instrukcja wyjaśnia, jak dekodować kod Morse'a za pomocą Arduino Uno R3.

Dekoder, który automatycznie dostosowuje się do prędkości wysyłania, jest w stanie dekodować Morse'a do co najmniej 80 słów na minutę.

Przychodzący kod jest wyświetlany jako tekst na monitorze szeregowym Arduino (lub ekranie TFT, jeśli jest zainstalowany)

Dołączono oscylator tonowy, jeśli chcesz ćwiczyć wysyłanie Morse'a.

Dekoder posiada:

  • moduł wyświetlacza TFT 320 x 240 [1]
  • cyfrowy filtr pasmowy Goertzel do oddzielania niepożądanych sygnałów.
  • „Drzewo binarne Morse'a” do dekodowania sygnału
  • automatyczne śledzenie prędkości
  • słyszalny sygnał wyjściowy podczas ćwiczenia Morse'a
  • wyświetlany jest zarówno tekst przychodzący, jak i wychodzący.

Rozpoznawane są następujące znaki i symbole:

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

Szacunkowy koszt osłony dekodera Morse'a, pomniejszony o wyświetlacz TFT, wynosi 25 USD. [1]

Obrazy

  • Zdjęcie na okładce przedstawia w pełni zmontowaną jednostkę
  • Film pokazuje działanie dekodera

Uwagi

[1]

  • Moduł wyświetlacza TFT jest opcjonalny, ponieważ cały tekst jest wysyłany do „monitora szeregowego” Arduino.
  • Moduł TFT jest opisany w moim instruktażowym

Krok 1: Lista części

Następujące części zostały uzyskane z

1 tylko prototypowa osłona dla Arduino UNO R3, rozstaw 2,54 mm

Lokalnie pozyskano następujące części:

  • 1 tylko podwójny wzmacniacz LM358
  • 1 tylko zielona dioda LED
  • 1 tylko klips LED
  • 1 tylko kapsuła mikrofonu elektretowego
  • 1 tylko przycisk normalnie otwarty
  • 1 tylko 8-pinowe gniazdo DIP
  • 2 rezystory tylko 330 omów
  • 2 tylko rezystory 2K2
  • 5 tylko rezystorów 10 kΩ
  • 2 tylko rezystory 56 kΩ
  • 2 tylko 1uF kondensator
  • 1 tylko kondensator 10uF

Następujące części są opcjonalne:

  • 1 tylko 2,2-calowy moduł wyświetlacza LCD TFT SPI 240*320 ILI9341 z gniazdem kart SD dla Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Klawisz / przycisk Morse'a
  • 1 tylko BC548 NPN tranzystor
  • 1 tylko 1 calowy głośnik
  • 1 tylko rezystor 33K ohm
  • 1 tylko wtyczka mono 3,5 mm (dla klucza Morse'a)
  • 1 tylko gniazdo mono 3,5 mm (dla klucza Morse'a)
  • 3 tylko 9mm gwintowane nylonowe podkładki M3
  • 1 tylko plastikowe pudełko z ABS o wymiarach 130 x 68 x 44 mm
  • 5 tylko 2-pinowych złączy kątowych

Szacunkowy koszt osłony dekodera Morse'a, pomniejszony o opcjonalny wyświetlacz TFT, wynosi 25 USD. [1]

Uwagi

[1]

Lista części opcjonalnego modułu wyświetlacza TFT 320 x 240 jest wymieniona w moim instruktażowym

[2]

Do korzystania z nadajnika potrzebny jest klucz Morse'a lub solidny przycisk.

Krok 2: Schemat obwodu

Schemat obwodu
Schemat obwodu
Schemat obwodu
Schemat obwodu
Schemat obwodu
Schemat obwodu

Obrazy

Zdjęcie 1 przedstawia schemat dekodera Morse'a. Rezystor 330 omów połączony szeregowo z kluczem Morse'a ogranicza prąd wyjściowy D4 w przypadku przypadkowego zwarcia do masy … zwiększenie jego wartości zmniejsza wyjście audio z głośnika. Z tego powodu nie dodałem go do tarczy, ale przymocowałem go bezpośrednio do gniazda klucza Morse'a, aby ułatwić regulację

Zdjęcie 2 pokazuje pasującą tarczę. Tarcza pochodzi z mojego instruktażowego https://www.instructables.com/id/Arduino-TFT-Grap… do którego dodałem wzmacniacz mikrofonu i oscylator tonu. [1]

Zdjęcie 3 przedstawia kompletną osłonę dołączoną do Arduino. Żadne inne komponenty nie są wymagane, jeśli tekst ma być wyświetlany na Arduino „Serial Monitor”

Zdjęcie 4 przedstawia dekoder częściowo zapakowany. W pokrywie wycięto otwór do oglądania wyświetlacza. Głośnik i mikrofon zostały przyklejone na gorąco do obudowy. Wywierć kilka otworów na głośniki w pokrywie przed zamontowaniem głośnika. Środkowe gniazdo na pokrywie jest przeznaczone na mikrofon przedłużający… bez tego dekoder musi być umieszczony blisko głośnika, co nie zawsze jest możliwe

Zdjęcie 5 przedstawia ekran TFT. Czarna taśma elektryczna została przymocowana do krawędzi wyświetlacza…taśma zapobiega wyciekom światła i maskuje wszelkie niewspółosiowość między wyświetlaczem a otworem w pokrywie

Ważny

[1]

Arduino z dużym złączem USB wymagają warstwy taśmy elektrycznej pomiędzy złączem USB a nakładką Arduino. Przypadkowe spodenki są możliwe bez taśmy, ponieważ prześwit jest niewielki. Taśma nie jest wymagana w przypadku Arduino z małymi złączami

Krok 3: Teoria

Teoria
Teoria
Teoria
Teoria
Teoria
Teoria

Każda litera kodu Morse'a składa się z serii krótkich i długich tonów zwanych „kropkami” i „kreskami”.

  • kropka (.) ma 1 jednostkę długości
  • kreska (_) ma długość 3 jednostek
  • odstęp między elementami liter wynosi 1 jednostkę
  • odstęp między literami to 3 jednostki
  • odstęp między słowami to 7 jednostek

Możemy określić, czy nadchodzący ton jest kropką czy kreską, porównując jego czas trwania z tonem referencyjnym o długości 2 jednostek.

  • kropka jest mniejsza niż 2 jednostki
  • kreska jest większa niż 2 jednostki

Istnieją dwie wyraźnie różne metody dekodowania przychodzącego wzoru kropek i kresek:

  • wyszukiwanie liniowe
  • drzewo binarne (znane również jako wyszukiwanie dychotomiczne)

Wyszukiwanie liniowe

Jedną z powszechnych metod jest utworzenie tablicy znaków i odpowiadających im wzorców Morse'a. Na przykład każdy z następujących znaków zostałby zapisany jako:

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

Każda litera wymaga 6 komórek… 1 dla samej litery i 5 dla (.) i (_). W tym celu potrzebujemy tablicy znaków liter[36][6] zawierającej łącznie 216 komórek. Nieużywane komórki są zwykle wypełnione zerem lub spacją.

Aby zdekodować przychodzące kropki i kreski, musimy porównać wzorzec kropka/kreska każdej przychodzącej litery z naszymi wzorcami znaków odniesienia.

Chociaż ta metoda działa, jest bardzo powolna.

Powiedzmy, że mamy 26 liter ('A',..'Z') i cyfry ('0', … '9') zapisane w tablicy, wtedy musimy wykonać 36 wyszukiwań, każde z maksymalnie 5 pod-wyszukiwaniami, co daje w sumie 36*5=180 wyszukiwań w celu odkodowania cyfry „9”.

Drzewo binarne

Wyszukiwanie binarne jest znacznie szybsze, ponieważ nie są wymagane żadne wyszukiwania.

W przeciwieństwie do wyszukiwania liniowego, które wymaga przechowywania zarówno znaków, jak i wzorców Morse'a, drzewo binarne przechowuje tylko znaki, co oznacza, że rozmiar tablicy jest mniejszy.

Podzieliłem moje drzewo binarne (zdjęcie 1) na dwie połowy (zdjęcia 2 i 3), aby było bardziej czytelne.

Aby znaleźć postać, przesuwamy wskaźnik w lewo za każdym razem, gdy słyszymy kropkę i przesuwamy wskaźnik w prawo za każdym razem, gdy słyszymy myślnik. Po każdym ruchu zmniejszamy o połowę odległość wskaźnika do następnego ruchu… stąd nazwa drzewo binarne.

Odkodowanie litery „9” (kreska, kreska, kreska, kreska, kropka) wymaga 5 ruchów… 4 w prawo i 1 w lewo, co pozostawia wskaźnik bezpośrednio nad „9”.

Pięć ruchów jest znacznie szybszych niż 180 wyszukiwań !!!!!

Tablica znaków binarnych jest również mniejsza… 26 liter i 10 cyfr wymaga tylko tablicy wierszy 64 x 1. Zdecydowałem się utworzyć tablicę 128 znaków, aby móc odkodować interpunkcję.

Krok 4: Uwagi do projektu

Uwagi do projektu
Uwagi do projektu
Uwagi do projektu
Uwagi do projektu
Uwagi do projektu
Uwagi do projektu
Uwagi do projektu
Uwagi do projektu

Morse'a jest trudny do odszyfrowania w obecności sygnałów zakłócających. Niechciane sygnały muszą zostać odrzucone… to wymaga pewnego rodzaju filtra.

Możliwości jest wiele:

  1. Pętle z blokadą fazową
  2. Filtry indukcyjno-kondensatorowe
  3. Filtry aktywne rezystorowo-kondensatorowe
  4. Cyfrowe przetwarzanie sygnału, takie jak szybka transformata Fouriera lub filtr Goertzel.

Metody 1, 2, 3 wymagają elementów zewnętrznych, które są nieporęczne.

Metoda 4 nie wymaga elementów zewnętrznych… częstotliwości są wykrywane za pomocą algorytmów matematycznych.

Szybka transformata Fouriera (FFT)

Jedną z metod wykrywania obecności tonu w złożonym przebiegu jest użycie szybkiej transformacji Fouriera

Zdjęcie 1 pokazuje, jak FFT (szybka transformata Fouriera) dzieli widmo audio na „biny”.

Zdjęcie 2 pokazuje, jak „binsy” FFT reagują na sygnał… w tym przypadku 800Hz. Gdyby obecny był drugi sygnał, powiedzmy, 1500 Hz, zobaczylibyśmy dwie odpowiedzi… jedną przy 800 Hz, a drugą przy 1500 Hz.

Teoretycznie dekoder kodu Morse'a może być wykonany poprzez monitorowanie poziomu wyjściowego określonego pojemnika częstotliwości FFT … duża liczba oznacza obecność kropki lub kreski … mała liczba oznacza brak sygnału.

Taki dekoder kodu Morse'a mógłby zostać stworzony przez monitorowanie „bin 6” na zdjęciu 2, ale jest kilka wad w tym podejściu:

  • chcemy tylko jednego przedziału częstotliwości… reszta to zmarnowane obliczenia
  • kosze częstotliwości mogą nie pojawiać się dokładnie na częstotliwości zainteresowania
  • jest stosunkowo wolny (20mS na pętlę Arduino()

Inną metodą jest użycie filtra Goertzel.

Filtr Goertzel

Filtr Goertzel jest podobny do FFT, ale ma tylko jeden przedział częstotliwości.

Zdjęcie 3 pokazuje odpowiedź częstotliwościową filtra Goertzela na dyskretne kroki audio.

Zdjęcie 4 to przemiatanie tego samego filtra w tym samym zakresie częstotliwości.

Postanowiłem „iść” z algorytmem Goertzela jako:

  • Czas Arduino loop() przy użyciu algorytmu Goertzel wynosił 14mS (milisekundy) w porównaniu do 20mS (milisekund) dla rozwiązania FFT przy użyciu biblioteki Arduino „fix_FFT”.
  • Łatwo jest ustawić środkową częstotliwość filtra pasmowego Goertzel.
  • Szerokość pasma wynosi około 190 Hz.

Zdjęcie 5 pokazuje numeryczne wyjście z filtru Goertzel 900 Hz po wykryciu tonu. Ustawiłem próg tonu na wartość 4000 … wartości powyżej 4000 oznaczają ton.

Teoretycznie wystarczy dostroić filtr do wygodnej częstotliwości słuchania. Niestety dźwięk z mojego 1-calowego głośnika monitorującego spada gwałtownie poniżej 900 Hz. Aby uniknąć problemów, używam częstotliwości filtra 950 Hz. Niezbędne wzory do obliczania alternatywnych częstotliwości filtrów znajdują się w nagłówku mojego kodu.

Rozszyfrowanie

Rozszyfrowanie kropek i kresek nie jest tak proste, jak się wydaje.

Morse doskonały jest zdefiniowany jako:

  • kropka = 1 jednostka
  • spacje wewnątrz litery = 1 jednostka
  • kreska = 3 jednostki
  • spacja między literami = 3 jednostki
  • odstęp między słowami = 7 jednostek

Do dekodowania doskonałego Morse'a potrzebujemy po prostu referencyjnego czasu trwania tonu wynoszącego 2 jednostki

  • kropka < 2 jednostki
  • przestrzeń elementów < 2 jednostki
  • kreska > 2 jednostki
  • litera _spacja > 2 jednostki
  • word_space > 6 jednostek (tj. 3 x jednostki odniesienia)

Działa to dla Morse'a maszynowego, ale w „rzeczywistym świecie”:

  • prędkość wysyłania jest różna
  • czas trwania poszczególnych kropek jest różny
  • czas trwania każdej kreski jest różny
  • litery E, I, S, H, 5 zawierają tylko kropki, które uśredniają czas trwania kropki
  • litery T, M, O, 0 zawierają tylko myślniki, które uśredniają czas trwania myślnika
  • luki w słowach mogą nie nadejść
  • zanikanie tworzy błędy, z których dekoder musi się naprawić.
  • uszkodzone sygnały z powodu zakłóceń

Litery zawierające tylko kropki i kreski są częściowo rozwiązane, jeśli:

Szacujemy czas trwania referencji, dopóki nie otrzymamy prawidłowej kropki i prawidłowej myślnika. Używam 200 milisekund, co jest ważne, jeśli prędkość wysyłania wynosi od 6 WPM (słów na minutę) do 17 WPM. Być może będziesz musiał zwiększyć tę wartość, jeśli uczysz się alfabetu Morse'a. Do oprogramowania dołączona jest tabela prędkości

Zmiany prędkości są rozwiązywane, jeśli:

  • wykonujemy średnią kroczącą dla każdej kropki i każdej kreski i
  • przeliczyć czas trwania odniesienia po odebraniu każdego symbolu

Braki w słowach i braki w słowach są rozwiązywane, jeśli:

  • zapamiętaj czas ostatniego przejścia krawędzi spływu (ton do braku tonu),
  • restart algorytmu po każdej literze,
  • obliczyć czas, jaki upłynął podczas oczekiwania na następne przejście krawędzi wiodącej (bez tonu do tonu) i
  • wstaw spację, jeśli przekroczono 6 jednostek czasu.

Oscylator Morse'a

Początkowo próbowałem niektórych buzzerów Piezo, ale znalazłem:

  • częstotliwość została ustalona
  • częstotliwość wyjściowa była zbyt wysoka dla dłuższego słuchania
  • piezosy miały tendencję do dryfowania poza pasmo Goertzel

Następnie próbowałem sterować przetwornikiem akustycznym falą prostokątną 750 Hz, ale odkryłem, że ma rezonans, który odfiltrowuje 1. i 3. harmoniczne. Zdjęcie 6 pokazuje wyjście wzmacniacza mikrofonowego na falę prostokątną 750 Hz … widzimy 5 harmoniczną !!!

Następnie uciekłem się do używania małego głośnika. Zdjęcie 7 pokazuje wyjście mikrofonu do fali prostokątnej 750 Hz, która została wysłana do małego głośnika… tym razem widzimy podstawową… nie piątą harmoniczną. Filtr Goertzel ignoruje wszelkie harmoniczne.

Uwagi

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Krok 5: Oprogramowanie

Oprogramowanie
Oprogramowanie
Oprogramowanie
Oprogramowanie
Oprogramowanie
Oprogramowanie

Instalacja

  • Pobierz załączony plik MorseCodeDecoder.ino [1]
  • Skopiuj zawartość tego pliku do nowego szkicu Arduino
  • Zapisz szkic jako „MorseCodeDecoder” (bez cudzysłowów)
  • Skompiluj i prześlij szkic do swojego Arduino

Aktualizacja oprogramowania 23 lipca 2020

Do załączonego pliku "MorseCodeDecoder6.ino" dodano następujące funkcje

  • okno "Dokładnego Blackmana" [2]
  • „Noise_blanker”

Dostosowanie:

  • zwiększ poziom dźwięku odbiornika, aż dioda LED zacznie migać, a następnie zgaś
  • teraz dostrój odbiornik, aż dioda LED zacznie migać w rytm nadchodzącego morse'a
  • Noise_blanker został ustawiony na ignorowanie impulsów hałasu do 8mS (czas jednej pętli)
  • próg szumu można dostosować, ustawiając Debug=true i obserwując ploter szeregowy

Notatka

[1]

Ustaw Arduino Serial Monitor na 115200 bodów, jeśli chcesz również wyświetlić tekst.

[2]

  • Zdjęcie 1 … Dokładne okno Blackmana
  • Zdjęcie 2 … filtr Goertzel bez okna Exact Blackman
  • Zdjęcie 3,,, Filtr Goertzel z zastosowanym oknem Exact Blackman

Krok 6: Operacja

Dekoder

Podczas słuchania alfabetu Morse'a umieść urządzenie obok głośnika.

  • Kapsuła mikrofonu elektretowego odbiera sygnał Morse'a z głośnika.
  • Wyjście mikrofonu elektretowego jest następnie wzmacniane 647 razy (56 dB), zanim zostanie przekazane do Arduino w celu przetworzenia.
  • Cyfrowy filtr pasmowy Goertzel wyodrębnia sygnał Morse'a z szumu.
  • Dekodowanie odbywa się za pomocą drzewa binarnego.
  • Wyjście dekodera jest wyświetlane jako tekst na wyświetlaczu TFT o rozdzielczości 320 x 240 pikseli. Jest również wysyłany do twojego Arduino „Serial Monitor”, jeśli nie chcesz używać wyświetlacza.

Nadawca Morse'a

Uwzględniono również nadawcę Morse'a. Pozwala to ćwiczyć wysyłanie Morse'a i działa w następujący sposób:

  • Na pinie 4 Arduino generowany jest stały słyszalny dźwięk.
  • Słyszymy ten ton za pomocą głośnika dekodera za każdym razem, gdy naciskamy klawisz Morse'a.
  • Ton jest ustawiony na tę samą częstotliwość, co filtr Goertzel, co powoduje, że dekoder myśli, że słucha prawdziwego morsa… cokolwiek wyślesz, pojawi się jako wydrukowany tekst na wyświetlaczu.

Twoje wysyłanie ulegnie poprawie, ponieważ dekoder wykryje typowe błędy, takie jak:

  • zbyt duża przestrzeń między symbolami. (przykład: Q oznaczone jako MA)
  • za dużo miejsca między literami (przykład: TERAZ wydrukowane jako NO W)
  • błędny kod

Krok 7: Podsumowanie

Dekoder

Ta instrukcja opisuje, jak zrobić dekoder Morse'a, który konwertuje kod Morse'a na tekst drukowany.

  • Dekoder jest w stanie dekodować Morse'a do co najmniej 80 WPM (słów na minutę)
  • Dekoder automatycznie śledzi zmiany w odbieranej szybkości wysyłania.
  • Tekst jest wyświetlany na monitorze szeregowym (lub na module wyświetlacza TFT 320 x 240, jeśli jest zainstalowany) [1]

Nadawca

Uwzględniono również nadawcę Morse'a

  • Nadawca pomaga poprawić jakość wysyłania Morse'a.
  • Dekoder potwierdza, że to, co wysłałeś, jest poprawne

Koszt części

Szacunkowy koszt osłony dekodera Morse'a, pomniejszony o opcjonalny wyświetlacz TFT, wynosi 25 USD.

Kliknij tutaj, aby wyświetlić inne moje instrukcje.

Wyzwanie audio 2020
Wyzwanie audio 2020
Wyzwanie audio 2020
Wyzwanie audio 2020

II nagroda w Audio Challenge 2020

Zalecana: