Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Ардуино и дисплей покупателя - vfd как подключить/управлять

Чт июн 02, 2022 21:44:23

Тема создана для обмена опытом ..
Сюда складываем скетчи и документацию..
Для начала Wincor nixdorf VA63 сам индикатор futaba 2*20 vfd
за совсем копейки 200₽ на Авито Москва с rs232 от жадности пять штук.. их там больше сотни со слов продавца - налетай покупай живопись!! ( c usb интерфейсом плата совсем другая кому нужно в здешней барахолке тоже есть ;-) ) чтобы такой запустить
= снял мелкосхему sp232 нафиг ( наверное можно и оставить) в площадку на 9 ногу впаял провод от ардуины от TX.. но этого оказалось не достаточно
- потребовалось поставить центральную из 5 возможных перемычку !! JP3 дабы установить принудительно Parity off
ВОТ ВЕДЬ ГАДЫ :kill: и все заработало в лучшем виде 8)
ps -- если пинцетом замкнуть кранную левую со стороны индикатора если смотреть, а вообще это jp5 "перемычку" и подать питание - запускается внутренний тест самого индикатора проверки сегментов

Спойлер// Скетч тестовый выводит на VFD-дисплей BA63 ля FUTABA хело ворд,и тест ангельскаго шрифта про лису и собаку в разных строчках.
// буковки отправляем как строчками так и цифирьками в хексе ASCII

#include <SoftwareSerial.h>

SoftwareSerial vfd(255,2,0); // This is required, to start an instance of an vfd (TX at pin D2)
// можно поменять на любой кроме некоторых смотря какя плата.
void setup() {
vfd.begin(9600); // Start the vfd at 9600 baud

vfd.write(0x1b); // выбор кодовой страницы рус - но печатать из под ардуино
vfd.write(0x52); // сможет только после обработки кодером из cp1251 в cp866
vfd.write(0x35);
delay (100); // подождем вдруг ему нужно время осознать
}

void CLS () { // очистка экрана
vfd.write(0x1b);
vfd.write(0x5b);
vfd.write(0x32);
vfd.write(0x4a);
}

void set_cursor (int str, int col) { // установить курсор
// строка , колонка
str = str + 0x30;
col = col + 0x30;
vfd.write(0x1b);
vfd.write(0x5b);
vfd.write(str);
vfd.write(0x3b);
vfd.write(col);
vfd.write(0x48);
}

void loop() {

CLS ();
set_cursor (1,4);
vfd.print("HELLO "); // можно печатать строкой
vfd.write(0x20); // space // можно передавать букавки кодами символов
vfd.write(0x57); // W
vfd.write(0x4F); // O
vfd.write(0x52); // R
vfd.write(0x4c); // L
vfd.write(0x44); // D
vfd.write(0x20); // space
delay (5000); // подождеми посмотрим
set_cursor (2,0);
vfd.print("the quick brown fox");
delay (5000); // подождеми посмотрим
set_cursor (2,0);
vfd.print("jumps over the lazy");
delay (5000); // подождеми посмотрим
set_cursor (2,0);
vfd.print(" dog ");
delay (5000); // подождеми посмотрим
}

К сожалению набор команд этого дисплея очень бедный - в лёгкую нет возможности прописать свои символы в память..вот это по настоящему трабла.. очень хочется..
Так же нет сдвига автоматического символов как у других дисплеев бывает - по этому к
тереть и ставить курсор заново.
Дока пдф гуглится моментом по этому аттачить нет смысла..
Про перемычки упоминание их функций удалось обнаружить в доке другого 4х строчного индикатора ,этой конторы va66

На гитхаюе нашлась либа с классами
https://github.com/MrTransistorsChannel/NixdorfVFD
Возможно она была сделана для usb версии .. в функции софтваре сериал включена инверсия.. для 232 версии этот параметр другой - дефолтный - нет инверсии.
Так что пора пилить часики 8)

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пт июн 03, 2022 23:03:06

200₽ на Авито Москва с rs232 от жадности пять штук.. их там больше сотни со слов продавца

Я у него и покупал. И друзья по несколько штук взяли...

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Сб июн 04, 2022 01:54:03

Мой вариант подключения:
перемычку J3 надо замкнуть.
Скорость по умолчанию будет 9600.

Микрухи выпаивать не надо !!! ), подключаемся к CN3 (это нераспаянные пины около центрального разъема
1. RX платы дисплея = TX от ардуино (в моем случае от D6)
2. - пустой
3 +12В
4. 0В - земля
Строка инициализации будет = SoftwareSerial vfd(255, 6, 1); //это для выхода с пина D6.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Сб июн 04, 2022 11:34:30

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

И вот в аттаче та же самая либа и хеловорд, но запиленная для GIGATECH DSP850C (он же Promag DSP 851c) пойдет для всей серии DSP800 и все на той же софтваре сериал.
чуть позже допилю ее по шрифту - скорее всего будет кривая Ё и ё // потом поправлю..

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 06, 2022 09:12:36



VFD дисплей Futaba M202MD10C. Часы на ESP8266 в среде Arduino.
Библиотекой не оформлял (пока лень разбираться))
Скетч прилагаю. В нём надо вписать имя вашей сети и её пароль.

