Оглавление:

Декодер Морзе двоичного дерева: 7 шагов (с изображениями)
Декодер Морзе двоичного дерева: 7 шагов (с изображениями)

Видео: Декодер Морзе двоичного дерева: 7 шагов (с изображениями)

Видео: Декодер Морзе двоичного дерева: 7 шагов (с изображениями)
Видео: Представление лабораторий ФИТИП. МНЦ КТ: Video Coding Lab, ИТМО ФИТИП, осень 2020. 2024, Ноябрь
Anonim
Image
Image
Принципиальная электрическая схема
Принципиальная электрическая схема

В этом руководстве объясняется, как декодировать код Морзе с помощью Arduino Uno R3.

Декодер, который автоматически настраивается на скорость отправки, способен декодировать морзе со скоростью не менее 80 слов в минуту.

Входящий код отображается в виде текста на последовательном мониторе Arduino (или на экране TFT, если он установлен).

Осциллятор тона был включен, если вы хотите попрактиковаться в отправке морзе.

Особенности декодера:

  • модуль дисплея TFT 320 x 240 [1]
  • цифровой полосовой фильтр Герцеля для разделения нежелательных сигналов.
  • «Двоичное дерево Морзе» для декодирования сигнала
  • автоматическое отслеживание скорости
  • звуковой выход при отработке азбуки морзе
  • отображаются как входящий, так и исходящий текст.

Распознаются следующие символы и символы:

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

Ориентировочная стоимость экрана декодера Морзе без TFT-дисплея составляет 25 долларов. [1]

Изображений

  • На фото на обложке изображен полностью собранный агрегат.
  • На видео видно, как работает декодер

Примечания

[1]

  • Модуль дисплея TFT не является обязательным, так как весь текст отправляется на ваш Arduino «Serial Monitor».
  • Модуль TFT описан в моей инструкции

Шаг 1: Список деталей

Следующие детали были получены с

1 только прототип экрана для Arduino UNO R3, шаг 2,54 мм

Следующие детали были получены на месте:

  • 1 только двойной операционный усилитель LM358
  • 1 только светодиод зеленый
  • 1 только светодиодный зажим
  • 1 только капсюль электретного микрофона
  • 1 только нормально разомкнутая кнопка
  • 1 только 8-контактный разъем DIP
  • 2 резистора всего 330 Ом
  • 2 только резистора 2К2
  • 5 резисторов всего 10 кОм
  • 2 резистора всего 56 кОм
  • 2 конденсатора емкостью 1 мкФ
  • 1 конденсатор емкостью 10 мкФ

Следующие части не являются обязательными:

  • 1 только 2,2-дюймовый TFT SPI ЖК-дисплей 240 * 320 ILI9341 со слотом для SD-карты для Arduino Raspberry Pi 51 / AVR / STM32 / ARM / PIC [1]
  • Клавиша / кнопка Морзе
  • 1 только транзистор BC548 NPN
  • 1 только 1-дюймовый динамик
  • 1 резистор всего 33 кОм
  • 1 моно штекер 3,5 мм (для ключа Морзе)
  • 1 моно гнездо 3,5 мм (для ключа Морзе)
  • 3 нейлоновых прокладки с резьбой 9 мм M3
  • 1 только коробка из АБС-пластика 130 x 68 x 44 мм
  • 5 только 2-контактных угловых разъема

Ориентировочная стоимость экрана декодера Морзе без учета дополнительного TFT-дисплея составляет 25 долларов. [1]

Примечания

[1]

Список деталей для дополнительного модуля TFT-дисплея 320 x 240 приведен в моем инструктируемом

[2]

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

Шаг 2: Принципиальная схема

Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема

Изображений

На фото 1 показана принципиальная схема декодера Морзе. Резистор на 330 Ом, включенный последовательно с ключом Морзе, ограничивает выходной ток D4 в случае случайного замыкания на массу… увеличение его значения снижает выходной аудиосигнал из динамика. По этой причине я не добавил его к экрану, а прикрепил его непосредственно к разъему для ключа Морзе, чтобы упростить регулировку

На фото 2 показан соответствующий щит. Экран взят из моего инструктируемого https://www.instructables.com/id/Arduino-TFT-Grap…, к которому я добавил микрофонный усилитель и тональный генератор. [1]

На фото 3 показан готовый щит, прикрепленный к Arduino. Никакие другие компоненты не требуются, если текст должен просматриваться на вашем «последовательном мониторе» Arduino

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

