Предыдущая
Оглавление
Следующая

УПРАВЛЕНИЕ: LPT, COM, USB, IR


LPT-ПОРТ




Следует учитывать, что USB-Lpt адаптеры к принтерам реализуют только часть функций "аппаратного" Lpt порта, существуют сложности адресации, к управлению внешними устройствами они, как правило - непригодны. Программа для экспериментов с Lpt портом: lpt.zip.


Выводы порта можно разделить на четыре группы: это 'земля' (8 выводов, обозначены черным цветом) - контакты 18-25. Красным цветом обозначены 8 выводов двунаправленного регистра Data (контакты 2-9), программируемого и возможна установка логических уровней (0-5в) извне. Адрес: 0x378 - в 16-ричной системе или 888 в десятичной (на рис. написано &H378 - это тоже самое что и 0x378, первое обозначение присуще языку Pasсal и ему подобным). Осталось еще два регистра. Однонаправленный регистр Status (контакты 10-13, 15). Управлять им можно только извне, через внешнее устройство (имеется в виду изменять данные на нем, читать можно из любого регистра в любую сторону). Он имеет адрес 0x379 - в 16-ричной системе или 889 в десятичной. И регистр Control (контакты 1, 14, 16-17). Он имеет всего 4 контакта и может управляться только программой. Его адрес: 890 в десятичной системе.


Работа из под Delphi. Регистрируем библиотеку inpout32.dll.


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
var Port: word; Data: Byte;

Посылка данных из окошек:

Data:= StrToInt(Edit1.Text); Port:= StrToInt(Edit2.Text); Out32(Port, Data);

Аналогично делаем для чтения данных.

Port:= StrToInt(Edit3.Text); Data:= Inp32(Port); MessageDlg('Value: '+ IntToStr(Data), mtInformation, [mbOK], 0);


Допустим, на выводе регистра Data под номером 3 (3 - это номера вывода LPT порта) нужно установить логическую 1 (т.е. чтоб между ножкой и землей было +5 В) и на остальных выводах этого регистра (2,4-9 выводы порта) были нули. В операционных системах, позволяющих получить прямой доступ к регистру, пишем код (опираясь на функцию Out32 библиотеки inpout32.dll):


int Address=888;
int data=2;
Out32(Address, data);


Ниже размещен пример вывода кода 245:




Считать данные из порта (Inp32 это функция для чтения данных из порта библиотеки inpout32.dll):


int Address=888;
int data;
data = Inp32(Address);


На выводах порта 2,4,6-9 сейчас +5 В а на выводах 3,5 0 В. (см. рис. выше). Как уже упомянуто выше, в регистр Data данные записать может и внешнее устройство.


Исходно, на всех выводах регистра Status (10-13, 15) находится высокий уровень напряжения +5 В. Заземлением можно менять уровень до нуля (подача данных извне). Он имеет инвертированные выводы и рабочими являются биты под номерами 4-7, а 0-3 не используются. Чтение:


int Address=889; //адрес регистра Status
int data;
data = Inp32(Address);


После первого замыкания выводов Status, начинают мигать выводы Data и Control. Это связано с тем, что порт LPT предназначен для подключения принтера, а выводы Status он использует, для того, чтобы сообщить компьютеру служебную информацию. Изменения на выводах Status регистрирует драйвер операционной системы. Он же проводит и ответные действия, для нас наблюдаемые в виде периодического изменения состояния других выводов. Тут уж ни чего не поделаешь. Обычно, в начале работы с портом далается замыкание какой-нибудь линии регистра Status на землю, примерно через минуту драйвер утихомирится. После этого порт свободен, и новые операции над регистром Status не приводят к неконтролируемым процессам в порту.


Особенности ввода информации в компьютер через стандартные порты обсуждаются также здесь: http://www.pcports.ru/, Com-Lpt-Win32.


COM-ПОРТ, ТИПОВЫЕ СХЕМЫ


COM-порт, контакты.


