записки маніяка

Reductio ad absurdum.
Друзі і не дуже! Ви, напевно, не раз спостерігали на касах в магазинах такі симпатичні зелені екранчики, на яких ви бачили суму своєї покупки та іншу корисну інформацію. А ви не думали про те, що такий екранчик від зламаного апарату цілком можна спробувати пристосувати для домашніх потреб? А якщо, наприклад, підключити це до комп'ютера, щоб воно виводило якусь корисну інформацію? Ось цим ми зараз і займемося.
Відразу зазначу: не варто бігти і ламати перший-ліпший касовий апарат, не прочитавши всього тексту. Пост написаний, перш за все, для людей, яким випадково попався саме ось такий дисплейний модуль, як у мене, і вони не знають, що з цим модулем робити. Справа в тому, що, по-перше, цей конкретний модуль відрізняється "трохи нестандартною" системою команд, а по-друге, до цього дня дуже мало на світі софта, призначеного для таких дисплеїв.
Отже. Ті, кому це не цікаво, проходять повз, а інших прошу під кат.
Отже, попався в мої лапи якийсь суворий чугуніевий POS-термінал вітчизняного виробництва, який називається "Штрих-М". Несправний. Після кількох безуспішних спроб оживити девайс цілком, я почав задивлятися на досить великий двухстрочний зелений VFD-дисплей на ньому. Як з'ясувалося, цей дисплей називається "дисплеєм покупця" і тим же "Штрихом" вбудовується в POS і продається окремо.
Після расковиріванія агрегату і вивчення модуля з'ясувалося наступне. Це тайванський VFD модуль компанії Flytech з підключенням по RS-232 інтерфейсу (COM-порт) і полем 2x20 символів. На самій платі розпаяний роз'єм 10P10C, на який підводиться і харчування модуля, і інтерфейсні лінії. Панікувати не варто, туди прекрасно влазить звичайний 8P8C роз'єм (RJ-45) і відмінно працює. Але про це трохи нижче.
Ось фотографія розбитого POS з першими спробами достукатися до дисплея.

Хочу висловити вдячність виробнику суворого агрегату "Штрих-М" за те, що на їхньому сайті викладена документація по протоколу обміну для цього модуля і драйвер з утилітою тестування. Драйвер нам не потрібен буде, а ось утиліта перевірки дисплея стане в нагоді.

Отже, що треба зробити, щоб VFD почала працювати окремо від терміналу?
По-перше, знайти COM-порт. По-друге, знайти роз'єм або кабель DB9F, щоб підключити дисплей до когось порту.
Викачуємо мануал до дисплея, посилання на який я давав вище, і бачимо, що нам від когось порту потрібні тільки три дроти: GND. TxD і DSR.

Будьте уважні: на роз'ємі 10P10C, який розпаяний на платі, крайні два контакти (по одному з кожного боку) не використовуються, але нумеруються в мануалі.

Схема підключення, як на скане вище. Третій контакт роз'єму 10P10C підключаємо до третього контакту когось порту, 4 контакт роз'єму 10P10C підключаємо до 5 контакту когось порту, 6 або 7 контакт роз'єму 10P10C підключаємо до 5 контакту когось порту, що залишився з них підключаємо до 12В харчування, 8 або 9 контакт роз'єму 10P10C підключаємо до +12 В харчування. На стороні комп'ютера треба ще додатково замкнути 7 і 8 контакти когось порту для повернення синхросигналу, в іншому випадку можна отримати підвішеному софт. Решта "ноги" не використовуються.

Підключаємо вийшло диво до порту, подаємо харчування і запускаємо програму "Тест драйвера дисплея покупця" з комплекту драйверів, посилання на який я знову ж давав вище (ви ж завантажили його, правда?). Натискаємо там кнопку "Візуальна настройка", виставляємо номер порту, швидкість 9600 бод, 8N1, протокол Firinch, довжину рядка 20 і 2 рядки, і тиснемо "Тест". У разі успіху ви побачите ось таку картину:


Якщо текст вивівся - значить, все ОК, і можна йти далі. Якщо немає - перевіряємо правильність з'єднань, налаштування утиліти і положення перемикачів на платі VFD. Перемикачі ці можна просто перемкнути всі вісім штук в положення ON (в сторону плати). У такому варіанті працювати воно буде (це дефолтні настройки: швидкість 9600, кодова сторінка US English, протокол обміну Firinch \ CD5220). В мануалі до дисплея є таблиці положень перемикачів, якщо буде потрібно ці самі настройки поміняти.
Можна ще послати текст на VFD через HyperTerminal або іншу програму для роботи з послідовним портом. Наприклад, текст "Hello World!" на знімку нижче був поданий на дисплей саме через "гіпертерміналу". Сервісні команди теж можна посилати "вручну". Наприклад, для очищення екрану можна послати послідовність ESC @ (тиснемо кнопку Ескейп і слідом вводимо "собаку"). Це команда ініціалізації екрана. В мануалі до дисплея прописані всі керуючі послідовності, деякі з яких нам знадобляться пізніше.

Якщо текст виводиться і взагалі дисплей працює, можна, естетики заради, викинути зайву интерфейсную плату і підключити кабель від когось порту і кабель живлення безпосередньо до плати дисплея. Якщо ви, зрозуміло, відразу так не зробили. Беремо звичайний RJ-45 роз'єм (8P8C) та вставляємо в нього наші кабелі. У точно такому самому порядку, як припаювали до плати. Не забуваємо, що у 8P8C на два контакту менше, тому контакт №2 на платі (TxD) стає контактом №1 в RJ-45.

