Pull to refresh

Arduino-терминал

Reading time 6 min
Views 33K
Иногда тебе позарез нужен девайс, которого нет ни в одном магазине. Можно ждать и надеяться, что, когда-нибудь производители выпустят то, чего тебе так не хватает. Можно запереться в гараже, запасшись пиццей и пивом — и через десяток-другой месяцев явить миру Apple, летающий автомобиль или супер-поисковик. А можно взять Arduino и за пару викендов смастерить девайс, без которого ты как без рук. Лично мне последние полгода категорически не хватало наголовного дисплея, который подключался бы к компьютеру без гирлянд проводов. И я взяла в руки Arduino…

Зачем мне столь экзотическое устройство? Я несколько лет пользуюсь носимым компьютером собственной сборки. Для меня это — рабочий инструмент, дающий мне возможность использовать время в дороге между домом и офисом для работы над собственными проектами. А 2 рабочих часа 5 раз в неделю, это 2*5*52 = 520 рабочих часов в год или 520/40/4.5 = почти три полноценных рабочих месяца. Три месяца, не оторванных от семьи, выходных или сна, а появившихся «ниоткуда». Только за счет того, что я могу работать в дороге в любой ситуации — в час пик, на ходу от метро к офису, в полночь на остановке автобуса. В тех ситуациях, когда ноутбуком не воспользуешься.

Естественно, кроме рабочих инструментов мой НК (носимый компьютер) стал понемногу обрастать и побочными функциями — воспроизведением музыки, VoIP-телефонией. Появился наголовный дисплей. Но использовать его вне помещения можно только ради эпатирования окружающих. Длинный, протянутый от наголовника к лежащему в сумке компьютеру, цепляющийся за все провод с висящим на нем адаптером/аккумулятором/пультом управления… На улице таким не воспользуешься, нужно беспроводное решение. Я знаю про появившиеся не так давно видео-адаптеры, способные гнать по WiFi видео от компа к телевизору (http://habrahabr.ru/blogs/hardware/80314/, ferralabs.ru/index.php?news=2989). Но перспектива разместить у собственного виска WiFi-модуль меня не особенно вдохновляет. С другой стороны, многие сейчас носят в ухе bluetooth-серьгу — и ничего, живы. Конечно, видео по bluetooth не посмотришь, а вот работать с текстовой консолью — вполне реально. Так как я работаю в основном под линуксом, а главный из собственных проектов — разработка «серверного ПО для НК», то консоли для работы мне более чем достаточно.

В альфа-версии устройства (о которой и пойдет ниже речь) я решила несколько упростить задачу:
— временно отказаться от синезубого модуля (подключить его позже будет несложно, да и создание автономного питания переносится «на потом»);
— в качестве микроконтроллерной платы использовать не миниатюрные Freeduino Nano или Arduino Mini, а полноразмерную и избыточно мощную Seeeduino Mega.

С «железной составляющей» все оказалось на удивление просто. Я купила плату расширения TellyMate. Подключение TellyMate к Seeeduino Mega заняло пару секунд. Все! Железная часть — готова!



Самое время вкратце рассказать, о том, что же такое эти самые Seeeduino Mega и TellyMate.



Seeeduino Mega



Seeeduino Mega — это Arduino-совместимая плата. Останавливаться на том, что такое Arduino, не стану — я об этом уже писала. Приведу лишь характеристики Seeeduino Mega в сравнении с Arduino Mega, избыточные для данного проекта:




TellyMate



TellyMate — это плата расширения для Arduino, разработанная британскими умельцами. Позволяет выводить текст на экран телевизора по обычному композитному выходу («тюльпан»). TellyMate поддерживает подмножество команд терминала VT-52, выдает черно-белое изображение, размер экрана — 38*25 символов. Позволяет хранить в памяти от 1 до 11 шрифтовых наборов (в зависимости от модели платы). В каждом шрифтовом наборе — 256 символов с матрицей 8*9. Любой набор шрифтов можно программно переопределить. При этом переопределенный шрифт сохраняется в памяти платы и после выключения. Так что помимо текста можно выводить и графику, используя переопределенные символы.

Конечно, черно-белый экран 38*25 — не совсем то, чего мне хотелось бы получить, но для первой версии вполне достаточно. Плата построена на микроконтроллере ATmega8, опенсорсна (можно самостоятельно спаять аналогичное устройство по выложенным в интернет схемам). На экран ТВ текст выводится стандартными командами Serial.print(), Serial.println(). Общается TellyMate с Arduino через стандартный COM-порт — тот самый, по которому Arduino общается с компьютером. Поэтому при загрузке программы на устройство по экрану телевизора начинают бежать символы.

Из-за этого совместного использования COM-порта для общения ардуины и с компом, и с TellyMate у меня поначалу были сомнения, не станет ли такая конструктивная особенность непреодолимым препятствием для создания терминала. Как показал опыт, опасения оказались напрасны, все заработало :)