1 DCD <- Carrier Detect

2 RXD <- Receive Data

3 TXD -> Transmit Data

4 DTR -> Data Terminal Ready

5 GND == System Ground

6 DSR <- Data Set Ready

7 RTS -> Request to Send

8 CTS <- Clear to Send

9 RI <- Ring Indicator


Первый контакт, DCD, передает сигнал начала передачи данных. В принципе, он необязателен, но в условиях с большим количеством помех бывает весьма полезен. RXD — контакт, принимающии данные. Это один из трех необходимых сигналов. TXD — передача данных, так что очевидно, что он тоже незаменим. DTR, DSR, RTS и CTS служат только для проверки и подтверждения отправки-получения данных. Обычно классический нульмодем не превышает длины в полтора метра, а при такой длине шнура трудно навести какие-либо помехи. RI — сигнал начала связи, который сохранился как историческая реликвия и практически никогда не использовался, даже в дремучие времена DOS. И наконец, GND — «земля».


Мышью используются следующие контакты разъема: RXD (2) – для передачи данных, GND (5) – земля, DTR, RTS (4, 7) – положительное питание, TXD (3) – отрицательное питание. В ряде случаев информационный сигнал подают на ножку 1 (DCD), мышь, как видно, его не использует (но не модем!). Выходной сигнал можно подавать не только на DCD но и на другие контакты CTS, DSR.


В ИК-системах считывания данных с помощью com-порта контакты 5, 9 объединяют, это земля. Контакты 7, 8 служат для подпитки внешней схемы (VCC), обычно далее следует стабилитрон на 5 вольт и резистивно-емкостной мост стабилизации (резистор на 100 ом и конденсатор на десять микрофарад). Это плюс по питанию, допустим, ИК-фототранзистора. Между 6 и 7 ножками размещают резистор в 3 Ком внешней нагрузки, на ножку 6 (DSR) поступает информативный сигнал с фоторезистора (OUT).


В Delphi порт и RTS (7, питание) инициализируется командами:


var port : hfile; IpEvtMask : dword;
begin port:= CreateFile('COM1',GENERIC_READ OR GENERIC_WRITE,0,NIL,OPEN_EXISTING,0,0); EscapeCommFunction(port,SETRTS);


Перехват события (состояния):

setCommMask(port,EV_DSR); getCommMask(port,IpEvtMask); WaitCommEvent(port,IpEvtMask,nil); ShowMessage('Прошло событие');


Установка события означает что состояние линии изменилось на противоположное, например с 0 в 1. Изменения на DCD (1 вывода Com-порта) отлавливаются при помощи события EV_RLSD. Разумеется после окончания работы порт надо закрыть функцией CloseHandle(port); end.



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



Из рисунка видно, что исходное состояние линии последовательной передачи данных - уровень логической 1. Это состояние линии называют отмеченным - MARK. Когда начинается передача данных, уровень линии переходит в 0. Это состояние линии называют пустым - SPACE. Если линия находится в таком состоянии больше определенного времени, считается, что линия перешла в состояние разрыва связи - BREAK. Стартовый бит START сигнализирует о начале передачи данных. Далее передаются биты данных, вначале младшие, затем старшие.


Если используется бит четности P, то передается и он. Бит четности имеет такое значение, чтобы в пакете битов общее количество единиц (или нулей) было четно или нечетно, в зависимости от установки регистров порта. Этот бит служит для обнаружения ошибок, которые могут возникнуть при передаче данных из-за помех на линии. Приемное устройство заново вычисляет четность данных и сравнивает результат с принятым битом четности. Если четность не совпала, то считается, что данные переданы с ошибкой. Конечно, такой алгоритм не дает стопроцентной гарантии обнаружения ошибок. Так, если при передаче данных изменилось четное число битов, то четность сохраняется и ошибка не будет обнаружена. Поэтому на практике применяют более сложные методы обнаружения ошибок.


