Съдържание:

Декодер на двоично дърво на Морс: 7 стъпки (със снимки)
Декодер на двоично дърво на Морс: 7 стъпки (със снимки)

Видео: Декодер на двоично дърво на Морс: 7 стъпки (със снимки)

Видео: Декодер на двоично дърво на Морс: 7 стъпки (със снимки)
Видео: Krisia, Hasan and Ibrahim - Planet Of The Children (Junior Eurovision 2014) - Official Video 2024, Ноември
Anonim
Image
Image
Електрическа схема
Електрическа схема

Тази инструкция обяснява как да декодирате азбуката на Морз с помощта на Arduino Uno R3.

Декодерът, който автоматично се настройва към скоростта на изпращане, е в състояние да декодира азбука до поне 80 думи в минута.

Входящият код се показва като текст на вашия Arduino сериен монитор (или TFT екран, ако има такъв)

Тонов осцилатор е включен, ако искате да практикувате изпращането на морз.

Характеристиките на декодера:

  • 320 x 240 TFT дисплей модул [1]
  • цифров лентов филтър на Goertzel за разделяне на нежелани сигнали.
  • „Двоично дърво на Морс“за декодиране на сигнала
  • автоматично проследяване на скоростта
  • звуков изход при практикуване на морз
  • се показват както входящият, така и изходящият текст.

Разпознават се следните знаци и символи:

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

Приблизителната цена на щита за декодиране на Морзе, минус TFT дисплея, е 25 долара. [1]

Изображения

  • Снимката на корицата показва напълно сглобена единица
  • Видеото показва как декодерът работи

Бележки

[1]

  • Модулът за TFT дисплей е незадължителен, тъй като целият текст се изпраща към вашия Arduino „Serial Monitor“.
  • TFT модулът е описан в инструкциите ми

Стъпка 1: Списък на частите

Следните части са получени от

1 единствен прототип на щит за Arduino UNO R3, 2.54mm Pitch

Следните части са получени локално:

  • 1 само LM358 двойна опампа
  • 1 само светодиод зелен
  • 1 само LED скоба
  • 1 само капсула с електретен микрофон
  • 1 само нормално отворен бутон
  • 1 само 8-пинов DIP контакт
  • 2 само 330 ома резистори
  • 2 само 2K2 резистора
  • 5 само 10K ома резистори
  • 2 само 56K ома резистори
  • 2 само 1uF кондензатор
  • 1 само 10uF кондензатор

Следните части са незадължителни:

  • 1 само 2.2 -инчов TFT SPI LCD дисплей модул 240*320 ILI9341 със слот за SD карта за Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Морзов ключ / бутон
  • 1 само BC548 NPN транзистор
  • 1 само 1 инчов високоговорител
  • 1 само 33K ом резистор
  • 1 само 3,5 мм моно щепсел (за ключ на Морз)
  • 1 само 3,5 мм моно гнездо (за морзов ключ)
  • 3 само 9 мм найлонови дистанционни елементи M3 с накрайник
  • 1 само 130 x 68 x 44 мм ABS пластмасова кутия
  • 5 само 2-пинови конектори за прав ъгъл

Приблизителната цена на щита за декодиране на Морзе, минус опционалния TFT дисплей, е 25 долара. [1]

Бележки

[1]

Списъкът с части за опционалния 320 x 240 TFT дисплей модул е посочен в инструкциите ми

[2]

Ако искате да използвате подателя, е необходим ключ на Морзе или здрав бутон.

Стъпка 2: Електрическа схема

Електрическа схема
Електрическа схема
Електрическа схема
Електрическа схема
Електрическа схема
Електрическа схема

Изображения

Снимка 1 показва електрическата схема на декодера на Морз. Резисторът от 330 ома, последователно с клавиша на Морс, ограничава изходния ток D4 в случай на случайно късо съединение към масата … увеличаването на неговата стойност намалява аудио изхода от високоговорителя. Поради тази причина не съм го добавил към щита, а го прикрепих директно към жака за морзов ключ за по-лесно регулиране

Снимка 2 показва съвпадащ щит. Щитът е от моя инструкционен https://www.instructables.com/id/Arduino-TFT-Grap…, към който добавих усилвателя на микрофона и тоналния осцилатор. [1]

Снимка 3 показва завършения щит, прикрепен към Arduino. Не се изискват никакви други компоненти, ако текстът трябва да се гледа на вашия Arduino „Serial Monitor“

