| УПРАВЛЕНИЕ: 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 показывают высокую
НЕСТАБИЛЬНОСТЬ распознавания управляющих сигналов вследствие отличия их от сигналов, вырабатываемых
телевизионными пультами. Обычный модуль не имеет инжектора, который нужен для управления роботом.
Модуль с инжектором находится в стадии разработки.
| |