В самом конце передаются один или два стоповых бита STOP, завершающих передачу байта. Затем до прихода следующего стартового бита линия снова переходит в состояние MARK. Использование бита четности, стартовых и стоповых битов определяют формат передачи данных. Очевидно, что передатчик и приемник должны использовать один и тот же формат данных, иначе обмен будет невозможен. Другая важная характеристика - скорость передачи данных. Она также должна быть одинаковой для передатчика и приемника.


Скорость передачи данных обычно измеряется в бодах (по фамилии французского изобретателя телеграфного аппарата Emile Baudot - Э. Бодо). Боды определяют количество передаваемых битов в секунду. При этом учитываются и старт/стопные биты, а также бит четности. Иногда используется другой термин - биты в секунду (bps). Здесь имеется в виду эффективная скорость передачи данных, без учета служебных битов.


Пусть var x : byte; dw : dword; установка параметров передачи в Delphi: getcommstate(com,dcb); dcb.baudrate := cbr_9600; dcb.bytesize := 8; dcb.parity := 2; setcommstate(com,dcb); команда чтение байта: readfile(com,x,1,dw,nil);


Если приемник качает информацию по DCD, нужен таймер, который будет считать время между изменениями DCD и установкой событий. Промежуток Т между 2 событиями равен нулевому биту в команде или адресе, 2Т соответственно равен 1. Время Т таймера обычно равно промежутку между старт битом и битом синхронизации. Набивая полученными битами байт - получаем искомое число - команду переданную с пульта, вначале идут несколько бит адреса блока команд и только потом сама команда. Плюс нужна поправка на пропуск в цикле каждого второго события, который сигнализирует о том, что сигнал на DCD вернулся в исходное состояние. В принципе по нему можно перезапускать таймер.


Итак, по событию запустить таймер для измерения интервала. По следующему событию учесть полученный интервал в таймере. Пропустить несколько событий (сколько - зависит от пульта). Запустить таймер. По наступлению события смотреть, было ли событие от таймера, или в событии от таймера смотреть, было ли событие от порта. Ориентируясь на это добавлять сдвигом в байт бит (0 или 1) в цикле N раз (сколько зависит от пульта). По окончанию цикла дождаться еще 1 события (стоповый бит). Проанализировать, что за байт получился и предпринять какие то шаги. Не забыть закрыть порт по выходу из программы.


USB-ПОРТ



Возможен доступ с помощью конвертора FT232BM. Это английская микросхема, которая имеет вход UART (или параллельный, аналог LPT, если это FT245BM) и выход USB. Также она имеет драйвер, распространяемый бесплатно. Установив этот драйвер на ПК, вы можете подключить ваше устройство к любому USB порту вашего ПК. При этом, как только ОС обнаружит устройство, USB таинственным образом исчезает из списка портов, а вместо него появляется "виртуальный" порт COMn, где n - номер, как правило, следующий за последним из реальных СОМ портов. См. приложения, включая интерфейс USB-АЦП.



Шина USB (Universal Serial Bus - универсальная последовательная шина) появилась по компьютерным меркам довольно давно - версия первого утвержденного варианта стандарта появилась 15 января 1996 года. Разработка стандарта была инициировна весьма авторитетными фирмами - Intel, DEC, IBM, NEC, Northen Telecom и Compaq.


Основная цель стандарта, поставленная перед его разработчиками - создать реальную возможность пользователям работать в режиме Plug&Play с периферийными устройствами. Это означает, что должно быть предусмотрено подключение устройства к работающему компьютеру, автоматическое распознавание его немедленно после подключения и последующей установки соответствующих драйверов. Кроме этого, желательно питание маломощных устройств подавать с самой шины. Скорость шины должна быть достаточной для подавляющего большинства периферийных устройств. Попутно решается историческая проблема нехватки ресурсов на внутренних шинах IBM PC совместимого компьютера - контроллер USB занимает только одно прерывание независимо от количества подключенных к шине устройств.