Снимка 4 показва декодера частично в кутия. В капака е изрязан отвор за гледане на дисплея. Високоговорителят и микрофонът са залепени горещо към корпуса. Пробийте няколко отвора за високоговорители в капака, преди да монтирате високоговорителя. Централният гнездо на капака е за разширителен микрофон … без това декодерът трябва да бъде поставен близо до високоговорителя, което не винаги е възможно

Снимка 5 показва TFT екрана. Черна електрическа лента е прикрепена към ръбовете на дисплея … тази лента предотвратява изтичането на светлина и маскира всяко разминаване между дисплея и отвора в капака

Важно

[1]

Arduinos с голям USB конектор изисква слой електрическа лента между USB конектора и Arduino щита. Случайни къси панталони са възможни без лентата, тъй като хлабината е малка. Лентата не е необходима за Arduinos, които имат малки конектори

Стъпка 3: Теория

Теория
Теория
Теория
Теория
Теория
Теория

Всяка буква на азбуката на Морз включва поредица от кратки и дълготрайни тонове, наречени „точки“и „тирета“.

  • точка (.) е с дължина 1 единица
  • тире (_) е с дължина 3 единици
  • пространството между буквените елементи е 1 единица
  • интервалът между буквите е 3 единици
  • пространството между думите е 7 единици

Можем да определим дали входящият тон е точка или тире, като сравним продължителността му с референтен тон с дължина 2 единици.

  • точка е по -малко от 2 единици
  • тире е по -голямо от 2 единици

Има два ясно различни метода за декодиране на входящия модел на точки и тирета:

  • линейно търсене
  • двоично дърво (известно също като дихотомично търсене)

Линейно търсене

Един често срещан метод е да се създаде масив от знаци и съответстващите им модели на Морзе. Например всеки от следните знаци ще бъде записан като:

  • А. _
  • Б _…
  • ° С _. _.
  • 0 _ _ _ _ _
  • 1. _ _ _ _
  • 2.. _ _ _

Всяка буква изисква 6 клетки … 1 за самата буква и 5 за буквите (.) И (_). За да направим това, се нуждаем от букви [36] [6] символен масив с общо 216 клетки. Неизползваните клетки обикновено се запълват с нула или празно място.

За да декодираме входящите точки и тирета, трябва да сравним модела точки/тирета на всяка входяща буква с нашите референтни символни модели.

Въпреки че този метод работи, той е изключително бавен.

Да речем, че имаме 26 букви ('A',.. 'Z') и цифрите ('0', … '9'), съхранени в масив, тогава трябва да извършим 36 търсения, всяко с до 5 под-търсения, което е общо 36*5 = 180 търсения за декодиране на цифрата '9'.

Двоично дърво

Двоичното търсене е много по -бързо, тъй като не са необходими търсения.

За разлика от линейното търсене, което изисква да се съхраняват както знаците, така и моделите на Морзе, двоичното дърво съхранява само знаците, което означава, че размерът на масива е по -малък.

Разделих двоичното си дърво (снимка1) на две половини (снимки 2 и 3), за да стане по -четимо.

За да намерим знак, преместваме показалец наляво всеки път, когато чуем точка и преместваме показалеца надясно всеки път, когато чуем тире. След всеки ход ние разделяме наполовина разстоянието на показалеца за следващия ход … оттук и името двоично дърво.

За декодиране на буквата „9“(тире, тире, тире, тире, точка) са необходими 5 хода… 4 надясно и 1 вляво, което оставя показалеца директно над „9“.

Пет хода са значително по -бързи от 180 търсения !!!!!

Двоичният масив от символи също е по -малък … 26 букви и 10 цифри изискват само масив от 64 x 1 ред. Избрах да създам масив от 128 знака, за да мога да декодирам пунктуацията.

Стъпка 4: Бележки за дизайна

Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна

Морзе е трудно да се декодира при наличие на смущаващи сигнали. Нежеланите сигнали трябва да бъдат отхвърлени … това изисква някакъв филтър.

Има много възможности:

  1. Фазово заключени контури
  2. Индуктор-кондензаторни филтри
  3. Резисторно-кондензаторни активни филтри
  4. Цифрова обработка на сигнал, като например бързо преобразуване на Фурие, или филтър на Goertzel.

Методи 1, 2, 3 изискват външни компоненти, които са обемисти.

Метод 4 не изисква външни компоненти … честотите се откриват с помощта на математически алгоритми.

Бърза трансформация на Фурие (FFT)

Един метод за откриване на наличието на тон в сложна форма на вълната е да се използва бързата трансформация на Фурие

