Dekoder morse'a na CH32V003

Typ_projektu
ElektronikaPL
Zdjecie główne
Krótki opis projektu

Tu wprowadź krótki opis projektu (max 500 znaków)

Niezbędne elementy

Potrzebne elementy:

  • nanoCH32V003 v1.0
  • WCH-Link
  • płytka stykowa
  • kable męsko-żeńskie oraz żeńsko-żeńskie
  • dwa przyciski
  • 3 rezystory
Opis projektu

Dekoder alfabetu Morse’a na CH32V003

Alfabet Morse’a to jeden z najstarszych i najbardziej uniwersalnych systemów przekazywania informacji w postaci sygnałów krótkich i długich — kropek i kresek. Został opracowany w XIX wieku przez Samuela Morse’a i Alfreda Vaila jako sposób przesyłania wiadomości telegraficznych na duże odległości. Każda litera, cyfra lub znak specjalny ma swój unikalny układ kropek i kresek, dzięki czemu można przekazywać tekst bez użycia głosu czy pisma. Początkowo alfabet Morse’a był używany w telegrafii przewodowej, później w radiokomunikacji, a dziś stanowi ważny element tradycji i szkolenia w służbach ratowniczych, wojsku oraz wśród radioamatorów. Jego prostota i niezawodność sprawiają, że jest skuteczny nawet w trudnych warunkach — można go nadawać światłem, dźwiękiem, sygnałem radiowym, a nawet ruchem ręki. Dzięki temu alfabet Morse’a pozostaje symbolem komunikacji awaryjnej i precyzyjnego przekazu informacji. 

Celem niniejszego projektu było stworzenie dekodera kodu Morse’a z użyciem mikrokontrolera CH32V00.

Potrzebne elementy:

  • nanoCH32V003 v1.0
  • WCH-Link
  • płytka stykowa
  • kable męsko-żeńskie oraz żeńsko-żeńskie
  • dwa przyciski
  • 3 rezystory

Zastosowane połączenia:

  • przycisk 1 został podłączony do GND oraz przez rezystor do pinu D3 (13) 
  • przycisk 2 został podłączony do GND oraz przez rezystor do pinu D2 (12)
  • dioda LED została podłaczona do GND oraz przez rezystor do pinu D4 (14)
  • RX z WCH-Link został podłączony do pinu D5 (15)
  • TX z WCH-Link został podłączony do pinu D6 (16)

Jeden przycisk służy do nadawania kodu morse’a, a drugi do zmiany trybów.

Dekoder pracuje w siedmiu trybach:

  1. RX

W trybie RX urządzenie działa jako klasyczny odbiornik alfabetu Morse’a. Użytkownik nadaje sygnały przyciskiem, a mikrokontroler mierzy czas ich trwania i rozpoznaje, czy są to kropki (krótkie sygnały) czy kreski (długie sygnały). Sygnały nadawane przez użytkownika są również na bieżąco pokazywane błyskaniem diody LED. Po zakończeniu nadawania litery dekoder analizuje sekwencję znaków (kropek i kresek) i wyświetla odpowiadającą jej literę w monitorze szeregowym (Serial Monitor). Tryb ten pozwala ćwiczyć poprawne rytmy nadawania i jednocześnie sprawdzać, czy dekoder prawidłowo rozpoznaje znaki. RX jest podstawowym trybem pracy — nie wymaga żadnych danych wejściowych z komputera, a jego zadaniem jest interpretacja sygnałów z przycisku i zamiana ich na znaki tekstowe. 

  1. TX

W trybie TX dekoder działa odwrotnie niż w RX — pełni funkcję nadajnika. Użytkownik wpisuje literę w monitorze szeregowym, a mikrokontroler przekształca ją na kod Morse’a i wysyła sekwencję błysków diody LED. Każda kropka to krótki błysk, a każda kreska – trzykrotnie dłuższy. Między elementami litery występuje krótka przerwa, a między literami – dłuższa. Tryb ten pozwala obserwować, jak wygląda nadawanie alfabetu Morse’a w praktyce i jak mikrokontroler odwzorowuje rytm sygnałów. TX jest przydatny do nauki wizualnego rozpoznawania kodu Morse’a.

  1. QUIZ

Tryb QUIZ wprowadza element interakcji i nauki. Mikrokontroler losuje literę i wyświetla ją w monitorze szeregowym, a użytkownik ma za zadanie nadać jej kod Morse’a przyciskiem. Po zakończeniu nadawania urządzenie sprawdza poprawność i informuje, czy odpowiedź była prawidłowa. Jeśli litera została nadana poprawnie, pojawia się komunikat „OK”. W przeciwnym razie dekoder pokazuje, jaka litera była oczekiwana, a jaka została nadana omyłkowo przez użytkownika. QUIZ pozwala ćwiczyć pamięć kodu Morse’a i refleks w nadawaniu. Dzięki losowaniu liter z różnym prawdopodobieństwem (litery częściej występujące w języku polskim jak E, A, I pojawiają się częściej) nauka jest bardziej realistyczna.

  1. LEARN

LEARN to tryb edukacyjny, w którym dekoder pomaga użytkownikowi nauczyć się alfabetu Morse’a od podstaw. Urządzenie losuje literę, pokazuje ją w monitorze szeregowym, a następnie wyświetla jej wzór w postaci kropek i kresek. Użytkownik ma za zadanie powtórzyć ten wzór przyciskiem. Po zakończeniu nadawania dekoder sprawdza poprawność i informuje, czy litera została nadana zgodnie z wzorem. Tryb LEARN jest idealny dla początkujących — pozwala utrwalić zależność między literą a jej kodem Morse’a.

  1. WORD