Спойлер
Код:
// serialesp8266clock.ino
//
// Libraries needed:
//  Time.h & TimeLib.h:  https://github.com/PaulStoffregen/Time
//  Timezone.h: https://github.com/JChristensen/Timezone
//  NTPClient.h: https://github.com/arduino-libraries/NTPClient
//  ESP8266WiFi.h & WifiUDP.h: https://github.com/ekstrand/ESP8266wifi
//  Вывод на VFD дисплей Futaba M202MD10C, выравнивание текста, кириллицу и анимацию прикрутил abomin


#include <ESP8266WiFi.h>
#include <WifiUDP.h>
#include <String.h>
#include <Wire.h>
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>

// Define NTP properties
#define NTP_OFFSET   60 * 60      // In seconds
#define NTP_INTERVAL 60 * 1000    // In miliseconds
#define NTP_ADDRESS  "ca.pool.ntp.org"  // change this to whatever pool is closest (see ntp.org)

// Set up the NTP UDP client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

const char* ssid = "SSID";   // insert your own ssid
const char* password = "PASSWORD";              // and password
String date;
String t;
const char * days[] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"} ;
const char * months[] = {"Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"} ;
const byte CYR_init_string[7] = {0x00, 0x01, 0x02, 0x0A, 0x14, 0x04, 0x20}; // кодовая страница СР-866, курсор выключить, яркость 20%
const int dispStringSize = 20; // сколько символов в строке дисплея
const int kadr = 60;   // задержка для смены спрайта

const byte userDefinedSymbol[] = {0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1C, 0x1D, 0x1E};
const byte fromL2R[] = {0x1D, 0x1C, 0x1A, 0x19, 0x1A, 0x1C, 0x1D, 0x1D};
const byte fromR2L[] = {0x18, 0x17, 0x16, 0x15, 0x15, 0x16, 0x17, 0x18};
const byte sprite[][8] = {
  {0x00, 0x70, 0xE8, 0xF8, 0xF8, 0x70, 0x00, 0X00}, // Pacman 1, user defined symbol #15
  {0x00, 0x70, 0xE8, 0xF8, 0xE0, 0x70, 0x00, 0X00}, // Pacman 2, user defined symbol #16
  {0x00, 0x70, 0xF8, 0xC0, 0xE0, 0x70, 0x00, 0X00}, // Pacman 3, user defined symbol #17
  {0x00, 0x70, 0xE0, 0xC0, 0xC0, 0x60, 0x00, 0X00}, // Pacman 4, user defined symbol #18
  {0x00, 0x70, 0xB8, 0xF8, 0xF8, 0x70, 0x00, 0X00}, // Pacman 5, user defined symbol #19
  {0x00, 0x70, 0xB8, 0xF8, 0x38, 0x70, 0x00, 0X00}, // Pacman 6, user defined symbol #1A
  {0x00, 0x70, 0xF8, 0x18, 0x38, 0x70, 0x00, 0X00}, // Pacman 7, user defined symbol #1C
  {0x00, 0x70, 0x38, 0x18, 0x18, 0x30, 0x00, 0X00}, // Pacman 8, user defined symbol #1D
  {0x00, 0x70, 0xA8, 0xF8, 0x88, 0x70, 0x00, 0X00} // Pacman 9, user defined symbol #1E
};
// Перекодировка русского текста для вывода в serial
char* RUS(char* StrIn)
{
  char* StrOut=StrIn; // сначала выходную строку приравниваем к входной
  uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; // создаём "рабочий" байтовый массив из 4-х членов: 0-счётик нечётных байтов входной строки, 1-счётик чётных байтов входной строки, 2-нечётный байт, 3-чётный байт
  while(i[2]>0&&i[0]<255) // проверяем, что не конец массива (тогда нулевой байт) и ограничиваем длину строки в 254 символов
   {
   if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0) // проверка - кирилица? от "А" до "п"?
    {
    StrOut[i[1]]=i[3]-0x10;i[0]++; // переводим в СР-866
    }
      else if(i[2]==0xd0&&i[3]==0x81) // проверка - кирилица? "Ё"?
      {
      StrOut[i[1]]=0xF0;i[0]++; // меняем на Ё СР-866
      }
        else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90) // проверка - кирилица? от "р" до "я"?
        {
        StrOut[i[1]]=i[3]+0x60;i[0]++; // переводим в СР-866
        }
          else if(i[2]==0xd1&&i[3]==0x91) // проверка - кирилица? "ё"?
          {
          StrOut[i[1]]=0xF1;i[0]++; // меняем на ё СР-866
          }
            else
            {
            StrOut[i[1]]=i[2];
            }
    i[0]++;
    i[1]++;
    i[2]=StrIn[i[0]];
    i[3]=StrIn[i[0]+1];
    }
  StrOut[i[1]]='\0';
  return StrOut;
}
// п-п печати спрайта
void printSprite(byte a, int b, int c) {
        Serial.write(0x10); // задать вывод символа
        Serial.write(b); // в b-е знакоместо
        Serial.write(a); // вывод спрайта a
        delay (c); 
        }

