24.05.2009

Arduino и ЖКИ-модуль H1313/120D

На прошлой неделе по случаю купил индикатор ЖКИ.

Купил просто так, из спортивного интереса - на вопрос о документации продавцы только печально развели руками: нету, дескать. Я решил, что с помощью Arduino смогу его "оседлать", пусть даже путем экспериментирования. Мысленно окрестив себя безумным тинкером, я безропотно выложил деньги за непонятный девайс.

Модуль выглядит так:



С обратной стороны висит кварц в цилиндрическом корпусе и керамический конденсатор. Единственное, что позволяло его идентифицировать - надпись H1313/120D на печатной плате:



Конечно же, Гугл про него ничего вразумительного не сказал. Зато удалось найти упоминание о таком дисплее на "Молотке", но увы - текст аукциона был перемещен в архив, прояснилось только, что это - модуль индикации телефонного аппарата.

К счастью, названия сигналов были подписаны на колодке сверху:



Слева направо: HK, DI, Vss, SK, T и еще один безымянный. Коллеги на работе указали на то, что Vss и безымянный - это питание, DI и SK - линия данных и синхронизация, по поводу остального предположений не было. Я остался один на один с непонятным дисплеем и могучим Интернетом. Ответ отыскался спустя часа полтора, в виде статьи "ЖКИ модули со встроенным контроллером HT1611/2" Леонида Ивановича Ридико.

Это - действительно дисплей телефонного аппарата. Основная особенность - наличие встроенного таймера, который отображается после того, как вы благополучно набрали номер телефона. Таймер живет своей обособленной жизнью и никак не доступен для считывания или установки по шине (разве что, можно его сбросить). Зато, по последовательной шине можно передавать набор из 16 разных символов - новый символ появляется справа, остальные сдвигаются влево, самый левый пропадает. Вот знакогенератор:



В статье рассматриваются контроллеры HT1611/HT1613, производимые фирмой Holtek Semiconductors Inc, вот страница с документацией у производителя. Мой же, похоже, оказался сильно урезанной версией, без часов, кнопок и прочих излишеств.

HK - это кнопка "поднятие трубки" (Hook). Если там 0 - это значит, что трубку сняли, дисплей начинает индикацию. Если там 1 - трубку повесили, и отображать ничего не надо (я немного упростил, но суть - правильная). Данные засылаются последовательным кодом (от старшего бита к младшему):



Данные записываются по спаду SK, при этом время установки ta> 1мкс, а время удержания данных tb> 2 мкс. Главная хитрость - после передачи оставить SK в состоянии логического 0, в противном случае, через 5 секунд бездействия наша информация пропадет и покажется злосчастный таймер, который начнет отсчитывать секунды разговора.

Дисплей - суперэкономичный, питается от напряжения около 1,6 В, поэтому для согласования с пятивольтовым МК Arduino пришлось сделать простой делитель на резисторах - на питание и на сигналы SK/DI. Получилась несложная схема:



Для работы требуется минимум две линии Arduino - я выбрал digital 5 и 6, к которым подключены SK и DI. Чтобы не плодить провода, я решил запитать его от digital 4 и digital 7, создав на них разность потенциалов. Для начала, я собрал схему на макетной плате:



Запустилось сразу же:



Маленький кусочек макетки, резисторы, колодки и вилки PBS/PLS - и получается компактный переходник:





Скетч, выводящий знакогенератор на дисплей:

 
#define DI 5
#define SK 6
#define VCC 7
#define GND 4
#define HK 3

void setup() {
pinMode(DI,OUTPUT);
pinMode(SK,OUTPUT);
pinMode(GND,OUTPUT);
pinMode(VCC,OUTPUT);
digitalWrite(GND,LOW);
digitalWrite(VCC,HIGH);
digitalWrite(SK,LOW);
pinMode(HK,OUTPUT);
digitalWrite(HK,LOW);
}

void writeDigit(byte d) {
for (int i=0;i<4;i++) {
digitalWrite(SK,HIGH);
digitalWrite(DI, d & (1 << (3-i)));
delayMicroseconds(1);
digitalWrite(SK,LOW);
delayMicroseconds(5);
}
}

void loop() {
digitalWrite(HK,LOW);
for (int i=0;i<16;i++) {
writeDigit(i);
delay(500);
}
digitalWrite(HK,HIGH);
delay(5000);
}


Итак, в результате экспериментов, мы получили 10-разрядный цифровой дисплей с последовательной записью для Arduino. Без статьи это сделать можно было бы, но ушло бы гораздо больше времени. Вывод напрашивается сам собой - для подобных экспериментов было бы неплохо иметь логический анализатор. Я его уже заказал, по традиции - выписал из-за границы. Как получу - обязательно напишу обзор ;)

Скачать архив со скетчем для Arduino и схемой.

6 комментариев:

  1. Прикольно, жаль что у знакогенератора нет букв...

    ОтветитьУдалить
  2. Да, жаль. Зато мало ест...

    ОтветитьУдалить
  3. Схема делителя сигналов DI и SK правильная? По моему резисторы 4.3K должны быть с обратной стороны - между контактами разъёма индикатора.

    ОтветитьУдалить
  4. Точно! Спасибо, проморгал!

    Но работает, что характерно...

    ОтветитьУдалить
  5. Исправил схему, Piotr - еще раз спасибо!

    Приятно осозновать, что метры тоже читают мой блог ;)

    ОтветитьУдалить
  6. Весьма прикольно. Хотелось бы вообще найти блог/форум, в котором регулярно появлялись бы статьи по расхакиванию и подключению старых "неопознанных" девайсов к Arduino ;-). Просто как некий "квест", плюс на каждую игрушку-перефирию для Arduino по 20 баксов не выложишь.

    ОтветитьУдалить