На фото 5 показан TFT-экран. К краям дисплея приклеена черная изолента … эта лента предотвращает утечку света и маскирует любое несовпадение между дисплеем и отверстием в крышке

Важный

[1]

Для Arduinos с большим USB-разъемом требуется слой изоленты между USB-разъемом и экраном Arduino. Случайное короткое замыкание возможно без ленты, так как зазор небольшой. Лента не требуется для Arduinos с небольшими разъемами

Шаг 3: теория

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

Каждая буква кода Морзе состоит из серии коротких и длинных звуковых сигналов, называемых «точками» и «тире».

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

Мы можем определить, является ли входящий тон точечным или тире, сравнив его продолжительность с эталонным тоном длиной 2 единицы.

  • точка меньше 2 единиц
  • тире больше 2 единиц

Есть два совершенно разных метода декодирования входящего паттерна точек и тире:

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

Линейный поиск

Один из распространенных методов - создать массив символов и соответствующих им паттернов Морзе. Например, каждый из следующих символов будет сохранен как:

  • А. _
  • B _…
  • C _. _.
  • 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. Цифровая обработка сигналов, такая как быстрое преобразование Фурье или фильтр Герцеля.

Для методов 1, 2, 3 требуются громоздкие внешние компоненты.

Метод 4 не требует внешних компонентов… частоты определяются с помощью математических алгоритмов.

Быстрое преобразование Фурье (БПФ)

Одним из методов обнаружения присутствия тона в сложной форме волны является использование быстрого преобразования Фурье.

Фотография 1 показывает, как БПФ (быстрое преобразование Фурье) делит звуковой спектр на «ячейки».

На фото 2 показано, как «ячейки» БПФ реагируют на сигнал… в данном случае 800 Гц. Если бы присутствовал второй сигнал, скажем, 1500 Гц, мы бы увидели два отклика… один на 800 Гц, а другой на 1500 Гц.

Теоретически декодер кода Морзе можно создать, отслеживая уровень выходного сигнала определенного частотного бина БПФ… большое число представляет собой наличие точки или тире… маленькое число означает отсутствие сигнала.

