«

»

Распечатать Запись

Терминал для Arduino

Микроконтроллерные модули семейства 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 — уро­вень чёрного.

Рис. 1

Рис. 1

Чтобы сформировать временную диаграмму сигнала программным пу­тём, проще всего использовать запро­сы прерываний от таймера, следующие с периодом 64 мкс, равным длительно­сти строки телевизионного сигнала. Обработчик этого запроса сначала ус­тановит уровень синхроимпульса и выдержит паузу, равную стандартной длительности строчного синхроимпуль­са (4...5 мкс). Затем установит уровень чёрного (гасящий импульс) и подгото­вит к выводу информацию, которая должна быть отображена в текущей строке. По её готовности выведет 32 байта (по числу содержащихся в строке символов) через аппаратный интерфейс SPI микроконтроллера (ис­пользование аппаратного интерфейса существенно снижает нагрузку на про­цессор). По окончании вывода инфор­мации установит уровень чёрного, чем и завершит свою работу.

Использование SPI позволяет полу­чить элементы изображения минимальной длительностью 125 не (по­ловина тактовой частоты мик­роконтроллера 16 МГц). Чтобы вывести на экран 32 символа по горизонтали, в каждой теле­визионной строке приходится с учётом интервалов между сим­волами занять около 46 мкс, что хорошо укладывается в её видимую на экране часть.

Выводимые текстовые сим­волы формируются из матри­цы 8x8 элементов изображе­ния. Таблица знакогенератора находится в памяти микро­контроллера и содержит сим­волы 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.

Рис. 2

Рис. 2

Компьютерную клавиатуру с интер­фейсом 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 раз­мерами 42x42 мм с уже установленны­ми на ней микроконтроллером DD1, разъёмом ХР1, кварцевым резонато­ром ZQ1 на 16 МГц и конденсаторами Cl, С4 Разъёмы XS1.1, XS1.2 и XS2 вы­несены на отдельную небольшую плату. Между собой платы соединены отрез- ком шестипроводного плоского кабе­ля, как показано на рис. 3. Платы помещены в пластмассовый корпус от электромонтажной коробки. Для дос­тупа к разъёмам использованы его технологические отверстия.

Рис. 3

Рис. 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.

Рис. 4

Рис. 4

Рассмотрим пример взаимодейст­вия терминального модуля с микро- контроллерным модулем Arduino Pro Mini [6], в который должна быть загружена програм­ма, скетч которой пред­ставлен в таблице.0

После подачи питания на модуль 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 соединена с одноимённой цепью тер­минального модуля. Теперь на модули можно подать питание.

Рис. 5

Рис. 5

На экране телевизора должны по­явиться надписи "Terminal v.9b“ (это за­работал терминальный модуль), а затем "START PROGRAM" — первое принятое от Arduino сообщение. Далее, как пока­зано на рис. 6, на экране периодиче­ски станет появляться новая строка с числом прошедших с момента запуска программы Arduino миллисекунд.

Рис. 6

Рис. 6

Переведём клавиатуру в режим за­главных букв коротким нажатием на клавишу Caps Lock. На клавиатуре должен включиться одноимённый индикатор.

Если теперь нажимать на клавиши латинских букв А, а, В, b, С, с и, нажав на клавишу Enter, отправлять код соот­ветствующей буквы в Arduino, то, со­гласно полученной команде, светодиод станет вспыхивать однократно, дважды или трижды, а сообщения о времени будут появляться на экране реже.

Некоторые клавиши выполняют управляющие функции.

Клавиша Caps Lock переключает на клавиатуре одноимённый индикатор и изменяет регистр передаваемых при нажатиях на клавиши букв. При вклю­чённом индикаторе они заглавные, а при погашенном — строчные.

При нажатой клавише Shift (как правой, так и левой) поднимается регистр цифровых и знаковых клавиш, а регистр букв становится противопо­ложным установленному клавишей Caps Lock.

Клавиша Scroll Lock управляет одноимённым индикатором клавиату­ры. Когда индикатор включён, к после­довательности символов из ряда 21, передаваемой по последовательному интерфейсу в результате нажатия на клавишу Enter, программа автоматиче­ски добавляет коды перевода строки и возврата каретки. При погашенном индикаторе происходит передача только символов из ряда 21.

Клавиша Esc — очистка строки 21 без передачи информации.

Клавиша Back Space — удаление из* строки 21 ранее введённого символа.

Терминальный модуль получился очень простым и компактным. Его удобно использовать не только при отладке микро­процессорных устройств, но и для отображения текс­товой информации от лю­бых приборов, оснащённых последовательным интер­фейсом. А немного изме­нив программу микроконт­роллера и добавив, напри­мер, датчики температуры, влажности и атмосферного давления, можно превра­тить сам модуль в метео­станцию, выдающую ин­формацию на экран теле­визора. Питать модуль це­лесообразно от разъёма USB того телевизора, с которым он работает. Такие разъёмы есть практически в каждом современном те­леприёмнике.

Нужно признать, что описанный модуль не ли­шён недостатков. Напри­мер, при нажатии на клави­шу Enter кратковременно нарушается синхронизация телевизионного изображе­ния. В это время микро­контроллер модуля выво­дит информацию в после­довательный порт, и прио­ритет в прерываниях отдан этому процессу в ущерб формированию видеосиг­нала.

Скачать архив к проекту

ЛИТЕРАТУРА

  1. Модуль Evolution light на базе микро­контроллера ATmega88PA-AU. — URL: http:// ekits.ru/index.php?ukey=product&productl D=2520 (06.07.15).
  2. Видеосигнал. — URL: https://ru.Wikipedia.orgwiki/Видеосигнал (06.07.15).
  3. Долгий А. Клавиатура IBM PC. — Радио, 1997, №4, с. 24, 25; №6, С. 19—21.
  4. Редькин П. Интерфейс АТ РС-клавиатуры для МК популярных семейств. — Радио, 2008, № 9, с. 22-26.
  5. Горшков Д. и др. Персональный радио­любительский компьютер "Радио-86РК". — Радио, 1986, № 4, с. 24-26; № 5, с. 31—34; № 6, с. 26-28.
  6. Arduino Pro Mini — URL: http://arduino.ru/Hardware/ArduinoBoardProMini (06.07.15).

Автор: А. ПАХОМОВ, г. Владимир
Источник: журнал Радио №11, 2015

Постоянная ссылка на это сообщение: http://meandr.org/archives/29329

Добавить комментарий