Если сборка «железной» части потребовала совсем немного времени, то на программную составляющую мне пришлось потратить пару викендов. На моем нетбуке ASUS EeePC 901 установлена Eeebuntu 3.0. Поэтому я воспользовалась стандартной линуксовской техникой работы с псевдотерминалами (огромное спасибо ЖЖ-юзеру tzirechnoy за помощь!). Запускаемый на ноутбуке самописный «терминальный сервер», открывает псевдотерминал и запускает в нем bash. После чего начинает отправлять символы, выводимые на псевдоэкран псевдотерминала, моему девайсу через виртуальный COM-порт. Пока что девайс общается с компьютером по проводному USB-подключению. Когда я заменю его беспроводным синезубым, придется внести некоторые изменения в программу, но сильно на архитектуре это не отразится.

В MS Windows нет механизмов, аналогичных линуксовским псевдотерминалам, так что над портированием софта под винды мне еще придется поломать голову. У меня нет опыта программирования приложений под Windows, поэтому буду благодарна за советы по написанию аналогичной программы под винды, а так же за советы в выборе инструментария (интересуют бесплатные средства разработки).

Исходник «терминального сервера»: ardu-term.c

Написать программу, запускаемую на девайсе, было гораздо проще. Но сначала стоит загрузить на устройство кириллицу — в стандартной теллимейтовской прошивке она отсутствует. За основу я взяла шрифт Press Start, созданный и выложенный для свободного использования неким пользователем с ником Codeman38. Вот моя версию шрифта, адаптированная под KOI8-R:



Сначала я сделала шрифт в соответствии с CP-1251, но, выяснив, что в такой раскладке нет символов псевдографики, переделала шрифт под KOI-8R.

Следующей проблемой стала загрузка созданного шрифта в шилд. На сайте разработчиков TellyMate можно скачать программу, загружающую шрифт в память девайса. Есть также ссылка на google-приложение, позволяющим создать собственный фонт. Честно говоря, нарисовав шрифт в графическом редакторе, мне было лень заново по точкам вводить символы в теллимейтовском гуглософте, так что пришлось, проанализировав приложение для загрузки фонта, разобрать формат данных шрифта. Первые 256 байт данных шрифта — это верхние 8 пикселов всех 256 символов. Следующие 256 байт — вторая сверху строчка каждого из 256 символов — и так далее, до самой нижней, 9-й строчки. Я написала несложную программку на Processing, создающую массив данных для шрифта по картинке со шрифтом: tv_img2font.pde. Почему Processing? Раз уж я пишу для Arduino на Arduino IDE, логично использовать для разработки на компьютере близкородственный пакет. Чтобы создать данные для загрузки шрифта, нужно прописать в тексте tv_img2font.pde имя файла с картинкой-шрифтом и запустить программу в среде Processing. В окне вывода появится код (0x00, 0xAB, 0xC3,...), задающий шрифт. Этот код нужно скопировать и вставить в программу для загрузки шрифта.

Преграмма, загружающая шрифт в КОИ-8Р на Ардуино: tv_font_upload.pde. В этой версии программы уже прописан нужный мне кириллический шрифт. Подключим наш Arduino-терминал к компьютеру, запустим Arduino IDE, откомпилируем в нем эту программу и загрузим ее на наш терминал:



После загрузки шрифта, остается загрузить на устройство софт, который наконец превратит Seeeduino+TellyMate в терминал: tv_terminal.pde (компилируем в Arduino IDE и загружаем на терминал).

Voila! Теперь можно использовать телевизор или наголовный дисплей в качестве текстовой консоли. А чтобы уж совсем не прикасаться к ноутбуку, для ввода текста возьмем bluetooth-клавиатуру, например, Nokia SU-8W.





Замеченные недостатки системы:
— Не работают функциональные клавиши и стрелки при запуске Midnight Commander'а.
— Слишком длинное «умолчательное» приглашение командной строки. Знать бы, как сразу после запуска bash'а заставить его выполнить export PS1="\u\$"…

Осталось доделать:
— Заменить подключение девайса к нетбуку по USB на подключение по Bluetooth.
— Сделать автономное питание для девайса.
— Заменить Seeeduino Mega на Freeduino Nano.
Tags:
Hubs:
+79
Comments 103
Comments Comments 103

Articles