Такой декодер кода Морзе можно было бы создать, отслеживая «bin 6» на фото 2, но в этом подходе есть ряд недостатков:

  • нам нужен только один частотный бин … остальное - бесполезные вычисления
  • элементы разрешения по частоте могут не отображаться точно на интересующей частоте
  • это относительно медленно (20 мс на цикл Arduino ()

Другой метод - использовать фильтр Герцеля.

Фильтр Герцеля

Фильтр Герцеля похож на БПФ, но имеет только один частотный элемент.

На фото 3 показана частотная характеристика фильтра Герцеля на дискретные звуковые шаги.

Фото 4 - это развертка того же фильтра в том же частотном диапазоне.

Я решил "пойти" с алгоритмом Герцеля:

  • Время цикла Arduino () с использованием алгоритма Герцеля составляло 14 мс (миллисекунды) по сравнению с 20 мс (миллисекунды) для решения БПФ с использованием библиотеки Arduino «fix_FFT».
  • Центральную частоту полосового фильтра Герцеля легко установить.
  • Полоса пропускания составляет примерно 190 Гц.

На фото 5 показан числовой выходной сигнал фильтра Герцеля с частотой 900 Гц при обнаружении тона. Я установил свой порог тона на значение 4000… значения выше 4000 указывают на тон.

Теоретически вам просто нужно настроить фильтр на удобную для прослушивания частоту. К сожалению, аудиовыход моего 1-дюймового контрольного динамика быстро падает ниже 900 Гц. Чтобы избежать проблем, я использую частоту фильтра 950 Гц. Необходимые формулы для расчета альтернативных частот фильтра находятся в заголовке моего кода.

Расшифровка

Расшифровка точек и тире не так проста, как кажется на первый взгляд.

Совершенный морс определяется как:

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

Чтобы декодировать идеальный морс, нам просто нужна эталонная длительность тона в 2 единицы.

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

Это работает для машины Морзе, но в «реальном мире»:

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

Буквы, содержащие только точки и тире, частично решаются, если:

мы оцениваем контрольную продолжительность до тех пор, пока не получим действительную точку и действительное тире. Я использую 200 миллисекунд, что допустимо, если скорость отправки составляет от 6 слов в минуту до 17 слов в минуту. Вам может потребоваться увеличить это значение, если вы изучаете морзе. Таблица скорости включена в программное обеспечение

Вариации скорости решаются, если:

  • мы выполняем скользящее среднее для каждой точки и каждого штриха и
  • пересчитывать контрольную продолжительность после получения каждого символа

Пробелы в словах и недоработки устраняются, если мы:

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

Осциллятор Морзе

Сначала я попробовал несколько пьезо-зуммеров, но обнаружил:

  • частота была зафиксирована
  • выходная частота была слишком высокой для длительного прослушивания
  • пьезоэлементы имели тенденцию выходить за пределы полосы пропускания Герцеля

Затем я попытался управлять акустическим преобразователем с прямоугольной волной 750 Гц, но обнаружил, что у него есть резонанс, который отфильтровывает 1-ю и 3-ю гармоники. На фото 6 показан выход микрофонного усилителя на прямоугольную волну 750 Гц… мы видим 5-ю гармонику !!!

Затем я прибег к использованию небольшого динамика. На фото 7 показан выход микрофона на прямоугольную волну 750 Гц, которая была отправлена на небольшой динамик… на этот раз мы видим основную… а не пятую гармонику. Фильтр Герцеля игнорирует любые гармоники.

Примечания

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Шаг 5: Программное обеспечение

Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение

Установка

  • Скачайте прикрепленный файл MorseCodeDecoder.ino [1]
  • Скопируйте содержимое этого файла в новый скетч Arduino.
  • Сохраните эскиз как «MorseCodeDecoder» (без кавычек).
  • Скомпилируйте и загрузите скетч на свой Arduino

Обновление программного обеспечения 23 июля 2020 г.

В прикрепленный файл "MorseCodeDecoder6.ino" добавлены следующие функции.

  • окно "Точный Блэкман" [2]
  • a "Noise_blanker"

Корректирование:

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

Примечание

[1]

Установите последовательный монитор Arduino на 115200 бод, если вы тоже хотите просматривать текст.

[2]

  • Фото 1… Точное окно Блэкмана
  • Фото 2. Фильтр Герцеля без окна Exact Blackman.
  • Фото 3``, фильтр Герцеля с примененным окном Exact Blackman

Шаг 6: Эксплуатация

Декодер

При прослушивании азбуки Морзе поместите устройство рядом с динамиком.

  • Капсюль электретного микрофона улавливает сигнал Морзе из динамика.
  • Затем выходной сигнал электретного микрофона усиливается в 647 раз (56 дБ) перед передачей в Arduino для обработки.
  • Цифровой полосовой фильтр Герцеля выделяет сигнал Морзе из шума.
  • Расшифровка выполняется с помощью двоичного дерева.
  • Выходные данные декодера отображаются в виде текста на TFT-дисплее с разрешением 320 x 240 пикселей. Он также отправляется на ваш «последовательный монитор» Arduino, если вы не хотите использовать дисплей.

Морс-отправитель

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

  • Постоянный звуковой сигнал генерируется на выводе 4 Arduino.
  • Мы слышим этот тон через громкоговоритель декодера всякий раз, когда нажимаем клавишу Морзе.
  • Тон устанавливается на ту же частоту, что и фильтр Герцеля, который обманывает декодер, заставляя его думать, что он слушает настоящий Морзе… все, что вы отправляете, будет отображаться на дисплее в виде печатного текста.

Ваша отправка улучшится, поскольку декодер улавливает распространенные ошибки, такие как:

  • слишком много места между символами. (пример: Q обозначен как MA)
  • слишком много места между буквами (пример: ТЕПЕРЬ печатается как NO W)
  • неверный код

Шаг 7: Резюме

Декодер

В этом руководстве описывается, как сделать декодер Морзе, который преобразует азбуку Морзе в печатный текст.

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

Отправитель

Также был включен отправитель Морзе

  • Отправитель помогает вам улучшить качество отправки морзе.
  • Декодер подтверждает, что отправленные вами данные верны.

Стоимость запчастей

Ориентировочная стоимость экрана декодера Морзе без учета дополнительного TFT-дисплея составляет 25 долларов.

Щелкните здесь, чтобы просмотреть другие мои инструкции.

Аудио Вызов 2020
Аудио Вызов 2020
Аудио Вызов 2020
Аудио Вызов 2020

Второй приз Audio Challenge 2020

Рекомендуемые: