азбука морзе на ардуино код
Перевод азбуки Морзе в текст
Мы общаемся друг с другом через наши естественные сенсоры (язык, жест и т.д.). Интересная часть общения людей начинается тогда, когда вы хотите поделиться с кем-либо какой-то секретной информацией. Но вопрос в том, как это сделать? Нужно передавать информацию так, что даже третье лицо смотря на сообщение не сможет понять его до тех пор, пока не найдет ключ. Так родилась простая экспериментальная идея по созданию проекта расшифровки азбуки Морзе.
Комплектующие
В нашем уроке нам пригодится следующий список комплектующих:
Оборудование
Программное обеспечение
Что такое азбука Морзе?
Причина выбора идеи для проекта очень банальна. В одном фильме агент передавал информацию азбукой Морзе, нажимая на кнопку передатчика, а на приемном конце другие люди расшифровывали переданную информацию. Стало интересно сделать это с помощью Arduino и простых базовых компонентов.
На картинке выше приведены буквы латинского алфавита передаваемые азбукой Морзе. Стоит заметить, что на практике вместо заучивания количества точек, тире и их последовательности запоминают так называемый «напев» (мнемоническую словесную форму), соответствующий каждому знаку кода Морзе. «Напевы» не являются стандартными, они могут различаться в зависимости от школы обучения или вообще не применяться (тогда обучаемый запоминает «мелодию» символа). Если в радиограмме только цифры, то вместо пяти тире нуля передается только одно тире. Ниже приводим таблицу с символами латинского и русского алфавитов в азбуке Морзе и примерах напевов:
Русский символ | Латинский символ | Код Морзе | «Напев» |
---|---|---|---|
А | A | · − | ай-даа, ай-ваа |
Б | B | − · · · | баа-ки-те-кут, беей-ба-ра-бан |
В | W | · − − | ви-даа-лаа, вол-чаа-таа |
Г | G | − − · | гаа-раа-жи, гаа-гаа-рин |
Д | D | − · · | доо-ми-ки, даай-ку-рить |
Е (также и Ё) | E | · | есть |
Ж | V | · · · − | же-ле-зис-тоо |
З | Z | − − · · | заа-каа-ти-ки |
И | I | · · | и-ди, ишь-ты |
Й | J | · − − − | йес-наа-паа-раа, йош-каа-роо-лаа |
К | K | − · − | каак-же-таак, каак-де-лаа |
Л | L | · − · · | лу-наа-ти-ки |
М | M | − − | маа-маа |
Н | N | − · | ноо-мер, наа-те |
О | O | − − − | оо-коо-лоо |
П | P | · − − · | пи-лаа-поо-ёт |
Р | R | · − · | ре-шаа-ет, ру-каа-ми |
С | S | · · · | си-ни-е, си-не-е, са-мо-лёт |
Т | T | − | таак, таам |
У | U | · · − | у-нес-лоо, у-бе-гуу |
Ф | F | · · − · | фи-ли-моон-чик |
Х | H | · · · · | хи-ми-чи-те |
Ц | C | − · − · | цаа-пли-наа-ши, цаа-пли-цаа-пли |
Ч | Ö | − − − · | чаа-шаа-тоо-нет, чее-лоо-вее-чек |
Ш | CH | − − − − | шаа-роо-ваа-рыы, шуу-раа-доо-маа |
Щ | Q | − − · − | щаа-ваам-не-шаа, щуу-каа-жи-ваа |
Ъ | Ñ | − − · − − | твёёр-дыый-не-мяяг-киий |
Ы | Y | − · − − | ыы-не-наа-доо |
Ь (также и Ъ) | X | − · · − | тоо-мяг-кий-знаак, знаак-мяг-кий-знаак |
Э | É | · · − · · | э-ле-роо-ни-ки, э-ле-ктроо-ни-ка |
Ю | Ü | · · − − | ю-ли-аа-наа |
Я | Ä | · − · − | я-маал-я-маал |
1 | · − − − − | и-тооль-коо-оо-днаа | |
2 | · · − − − | две-не-хоо-роо-шоо | |
3 | · · · − − | три-те-бе-маа-лоо | |
4 | · · · · − | че-тве-ри-те-каа | |
5 | · · · · · | пя-ти-ле-ти-е | |
6 | − · · · · | поо-шес-ти-бе-ри | |
7 | − − · · · | даа-даа-се-ме-ри | |
8 | − − − · · | воо-сьмоо-гоо-и-ди | |
9 | − − − − · | ноо-наа-ноо-наа-ми | |
0 | − − − − − | нооль-тоо-оо-коо-лоо | |
Точка | · · · · · · | то-чеч-ка-то-чеч-ка | |
Запятая | · − · − · − | крю-чоок-крю-чоок-крю-чоок | |
Двоеточие | − − − · · · | двоо-ее-тоо-чи-е-ставь | |
Точка с запятой | − · − · − · | тоо-чка-заа-пя-таа-я | |
Скобка | − · − − · − | скоо-бку-стаавь-скоо-бку-стаавь, скоо-бку-тыы-мнее-пи-шии | |
Апостроф | · − − − − · | крю-чоок-тыы-веерх-ниий-ставь | |
Кавычки | · − · · − · | ка-выы-чки-ка-выы-чки, ка-выы-чки-от-крыы-ли, ка-выы-чки-за-крыы-ли | |
Тире | − · · · · − | чёёр-точ-ку-мне-да-ваай, чёёр-точ-ку-ты-пи-шии | |
Косая черта | − · · − · | дрообь-здесь-пред-стаавь-те, доо-ми-ки-ноо-мер | |
Вопросительный знак | · · − − · · | вы-ку-даа-смоо-три-те, до-про-сии-лии-е-го, у-нес-лоо-доо-ми-ки, э-ти-воо-проо-си-ки | |
Восклицательный знак | − − · · − − | оо-наа-вос-кли-цаа-лаа | |
Знак раздела | − · · · − | рааз-де-ли-те-каа | |
Ошибка/перебой | · · · · · · · · | хи-ми-чи-те-хи-ми-чи-те, ше-стью-во-семь-со-рок-во-семь | |
@ | · − − · − · | со-баа-каа-ре-шаа-ет, со-баа-каа-ку-саа-ет | |
Конец связи | · · − · − | хо-ро-шоо-по-каа, хо-ро-шоо-да-ваай, до-сви-даа-ни-яя |
Как работает этот проект? Очень просто. Когда вы соберете комплектующие нашего «дешифратора» по схеме на макетной плате и загрузите скетч, то далее нужно будет выбрать Serial Monitor (последовательный монитор) и вы увидите информацию как на картинке ниже:
Схема соединения
Инструкция ниже представлена для соединения цифровых выводов Arduino и макета:
Другие соединения нужно сделать согласно схематическому изображению выше. После того как вы всё соединили вы готовы переходить к следующему шагу, а точнее к коду программы нашего дешифратора. Скажем сразу, знание английского языка приветствуется, если вы хотите стать хорошим программистом.
Код дешифратора
Ниже вы можете скачать или скопировать код нашего «дешифратора» азбуки Морзе в текст с помощью Ардуино:
Лазерная связь между двумя Arduino кодом Морзе
Почему лазерный луч, а не радиосвязь? Ради фана. С целью обеспечения секретности, радиопередачи перехватывают все кому не лень, а перехватывать вспышки света не догадаются, к тому же нужно встать в направлении передачи луча. Возможно использовать там, где радиосвязь невозможна из-за сильных помех.
Передатчик
Передатчик подключается как самая простая схема в Ардуине (Blink), можно поморгать код Морзе и обычным светодиодом, но на небольшое расстояние, для передачи на метровые расстояния придется воспользоваться лазером. Лазер можно взять или из лазерной указки или купить в магазине специальный модуль для Ардуино с 3 контактами:
Схема подключения лазера к Ардуино:
Так как KY-008 part не нашлась в fritzing на схеме пришлось использовать RGB светодиод, подписав ноги S и “-“, S пин подключаем к 13 ноге, минус к GND (земле).
Для передачи данных воспользуемся кодом Морзе — способ представления букв алфавита последовательностью длинных («тире») и коротких («точка») сигналов. Конечно, при передаче кодом Морзе нет коррекции ошибок, но для тестовой передачи можно обойтись и без нее. Так как мы все равно знаем последовательность передаваемых символов.
В коде скетча указываем на каком контакте будет подаваться морзянка, 13 нога (как для большинства blink.ino скетчей моргания светодиодом), второй параметр отвечает за скорость передачи (24 слов в минуту), 3 параметр 1 для beep звукового сигнала и 0 для PTT (переключение пина в HIGH и LOW). Если заглянуть в код Morse.cpp то увидим что для третьего параметра 1 – beep используется как аналоговый выход запись на пин:
analogWrite(_pin, 128);
delay(_dashlen);
analogWrite(_pin, 0);
delay(_dotlen);
а для 0 – используется как цифровой выход
digitalWrite(_pin, HIGH);
delay(_dashlen);
digitalWrite(_pin, LOW);
delay(_dotlen);
В нашем случае используем код: Morse morse(13, 24, 0);
Для работы скетча необходима библиотекой morze.zip автора Erik Linder. Скетч передатчика простой:
Заливаем скетч, система готова к передаче данных.
Приемник
Собираем схему приемника, ничего сложного, фоторезистор одна нога с 5V вторая нога аналоговый порт A0, резистор 10 кОм — одна нога GND («земля»), вторая нога A0:
Приемник с LCD экраном
Полученные данные выводятся в COM порт, это конечно здорово, но не наглядно и требует наличие включенного компьютера. Поэтому подключаем 2 строчный экран с I2C подключением:
Для экрана SDA подключаем ногу arduino UNO A5, SCL – A4, VCC экрана к 5V, GND к GND:
Добавляем в скетче приемника receiver.ino строки отвечающие за вывод на 2 строчный LCD экран. Можно теперь уйти в поле с компактным приемником и прочитать сообщение прямо с LCD экрана.
Итоги
Данный способ передачи успешно работал у меня как и в комнате вечером на расстоянии 0,5–3 метра, так и вечером на улице на расстоянии 7–14 м. Большие расстояния пока не были опробованы. Передача днем потребует светозащищенной трубы чтобы на фотоэлемент не падал солнечный и дневной свет, а только свет от лазера или нужно поиграться параметром LEVEL_LDR отвечающий за чувствительность к свету в скетче приемника.
Станция азбуки Морзе на Arduino Uno
Создадим станцию дешифровки азбуки Морзе с помощью Arduino Uno с использованием графического дисплея.
Компоненты
Для создания нашей станции азбуки Морзе нам понадобятся следующие компоненты:
О проекте
Код азбуки Морзе вводится нажатием кнопки. Одно короткое нажатие для точки и более длинное (не менее чем в два раза длиннее) для тире.
При вводе распознанного кода отображается буква или цифра, которую он представляет. Если между нажатиями сделать паузу примерно в 1,5 секунды, то на дисплее появится пробел, позволяющий вводить слова. Если код не распознан, на экране отобразится символ ‘?’.
Азбука Морзе является методом связи, который кодирует символы в виде серии точек и тире. Эта схема использует зуммер, чтобы сделать точки и тире слышимыми. Используя кнопку, вы вводите азбуку Морзе, при каждом нажатии кнопки раздается звуковой сигнал, а на OLED-дисплее отображается декодированное сообщение.
Большинство людей не знакомы с азбукой Морзе, поэтому изображение ниже показывает все международные коды азбуки Морзе:
Схема соединения
Соедините все комплектующие согласно схеме ниже:
Скетч
Загружаем в Arduino Uno скетч для платы ниже:
Можно попробовать поиграть с кодом, чтобы после декодирования нажатий вывести на последовательный монитор полное слово или предложение.
Генератор кода Морзе на Arduino Uno
Азбука Морзе (код Морзе) – это система связи для кодирования любого символа в двух различных длительностях сигналов, называемых точками и тире. Азбука Морзе разработана Сэмюэлем Ф. Б. И в дальнейшем стала использоваться в телеграфии для передачи секретной информации. Больше всего она использовалась во время Второй мировой войны. Код Морзе можно формировать с помощью постукивания, мигающего света или письма. Код Морзе доступен в двух вариантах: оригинальный и международный код. В международной версии азбуки Морзе оригинальная версия модифицируется путем удаления пробелов и создания тире определенной длины.
Код Морзе может быть использован для кодирования алфавитов и цифр. Он, в основном, используется в радиосвязи и океанской связи, а также является частью подготовки солдат. Его очевидным достоинством по сравнению со всеми другими современными методами передачи информации является то, что прием информации при его использовании можно осуществлять при очень слабом уровне сигнала, ниже уровня шумов – в этих условиях не может работать ни одна современная система связи (широкополосные сигналы не в счет, приводить в сравнение их здесь некорректно).
Язык всегда был барьером для азбуки Морзе, так как трудно выполнить код для диакритических символов на другом языке. Есть несколько известных слов, которые считаются важной особенностью азбуки Морзе, например «SOS». SOS (расшифровывается как Save Our Souls) – означает спасение наших душ. Он был создан как универсальный сигнал бедствия.
На следующем рисунке показана азбука Морзе для английского алфавита от A до Z.
В этой статье мы рассмотрим создание генератора кода Морзе на основе платы Arduino Uno, который будет принимать символы из окна монитора последовательной связи и конвертировать их в код Морзе с помощью зуммера. Статья переведена с иностранного сайта, поэтому представленный генератор кода Морзе работает только с английским алфавитом (впрочем, как и все другие аналогичные статьи на эту тему, которые мне удалось найти в рунете). Но, поняв принцип этого проекта, вы легко можете переписать его программу для работы с русским алфавитом – если вы сделаете это, будем вам признательны если поделитесь кодом этой программы с другими посетителями нашего сайта (могу включить код вашей программы в текст данной статьи).
Необходимые компоненты
Схема проекта
Схема генератора кода Морзе на основе платы Arduino Uno представлена на следующем рисунке.
Как вы можете видеть, схема очень проста. Просто соедините положительный контакт зуммера с контактом 8 платы Arduino Uno, а его отрицательный контакт – к земле платы Arduino Uno. Загрузите код программы в плату Arduino и можете начинать печатать символы в окне монитора последовательной связи – зуммер начнет издавать сигналы кода Морзе, соответствующие данным символам. Также схему можно усовершенствовать, включив в нее ЖК дисплей 16х2.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Сначала в программе объявим переменную, в которую будем записывать символы, которые мы в дальнейшем будем конвертировать в код Морзе.
Знакомство с Arduino, часть 2. Морзе-клавиатура: альфа-версия
Даже на базе простейшего — лампочка с кнопкой — скетча можно собрать вполне самостоятельное устройство. Думаете, речь пойдет о настольной лампе? Нет. Попробуем собрать простейший вариант аккордной клавиатуры.
Аккордная клавиатура — это устройство, позволяющее вводить текст, но в отличие от обычной полноразмерной qwerty-клавиатуры аккордная имеет небольшое число кнопок (обычно от 3-5 и до дюжины). При этом символ вводится одновременным нажатием не одной, а нескольких кнопок — аккордом. Также символ может вводиться не одним, а несколькими последовательными нажатиями. На клавиатуре компьютера мы тоже время от времени используем аккорды — например, вводя заглавную букву одновременным нажатием соответствующей клавиши и shift’а. Или используя разнообразные заклинания вроде Shift+Ctrl+S или Ctrl+Alt+Del. Какую же аккордную клавиатуру можно собрать, используя только одну кнопку? Вспомним старую добрую проверенную временем азбуку Морзе.
Конечно, азбука Морзе не слишком подходит для полноценного набора текстов, но отлично годится для примера создания на базе Arduino вполне осмысленного работающего устройства. Итак, мы собираемся создавать не учебный пример, а прототип полноценного коммерческого девайса. Он должен не просто превращать нажатия кнопки в символы, но и давать возможность переключать раскладку, а при отсутствии активности пользователя — переходить в спящий режим. Кроме того, должна быть какая-то обратная связь, позволяющая пользователю быть в курсе текущего состояния клавиатуры.
Начнем с разработки альфа-версии устройства. Для альфы нам потребуются:
— Arduino-совместимая плата
— кнопка
— светодиод
— резистор 330 Ом
— резистор 1 кОм
— резистор 10 кОм
— макетная плата
— 7 проводков для макетной платы
— кабель USB/miniUSB
Логика распознавания точек и тире будет простейшая. Если нажатие кнопки длилось менее некоторого времени, устройство определит сигнал как точку. Если дольше — как тире.
Длительное нажатие — переключит раскладку клавиатуры с кириллицы на латынь и обратно. В качестве индикатора будем использовать светодиод. Пусть погасший светодиод означает кириллическую раскладку, горящий — латинскую. При нажатии кнопки во время печати светодиод будет загораться (при включенной кириллице, для латыни — наоборот, гаснуть).
Если клавиша в течение минуты не нажималась — устройство переходит в спящий режим. В спящем режиме пусть диод потихоньку мигает. Выход из спящего режима — длительное нажатие кнопки. Когда это нажатие становится достаточным для вывода устройства из спячки, светодиод загорается на полную яркость, чтобы стало ясно, что девайс проснулся и кнопку можно отпускать.
Схема скетча:
Соберем схему, показанную на рисунке выше. Черные проводки на схеме идут к «земле», красные — к +5В. Не забудем, что подключать диод нужно так, чтобы к «земле» был подключен отрицательный, более короткий вывод диода.
Схему скетча можно логически разбить на 2 цепи — диодную и кнопочную.
Светодиод имеет весьма небольшое внутреннее сопротивление, и если мы подключим его напрямую, то возникший в цепи большой ток может сжечь порт микроконтроллера. Поэтому, подключив небольшое 330-омное сопротивление, мы ограничим ток. Величину тока легко оценить, воспользовавштись законом Ома, гласящему, что ток равен отношению напряжения к сопротивлению: I = V/R. В нашем случае примем сопротивление светодиода за 0 и получим по формуле ток, равный 5 Вольт / 330 Ом = 15.1515… миллиампер. Порты микроконтроллера выдерживают ток до 40 мА (сколько выдержат ваши диод и микроконтроллер — смотрите по спецификациям), так что 15-16 мА — вполне в пределах допустимого.
Кнопочная цепь несколько сложнее. Что касается резистора R2 — тут все понятно. Мы подключаем его чтобы ограничить текущий через нажатую кнопку ток. Зачем нужен резистор R3? Попробуем разобраться в «физике» работы цифрового порта. Если мы подключим кнопку без этого резистора, подключающего «землю» к порту7, то при ненажатой кнопке к 7-му порту будет подключен только синий проводок, по которому не идет никакого тока. Казалось бы, это значит, что к порту ничего не подключено. Вовсе нет! Этот проводок, играя роль антенны, начнет собирать наводки от электросети, компьютера и т.п. В результате на вход порта посыплется цифровой мусор, хаотическая последовательность логических нулей и единиц — как если бы мы постоянно случайным образом нажмали/отпускали кнопку. Сопротивление R3 подводит к порту «землю» для того, чтобы при ненажатой кнопке на порт поступал совершенно конкретный потенциал — потенциал «земли», логический «ноль». Когда мы замкнем кнопку, на порт пойдет +5В — логическая «единица».
Исходный текст скетча для морзе-клавиатуры:
Скопируем текст скетча в Arduino IDE. Кнопкой Verify откомпилируем скетч.
Переключимся на кириллицу, нажав и удерживая кнопку. Лампочка, отследив нажатие, погаснет. Как только нажатие будет достаточно долгим и раскладка переключится, лампочка светодиода загорится. При переключении с кириллицы на латынь лампочка будет вести себя с точностью до наоборот — зажжется, а при переключении раскладки — погаснет.
Снова отстучим «привет». В окошке COM-монитора вместо ожидаемых русских букв вылезут кракозябры. Естественно — скетч отправляет кириллицу в Unicode.
Оставим устройство на минуту в покое, не будем нажимать на нем кнопки. Через минуту включится спящий режим, о чем просигнализирует светодиод, мигая неярким светом.
Альфа-версия готова. Она делает именно то, что мы планировали. Но до релизного варианта устройству пока далеко. Стоило бы проработать следующие моменты:
— Индикация с помощью одного одноцветного светодиода — малопонятна. Это как раз тот вариант интерфейса, который совершенно неинтуитивен и понятен только создателю устройства. Впрочем, с помощью одного одноцветного диода вряд ли удалось бы сделать что-то кардинально лучше.
— Фиксированная граница между длительностью точки и длительностью тире — неудобна. Такой подход привязывает пользователя к ритму, на который настроена наша морзе-клавиатура. Можно, конечно, поработать над логикой, заставив программу подстраиваться под скорость работы пользователя. Это было бы неплохое упражнение для начинающего программиста. Но с точки зрения коммерческого проекта — лишняя трата времени. Куда проще и удобнее заменить ввод одной кнопкой, к примеру, на ввод двумя кнопками: одна для точки, вторая для тире.
— Один из режимов использования аккордной клавиатуры — слепая печать. Поэтому стоило бы дополнить светодиодную индикацию вибрацией — чтобы пользователь чувствовал состояние клавиатуры, не глядя на нее.
Поработать над перечисленным мы попробуем в следующей статье.