Снимка 1 показва как FFT (бърза трансформация на Фурие) разделя аудио спектъра на „контейнери“.

Снимка 2 показва как FFT „контейнерите“реагират на сигнал … в този случай 800Hz. Ако присъстваше втори сигнал, да речем 1500Hz, щяхме да видим две реакции … една на 800Hz и друга на 1500Hz.

На теория декодер на азбука на Морз може да бъде направен чрез наблюдение на изходното ниво на определена битова честотна лента … голям брой представлява наличието на точка или тире … малък брой не представлява сигнал.

Такъв декодер на азбуката на Морз може да бъде направен чрез наблюдение на „кош 6“на снимка 2, но има няколко неща, които не са наред с този подход:

  • искаме само една честотна лента … останалите са напразни изчисления
  • честотните кутии може да не се показват точно на честотата, която представлява интерес
  • сравнително бавен е (20mS на контур на Arduino ()

Друг метод е да използвате филтър на Goertzel.

Goertzel филтър

Филтърът Goertzel е подобен на FFT, но има само една честотна лента.

Снимка 3 показва честотната характеристика на филтър на Goertzel към дискретни аудио стъпки.

Снимка 4 е размахване на същия филтър в същия честотен диапазон.

Реших да „отида“с алгоритъма на Goertzel като:

  • Времето на Arduino loop (), използващо алгоритъма Goertzel, е 14mS (милисекунди) срещу 20mS (милисекунди) за FFT решение, използващо библиотеката „fix_FFT“на Arduino.
  • Лесно е да настроите централната честота на лентов филтър на Goertzel.
  • Пропускателната способност е приблизително 190Hz.

Снимка 5 показва числовия изход от 900Hz Goertzel филтър, когато се открие тон. Задал съм тоновия си праг на стойност 4000 … стойностите над 4000 означават тон.

На теория просто трябва да настроите филтъра си на удобна за слушане честота. За съжаление аудио изходът от моя 1 -инчов високоговорител за мониторинг пада бързо под 900Hz. За да избегна всякакви проблеми, използвам филтърна честота 950Hz. Необходимите формули за изчисляване на алтернативни честоти на филтрите се намират в заглавката на моя код.

Декодиране

Декодирането на точките и тиретата не е толкова лесно, колкото изглежда на пръв поглед.

Перфектният морз се определя като:

  • точка = 1 единица
  • интервали в буквата = 1 единица
  • тире = 3 единици
  • интервал между букви = 3 единици
  • интервал между думите = 7 единици

За да декодираме перфектен морз, просто се нуждаем от референтна продължителност на тона от 2 единици

  • точка <2 единици
  • пространство на елементите <2 единици
  • тире> 2 единици
  • буква _пространство> 2 единици
  • word_space> 6 единици (т.е. 3 x референтни единици)

Това работи за машината на Морс, но в „реалния свят“:

  • скоростта на изпращане варира
  • продължителността на всяка точка е различна
  • продължителността на всяко тире варира
  • буквите E, I, S, H, 5 съдържат само точки, които са средни за продължителността на точката
  • буквите T, M, O, 0 съдържат само тирета, които са средни за продължителността на тирето
  • пропуските в думите може да не се появят
  • избледняване създава грешки, от които декодерът трябва да се възстанови.
  • повредени сигнали поради смущения

Буквите, съдържащи само точки и тирета, са частично решени, ако:

ние изчисляваме референтната продължителност, докато не получим валидна точка и тире. Използвам 200 милисекунди, което е валидно, ако скоростта на изпращане е между 6 WPM (думи в минута) и 17 WPM. Може да се наложи да увеличите тази стойност, ако изучавате морз. В софтуера е включена таблица за скоростта

Промените в скоростта се решават, ако:

  • изпълняваме подвижна средна стойност за всяка точка и всяко тире и
  • преизчислете референтната продължителност след получаване на всеки символ

Дупките и дупките, които не пристигат, се решават, ако:

  • запомнете времето на последния преход (тон към без тон),
  • рестартирайте алгоритъма след всяка буква,
  • изчисляване на изминалото време, докато се чака следващият преход (без тон към тон) и
  • вмъкнете интервал, ако са надхвърлени 6 времеви единици.

Осцилатор на Морс

Първоначално опитах някои пиезо зумери, но намерих:

  • честотата беше фиксирана
  • изходната честота е твърде висока за продължително слушане
  • пиезотата имаха тенденция да се отклоняват от пропускателната лента на Goertzel

След това се опитах да управлявам акустичен преобразувател с 750Hz квадратна вълна, но установих, че той има резонанс, който филтрира 1 -ва и 3 -та хармоника. Снимка 6 показва изхода на микрофонния усилвател на 750Hz квадратна вълна … виждаме 5-та хармоника !!!

След това прибягнах до използването на малък високоговорител. Снимка 7 показва изхода на микрофона към 750Hz квадратна вълна, която е изпратена до малък високоговорител … този път виждаме фундаменталната … не 5 -та хармоника. Филтърът на Goertzel пренебрегва всички хармоници.

Бележки

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Стъпка 5: Софтуер

Софтуер
Софтуер
Софтуер
Софтуер
Софтуер
Софтуер

Инсталация

  • Изтеглете прикачения файл MorseCodeDecoder.ino [1]
  • Копирайте съдържанието на този файл в нова скица на Arduino
  • Запазете скицата като "MorseCodeDecoder" (без кавичките)
  • Компилирайте и качете скицата във вашия Arduino

Софтуерна актуализация 23 юли 2020 г.

Следните функции са добавени към прикачения файл "MorseCodeDecoder6.ino"

  • прозорец "Точен Blackman" [2]
  • "Noise_blanker"

Регулиране:

  • увеличете нивото на звука на приемника, докато светодиодът започне да мига, след което се изключи
  • сега настройте приемника си, докато светодиодът започне да мига в крак с входящия морс
  • Noise_blanker е настроен да игнорира шумовите изблици до 8mS (време на един цикъл)
  • прагът на шума може да се регулира, като зададете Debug = true и гледате вашия сериен плотер

Забележка

[1]

Настройте вашия Arduino Serial Monitor на 115200 бода, ако желаете и вие да прегледате текста.

[2]

  • Снимка 1… Точен прозорец на Blackman
  • Снимка 2… Филтър на Goertzel без прозорец с точен Blackman
  • Снимка 3,,, Goertzel филтър с приложен Точен прозорец на Blackman

Стъпка 6: Операция

Декодер

Поставете устройството до високоговорителя, когато слушате морзе.

  • Капсулата за електретен микрофон улавя морзов сигнал от вашия високоговорител.
  • След това изходът на електретен микрофон се усилва 647 пъти (56dB), преди да бъде предаден на Arduino за обработка.
  • Цифров лентов филтър на Goertzel извлича морзов сигнал от шума.
  • Декодирането се извършва с помощта на двоично дърво.
  • Изходът на декодера се показва като текст на TFT дисплей с размери 320 x 240 пиксела. Той също се изпраща до вашия Arduino „Serial Monitor“, ако не искате да използвате дисплей.

Морзов подател

Включен е и подател на морс. Това ви позволява да практикувате изпращането на морз и работи по следния начин:

  • На пин 4 на Arduino се генерира постоянен звуков тон.
  • Чуваме този тон през високоговорителя на декодера, когато натискаме клавиша на Морз.
  • Тонът е настроен на същата честота като филтъра на Goertzel, който заблуждава декодера да мисли, че слуша на истински морз … каквото и да изпратите, ще се появи като отпечатан текст на дисплея.

Изпращането ви ще се подобри, тъй като декодерът улавя често срещани грешки като:

  • твърде много пространство между символите. (пример: Q пинтиран като MA)
  • твърде много място между букви (пример: СЕГА отпечатано като NO W)
  • грешен код

Стъпка 7: Обобщение

Декодер

Тази инструкция описва как да се направи декодер на Морз, който преобразува азбуката на Морз в отпечатан текст.

  • Декодерът е в състояние да декодира азбуката до поне 80 WPM (думи в минута)
  • Декодерът автоматично проследява вариациите в приетата скорост на изпращане.
  • Текстът се показва на вашия сериен монитор (или на 320 x 240 TFT дисплей модул, ако има такъв) [1]

Изпращач

Включен е и подател на морс

  • Изпращачът ви помага да подобрите качеството на изпращането си по морз.
  • Декодерът потвърждава, че изпратеното от вас е правилно

Цената на частите

Приблизителната цена на щита за декодиране на Морзе, минус опционалния TFT дисплей, е 25 долара.

Щракнете тук, за да видите другите ми инструкции.

Аудио предизвикателство 2020
Аудио предизвикателство 2020
Аудио предизвикателство 2020
Аудио предизвикателство 2020

Втора награда в Audio Challenge 2020

Препоръчано: