В этой статье я хочу поделиться опытом использования индикатора FUTABA MSD204AJ в режиме последовательного интерфейса. Будем программировать на ардуине.
Для перевода индикатора в последовательный режим нужно установить перемычки в соответствии с даташитом:
J3-вкл
J4-выкл
J5-вкл
J6-вкл
J7-выкл
В этом режиме назначение выводов следующее (в соответствии с таблицей 11):
1 — Общий
2 — Питание 5В
3 — Вх/Вых данные
4 — Строб импульс
6 — Тактовые импульсы
Типичная посылка на индикатор состоит из стартового байта и непосредственно байта нужной нам информации (будь то команда или данные).
Стартовый байт состоит из пяти логических единиц, бита RW Чтения(1)/Записи(0), бита идентификатора RS Команды(0)/Данные(1), логического нуля — итого восемь бит. При этом запись битов в индикатора происходит по переднему фронту тактового импульса. А чтение битов из индикатора — по заднему фронту. Любая посылка чтения/записи начинается после заднего фронта сигнала Строб, а заканчивается по переднему фронту.
1 — в этот момент начинается прием/передачи.
2 — в этот момент заканчивается прием/передача
3 — в этот момент происходит чтение бита индикатором
4 — бит определяет Запись/Чтение
Вообщем наша задача:
1. установить строб в нуль.
2. установить вывод тактового сигнала в ноль.
3. выдать информационный бит.
3а. чутка подождать.
4. установить вывод тактового сигнала в единицу.
4а. чутка подождать.
5а пункты 2-4 делать 8 раз. — это будет первый байт.
5б пункты 2-4 сделать еще 8 раз. — это будет второй байт.
6. установить строб в единицу.
Итак, берем макетку ардуины и среду разработки.
Объявим дефайны:
#define _STB 2
#define _SCK 3
#define _SISO 4
Настроим порты ардуины:
pinMode(_STB, OUTPUT);
pinMode(_SCK, OUTPUT);
pinMode(_SISO, OUTPUT);
Установим strob и clock в лог единицу:
digitalWrite(_STB,1);
digitalWrite(_SCK,1);
И начнем отправлять биты в индикатор. Т.к. нам нужно отправлять 2 байт друг за другом, то сделаем это при помощи вложенного цикла for в for.
Создадим процедуру, обзовем ее futab. Она будет использовать две входящие переменные. x1 это первый стартовый байт, x2 — это байт данных.
void futab(int x1, int x2){
digitalWrite(_STB,0); //п.1
for (j=1; j<3; j++){
if (j==1) {cmd = x1;} else {cmd = x2;} //п. 5а, 5б
for (i=7; i>-1; i--) {
digitalWrite(_SCK,0); //п.2
digitalWrite(_SISO,bitRead(cmd,i)); //п.3 устанавливаем на выходе i-й бит байта
delayMicroseconds(2); //п.3а чутка ждем
digitalWrite(_SCK,1); //п.4
delayMicroseconds(2); //п.4а чутка ждем
}
}
digitalWrite(_STB,1); //п.6
}
Ну и всё, можно пользоваться этой процедурой. Как? А вот так:
futab(0b11111000,0b00000001); //стартовый байт и команда 4-4-1 очистки дисплея.
// или так
futab(0b11111000,0b10010101); //стартовый байт и команда 4-4-8 установки адреса DDRAM = 15h, т.е. установить курсор в 3-ю строчку 2-й столбец
// а также так
futab(0b11111010,0b010000010); //вывод кода 41h (буква А). Команда 4-4-10.
Вот так это выглядит на экране осциллографа
Ну а дальше просто кидать команды и данные в индикатор и получать на табло всякие надписи. Сама система команд очень похожа на команды популярного контроллера HD44780, за исключением пары управляющих бит, которыми можно управлять яркостью индикатора.
Т.к. применения данного индикатора не вижу, то выведу простой Hello, world. Напишу, что называется в лоб, по буквам. Никаких библиотек, только коды символов, только хардкор.
Здесь код
/* FUTABA */
#define _STB 2
#define _SCK 3
#define _SISO 4
int i,j,n,m;
int cmd;
void futab(int x1, int x2){
digitalWrite(_STB,0);
for (j=1; j<3; j++){
// delay(1500);
if (j==1) {cmd = x1;} else {cmd = x2;}
for (i=7; i>-1; i--) {
digitalWrite(_SCK,0);
digitalWrite(_SISO,bitRead(cmd,i));
delayMicroseconds(2);
digitalWrite(_SCK,1);
delayMicroseconds(2);
}
}
digitalWrite(_STB,1);
delay(50);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // starts the serial monitor
pinMode(_STB, OUTPUT); //скажем портам "работать на выход"
pinMode(_SCK, OUTPUT);
pinMode(_SISO, OUTPUT);
digitalWrite(_STB,1); // и установим их в единички
digitalWrite(_SCK,1);
futab(248,1); //очистка дисплея команда 4-4-1
delay(2000); //подождем пару секунд
futab(250,0x87); // П
futab(250,0x50); // Р
futab(250,0x84); // И
futab(250,0x42); // В
futab(250,0x45); // Е
futab(250,0x54); // Т
futab(248,0b11000011); // команда 4-4-8 установка адрса ДДРАМ=43h это адрес вторая строка, четвертый столбец
futab(250,0x48); // H
futab(250,0x61); // a
futab(250,0x62); // b
futab(250,0x72); // r
futab(248,0b11011111); // команда 4-4-8 установка адрса ДДРАМ=5Fh это 4-я строка, 12й столбец
futab(250,0x35); // 5
futab(250,0x65); // e
futab(250,0x72); // r
futab(250,0x47); // G
futab(250,0x30); // 0
futab(248,0b10011011); // команда 4-4-8 установка адрса ДДРАМ=5Dh это 3-я строка, 10й столбец
futab(250,0x30); // 0
futab(250,0x37); // 7
futab(250,0x2E); // .
futab(250,0x30); // 0
futab(250,0x34); // 4
futab(250,0x2E); // .
futab(250,0x32); // 2
futab(250,0x30); // 0
futab(250,0x31); // 1
futab(250,0x36); // 6
for (m=1; m<5; m++){
for (n=1; n<4; n++){
futab(248,0b00011100); //команда 4-4-5 подвигаем весь экран вправо
delay(100);
}
for (n=1;n<4;n++){
futab(248,0b00011000); //команда 4-4-5 подвигаем весь экран влево
delay(100);
}
}
delay(1500);
for (n=1;n<5;n++){
futab(248,0b00001000); //команда 4-4-4 выключим дисплей
delay(100);
futab(248,0b00001100); //команда 4-4-4 включим дисплей
delay(100);
}
delay(1500);
for (n=1;n<5;n++){
futab(248,0b00111101); //команда 4-4-6 установка яркости 75%
delay(100);
futab(248,0b00111110); //команда 4-4-6 установка яркости 50%
delay(100);
futab(248,0b00111111); //команда 4-4-6 установка яркости 25%
delay(100);
futab(248,0b00111110); //команда 4-4-6 установка яркости 50%
delay(100);
futab(248,0b00111101); //команда 4-4-6 установка яркости 75%
delay(100);
futab(248,0b00111100); //команда 4-4-6 установка яркости 100%
delay(100);
}
delay(1000);
// нарисуем парочку собственных символов
futab(248,0b01001000); //команда 4-4-7 установим адрес CGRAM=8
futab(250,0b00001110);
futab(250,0b00010001);
futab(250,0b00010001);
futab(250,0b00010011); //батарейка
futab(250,0b00010111);
futab(250,0b00011111);
futab(250,0b00011111);
futab(250,0b00011111);
futab(248,0b01010000); //команда 4-4-7 установим адрес CGRAM=16
futab(250,0b00000000);
futab(250,0b00000001);
futab(250,0b00000110);
futab(250,0b00001100); //какая-то фигня
futab(250,0b00010001);
futab(250,0b00000110);
futab(250,0b00001100);
futab(250,0b00010000);
// и выведем их
futab(248,0b10010011); // курсор в координатах 1*20
futab(250,0b00000001); // вывод символа из CGRAM c адреса 1
futab(248,0b11010011); // курсор в координатах 2*20
futab(250,0b00000010); // вывод символа из CGRAM c адреса 2
}
void loop() {
}
И в заключение видео работы:
infrapro
какое питание у индикатора?
Vanger
5V ну про это еще и в начале написано
5erG0
5 вольт. Необходимое повышенное напряжение для питания самого лампового индикатора формируется на борту — там установлен повышающий преобразователь. Но нас это совершенно не должно волновать :)
infrapro
Меня как раз интересует этот повышающий преобразователь, хотел бы знать его схемотехническое устройство. В даташите на этот дисплей такой инфы, к сожалению, не нашел
5erG0
а зачем вам это знать? Этот индикатор — законченное устройство, plug&play как говорится. Как простая лампочка накаливания. Берите и пользуйтесь, и не заморачивайтесь. В HD44780 тоже ни слова про схемотехнику каких-нибудь дешифраторов
infrapro
Имею индикатор, который требует подключения дополнительного питания, а тут как раз вижу статью, в которой описан VFD дисплей со встроенным преобразователем, вот и интересуюсь, может возможно узнать схемотехнику этого преобразователя. Предполагаю, что используется какое-нибудь законченное решение на базе микрухи с обвязкой, как раз то, что мне нужно
5erG0
Пожалуйста, изучайте :) Никаких микросхем. Все «на одном» транзисторе
Alexeyslav
Что-то я не уверен на счет одного транзистора, там их как минимум 3 штуки и 3 стабилитрона с кучей диодов. На блокинг-генератор не похож, да и силовой транзистор слишком крупненький как для маломощного устройства. Может, обратноход?
Ведь кроме высокого напряжения нужно еще и накальное, изолированное гальванически и стабилизированное.
Sleepwalker_ua
Если знаете, какое именно нужно напряжение на выходе, гуглите что-то на lm2566\2567 например, обвязки ерунда, а точность и диапазон возможной регулировки весьма широк + у китайцев есть готовые платы по цене от 1.2 до 5-6 долларов. смотря что и сколько нужно.
alexkunin
Классный индикатор: теплый и ламповый. Действительно хорошо выглядит, так и хочется что-нибудь сделать эдакое с ним.
25080205
Да уж… Меня с раннего детства перло от этих жизнерадостно зеленых индикаторов… И как приятно видеть, что технология жива до сих пор!
Но цена… Кому «ехать» без вариантов предпочтет LCD за 5, чем эту конфетку, но за 55 :-(
5erG0
Меня до сих пор прет, но вот не знаю куда применить.
MartinX
Ищите более интересные и в часы, чисто из-за красоты. А так они все же устарели в большинстве случаев. Хотя символьный индикатор вроде вашего я бы применил в магнитоле, но слишком они дороги (от 50$ до 300$ графические).
Alexeyslav
Я бы предпочёл OLED индикаторы вакуумным. И потребление и хрупкость и контраст изображения выигрывают у вакуумных, а ресурс… даже больше чем у вакуумных(если не брать в расчёт отбраковку).
25080205
Ну да… Но они какие-то безжизненные, нет такого живого мерцания, нет разных хитрых контактиков, сеточек, едва различимой красной ниточки… Так-то «восьмерка» на диодах копейки, LCD тоже, кому надо для дела. А качественный цветной экран стоит соизмеримо и позволяет многое «нарисовать», в том числе с имитацией люминисцентного или вакуумного индикатора, а то и ЭЛТ, но вблизи видно же, что «не то»…
NLO
НЛО прилетело и опубликовало эту надпись здесь
5erG0
это мой первый пост. я еще тут не освоился. Не могу понять разницу направлений — хабр, гик, мегамозг
IronHead
Разница примерно такая:
Хабр: Быстрый алгоритм распознавания изображений на 8-битных микроконтроллерах табличным методом
Гиктаймс: Смотрите, я прикрутил дисплей к ардуино!
Мегамозг: Как продавать китайские ардуины или реалии перегруженного рынка сбыта…
NetBUG
Самое главное — что текст может при этом незначительно различаться путём создания акцента на том или ином разделе.
r00tGER
И что теперь ваш комментарий делает на гиктаймсе?
ZafiRUS
Эмм, а аппаратный SPI нельзя для этого использовать? Судя по диаграмме это в чистом виде SPI на 3х проводах с CSn
5erG0
честно не думал об этом, ибо в синтаксисе ардуины не силен. Больше программировал на AVRовском асме
SopaXT
Её же можно из AVRStudio цеплять, нет?
ikaktys
там какой то кривой SPI
http://datasheet.elcodis.com/pdf2/94/90/949025/m204sd02aj.pdf