Микроконтроллерные модули семейства Arduino оснащены последовательным интерфейсом и могут через него в текстовом виде выдавать информацию о своей работе и получать команды. Но для отображения этой информации на экране и ввода команд необходимо подключить к последовательному порту модуля устройство, называемое терминалом. Как правило, им служит компьютер с запущенной на нём терминальной программой. Но это не всегда удобно, поскольку для компьютера может найтись много других дел. В статье описано несложное терминальное устройство, которое может получать и отображать поступающую по последовательному порту текстовую информацию на экране обычного телевизора и передавать обратно сообщения, вводимые с обычной компьютерной клавиатуры. Его можно использовать для отладки и контроля работы не только устройств на Arduino, но и самого разнообразного оборудования, имеющего последовательный интерфейс RS-232. Терминал собран на микроконтроллере ATmega88PA—AU.
При разработке микроконтроллерах устройств очень часто применяют в качестве отладочного средства вывод контрольных текстовых сообщений через последовательный порт. Например, в различных проектах на базе Arduino такой приём — основной, и редко не встретишь в скетче (так среди фанатов Arduino называют исходный текст программы) строки
- serial,begin(9600);
- serial .pnntln(value);.
Обычно в качестве терминального устройства, «слушающего” последовательный порт и посылающего в него текстовые команды, используют компьютер с запущенной на нём терминальной программой. Но в практике автора однажды случилось так, что все компьютеры были заняты, и для того чтобы поработать с Arduino, пришлось ждать, когда хотя бы один из них освободится. Тогда и появилась мысль создать самостоятельное терминальное устройство. В качестве устройства ввода вполне подошла бы обычная компьютерная клавиатура, которая почти всегда есть под рукой, да и приобрести новую — не такое уж затратное дело. В качестве устройства отображения информации хотелось иметь небольшой «ЖК-экранчик”, но такового под рукой не оказалось, зато нашёлся никем не используемый телевизор.
Сразу вспомнилась молодость и первые самодельные компьютеры на КР580ВМ80А, Z80A… Тогда бытовые телевизоры применяли в качестве мониторов повсеместно (ничего другого просто не было). Для сопряжения с ними делали специальные платы со своей экранной памятью, контроллерами отображения и формирователями видеосигнала.
С тех пор минули десятилетия, и нынешние рядовые микроконтроллеры обладают достаточными ресурсами для формирования телевизионного сигнала без использования дополнительных микросхем. Почти все компоненты разрабатываемого терминального модуля с выходом на телевизор удалось разместить на отладочной плате SEM0010M-88PA [1] с уже установленным на ней микроконтроллером ATmega88PA-AU.
Этот микроконтроллер должен выполнять три основные задачи:
- получать информацию о нажатых клавишах от стандартной компьютерной клавиатуры;
- принимать и отправлять сообщения по последовательному интерфейсу;
- формировать видеосигнал, содержащий текст принятых и введённых с клавиатуры сообщений.
Телевизионный сигнал [2] представляет последовательность строк, временная диаграмма одной из которых показана на рис. 1. Для нашей цели можно считать, что сигнал изображения имеет три уровня (оттенки серого не нужны): уровень синхроимпульсов, уровень чёрного (практически совпадающий с уровнем гасящих импульсов) и уровень белого. Следовательно, для формирования видеосигнала достаточно простого двухразрядного ЦАП: код 00 — уровень синхроимпульсов, код 11 — уровень белого, коды 01 или 10 — уровень чёрного.
Чтобы сформировать временную диаграмму сигнала программным путём, проще всего использовать запросы прерываний от таймера, следующие с периодом 64 мкс, равным длительности строки телевизионного сигнала. Обработчик этого запроса сначала установит уровень синхроимпульса и выдержит паузу, равную стандартной длительности строчного синхроимпульса (4…5 мкс). Затем установит уровень чёрного (гасящий импульс) и подготовит к выводу информацию, которая должна быть отображена в текущей строке. По её готовности выведет 32 байта (по числу содержащихся в строке символов) через аппаратный интерфейс SPI микроконтроллера (использование аппаратного интерфейса существенно снижает нагрузку на процессор). По окончании вывода информации установит уровень чёрного, чем и завершит свою работу.
Использование SPI позволяет получить элементы изображения минимальной длительностью 125 не (половина тактовой частоты микроконтроллера 16 МГц). Чтобы вывести на экран 32 символа по горизонтали, в каждой телевизионной строке приходится с учётом интервалов между символами занять около 46 мкс, что хорошо укладывается в её видимую на экране часть.
Выводимые текстовые символы формируются из матрицы 8×8 элементов изображения. Таблица знакогенератора находится в памяти микроконтроллера и содержит символы ASCII только с кодами 0x20—0x7F (цифры 0—9, знаки препинания и некоторые математические и специальные символы, прописные и строчные буквы латинского алфавита). Из восьми разрядов каждого байта, содержащегося в знакогенераторе, для формирования символов используются только пять. Время, в течение которого контроллер SPI передаёт остальные три разряда загруженного в него байта, а затем программа загружает в него новый байт, образует интервал, разделяющий символы на экране по горизонтали.
По вертикали между символами, находящимися в соседних горизонтальных рядах, выводятся по четыре пустые телевизионные строки. Поэтому один ряд символов занимает 12 телевизионных строк.
Формируемый микроконтроллером видеосигнал имеет упрощённую форму. В частности, не формируется чересстрочная развёртка из 312,5 строк в каждом полукадре. Кадр образуют ровно 312 строк, причём вертикальная развёртка получается прогрессивной. Кадровый гасящий импульс занимает строки 250—312, кадровый синхроимпульс — строки 290—292. Уровень гасящих импульсов, как уже было сказано, считается совпадающим с уровнем чёрного. Такие упрощения не приводят к искажениям формируемого микроконтроллером изображения на экранах как старых, так и новых телевизоров.
Обмен информацией между компьютером и его клавиатурой подробно рассмотрен в статьях [3, 4]. Используемый для этого интерфейс PS/2 имеет двунаправленную линию данных и линию синхронизации, сигнал которой формирует клавиатура. Приём информации микроконтроллером происходит в процедуре обработки запроса прерывания INTO, на вход которого подан сигнал синхронизации от клавиатуры. Принятые от клавиатуры скан-коды клавиш преобразуются в коды ASCII соответствующих символов, которые программа выводит в самый нижний (двадцать первый) ряд символов на экране телевизора. При нажатии на клавишу Enter программа отправляет коды ранее введённых символов по последовательному интерфейсу и очищает ряд 21 на экране.
Приём сообщений по последовательному интерфейсу также организован по прерываниям. Принятый байт (код символа), если его значение находится в интервале 0x20—0x7F, сразу помещается в буфер вывода на экран. В противном случае он предварительно заменяется 0х2Е (кодом символа «точка”). Исключение — байты 0х0А («Перевод строки») и 0x0D («Возврат каретки»). Вывод полученных вслед за ними символов продолжится соответственно в следующем ряду либо с начала текущего ряда.
Схема терминального модуля показана на рис. 2. Он построен на микроконтроллере ATmega88PA-AU (DD1), тактовая частота которого стабилизирована кварцевым резонатором ZQ1.
Компьютерную клавиатуру с интерфейсом PS/2 подключают к разъёму XS1.1 — сиреневой части сдвоенной розетки MDD-6FR, хотя можно использовать и совсем уж старые АТ-клавиатуры с пятиконтактным разъёмом DN-5F1 (схема подключения такой клавиатуры приведена в [3]).
Для сопряжения с видеовходом телевизора использован узел, аналогичный применённому в компьютере «Радио-86РК» [5]. Из нескольких опробованных вариантов он оказался наиболее стабильным. На резисторах R1— R3 выполнен простейший ЦАП, для сопряжения которого с низкоомной нагрузкой служит эмиттерный повторитель на транзисторе VT1.
Питают модуль от не показанного на схеме зарядного устройства для сотового телефона через разъём XS2. Конденсаторы С2, СЗ — фильтр в цепи питания. Зарядное устройство пригодно любое с напряжением холостого хода не выше 6 В, чтобы не повредить микроконтроллер. Если в телевизоре есть разъём USB, питать модуль можно и от него.
Внешние устройства с последовательным интерфейсом присоединяют к разъёму XS1.2 (зелёной части сдвоенной розетки MDD-6FR). Такое решение позволяет использовать для подключения внешнего оборудования кабель от неисправной компьютерной мыши с интерфейсом PS/2. Поскольку защитных цепей в модуле не предусмотрено, подключать оборудование к этому разъему следует в отключённом от сети состоянии.
Разъём программирования микроконтроллера ХР1 на плате SEM0010M- 88РА уже имеется.
Печатная плата для терминального модуля не разрабатывалась. Большая часть его элементов смонтирована на отладочной плате SEM0010M-88PA размерами 42×42 мм с уже установленными на ней микроконтроллером DD1, разъёмом ХР1, кварцевым резонатором ZQ1 на 16 МГц и конденсаторами Cl, С4 Разъёмы XS1.1, XS1.2 и XS2 вынесены на отдельную небольшую плату. Между собой платы соединены отрез- ком шестипроводного плоского кабеля, как показано на рис. 3. Платы помещены в пластмассовый корпус от электромонтажной коробки. Для доступа к разъёмам использованы его технологические отверстия.
Сдвоенную розетку MDD-6FR можно найти на старой компьютерной материнской плате. Разъём XW1 — гнездо RCA RP-8 («тюльпан»), XS2 — розетка микро-USB USB/Mc-1J, в которой использованы только контакты питания.
Настройки цифровые устройства при правильном монтаже, как правило, не требуют. Возможно, потребуется подобрать в небольших пределах номиналы резисторов R1—R3 для получения стабильного и контрастного изображения на экране телевизора.
Предназначенная для микроконтроллера DD1 программа tvk9b.alp (загрузочный файл tvk.9b.hex) подготовлена в среде разработки Algorithm Builder for AVR. После подачи питания на микроконтроллер она настраивает таймер Т2 на формирование запросов прерывания с периодом 64 мкс, контроллер SPI — на передачу информации с тактовой частотой 8 МГц, последовательный интерфейс — на скорость 9600 Бод и восьмиразрядные посылки без контроля чётности с двумя стоповыми разрядами. Затем программа очищает экранную память, выводит на экран телевизора надпись «Terminal v.9b», а на клавиатуру подаёт команду установки в исходное состояние.
Далее программа циклически проверяет готовность информации, принятой по последовательному интерфейсу и от клавиатуры.
Принятые по последовательному интерфейсу байты программа заносит в буфер экрана, определяя при этом позицию (ряд и колонку) символа на экране. В каждом ряду возможно отображение до 32-х символов с кодами ASCII 0x20—0x7F. Символы с другими кодами отображаются в виде точек (символов с кодом 0х2Е). Символы «Перевод строки» (0х0А) и «Возврат каретки» (0x0D) вызывают соответствующую коррекцию места вывода на экран последующих принимаемых символов. В отсутствие переводов строки и возвратов каретки символы, следующие за 32-м, затирают его на экране.
Всего на экране имеется место для 21-го ряда по 32 символа в каждом. Двадцать из них предназначены для информации, принимаемой по последовательному интерфейсу. Если приём идёт в ряду 20, то символ «Перевод строки» сдвигает весь принятый текст на один ряд вверх, освобождая ряд 20 для дальнейшего приёма.
Самый нижний ряд 21 предназначен для отображения символов, вводимых с клавиатуры. При нажатии на клавишу Enter содержимое этой строки отправляется по последовательному интерфейсу во внешнее устройство.
Как уже было отмечено, формирование видеосигнала, взаимодействие с клавиатурой и внешним оборудованием происходит в процедурах обработки запросов прерываний соответственно от таймера по спадающему перепаду сигнала на линии INTO и от последовательного интерфейса.
Конфигурация микроконтроллера DD1 должна соответствовать показанной на рис. 4.
Рассмотрим пример взаимодействия терминального модуля с микро- контроллерным модулем Arduino Pro Mini [6], в который должна быть загружена программа, скетч которой представлен в таблице.
После подачи питания на модуль Arduino с этой программой в памяти на нём включится светодиод, соединённый с его выводом 13, а в последовательный порт будет выведено сообщение «START PROGRAM». Далее в последовательный порт станут периодически выводится сообщения о прошедшем с момента запуска программы времени в миллисекундах, а также выполняться проверки, не принят ли из того же порта байт. Если принятый байт — ASCII-код латинской буквы А, то светодиод переключится в режим одиночных вспышек, если это код латинской буквы В, вспышки станут двойными, а если латинской буквы С — тройными.
Теперь подключим модуль Arduino к терминалу. Для этого достаточно соединить выход ТХ Arduino (вывод 0) с входом RXD (контакт 1 разъёма XS1.2) терминального модуля, вход RX Arduino (вывод 1) — с выходом TXD (контакт 5 разъёма XS1.2), а также общий провод (GND) Arduino — с контактом 3 разъёма XS1.2. Разъём XW1 нужно соединить с видеовходом телевизора, а к разъёму XS1.1 подключить клавиатуру. Все эти соединения видны на рис. 5. Цепь +5 В модуля Arduino соединена с одноимённой цепью терминального модуля. Теперь на модули можно подать питание.
На экране телевизора должны появиться надписи «Terminal v.9b“ (это заработал терминальный модуль), а затем «START PROGRAM» — первое принятое от Arduino сообщение. Далее, как показано на рис. 6, на экране периодически станет появляться новая строка с числом прошедших с момента запуска программы Arduino миллисекунд.
Переведём клавиатуру в режим заглавных букв коротким нажатием на клавишу Caps Lock. На клавиатуре должен включиться одноимённый индикатор.
Если теперь нажимать на клавиши латинских букв А, а, В, b, С, с и, нажав на клавишу Enter, отправлять код соответствующей буквы в Arduino, то, согласно полученной команде, светодиод станет вспыхивать однократно, дважды или трижды, а сообщения о времени будут появляться на экране реже.
Некоторые клавиши выполняют управляющие функции.
Клавиша Caps Lock переключает на клавиатуре одноимённый индикатор и изменяет регистр передаваемых при нажатиях на клавиши букв. При включённом индикаторе они заглавные, а при погашенном — строчные.
При нажатой клавише Shift (как правой, так и левой) поднимается регистр цифровых и знаковых клавиш, а регистр букв становится противоположным установленному клавишей Caps Lock.
Клавиша Scroll Lock управляет одноимённым индикатором клавиатуры. Когда индикатор включён, к последовательности символов из ряда 21, передаваемой по последовательному интерфейсу в результате нажатия на клавишу Enter, программа автоматически добавляет коды перевода строки и возврата каретки. При погашенном индикаторе происходит передача только символов из ряда 21.
Клавиша Esc — очистка строки 21 без передачи информации.
Клавиша Back Space — удаление из* строки 21 ранее введённого символа.
Терминальный модуль получился очень простым и компактным. Его удобно использовать не только при отладке микропроцессорных устройств, но и для отображения текстовой информации от любых приборов, оснащённых последовательным интерфейсом. А немного изменив программу микроконтроллера и добавив, например, датчики температуры, влажности и атмосферного давления, можно превратить сам модуль в метеостанцию, выдающую информацию на экран телевизора. Питать модуль целесообразно от разъёма USB того телевизора, с которым он работает. Такие разъёмы есть практически в каждом современном телеприёмнике.
Нужно признать, что описанный модуль не лишён недостатков. Например, при нажатии на клавишу Enter кратковременно нарушается синхронизация телевизионного изображения. В это время микроконтроллер модуля выводит информацию в последовательный порт, и приоритет в прерываниях отдан этому процессу в ущерб формированию видеосигнала.
ЛИТЕРАТУРА
- Модуль Evolution light на базе микроконтроллера ATmega88PA-AU. — URL: http:// ekits.ru/index.php?ukey=product&productl D=2520 (06.07.15).
- Видеосигнал. — URL: https://ru.Wikipedia.orgwiki/Видеосигнал (06.07.15).
- Долгий А. Клавиатура IBM PC. — Радио, 1997, №4, с. 24, 25; №6, С. 19—21.
- Редькин П. Интерфейс АТ РС-клавиатуры для МК популярных семейств. — Радио, 2008, № 9, с. 22-26.
- Горшков Д. и др. Персональный радиолюбительский компьютер «Радио-86РК». — Радио, 1986, № 4, с. 24-26; № 5, с. 31—34; № 6, с. 26-28.
- Arduino Pro Mini — URL: http://arduino.ru/Hardware/ArduinoBoardProMini (06.07.15).
Автор: А. ПАХОМОВ, г. Владимир
Источник: журнал Радио №11, 2015