Воскресенье, 19.05.2024, 16:01

Приветствую Вас Гость | RSS

Главная » 2013 » Сентябрь » 22 » Применение вакуумного люминисцентного индикато�
12:24
 

Применение вакуумного люминисцентного индикато�

6 февраля 2012 в 20:25

Применение вакуумного люминисцентного индикатора из песочницы

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



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

Я использовал дисплей IEE 036X2–122–09220 (он же IEE 36199-01), их можно найти на ибее. Скорее всего, работа с любым другим VFD от IEE не будет отличаться (также, как и со многими другими похожими дисплеями, например, от кассовых аппаратов).

Дисплей поддерживает три параллельных интерфейса (процессорные шины Intel 8041/42 и Motorola 6821, режим эмуляции HD44780) и обычный асинхронный последовательный вход с уровнями RS-232. Параллельные интерфейсы удобны для встраивания дисплея в готовые девайсы, нам же удобнее использовать последовательный вход.

Разъём дисплея:



Нам нужны только +5 VDC (питание), COMMON (земля) и SERIAL_IN (последовательный вход). Остальные пины используются для параллельных интерфейсов, они уже подтянуты к питанию и можно оставить их висеть.

Запитать дисплей можно от USB-порта или блока питания ПК. Для связи же проще всего использовать COM-порт.



Однако, естественно, лучше как-нибудь прицепиться к USB. Например, с помощью
популярного переходничка AVR-CDC на Тине 2313, дополненного преобразователем уровней на MAX232. Правда с этим переходничком у меня возникли проблемы, когда я перешёл на 64-битный Debian (устройство вроде бы нормально подхватывалось системой, но не работало). На помощь пришёл вот такой USB-COM хвостик на PL2303 и MAX212, купленный в одном из китайских интернет-магазинов.



Хвостик я распотрошил и подключил питание дисплея +5 VDC и COMMON напрямую к USB (красный и чёрный провода, соовтетственно), а SERIAL_IN — к пину 3 (TxD) COM-порта.



На питание повесил конденсатор на 100 мкф (хотя это и не обязательно).



Чтобы проверить экранчик, подойдёт, например, 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 — это скорость последовательного входа дисплея, выбираемая джамперами на нём.



Набор символов, который используется дисплеем, напоминает ASCII. Набираем что-нибудь в microcom'е — оно должно появляться на дисплее.



Для управления дисплеем можно приспособить что-нибудь наподобие 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



Вот моя текущая версия. С отображением LA, свободной памяти, места на диске и онлайна на сервере майнкрафта.



Вот так можно сделать красивую фигню. Спасибо за внимание.

Документация на дисплей.
Моя управляющая программа.
Просмотров: 266 | Добавил: foried | Рейтинг: 0.0/0
Всего комментариев: 0