вторник, 31 марта 2015 г.

Удаленный контроль DLP проектора NEC projector VTхх из скрипта VBS

Проекторы серий NEC Projector VTxx являются продукцией фирмы NEC Display Solutions, дочки более известной всем эмбеддерам NEC Corporation. Сама линейка проекторов хоть и считается на данный момент устаревшей, но, при вполне бюджетной цене, показала высокую надежность в условиях эксплуатации помещений учебных заведений, офисов и конференц-залов. Одной из особенностей является возможность их удаленного контроля и управления не только через пульт ДУ, но и по интерфейсу RS-232. Что, наряду с использованием конверторов интерфейса RS-232 в двухпроводный (и дифференциальный) RS-485, позволяет смонтировать изделие в любом удобном для проекции изображения месте, не только не мешая вечно болтающимися под ногами проводами, но и реализации возможности автоматизации из своих программ, без участия человека. Предлагаемый VBS-скрипт предназначен для удаленного контроля проектором через конверторы RS-485/RS-232 по сети RS-485 с голосовым сопровождением действий (включение-выключение, управление громкостью, навигации и завершения работы). Поскольку собственное ПО проектора не предполагает использование в сети RS-485 и возможность управления направлением приема-передачи, то в качестве конверторов необходимы конверторы с автоконтролем, подойдут, к примеру, овеновские модели AC3-M-024 (без собственного адреса). При необходимости организации сети из таких проекторов потребуется использование конверторов RS-485/RS-232 с собственным адресом.

Краткий экскурс...

Слегка напомним читателю про топологию промышленного сетевого стандарта RS-485 (более подробно см. в нашем цикле «MODBUS на привязи»). RS-485 – это стандарт физического уровня для асинхронного интерфейса, регламентируемый EIA-485. В стандарте RS-485, в отличие от RS-422, для передачи и приема данных используется одна витая пара проводов с экранирующей оплеткой или общим проводом. Передача данных осуществляется с помощью дифференциальных сигналов. Разница напряжений между проводниками одной полярности означает логическую единицу, разница другой полярности – ноль (см. рисунок 1):

Рис. 1. Топология сети RS-485

Взгляните на типичную структуру сети RS-485. Что дает такая организация связи? Очевидно, что с одного главного узла можно реализовать управление до 32-х точек (без использования специальных драйверов и повторителей шины) на расстоянии до 1200 метров (следует отметить, что в данном случае, 32 точки не являются преимуществом, они нам не нужны ...да и без конвертора с собственным уникальным сетевым базовым адресом подобное реализовать невозможно, нужен арбитраж на шине). Кроме того, никто ведь не мешает дополнить всю систему обратной связью не только непосредственно с комплектного пульта ДУ, но и с мобильного телефона (смартфона или даже КПК), скажем через Wi-Fi. Само ПО может включать   обычный WEB- сервер, это даст универсальность доступа с любого устройства непосредственно с браузера (а при пробросе портов во внешний мир и удаленного наблюдения за поведением системы). Благодаря чему схема сети по управлению проектором видится следующей (см. рисунок 2):


Рис. 2. Схема сети по управлению и контролю DLP- проектором в конференц-зале

Главный узел или сервер сбора данных-управления будет включать в себя: ноутбук (или компьютер), конвертор интерфейсов RS-232 (USB)/RS-485 и опционально Wi-Fi точку доступа (подойдет абсолютно любая с требуемым радиусом действия в зависимости от размеров помещения и материала его стен), подключенную к сетевой карте через интерфейс Ethernet. Подчиненный узел, расположенный в отдельном помещении (конференц-зале), соответственно:  конвертор интерфейсов RS-232/RS-485 и сам контролируемый проектор.

Проектор

Следует оговорить, что работать мы будем непосредственно с проектором NEC Projector серии V260 (см. рисунок 3), но все наши выкладки будут справедливы и для моделей VT49, VT59, VT70, VT80, VT90, VT490, VT590, VT700.


Рис. 3. Лицевая и задняя панель c внешними интерфейсами проектора V260

Cистемные требования и зависимости
  1.  Win OS 32/64-bit.
  2.  COM-сервер DynWrapx.dll.
  3.  SAPI (для озвучивания используется интерфейс по-умолчанию).
  4.  Физический RS-232 or virtual COM over USB or over RS-485.
  5.  Подключенный проектор NEC Projector серий VTxx.
Кишочки скрипта:
' NEC_Projector_VTxx.VBS
' Демонстрационный скрипт управления проектором NEC Projector VTxx over 'RS-232 c голосовым сопровождением
' Поддержка следующих команд: вкл-выкл. проектора,
вкл-выкл. экрана, вкл-откл.звука, переключения источника видео и завершения скрипта
'
' Разработчик: Бадло Сергей Григорьевич aka raxp
' H-page: http://raxp.radioliga.com'
' Зависимости:
' · Win OS 32/64-bit
' · COM-сервер DynWrapx.dll
' · SAPI (для озвучивания используется интерфейс по-умолчанию)
' · Физический RS-232 or virtual COM over USB
' · Подключенный проектор NEC Projector VTxx
'
' Региcтрация интерфейсов (обязательно первично однократно):
' · в данном скрипте задайте порт подключения проектора
' · запустите regdynwrapx.bat (на Windows Vista/7/8/8.1 запускать правой кнопкой мыши от имени Администратора)
' Использование:
' · запустите run_NEC_Projector_VTxx.cmd
' · для завершения нажмите 'Escape'