Після обтиску RJ-45 і підключення до плати дисплея ми отримуємо функціонально закінчений пристрій без зайвого мотлоху.

Коричнева конструкція, видима ліворуч від багатофункціонального гнізда, є 3-контактним роз'ємом від дохлого процесорного кулера, в якому замкнуті крайні контакти. Раніше там сидів вимикач харчування дисплея.

Тепер, цю конструкцію непогано було б перевірити на працездатність. Виводимо що-небудь на дисплей, і якщо воно не виводиться - уважно перевіряємо правильність обтиску.




Тепер справа за програмним забезпеченням. Справа в тому, що і так замало софта, який здатний виводити якусь корисну інформацію на LCD або VFD дисплей. Плюс до цього, при спробах пристосувати подібний софт позначалася, в першу чергу, нестандарт система команд саме цього дисплея. Наприклад, часто використовувана таким софтом команда очистити дисплей, у цій плати кодується символом 12 ASCII (FF), або 0x0C в шістнадцятковій системі, тоді як софт ліпить в порт команду 21 (NAK), вона ж 0x15, яку девайс успішно ігнорує. Поєднання відмінностей в цій та інших командах призводить до некоректної роботи девайса: текст, хоч і виводиться сам по собі коректно, починає плавати в різні боки, дисплей періодично починає показувати повну нісенітницю, або навіть зовсім відключитися.
Як приклад, команда перекладу курсору на початок рядка, видавлені в порт якимось плагіном WinAmp, геть ігнорується, і початок другого рядка виходить там, де закінчилася перша. Виглядає це все забавно, але нечитабельне - з огляду на те, що той текст, якому не вистачило місця в цій самій другому рядку, автоматично переноситься дисплеєм на перший рядок, затираючи частина вже існуючої там інформації.

На жаль, переважна кількість подібного ПО має в своєму складі кілька налаштувань для різних дисплеїв (серед яких, звичайно ж, немає нашого) і поміняти кілька команд в будь-якому з цих попередніх на правильні не представляється можливим, оскільки предустановки лежать у вигляді бібліотек. Можна, звичайно, взяти і написати бібліотеку самому, взявши за основу API програми або приклади для програмування, викладені на офіційному сайті, але це не до мене - я не програміст.
Тому я продовжив шукати програми, які або дозволяють вписувати довільні набори команд дисплея, або довільно змінювати ці команди в текстових файлах попередніх без використання компіляторів.
Першою, і поки єдиною програмою з такою можливістю, яку я знайшов, був MediaPortal - оболонка для мультимедіа-центрів та інших домашніх кінотеатрів на базі ПК. У комплекті з програмою йде плагін Mini Display, який підтримує команди для цілої купи дисплеїв.

А найголовніше, що серед цієї купи була виявлена попереднє встановлення під назвою Generic Serial Character VFD / LCD driver, що дозволяє вспісать в кілька полів потрібні командні послідовності символів!

Отже, ставимо MediaPortal. Мова вибираємо англійська! Або потім міняємо в налаштуваннях на англійську. Після установки в налаштуваннях програми (виконаних у вигляді окремої програми MediaPortal Configuration) включаємо плагін MiniDisplay. Потім кнопка Config переносить нас в настройки самого плагіна. де ми вибираємо порт, кількість стовпців і рядків символів на дисплеї, а кнопка Advanced переносить нас ще глибше - до установок швидкості порту і призначається командним послідовностям.

Відповідно до мануалом до дисплея, заносимо в поля відповідні послідовності. Звертаю вашу увагу, що плагін вимагає записи послідовностей в шістнадцятирічних числах, у вигляді 0x00, розділених пробілами (якщо конкретна команда складається з декількох символів. Так, наприклад, команду зміщення курсору вправо, по мануалу визначається символом Ht (09 в шістнадцятковій формі), в відповідне поле плагіна треба запісиать як 0x09. а команда ініціалізації дисплея Esc @ (вона ж 1B 40) перетворюється в 0x1B 0x40.
Заповнивши поля згідно мануалу або моїм скриншотам, можна закривати конфигуратор і запускати сам Медіапортал. Після завантаження оболонки, в разі коректно виставлених налаштувань і керуючих послідовностей, на екрані має висвітитися ось це:

Потім можна погуляти по пунктам меню. Кожна дія в медіапорталі - переміщення по меню, входи і виходи з ієрархії меню, запуск і зупинка відтворення медіафайлів - має відображатися на дисплеї.

Єдиний момент, який я поки не переміг. Через відсутність мізків або у цьому винна банальна лінь - не знаю. Дисплей, який дістався мені на розтерзання і програма MediaPortal підтримують різні кодування української мови. Саме тому я говорив про англійську мову трохи раніше. Дисплей вимагає кодування CP866 для української мови, в настройках ж медіапортал я не знайшов пункту, що відповідає за кодування посилається на міні дисплей тексту.

На цій, не надто позитивною, ноті я закінчую сьогоднішній пост. Оскільки дослідження я продовжу, можливо, буде друга частина, в якій будуть описані ті чи інші результати зазначених досліджень.