// п-п очистки (забоя) последнего символа
void backspace() {       
        Serial.write(8); // backspace
        Serial.write(32); // space
        }

//  п-п задания след. позиции вывода символа слева вверху
void goLeftUpCorner() {
    Serial.write(0x10); // задать вывод символа
    Serial.write(0x00); // в нулевое знакоместо   
    }
         
// Выравнивание строки по центру
String centerJustify(String inputString)
  {
    int needSpaces = (dispStringSize - inputString.length()) / 2;
    String outputString = "";
    for(int i = 0; i < needSpaces; i++)
    outputString += ' ';
    outputString += inputString;
    for(int i = 0; i < (needSpaces - 1); i++)
    outputString += ' ';
    return outputString;
  }
//
 
void setup ()
{
  Serial.begin(9600); // most ESP-01's use 115200 but this could vary
  timeClient.begin();   // Start the NTP UDP client
 
// инициализировать дисплей
  for(int i=0; i<7; i++)
    Serial.write(CYR_init_string[i]);
   
// набиваем пользовательские символы:
  for(int j=0; j<9; j++) {    // девять пользовательских символов
  Serial.write(03);
  Serial.write(userDefinedSymbol[j]);
  for(int i=0; i<8; i++)    // 8 байт на символ
    Serial.write(sprite[j][i]);}
   
  // Connect to wifi
  Serial.println("");
  Serial.print(RUS("Подключаюсь к WiFi"));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print(RUS("Подключено к WiFi at "));
  Serial.print(WiFi.localIP());
  delay(1000);
  Serial.println("");
  Serial.println("");
}

void loop()
{
  if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status
  {   
    date = "";  // clear the variables
    t = "";
   
    // update the NTP client and get the UNIX UTC timestamp
    timeClient.update();
    unsigned long epochTime =  timeClient.getEpochTime();

    // convert received time stamp to time_t object
    time_t local, utc;
    utc = epochTime;

    // Then convert the UTC UNIX timestamp to local time
    TimeChangeRule MSK = {"MSK", Second, Sun, Mar, 2, +120};  //UTC - 5 hours - change this as needed
//    TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -360};   //UTC - 6 hours - change this as needed
    Timezone tMSK(MSK, MSK);
    local = tMSK.toLocal(utc);

 // now format the date variables into string with proper names for month, day etc
    date += day(local);
    date += " ";
    date += months[month(local)-1];
    date += " ";
    date += year(local);

// сформировать выровненную по центру строку даты
    char dateChar[date.length()+1];
    date.toCharArray(dateChar, sizeof(dateChar));
    String dateString = centerJustify(RUS(dateChar));   

// format the time
    if(hour(local) < 10)  // add a space if hour is under 10
      t += " ";
    t += hour(local);
    t += ":";
    if(minute(local) < 10)  // add a zero if minute is under 10
      t += "0";
    t += minute(local);

// сформировать выровненную по центру строку времени и дня недели
    String dayNow = days[weekday(local)-1];
    char dayChar[23];
    dayNow.toCharArray(dayChar, 23);
    String timeDayChar866 = t + ' ' + RUS(dayChar);
    String timeDayString = centerJustify(timeDayChar866);

    // Display the date and time
    goLeftUpCorner();
    Serial.println(timeDayString);
    Serial.print(dateString);

    delay (5000);

// анимация Pacman
     
    for(int i=38; i>19; i--) {  // нижняя строка
      for(int k=0; k<8; k++)
        printSprite(fromR2L[k], i, kadr);
        backspace(); }
     
    for(int i=0; i<20; i++) { // верхняя строка
      for(int k=0; k<8; k++)
        printSprite(fromL2R[k], i, kadr);
        backspace(); }
       
    printSprite(0x1E, 19, 1000);   
    backspace();
    goLeftUpCorner();
  }
  else // attempt to connect to wifi again if disconnected
  {
    WiFi.begin(ssid, password);
    delay(1000);
  }
   
//  delay(10000);    //Send a request to update every 10 sec (= 10,000 ms)
}

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 06, 2022 12:29:16

