UART-терминал из LCD-дисплея, PS-2 клавиатуры и любого МК

в 4:31, , рубрики: stm32, stm32f030, uart, Программирование, электроника
Вот так терминал выглядит "в комплект (е" - справа STM32F103 c Бейсиком

Вот так терминал выглядит "в комплект (е" - справа STM32F103 c Бейсиком

Совсем коротенький рассказ - о довольно бесполезной но забавной штуковине, извините :)

Как-то раз я написал интерпретатор BASIC, который можно использовать на контроллере хоть с 1кб памяти (в частности AVR / Arduino). В основном мы им пользовались через Bluetooth-модуль с телефона (я уж рассказывал). Но у меня руки чесались сделать своеобразный "терминальчик" - ну я и сделал.

Как видите - в качестве экрана тут дисплей 4 строки по 20 символов. А клавиатура полноценная - обычная c PS/2 разъёмом. Между ними и UART-ом воткнут контроллер (младший STM32). Вообще-то можно было без него, реализовать общение с клавиатурой и дисплеем в том же контроллере где интерпретатор крутится - но тогда это не был бы терминал, его нельзя было бы использовать с любым другим UART-интерфейсом.

Покажу картинки, код - и немножко расскажу.

Рассмотрим поближе

Это рабочее положение - а не вверх ногами

Это рабочее положение - а не вверх ногами

Как видно, сам терминал представляет из себя маленькую плату - гораздо меньше даже самого дисплея, который конечно гораздо меньше клавиатуры.

При разводке платы я заложился на интерфейс дисплея с 4-битной шиной данных вместо восьми (несколько дополнительных строк кода - это проще чем несколько лишних дорожек на плате), поэтому вы можете видеть в разъёме небольшой "гэп" от линий D0 до D3.

В целом на плате почти ничего нет - разъёмы для UART (справа) и клавиатуры (слева). Провод питания с типичным USB-разъёмом - и регулятор для срезания 5В. У меня явно под рукой не оказалось SMD-шного в тот момент, поэтому вот он торчит в корпусе TO-92. Ну и несколько резисторов - подтяжки, делитель. В общем если кто-то решит повторить - понятно что все эти компоненты зависят от конкретной платы. Выкинуть можно всё или почти всё.

UART-терминал из LCD-дисплея, PS-2 клавиатуры и любого МК - 3

Маленький подстроечный резистор - по-моему для регулировки контраста. Выводные резюки в паре мест вместо SMD-шных впаяны просто чтобы развязать топологию (плата односторонняя) - никакого другого смысла в их выборе нет :)

Чертёж платы не привожу, т.к. он был на скорую руку выполнен в графическом редакторе - но по картинке видно что по большому счету плата не содержит ничего интересного кроме МК и разъёмов. Подключение к МК достаточно подробно описано в README на гитхабе, сейчас к этому перейдём.

UART-терминал из LCD-дисплея, PS-2 клавиатуры и любого МК - 4

Клавиатура работает от 5 Вольт, контроллер от трёх. К счастью его входы 5v-tolerant и им только две подтяжки нужны. Но в целом использовав 5-вольтовый контроллер можно было немного упростить схему.

Программируется контроллер через тот же UART-разъём. Я собственно ради этого люблю STM32 чипы что у них встроенный загрузчик через UART работает. Просто при сбросе контакт BOOT замкнул ненадолго - и вот ты в режиме загрузки.

Теперь про код

Код проекта на гитхабе: https://github.com/RodionGork/stm32f030-terminal

Не думаю что кому-то он прямо в таком виде понадобится, но частями позаимствовать или адаптировать его несложно. Наверное самая "выдающаяся" часть в нём это "bitbang" клавиатуры (у неё довольно незамысловатый синхронный интерфейс - одна линия CLK, другая данные). Я с ним впервые в жизни столкнулся но не сказать чтобы это было сложно.

UART-терминал из LCD-дисплея, PS-2 клавиатуры и любого МК - 5

Похоже на... много на что, не правда ли :) на SPI, USART и т.п.

В нормальном режиме протокол "драйвит" клавиатура, поэтому со стороны контроллера мы используем прерывание по внешнему пину.

В протоколе есть некоторое расширение на случай когда надо наоборот клавиатуре что-то передать со стороны "компьютера" - этого я не заимплементил т.к. передавать ничего не собирался.

Клавиатура естественно возвращает не буквы а скан-коды, поэтому кроме бит-бэнга потребовалось ещё и держать таблицу преобразований. Точнее их в коде две - для верхнего и нижнего регистра. Для букв это необязательно но для символов, знаков препинаний и т.п. всё равно пришлось бы делать.

Часть кода (sendHex и т.п.) вообще не нужна для функционирования а используется только для отладки по ходу программирования.

Я любитель имплементить протоколы (в т.ч. LCD-шный) вручную нежели затаскивать чужие библиотеки - но сами видите, там кода-то прямо скажем немного. Самому доку глянуть или бороться с чужими "кодулями" - не всегда известно на что больше времени уйдёт. Конечно выгоднее использовать дисплей с I2C-интерфейсом (и в смысле схемы) - но они реже попадаются под руку (тем более крупного размера).

Несколько функций (например wrapLine, scrollDown) - это необходимая для адекватного отображения логика. Если вы пробовали заимплементить "терминал" хотя бы на компьютере, то наверное знаете что вопросы типа "как обработать Backspace" достаточно неоднозначны. В общем тут возможно можно что-то улучшить.

Так или иначе вся программулина - меньше 400 строчек кода (из которых половина - пропуски и скобки).

Заключение

В общем эта штука вполне себе работала - на титульной картинке она подключена к самодельной плате с Бейсиком на STMF32103 - с которого мы управляем очевидно семисегментным элементом. Бейсика хватает чтобы подключить скажем 7-сегментный дисплей из нескольких знаков, датчик температуры, несколько кнопок и т.п.

Но в целом на Бейсике мне программировать показалось скучновато :) плюс построчный ввод с 4-строчным экраном это не самое удобное.

Можно подключить и к любым другим устройствам с UART - хоть к компьютеру настольному, хоть к Raspberry Pi (ну и старинную картинку с тостером мы помним наверное). Хотя понятно что большого удобства маленький экран не обещает. На телефоне через блютус в чем-то удобнее.

Тем не менее само впечатление от поделки - этакий "старинный комп" в миниатюре - довольно забавное.

В качестве развития идеи быть может когда-нибудь вместо Бейсика прошью что-нибудь повеселее. Forth я помню имеет несколько вариантов для контроллеры - надо попробовать.

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

Если у вас возникнут какие-то конструктивные-забавные идеи насчет вариаций подобной штуковины - приглашаю делиться в комментариях :)

Телеграфная клавиатура Бодо

Телеграфная клавиатура Бодо

Автор: RodionGork

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js