Возможности USB следуют из ее технических характеристик:

  • Высокая скорость обмена (full-speed signaling bit rate) - 12 Mb/s
  • Максимальная длина кабеля для высокой скорости обмена - 5 m
  • Низкая скорость обмена (low-speed signaling bit rate) - 1.5 Mb/s
  • Максимальная длина кабеля для низкой скорости обмена - 3 m
  • Максимальное количество подключенных устройств (включая размножители) - 127
  • Возможно подключение устройств с различными скоростями обмена
  • Отсутствие необходимости в установке пользователем дополнительных элементов, таких как терминаторы для SCSI
  • Напряжение питания для периферийных устройств - 5 V
  • Максимальный ток потребления на одно устройство - 500 mA


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


Кабели и разъемы


Сигналы USB передаются по 4-х проводному кабелю


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


Номер контакта Назначение Цвет провода
1 V BUS Красный
2 D- Белый
3 D+ Зеленый
4 GND Черный
Оплетка Экран Оплетка


Здесь GND - цепь "корпуса" для питания периферийных устройств, VBus - +5V также для цепей питания. Шина D+ предназначена для передачи данных по шине, а шина D- для приема данных. Кабель для поддержки полной скорости шины (full-speed) выполняется как витая пара, защищается экраном и может также использоваться для работы в режиме минимальной скорости (low-speed). Кабель для работы только на минимальной скорости (например, для подключения мыши) может быть любым и неэкранированным. Разъемы, используемые для подключения периферийных устройств, показаны на рисунке выше.

ИК-СВЯЗЬ С РОБОТАМИ



СВЕДЕНИЯ ПО ИК-УПРАВЛЕНИЮ


Для компорта продается набор ИК-управления.


Схема устройства приведена ниже:



У обычных компьютерных ИК приёмников жёстко прошит протокол IRDA, что не позволяет им принимать сигналы от пультов ДУ, т. к. протоколы пультов и ИК приёмников совершенно несовместимы. Разработаны некоторые программы и устройства перехвата ИК-управления, см. ИК-приемники, SlyControl, ИК-порт. Команды передаваемые ИК передатчиком - последовательный набор байт или один байт, в котором есть старт бит, бит синхронизации, 4-5 бит адрес команды, 4-8 бит сама команда, стоповый бит. Приемник обычный TSOP-17xx. Часть систем ДУ использует ШИМ-модуляцию передаваемых данных.


КОММЕНТАРИИ К ТИПОВЫМ СХЕМА ИК-ПРИЕМНИКА ИЗ СЕТИ


Вот одна из схем, распространяемых интернетом. В COM-порту нет нужных нам 5 вольт, но есть сигнальные линии, выходной уровень которых близок к 12 вольтам, а тока может оказаться (см. далее) достаточно для следующей схемы.



Всего нужны пять деталей. Самая дорогая - фотоприемник типа ТК-19 (TSOP1738, SFH56-38 и др.) - стоит 60 рублей. Еще желателен, но не обязателен стабилизатор напряжения (можно заменить 5-вольтовым стабилитроном). 78L05 подойдет или отечественный КРЕН5A (точнее, КР142ЕН5А (В)), ценою 5 рублей. Остальные детали - сопротивление 4,7 кОм (для некоторых фотоприемников имеет смысл увеличить номинал до 10 кОм), конденсатор 4,7 мкФ/10 В и диод КД521 или подобный. Понадобится также разъём для COM-порта типа "мама".


Сходные схемы. Диод КД521 (можно и 522 и др. подобные кремниевые), конденсатор 10мкф, 16v. ИК приемник TK1833, выпуклостью к себе, слева-направо: DCD (сигнал), GND (общий), RTS (питание +).



Первое, что сразу заметно в первой схеме - это попытка нагрузить достаточно слабый выход IR-приемника на COM-порт. У того же достаточно распространенного TSOP1736 - выходное сопротивление порядка 25-30 кОм. Т.е. при питании 5В размах напряжения на выходе (при нагрузке 12 кОм) не превысит 1.5-2В (что оказалось недостаточно на 4х компах из 5ти, в экспериментах). Транзистор можно поставить KT315. Стабильность работы даже на длинный шнур значительно возрастает.