Супер! Надо будет попробовать на досуге.
А где взять нужные библиотеки? И можно ссылку на сам проект? Спасибо!

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 06, 2022 18:37:57

Как и обещал выкладываю тест-пример и библиотеку рядом с ним для GIGATECH DSP850
где поправил шрифт в части подмены "Ё ё" на обычные "Е е" в виду отсутствия их в таблице знакогенератора в DSP850.

PS для полного счастья стоит разобраться как залить своих кастомных символов в таблицу знакогенератора этого дисплея..
над этой задачей попробую повозиться - если получится буду счастлив по настоящему, тогда и часики красивые попробую запилить..
Вложения
HelloWorld.rar
(3.14 KiB) Скачиваний: 225

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 06, 2022 22:15:35

Energizer-A, в дисплее Wincor nixdorf VA63 не удалось еще случайно найти управление яркостью?
Я ранее в безымянном китайце нашел такое, собрав воедино несколько бумаг по нему. Там команды управления EPSON.

вот функция. но на футабе не работает.

void brightnes(byte br){ // яркость установить 1=25%... 4=100% и записать в ячейку EEPROM
if (br<1 || br>4) br = 4;
if (EEPROM[0] != br) EEPROM[0] = br; // перезапись только, если отличается
softportVFD.write(0x1F);
softportVFD.write(0x58);
softportVFD.write(br);
}

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вт июн 07, 2022 07:09:22

OlegRu, я пока ковыряю dsp850c и там к сожалению этой функции тоже нет..там вообще только один протокол dsp800 и тот обрезан совсем.. по этому много чего нужного нет.. и кастомных символов простым способом тоже не получить по простому..
Кстати видимо тебе спасибо за функцию вывода нуля перед цифрой до 10 -- c2d :beer:
вчерась запилил часики тестовые тупорылые для обкатки - пригодилась

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вт июн 07, 2022 23:28:38

Благодаря OlegRu удалось сделать текстовые часы на дисплее BA63. Есть 3 режима отображения времени.

Изображение Изображение Изображение

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Ср июн 08, 2022 08:09:43

Рекомендую ознакомиться: http://www.mantrid.ru/forum/showthread.php?t=1683

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Ср июн 08, 2022 09:00:41

abomin писал(а):Рекомендую ознакомиться

Спасибо -весьма познавательно ..
Была идея похожая но чуть другая - сделать транслятор i2c в стандартные команды дисплеея покупателя-, что бы имитировала обычный дисплей типа 16*2 - для проектов где код не публикуется или не читаем..

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Ср июн 08, 2022 10:19:16

...сделать транслятор i2c в стандартные команды дисплеея покупателя...
Хорошая идея! И вполне реализуемая, думаю. Встречал в офисных телефонах или факсах ЖК дисплеи с последовательным интерфейсом, а по командам совместимые с HD44780. Даже библиотеки под них есть.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Ср июн 08, 2022 10:38:54

А какой вариант применения такой конструкции? Включиться с VFD вместо дисплея 1602 или 2002 для случая когда исходная прошивка устройства не доступна и нет возможности заменить библиотеку?Сам по себе без платки расширения (регистр с i2c) дисплей lcd1602 имeeт управление по параллельному порту. Это управление реализуется и просто на ардуинке, если ноги ничем другим не заняты, а это 80% всех устройств.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Ср июн 08, 2022 17:38:17

OlegRu писал(а):прошивка устройства не доступна и нет возможности заменить библиотеку?

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

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Ср июн 08, 2022 20:56:42

Кажется, здесь 80% решения https://microkontroller.ru/arduino-proj ... tvo/?amp=1

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 12, 2022 09:49:50

Ув. Коты, может кто-нибудь подсказать, как на дисплее Wincor BA63 RS232 реализовать управление яркостью? Какая команда для этого нужна?
#define DIM не прокатывает :(

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Ср июн 15, 2022 20:13:09

Ну и заодно подскажите, есть-ли в таблице символов значок градуса Цельсия? Если да, какой код у него?

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Чт июн 16, 2022 01:47:32

0xF8 или 248
Только вот странно, функцией write он выводится, а через printf нет.
Итак, градус побежден, осталось с загружаемыми символами разобраться и там до пакмана недалеко.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Чт июн 16, 2022 08:55:01

Я для своего дисплея даташита не нашёл, а в даташите на аналог не все управляющие коды были описаны. Так что пришлось выпаивать контроллер, городить адаптер на проводках, считывать прошивку (благо контроллер оказался незалоченным), и дизассемблировать её. Там оказалась куча недокументированных управляющих кодов, двенадцать переключаемых раскладок-алфавитов и целых девять пользовательских символов.

Вот тут - https://embedded.by/406 - чел ковырял дисп, как у меня.
Ответить