Некоторое время назад мне подвернулся недорогой VFD-экранчик. Из него я сделал что-то вроде часиков, подключив к домашнему серверу.
![](https://habrastorage.org/r/w780q1/storage2/f63/db4/043/f63db40433125f45f9ef3eee5d0be7cb.jpg)
Подобные дисплеи выглядят довольно красиво, а использовать их очень просто, так что они подойдут для множества проектов.
Я использовал дисплей IEE 036X2–122–09220 (он же IEE 36199-01), их можно найти на ибее. Скорее всего, работа с любым другим VFD от IEE не будет отличаться (также, как и со многими другими похожими дисплеями, например, от кассовых аппаратов).
Дисплей поддерживает три параллельных интерфейса (процессорные шины Intel 8041/42 и Motorola 6821, режим эмуляции HD44780) и обычный асинхронный последовательный вход с уровнями RS-232. Параллельные интерфейсы удобны для встраивания дисплея в готовые девайсы, нам же удобнее использовать последовательный вход.
Разъём дисплея:
![](https://habrastorage.org/r/w1560/storage2/bea/c2b/ef1/beac2bef124f34c9f9b15da21d4bba46.png)
Нам нужны только +5 VDC (питание), COMMON (земля) и SERIAL_IN (последовательный вход). Остальные пины используются для параллельных интерфейсов, они уже подтянуты к питанию и можно оставить их висеть.
Запитать дисплей можно от USB-порта или блока питания ПК. Для связи же проще всего использовать COM-порт.
![](https://habrastorage.org/r/w1560/storage2/749/917/6ec/7499176eccfabc157d98e3300c5a8a75.png)
Однако, естественно, лучше как-нибудь прицепиться к USB. Например, с помощью популярного переходничка AVR-CDC на Тине 2313, дополненного преобразователем уровней на MAX232. Правда с этим переходничком у меня возникли проблемы, когда я перешёл на 64-битный Debian (устройство вроде бы нормально подхватывалось системой, но не работало). На помощь пришёл вот такой USB-COM хвостик на PL2303 и MAX212, купленный в одном из китайских интернет-магазинов.
![](https://habrastorage.org/r/w780q1/storage2/20a/ec5/932/20aec5932466846fdaed6f396f6105a6.jpg)
Хвостик я распотрошил и подключил питание дисплея +5 VDC и COMMON напрямую к USB (красный и чёрный провода, соовтетственно), а SERIAL_IN — к пину 3 (TxD) COM-порта.
![](https://habrastorage.org/r/w780q1/storage2/9c8/493/4c0/9c84934c074c56522a620171e8c6d88a.jpg)
На питание повесил конденсатор на 100 мкф (хотя это и не обязательно).
![](https://habrastorage.org/r/w780q1/storage2/f32/f8d/dc4/f32f8ddc415fdf84ae7ac2c9cf8e4f10.jpg)
Чтобы проверить экранчик, подойдёт, например, microcom.
/dev/ttyUSB0 — это для переходничков на PL2303, FT232, etc. Для COM-порта компа скорее всего будет /dev/ttyS0, переходнички же наподобие AVR-CDC живут в /dev/ttyACM0, etc.
9600 — это скорость последовательного входа дисплея, выбираемая джамперами на нём.
![](https://habrastorage.org/r/w1560/storage2/c30/bb7/572/c30bb7572f23cd813a930d98f1891217.png)
Набор символов, который используется дисплеем, напоминает ASCII. Набираем что-нибудь в microcom'е — оно должно появляться на дисплее.
![](https://habrastorage.org/r/w780q1/storage2/2c6/4fc/802/2c64fc802549d200c614e9776b542096.jpg)
Для управления дисплеем можно приспособить что-нибудь наподобие lcd4linux, lcdproc, etc. Но их возможности зачастую могут оказаться недостаточными, в общем, проще написать самим)
Писать будем на перле, т.к. он лаконичен и понятен.
Для начала, чтобы отображать данные в реальном времени, нам понадобится оторвать буферизацию.
Теперь перл будет сбрасывать автоматически сбрасывать буфер.
Управляется дисплей специальными символами. Например, 0x0F — показать курсор, 0x15 — очистить экран. Подробнее — в документации, ссылка на которую указана ниже.
Напишем часики.
Запустим.
![](https://habrastorage.org/r/w780q1/storage2/b95/255/26a/b9525526acc196fd5984666662116639.jpg)
Вот моя текущая версия. С отображением LA, свободной памяти, места на диске и онлайна на сервере майнкрафта.
![](https://habrastorage.org/r/w780q1/storage2/e1f/bba/c6b/e1fbbac6be9890454f826e87e51a979d.jpg)
Вот так можно сделать красивую фигню. Спасибо за внимание.
Документация на дисплей.
Моя управляющая программа.
![](https://habrastorage.org/storage2/f63/db4/043/f63db40433125f45f9ef3eee5d0be7cb.jpg)
Подобные дисплеи выглядят довольно красиво, а использовать их очень просто, так что они подойдут для множества проектов.
Я использовал дисплей IEE 036X2–122–09220 (он же IEE 36199-01), их можно найти на ибее. Скорее всего, работа с любым другим VFD от IEE не будет отличаться (также, как и со многими другими похожими дисплеями, например, от кассовых аппаратов).
Дисплей поддерживает три параллельных интерфейса (процессорные шины Intel 8041/42 и Motorola 6821, режим эмуляции HD44780) и обычный асинхронный последовательный вход с уровнями RS-232. Параллельные интерфейсы удобны для встраивания дисплея в готовые девайсы, нам же удобнее использовать последовательный вход.
Разъём дисплея:
![](https://habrastorage.org/storage2/bea/c2b/ef1/beac2bef124f34c9f9b15da21d4bba46.png)
Нам нужны только +5 VDC (питание), COMMON (земля) и SERIAL_IN (последовательный вход). Остальные пины используются для параллельных интерфейсов, они уже подтянуты к питанию и можно оставить их висеть.
Запитать дисплей можно от USB-порта или блока питания ПК. Для связи же проще всего использовать COM-порт.
![](https://habrastorage.org/storage2/749/917/6ec/7499176eccfabc157d98e3300c5a8a75.png)
Однако, естественно, лучше как-нибудь прицепиться к USB. Например, с помощью популярного переходничка AVR-CDC на Тине 2313, дополненного преобразователем уровней на MAX232. Правда с этим переходничком у меня возникли проблемы, когда я перешёл на 64-битный Debian (устройство вроде бы нормально подхватывалось системой, но не работало). На помощь пришёл вот такой USB-COM хвостик на PL2303 и MAX212, купленный в одном из китайских интернет-магазинов.
![](https://habrastorage.org/storage2/20a/ec5/932/20aec5932466846fdaed6f396f6105a6.jpg)
Хвостик я распотрошил и подключил питание дисплея +5 VDC и COMMON напрямую к USB (красный и чёрный провода, соовтетственно), а SERIAL_IN — к пину 3 (TxD) COM-порта.
![](https://habrastorage.org/storage2/9c8/493/4c0/9c84934c074c56522a620171e8c6d88a.jpg)
На питание повесил конденсатор на 100 мкф (хотя это и не обязательно).
![](https://habrastorage.org/storage2/f32/f8d/dc4/f32f8ddc415fdf84ae7ac2c9cf8e4f10.jpg)
Чтобы проверить экранчик, подойдёт, например, microcom.
sudo apt-get install microcom
sudo microcom -s 9600 -p /dev/ttyUSB0
/dev/ttyUSB0 — это для переходничков на PL2303, FT232, etc. Для COM-порта компа скорее всего будет /dev/ttyS0, переходнички же наподобие AVR-CDC живут в /dev/ttyACM0, etc.
9600 — это скорость последовательного входа дисплея, выбираемая джамперами на нём.
![](https://habrastorage.org/storage2/c30/bb7/572/c30bb7572f23cd813a930d98f1891217.png)
Набор символов, который используется дисплеем, напоминает ASCII. Набираем что-нибудь в microcom'е — оно должно появляться на дисплее.
![](https://habrastorage.org/storage2/2c6/4fc/802/2c64fc802549d200c614e9776b542096.jpg)
Для управления дисплеем можно приспособить что-нибудь наподобие lcd4linux, lcdproc, etc. Но их возможности зачастую могут оказаться недостаточными, в общем, проще написать самим)
Писать будем на перле, т.к. он лаконичен и понятен.
Для начала, чтобы отображать данные в реальном времени, нам понадобится оторвать буферизацию.
$| = 1;
Теперь перл будет сбрасывать автоматически сбрасывать буфер.
Управляется дисплей специальными символами. Например, 0x0F — показать курсор, 0x15 — очистить экран. Подробнее — в документации, ссылка на которую указана ниже.
Напишем часики.
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
# инициализация дисплея
sub display_init() {
$| = 1; # включаем автоматическое сбрасывание буфера
binmode(STDOUT,':raw'); # на всякий случай
print pack("C",0x14); # отправляем дисплею программный сброс
print pack("C",0x0e); # выключаем курсор
print pack("CCCCCCC",0x18,0xf6,0x00,0x04,0x44,0x40,0x00); # знак градуса
}
# переход в указанную позицию
sub display_goto() {
my ($x, $y) = @_;
my $pos = $x + $y*20;
print pack("CC",0x1b,$pos);
}
# получение текущей погоды
sub get_weather() {
my ($city) = @_;
my $url = "http://www.google.com/ig/api?weather=$city";
my $data = get $url or return undef;
if($data =~ /<current_conditions>(.+?)<\/current_conditions>/) {
my $weather = $1;
my %info;
while($weather =~ /<(.+?) data="(.+?)"\/>/g) {
$info{$1} = $2;
}
return \%info;
}
return undef;
}
# вывод времени
sub display_time() {
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
printf "%s %02d %02d:%02d:%02d",$abbr[$mon],$mday,$hour,$min,$sec;
}
# вывод температуры
sub display_weather {
my $city = shift;
my $info = &get_weather($city);
if(!$info) {
print "Err!";
return;
}
my $temp = int($info->{temp_c});
printf("%+3d%s",$temp,chr(0xf6));
}
&display_init();
my $last_weather_update = 0;
while(1) {
# показываем время
&display_goto(0,0);
&display_time();
# и погоду (примерно каждые пол часа)
if(time() - $last_weather_update > 30*60) {
&display_goto(16,0);
&display_weather("Novosibirsk");
$last_weather_update = time();
}
sleep 1;
}
Запустим.
./vfd_clock.pl | sudo microcom -s 9600 -p /dev/ttyUSB0
![](https://habrastorage.org/storage2/b95/255/26a/b9525526acc196fd5984666662116639.jpg)
Вот моя текущая версия. С отображением LA, свободной памяти, места на диске и онлайна на сервере майнкрафта.
![](https://habrastorage.org/storage2/e1f/bba/c6b/e1fbbac6be9890454f826e87e51a979d.jpg)
Вот так можно сделать красивую фигню. Спасибо за внимание.
Документация на дисплей.
Моя управляющая программа.