WORD rozszerza zasadę QUIZ na całe słowa. Mikrokontroler losuje jedno z zapisanych w pamięci krótkich słów (np. „KWIAT”, „ZIMA”, „LASER”) i wyświetla je w monitorze szeregowym. Użytkownik musi nadać każdą literę po kolei, zachowując przerwy między literami. Dekoder analizuje każdą literę i sprawdza, czy została nadana poprawnie. Jeśli całe słowo jest poprawne, pojawia się komunikat „Słowo OK”. W przeciwnym razie urządzenie informuje, przy której literze wystąpił błąd. Tryb WORD pozwala ćwiczyć płynne nadawanie dłuższych sekwencji i utrwala znajomość liter w kontekście całych wyrazów. To etap przejściowy między nauką pojedynczych znaków a praktycznym nadawaniem wiadomości w kodzie Morse’a. 

  1. ECHO

ECHO to tryb testowy i diagnostyczny. Użytkownik nadaje literę przyciskiem, a dekoder natychmiast powtarza ją na diodzie LED. W praktyce działa jak „echo” — wszystko, co zostanie nadane, jest odtworzone przez mikrokontroler. Tryb ten pozwala sprawdzić, czy urządzenie prawidłowo rozpoznaje długości impulsów i czy czasy kropek i kresek są interpretowane zgodnie z założeniami. ECHO jest bardzo przydatny przy kalibracji sprzętu, testowaniu przycisku lub diody LED oraz przy analizie błędów w rytmie nadawania. Dzięki natychmiastowej reakcji użytkownik widzi, jak dekoder „rozumie” jego sygnały, co ułatwia korektę tempa i długości impulsów. 

  1. SPEED

SPEED to najbardziej analityczny tryb dekodera. Użytkownik nadaje literę w kodzie Morse’a, a urządzenie mierzy czas trwania każdej kropki i kreski. Dopiero po zakończeniu całej litery dekoder wypisuje w monitorze szeregowym listę czasów wszystkich elementów, np. „KROPKA: 180 ms”, „KRESKA: 610 ms”. Dzięki temu można dokładnie ocenić tempo nadawania i proporcje między krótkimi i długimi impulsami. Tryb SPEED jest doskonałym narzędziem do treningu precyzji — pozwala analizować, czy kropki są wystarczająco krótkie, a kreski trzykrotnie dłuższe. Umożliwia też porównanie własnego rytmu z teoretycznym wzorcem i stopniowe doskonalenie techniki nadawania. To tryb dla użytkowników, którzy chcą wyćwiczyć regularność w nadawaniu sygnałów w kodzie Morse’a.

 

Pierwsza wersja programu była zbyt duża — kompilator zgłaszał przepełnienie pamięci FLASH o kilkaset bajtów. Kod zawierał wiele funkcji, tablic i tekstów, które zajmowały więcej miejsca, niż mikrokontroler mógł pomieścić. Dlatego kod został zoptymalizowany zachowując pełną funkcjonalność wszystkich trybów.

1. Usunięcie obiektów typu String  

Najwięcej pamięci zajmowały dynamiczne obiekty String. W Arduino każdy taki obiekt rezerwuje dodatkowe bajty na metadane i zarządzanie pamięcią, co powoduje duży narzut. Zastąpiono je prostymi tablicami znaków (char[]) i stałymi wskaźnikami do tekstów (const char*). Dzięki temu kod przestał korzystać z dynamicznej alokacji i zyskał kilkaset bajtów wolnego miejsca.

2. Przeniesienie danych do pamięci programu (PROGMEM)  

Tablice słów i wzorców Morse’a pierwotnie były przechowywane w RAM-ie, co powodowało, że kompilator kopiował je z FLASH do pamięci operacyjnej przy starcie programu. Zmieniono deklaracje na const char* const, co sprawiło, że dane pozostały w pamięci programu i nie były duplikowane. W efekcie zmniejszyło to zarówno zużycie FLASH, jak i RAM.

3. Uproszczenie słownika Morse’a  

Pierwotny słownik składał się z wielu instrukcji if (m == "...") return 'X';, co generowało długi kod maszynowy. Zastąpiono go prostą funkcją z porównaniami strcmp(), która jest bardziej kompaktowa i wykorzystuje wspólną logikę dla wszystkich liter. Dzięki temu kod słownika skrócił się o kilkaset bajtów.

4. Zastosowanie makra F() dla tekstów w Serial.println()  

Wszystkie komunikaty wypisywane przez port szeregowy przeniesiono do pamięci programu za pomocą makra F(). Bez tego kompilator umieszczał teksty w RAM-ie, co powodowało ich duplikację. Po zmianie komunikaty są odczytywane bezpośrednio z FLASH, co przyniosło kolejne oszczędności.

5. Redukcja liczby trybów i funkcji pomocniczych  

W pewnym momencie kod zawierał osiem trybów, w tym TX_WORD, który był najbardziej pamięciożerny. Usunięcie tego trybu pozwoliło uprościć strukturę programu i zmniejszyć liczbę powtarzających się fragmentów.

6. Skrócenie tablic i komunikatów  

Niektóre tablice (np. lista słów) zawierały długie ciągi znaków. Skrócono je do kilku prostych przykładów, zachowując sens działania trybu WORD. Zredukowano też długość komunikatów w Serial.println(), co dało niewielkie, ale istotne oszczędności.

7. Eliminacja zbędnych zmiennych i duplikacji kodu  

W wielu miejscach kod powtarzał te same operacje, np. czyszczenie bufora czy resetowanie flag. Zastąpiono je wspólnymi funkcjami i uproszczonymi warunkami logicznymi. Dzięki temu kod stał się bardziej zwarty i czytelny.

 

Zdjęcia
kod programu

ZIP poniżej

Pliki_projektu
Youtube
Tagi
morse przyciski ch32v003 dekoder_morse'a ch32v00