' Список команд
cmdon = chr(02)&
chr(00)&chr(00)&chr(00)&chr(00)&chr(02)  ' вкл. проек 'Space'
cmdoff = chr(02)&chr(01)&chr(00)&chr(00)&chr(00)&chr(03) ' выкл. проек 'Space'
cmdup = chr(02)&chr(16)&chr(00)&chr(00)&chr(00)&chr(18) ' вкл. экран 'Up
cmddown = chr(02)&chr(17)&chr(00)&chr(00)&chr(00)&chr(19)  ' выкл. экран 'Down
cmdleft = chr(02)&chr(18)&chr(00)&chr(00)&chr(00)&chr(20)  ' вкл. звук 'Left
cmdright = chr(02)&chr(19)&chr(00)&chr(00)&chr(00)&chr(21)  ' выкл. звук 'Right
cmdvolup = chr(02)&chr(03)&chr(00)&chr(00)&chr(02)&chr(01)&chr(06)&chr(14) ' video input '+'
cmdvoldown = chr(02)&chr(03)&chr(00)&chr(00)&chr(02)&chr(01)&chr(11)&chr(19) ' s-video input '-'

' подключаем голосовое сопровождение
' при надоедливости голоса speakon = false
Dim Speak
speakon = true ' разрешаем голосовое сопровождение
Set Speak = CreateObject("sapi.spvoice")
' регистрируем COM объект DynamicWrapperX в тихом режиме
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ("regsvr32.exe dynwrapx.dll /s"),3, true
' создаем объект DynamicWrapperX
Set Wrap = CreateObject("DynamicWrapperX.2")
Wrap.Register "user32.dll", "GetAsyncKeyState", "i=l", "f=s", "r=l"

' Настройка порта COM1, на котором проектор
port = "COM1"
' регистрируем функи для работы с портом
Wrap.Register "KERNEL32.DLL", "CreateFile", "i=sllllll", "r=l"
Wrap.Register "KERNEL32.DLL", "WriteFile", "i=lslll", "r=l" ' ANSI
' вариант с Unicode - Wrap.Register "KERNEL32.DLL", "WriteFile", "i=lllll", "r=l"
Wrap.Register "KERNEL32.DLL", "CloseHandle", "i=l", "r=l"
Wrap.Register "KERNEL32.DLL", "EscapeCommFunction", "i=hu", "r=l"
' забиваем аттрибуты
GENERIC_WRITE = 1073741824
FILE_SHARE_READ = 1
FILE_SHARE_WRITE = 2
OPEN_EXISTING = 3
FILE_ATTRIBUTE_NORMAL = 128
cbWritten = " "
pcbWritten = Wrap.StrPtr(cbWritten)
' открываем нужный нам порт COMn
hFile = Wrap.CreateFile(port, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
' отключаем сигналы на DTR/RTS
Wrap.EscapeCommFunction hFile, 4
Wrap.EscapeCommFunction hFile, 6

' Информируем пользователя о начале работы
if (speakon = true) then
Speak.Speak "Готов измываться над проектором."
End if

p = true

' запускаем бесконечный цикл по условию нажатия 'Escape' с задержкой
Do While Wrap.GetAsyncKeyState(27) = "0"

'задержка на кол-во миллисекунд
WScript.Sleep 500
' отлавливаем нажатие SPace (пробела)
probel = Wrap.GetAsyncKeyState(32)
' отлавливаем нажатие Up
upt = Wrap.GetAsyncKeyState(38)
' отлавливаем нажатие Down
downt = Wrap.GetAsyncKeyState(40)
' отлавливаем нажатие Left
leftt = Wrap.GetAsyncKeyState(37)
' отлавливаем нажатие Right
rightt = Wrap.GetAsyncKeyState(39)
' отлавливаем нажатие Add (+) key
plus = Wrap.GetAsyncKeyState(187)
' отлавливаем нажатие SUBTRACT (-) key
minus = Wrap.GetAsyncKeyState(189)


if (probel = "1") then
 p = not p

 if (p = false) then
  ' активируем проектор
  Wrap.WriteFile hFile, cmdon, Len(cmdon), pcbWritten, 0
  ' озвучиваем
  if (speakon = true) then
   Speak.Speak "Проектор включен."
  End if
 End if

 if (p = true) then
  ' вырубаем проектор
  Wrap.WriteFile hFile, cmdoff, Len(cmdoff), pcbWritten, 0
  ' озвучиваем
  if (speakon = true) then
   Speak.Speak "Проектор выключен."
  End if
 End if
End if

if (upt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdup, Len(cmdup), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Экран включен."
 End if
End if

if (downt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmddown, Len(cmddown), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Экран выключен."
 End if
End if

if (leftt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdleft, Len(cmdleft), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Звук включен."
 End if
End if

if (rightt = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdright, Len(cmdright), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Звук выключен."
 End if
End if

if (plus = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdvolup, Len(cmdvolup), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Источник VIDEO."
 End if
End if

if (minus = "1") then
 ' посылаем
 Wrap.WriteFile hFile, cmdvoldown, Len(cmdvoldown), pcbWritten, 0
 ' озвучиваем
 if (speakon = true) then
  Speak.Speak "Источник S-VIDEO."
 End if
End if

Loop ' завершение цикла

' закрываем порт
Wrap.CloseHandle(hFile)
' озвучиваем
if (speakon = true) then
 Speak.Speak "Программа завершена."
End if
Использование
  1.  Задайте порт подключения проектора.
  2.  Запустите 'regdynwrapx_2.bat' (на Windows Vista/7/8/8.1 запускать правой кнопкой мыши от имени Администратора).
  3.  Запустите 'run_NEC_Projector_VTxx_2.cmd'.
И вуа-ля:

 
cкачать полный комплект.

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.