Все началось с короткого видео в соцсетях, возможно многие видели брелок, который превращает нажатые точки и тире азбуки Морзе в буквы на дисплее. Фишка в том, что светодиоды там расположены в виде «дерева поиска». Длительное нажатие – загорелось тире, короткое – точка. Красивый корпус, пищалка и световая индикация в современной гонке за вниманием.
Увидев эту идею, сразу загорелся реализовать на Arduino, пишем пару циклов за 10 минут и готово, но таких программ миллион, мы привыкли прятать любую сложность за строчками кода, превращая разработку железа в банальное подключение модулей к микроконтроллеру.
Меня вдохновила мысль о создании подобного устройства на базе отдельных микросхем на которых можно выполнять даже сложные вычисления без единой строки кода. Это позволит подтянуть знания в схемотехнике, разработке устройств и просто займет некоторое время.
В этой статье я расскажу, как спроектировать на «железе» мозги устройства, таймер для отсчета времени, побороть гонку сигналов, зажечь светодиод длинным или коротким нажатием кнопки и собрать это на одной плате, не имея внутри ни одного байта программного кода.
Немного теории: Магия точек и тире
Азбука Морзе – по сути, первый в истории цифровой код, где информация передается не уровнем напряжения, а временем. Сигнал – наше физическое воздействие: короткое или длительное (в три раза длиннее) нажатие кнопки. Символ – выводимая буква в соответствии с количеством и длительностью нажатий.
Проанализируем устройство, составим план и цель к которой необходимо прийти (хотя бы приблизиться). Первое, что бросается в глаза это дисплей с символами, также элемент ввода, с которым взаимодействует человек и можно предположить некий внутренний блок для обработки и дешифрации сигналов. Получаем три блока:
-
Блок распознавания, входной каскад, который превращает длительность нажатия кнопки в один из двух сигналов при коротком нажатии 0 – точка, при длительном зажатии 1 – тире.
-
Блок навигации, принимает 0 или 1, сохраняет биты сигналов набранного кода.
-
Блок индикации, дешифрирует и визуализирует нажатия.
1 Блок распознавания
В блоке распознавания нам нужно превратить нажатие кнопки в один из двух цифровых сигналов: короткий импульс – точка, длинный – тире. Значит необходимо понимать сколько времени мы нажимаем на кнопку. Когда дело касается времени, сразу возникает желание использовать NE555 – популярная микросхема универсального таймера позволяющая формировать одиночные и повторяющиеся импульсы со стабильными временными характеристиками.
Под рукой была книга с пошаговым обучением электроники и примерами использования NE555 [1]. В ней описан принцип работы схемы одновибратора (Схема 29. Специализируемая схема задержки) и предоставлен график для удобства выбора компонентов регулирующих длительность получаемого импульса, который можно вычислить более точно по формуле:
где T – длительность, с; R – сопротивление, Ом; C – емкость, Ф.
Для создания временного сигнала на микросхему необходимо подать короткий импульс смещающий вывод микросхемы к земле, если использовать только кнопку, то при длительном зажатии (больше времени счета) на выходе получиться просто инвертированный сигнал. Воспользуемся дифференцирующей RC-цепочкой и подберем параметры цепи в симуляторе Proteus. Важно добавить диод, иначе схема будет генерировать в конце работы кнопки сигнал обратной полярности, что может повлиять на работу или испортить МС.
Собираем следующую часть схемы и проверяем ее работоспособность. Подаем запускающий сигнал и получаем импульс длительностью (на схеме старые значения):
В симуляции видна красная линия – заряд конденсатора до напряжения 63,2% и зеленая линия — длительность выходного сигнала. В реальности необходимо настроить с помощью переменного резистора длительность тире, как три длительности точки.
(Немногим изменил схему, убрал инвертор за ненадобностью) Подключим D-триггер, на синхронизирующий вход C будем подавать сигнал с кнопки, а на вход D после NE555. Таким образом при коротком нажатии на входе D будет 1, тем самым на инверсном выходе получим 0 – точка. При длительном нажатии после окончания отсчета на входе D будет 0, что переключит выход D-триггера в 1 – тире. Синхронизирующий сигнал зависит от кнопки, чтобы избавиться от задержки при коротком нажатии.
Напишем небольшой код в Generator Mode – Easy HDL Generator Properties для реализации нажатий кнопки, 1011 (0 – 50 мс, 1 – 150 мс):
OUT = 1 //вывод логической 1SLEEP FOR 50m //ожидание 50 мсOUT = 0 //вывод логического 0SLEEP FOR 150mOUT = 1SLEEP FOR 50mOUT = 0SLEEP FOR 50mOUT = 1SLEEP FOR 150mOUT = 0SLEEP FOR 150mOUT = 1SLEEP FOR 50mOUT = 0SLEEP FOR 150mOUT = 1END
Подаем 1 – кнопка отключена, далее подаем 150 мс – 0, так как длительность задержки NE555 137,5 мс, этот сигнал засчитывается как длинный и на выходе сохраняется 1. Ожидаем 50 мс и нажимаем на кнопку 50 мс, так как это меньше времени задержки, мы видим переключение выхода D-триггера в 0.
При создании даже этой части устройства я столкнулся с некоторыми интересными вопросами:
-
Сразу не подумал, что D-триггеру для сохранения сигнала необходимо переключение сигнала из 0 в 1, что составило задачку на подумать. Так же возник вопрос, какой сигнал подать на синхронизирующий вход, если с кнопки, то можно нажать слишком быстро, и если время задержки не закончится, то короткий сигнал не зарегистрируется. Или с выхода NE555, тогда при коротком нажатии сигнал загорится не сразу, а по окончании отсчета. Выбрал кнопку, так как считаю задержку после нажатия в данном устройстве не оправданной.
-
Как-то при пайке не отключил макетную плату от источника питания, что нарушило работу NE555, которую пришлось перепаивать и добавлять сокет для быстрой замены.
-
Под рукой оказались разные МС элемента НЕ: ЛН1 и ЛН2. Кажется такие одинаковые, а работают по разному. ЛН1 выдает полноценные уровни 0 и 1 (от 3,5 В), а в ЛН2 имеет выход с открытым коллектором, который может притягивать выход к земле, а 1 можно получить при помощи подтягивающего резистора. Однако обе не идеальны для работы с RC-цепями. Так же в Proteus изначально начал использовать элемент НЕ 7404 (аналог ЛН1), но из-за особенности ТТЛ при подключении на вход резистор больше нескольких кОм (я применял 15 кОм) вытекающий ток из МС создавал ложные срабатывания. Поэтому остановился на 74HC14 – инверторы с триггером Шмитта, в котором есть гистерезис. При подаче плавно нарастающего сигнал от конденсатора на выходе будет стабильный сигнал.
Блок навигации
Блок навигации, это центральная часть устройства он должен принимать сигналы точка/тире, сохранять и подготавливать их для вывода. Для сохранения всех переходов по дереву отлично подойдет МС 74HC595 с ее помощью можно реализовать сохранение пути к букве, а также всех нажатых сигналов. При использовании обычного железа (без программируемых МК) будет лучше уменьшить количество импульсов и использованных шин, поэтому будем использовать 74HC164, аналог, но без дополнительной линии сдвига из внутренней памяти в выходные регистры, что для нашего использования только усложнит и затормозит вывод.
Возможны разные способы создания и хранения размера дерева, например при каждом символе записывать разделительную 1 (те при записи точки будет записано 01), однако это усложняет процесс записи и возникают сложности синхронизации подачи сигналов 1 и сигнала необходимого символа, а также сложнее логически понять схему для дешифраторов. Наиболее простой использовать второй регистр для записи количества знаков.
Так первый регистр «Путь» и второй «Уровень» разрешат вопрос синхронизации, упростят понимание логики работы, упростят схему дешифраторов.
После подачи сигнала на D-триггер важно задержать сигнал на некоторое время, иначе регистр сохранит предыдущие символы, не дождавшись переключения D-триггера, создадим простейшую схему задержки используя инверторы и RC-цепь [2]. Для этого достаточно минимальной задержки (на схеме старые значения):
При длительном бездействии устройство должно возвращаться в начальное положение – перезапускаться, создадим RC-цепь для ожидания времени после нажатия кнопки, через диод конденсатор заряжается и начинает постепенно разряжаться через резистор, спустя 1,128 с обнуляются регистры и запись начинается заново.
Блок индикации
Блок состоит из дешифраторов 74HC138, имеющие 3 входа и 8 выходов, а также два инверсных и один прямой разрешающие входы, которые позволяют активировать необходимую букву при определенном вводе сигналов.
Для разработки схемы соединений дешифраторов буквы необходимо объединить в группы различающиеся по количеству введенных символов и первому символу, который разделяет дерево на правую и левую часть:
-
Буквы по одному или двум сигналам (6: E, T, I, A, N, M). В данном случае для дешифрирования используется первые два вывода регистра «Путь», а для различия, например, E=0 и I=00 к третьему входу подключена вторая нога регистра «Уровень». Первая нога «Уровень» – разрешение на работу, 3 и 4 – запрет.
-
Удачно сложилась (или это было продуманно при создании азбуки) группа состоящая из трех сигналов имеет восемь символов (8: R, S, W, U, O, G, D, K). Связь самая простая, три первых вывода регистра «Путь», Третья «Уровень» – разрешение, 4 – запрет.
-
и 4. Разделяют буквы (6 и 6: V, F, L, P, J, H и Q, Z, B, X, Y, C), состоящие из четырех сигналов, для разрешения работы подключаем четвертый вывод «Путь» к прямому одного и инверсному другого входу дешифратора для разделения дешифраторов на условно «правый» и «левый» (первый сигнал 0 или 1), разрешение работы осуществляется с помощью четвертого вывода «Уровень», подключаем в свободные входы, так как один свободный вход инверсный используем элемент НЕ.
Финальные доработки
Для отключения работы кнопки при четвертом нажатии подключим четвертый вывод регистра «Уровень» к кнопке вместо земли. Если вывод не активен на нем 0, он управляет NE555, после четырех нажатий на кнопке 1 – она блокируется и не взаимодействует с NE555.
Выбрано напряжение 3 В от батареи CR2032, хочется создать наиболее компактный вариант, в случае нехватки мощности можно использовать элементы ААА. В связи с этим применяется TLC555 – более экономична и работает от 2В.
Добавил пищалку и двойной переключатель на четыре вывода для отключения устройства, включения и отключения пищалки. Так как активные пищалки настроены на частоты более 2 кГц я решил использовать свой генератор – симметричный мультивибратор на паре транзисторов разной проводимости.
Добавил конденсаторы по питанию МС для исключения скачков при переключении внутренних каскадов, и защиты от шумов RC-цепей. Подправил время работы RC генераторов.
Разработка печатной платы
Разработка печатных плат в Proteus не самое удобное занятие, поэтому пришлось перенести схему в EasyEDA. Размеры выбрал в формате карты, шелкографией обозначил символы.
Выводы: В ходе проекта было спроектировано и реализовано устройство дешифрации азбуки Морзе на базе жесткой логики. Разработан входной каскад распознавания на базе таймера TLC555 и D-триггера, реализована схема измерения длительности импульса с помощью RC-цепей. Блок стабильно дифференцирует «точку» и «тире», преобразуя их в логические уровни 0 и 1. Спроектирован блок навигации и памяти, с помощью каскада сдвиговых регистров 74HC164 организовано хранение 4-битного кода символа и отслеживание глубины дерева поиска (до 4-х уровней). Реализована аппаратная дешифрация на базе четырех дешифраторов 74HC138 выстроено интерактивное дихотомическое дерево на плате. Решена проблема избыточного ввода: логика автоблокировки на выходе Q4, предотвращающая ошибки при попытке ввода более чем 4-х символов в одной последовательности и создана шина Reset. Оптимизировано энергопотребление, используется CMOS-серии микросхем, запитано устройство напрямую от одного элемента CR2032, сохранив при этом компактный форм-фактор.
Работоспособность схемы подтверждена циклом симуляций в среде Proteus с оптимизацией параметров для работы в реальном времени. Создана печатная плата, произведен подбор компонентов.
Литература:
-
Трейстер Р. – Радиолюбительские схемы на ИС типа 555: Пер. с англ. – М.: Мир, 1988. – 263 с.
Хотел бы получить отзывы, что можно исправить, как оптимизировать. Схемотехникой и печатными платами занимался не много, но есть образование и цель изучать новое.
ссылка на оригинал статьи https://habr.com/ru/articles/1033508/