image

В этой статье я хочу поделиться опытом использования индикатора FUTABA MSD204AJ в режиме последовательного интерфейса. Будем программировать на ардуине.

Для перевода индикатора в последовательный режим нужно установить перемычки в соответствии с даташитом:

J3-вкл
J4-выкл
J5-вкл
J6-вкл
J7-выкл

image

В этом режиме назначение выводов следующее (в соответствии с таблицей 11):

1 — Общий
2 — Питание 5В
3 — Вх/Вых данные
4 — Строб импульс
6 — Тактовые импульсы

Типичная посылка на индикатор состоит из стартового байта и непосредственно байта нужной нам информации (будь то команда или данные).

Стартовый байт состоит из пяти логических единиц, бита RW Чтения(1)/Записи(0), бита идентификатора RS Команды(0)/Данные(1), логического нуля — итого восемь бит. При этом запись битов в индикатора происходит по переднему фронту тактового импульса. А чтение битов из индикатора — по заднему фронту. Любая посылка чтения/записи начинается после заднего фронта сигнала Строб, а заканчивается по переднему фронту.

image

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.

Вот так это выглядит на экране осциллографа

image

image

Ну а дальше просто кидать команды и данные в индикатор и получать на табло всякие надписи. Сама система команд очень похожа на команды популярного контроллера 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() {
 
}


image

И в заключение видео работы:

Комментарии (24)


  1. infrapro
    08.04.2016 11:36

    какое питание у индикатора?


    1. Vanger
      08.04.2016 11:59

      5V ну про это еще и в начале написано


    1. 5erG0
      08.04.2016 12:35
      +1

      5 вольт. Необходимое повышенное напряжение для питания самого лампового индикатора формируется на борту — там установлен повышающий преобразователь. Но нас это совершенно не должно волновать :)


      1. infrapro
        08.04.2016 13:30

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


        1. 5erG0
          08.04.2016 13:53

          а зачем вам это знать? Этот индикатор — законченное устройство, plug&play как говорится. Как простая лампочка накаливания. Берите и пользуйтесь, и не заморачивайтесь. В HD44780 тоже ни слова про схемотехнику каких-нибудь дешифраторов


          1. infrapro
            08.04.2016 15:39

            Имею индикатор, который требует подключения дополнительного питания, а тут как раз вижу статью, в которой описан VFD дисплей со встроенным преобразователем, вот и интересуюсь, может возможно узнать схемотехнику этого преобразователя. Предполагаю, что используется какое-нибудь законченное решение на базе микрухи с обвязкой, как раз то, что мне нужно


            1. 5erG0
              08.04.2016 15:48
              +1

              Пожалуйста, изучайте :) Никаких микросхем. Все «на одном» транзисторе

              Обратная сторона
              image


              1. Alexeyslav
                11.04.2016 11:36

                Что-то я не уверен на счет одного транзистора, там их как минимум 3 штуки и 3 стабилитрона с кучей диодов. На блокинг-генератор не похож, да и силовой транзистор слишком крупненький как для маломощного устройства. Может, обратноход?
                Ведь кроме высокого напряжения нужно еще и накальное, изолированное гальванически и стабилизированное.


            1. Sleepwalker_ua
              09.04.2016 00:51
              +1

              Если знаете, какое именно нужно напряжение на выходе, гуглите что-то на lm2566\2567 например, обвязки ерунда, а точность и диапазон возможной регулировки весьма широк + у китайцев есть готовые платы по цене от 1.2 до 5-6 долларов. смотря что и сколько нужно.


  1. alexkunin
    08.04.2016 12:28

    Классный индикатор: теплый и ламповый. Действительно хорошо выглядит, так и хочется что-нибудь сделать эдакое с ним.


    1. 25080205
      08.04.2016 18:16

      Да уж… Меня с раннего детства перло от этих жизнерадостно зеленых индикаторов… И как приятно видеть, что технология жива до сих пор!
      Но цена… Кому «ехать» без вариантов предпочтет LCD за 5, чем эту конфетку, но за 55 :-(


      1. 5erG0
        08.04.2016 21:11

        Меня до сих пор прет, но вот не знаю куда применить.

        мои индикаторы
        1. MartinX
          09.04.2016 00:36

          Ищите более интересные и в часы, чисто из-за красоты. А так они все же устарели в большинстве случаев. Хотя символьный индикатор вроде вашего я бы применил в магнитоле, но слишком они дороги (от 50$ до 300$ графические).


      1. Alexeyslav
        11.04.2016 13:04

        Я бы предпочёл OLED индикаторы вакуумным. И потребление и хрупкость и контраст изображения выигрывают у вакуумных, а ресурс… даже больше чем у вакуумных(если не брать в расчёт отбраковку).


        1. 25080205
          13.04.2016 09:23

          Ну да… Но они какие-то безжизненные, нет такого живого мерцания, нет разных хитрых контактиков, сеточек, едва различимой красной ниточки… Так-то «восьмерка» на диодах копейки, LCD тоже, кому надо для дела. А качественный цветной экран стоит соизмеримо и позволяет многое «нарисовать», в том числе с имитацией люминисцентного или вакуумного индикатора, а то и ЭЛТ, но вблизи видно же, что «не то»…


  1. NLO
    08.04.2016 12:35

    НЛО прилетело и опубликовало эту надпись здесь


    1. 5erG0
      08.04.2016 12:36
      +2

      это мой первый пост. я еще тут не освоился. Не могу понять разницу направлений — хабр, гик, мегамозг


      1. IronHead
        08.04.2016 12:43
        +8

        Разница примерно такая:
        Хабр: Быстрый алгоритм распознавания изображений на 8-битных микроконтроллерах табличным методом
        Гиктаймс: Смотрите, я прикрутил дисплей к ардуино!
        Мегамозг: Как продавать китайские ардуины или реалии перегруженного рынка сбыта…


        1. NetBUG
          14.04.2016 21:46

          Самое главное — что текст может при этом незначительно различаться путём создания акцента на том или ином разделе.


    1. r00tGER
      08.04.2016 13:43
      -1

      И что теперь ваш комментарий делает на гиктаймсе?


  1. ZafiRUS
    08.04.2016 15:27

    Эмм, а аппаратный SPI нельзя для этого использовать? Судя по диаграмме это в чистом виде SPI на 3х проводах с CSn


    1. 5erG0
      08.04.2016 15:28

      честно не думал об этом, ибо в синтаксисе ардуины не силен. Больше программировал на AVRовском асме


      1. SopaXT
        09.04.2016 11:24

        Её же можно из AVRStudio цеплять, нет?


    1. ikaktys
      08.04.2016 15:47

      там какой то кривой SPI

      http://datasheet.elcodis.com/pdf2/94/90/949025/m204sd02aj.pdf