Первенец ИК-управления в стране - фирма IRLink. Сегодня вышла на торговлю модулями связи в магазины Key по Санкт-Петербургу. Тесты ИК-устройств роботов от Lego показывают высокую НЕСТАБИЛЬНОСТЬ распознавания управляющих сигналов вследствие отличия их от сигналов, вырабатываемых телевизионными пультами. Обычный модуль не имеет инжектора, который нужен для управления роботом. Модуль с инжектором находится в стадии разработки.


ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ


ИК пакеты, генерируемые пультами имеют небольшую частоту - порядка 30-40кГц. Пакеты может запомнить программа, идентифицирующая их как нажатия разных клавиш пульта. Ее можно реализовать в виде драйвера, отдав верхний уровень управления другим разработкам.


GIRDER. Плагины к программе Girder, русифицированная версии 3.2 (программа стала платной), можно найти на narod.ru. Нужный плагин называется Igor SFH-56 Device. Никаких настроек не требуется, нужно лишь указать COM-порт и входящий сигнал. Правда, иногда попадаются пульты, высокая частота посылок импульсов у которых не позволяет фотоприёмнику обработать их (вернее, порты, рассчитанные на 115 кбит/с, не в состоянии пропустить 400 кГц некоторых пультов). Нажимаем любую кнопку на первом попавшемся под руку пульте, не забыв направить его в сторону фотоприёмника. Если в уголке окна программы индикатор изменил цвет на зелёный, можно поздравить себя с правильно функционирующим устройством распознавания. Создаем любую команду, нажимаем кнопку "Учить событие". В окошечке должна появиться комбинация цифр или букв, этот уникальный код как раз и определяет каждую кнопку пульта. Теперь подставляем для команды любое событие из всего того богатства, что предлагает Girder, и наслаждаемся, глядя как компьютер реагирует на кнопки пульта. В комплекте с программой идёт несколько готовых скриптов для управления популярными плеерами, где остаётся только подставить коды посылок от своего пульта. Girder позволяет производить какие угодно действия, вплоть до управления курсором мыши. Очень полезная возможность - назначение нескольких команд на одну кнопку. Можно, например, запустить программу, а потом закрыть её, нажав два раза на одну кнопку. А в сочетании с дополнительными плагинами можно делать OSD-меню, позволяющие перемещаться по дискам, запускать приложения, переключаясь между ними, и т. д.


WinLIRC. Проект LIRC (linux infrared control), разработанный для Linux, успешно адаптирован под Windows и называется WinLIRC. Программа читает ИК пакеты через последовательный порт и работает в качестве демона по IP протоколу. После подключения ИК приемника к любому COM порту (1-му или 2-му), необходимо проверить работоспособность схемы. Для этого в LIRC идем в пункт меню RAW data. Нажимаем кнопку пульта и смотрим пакеты. Если все нормально, то в окошке видны изменения, схему можно считать рабочей. Далее необходимо научить программу распознавать все кнопки пульта. В строчке config прописывается новое имя файла (где будет описан пульт), нажимаем learn (учить) и следуем инструкциям. После обучения необходимо проанализировать получившийся файл с RAW данными от пульта. Нажимаем кнопку Analyze. Программа перестроит CFG файл, где будут хранится значения всех кнопок, которые были нажаты. Больше в программе LIRC делать нечего, сверните ее - пусть висит в трее. Нажмите кнопку пульта - в WinLIRC трей должен отзываться зеленым светом на известные кнопки. Для ходовых испытаний программы установите плагин для Winamp, который позволяет управлять плейером. Плагин необходимо сконфигурировать. Придется лазить постоянно в файлик .CF, который WinLIRC создал для пульта - там находятся названия кнопок (которые вы же и давали) - их необходимо прописать в свойствах плагина.

Предыдущая