Мост IrDA-COM
Кратенько (и довольно бестолково) об IrDA в Wikipedia
Наши цифровое зарядное устройство, микропроцессорный модуль для передатчика, гироскоп, цифровой радиоканал, гувернер, а также не наши регуляторы Pilotage и Hyperion имеют интерфейсы СОМ (или UART) для конфигурирования, считывания и записи данных. Проблема в том, что многие современные РС не имеют RS-232 интерфейсов. А найти ноутбук, наладонник или смартфон с СОМ портом сейчас уже практически невозможно. Между тем, в полевых условиях удобно использовать именно портативные устройства. Чтобы решить эту проблему, было решено разработать устройство-мост между СОМ портом и беспроводным интерфейсом IrDA, имеющим пока еще довольно хорошую поддержку в разного рода портативных компьютерах. При этом устройство хотелось сделать малогабаритным, недорогим и с использованием доступного микроконтроллера, например, Atmel ATmega8.
Рассмотрим, что необходимо для реализации такого моста.
Во-первых, нужно уметь принимать и передавать инфракрасные (ИК) сигналы. Для этого необходимы приемник и передатчик оптического ИК излучения. Эксперименты показали, что в качестве передатчика можно использовать обычный ИК светодиод. А вот соорудить приемник на фотодиоде и дискретных компонентах, способный работать в широком диапазоне скоростей, дальностей и внешних засветок, оказалось совсем непросто. Поэтому было решено использовать интегральный ИК трансивер типа RPM8xxx от ROHM или TFDU4x00 от VISHAY. Далее, необходимо разобраться с модуляцией по стандарту IrDA. Эта модуляция различна для SIR и FIR IrDA-устройств. Мы ограничимся спецификацией SIR (скорость обмена до 115.2 кБод). На физическом уровне SIR передача напоминает асинхронный последовательный интерфейс - есть старт-бит, биты данных и стоп-бит. При этом логический "0" передается световым импульсом, а логической "1" соответствует отсутствие импульса.
Длительность светового импульса по стандарту составляет 3/16 от длительности бита. Причем на скоростях ниже 115200 допускается использовать импульсы с длительностью от 3/16 бита скорости 115200 до 3/16 бита текущей скорости. Например, для скорости 9600 длительность импульса может принимать значения от 1.6 до 19.5 мкс. Понятно, что напрямую принимать и генерировать такие сигналы с помощью UART микроконтроллера невозможно. Поэтому было решено применить UART по его прямому наначению - для СОМ порта, а для приема и передачи SIR - использовать 16-битный таймер контроллера. При этом в режиме передачи используется режим Fast PWM (Mode 14), а в режиме приема - режим Normal (Mode 0) с обработкой событий Input_Capture и Output_Compare. Такое программно-аппаратное решение модулятора и демодулятора оказалось довольно требовательным к быстродействию процессора. При скорости 115 кБод период между событиями составляет всего 8.6 мкс, и, кроме того, в это же время может иметь место асинхронный прием и передача через UART. Решение этой задачи потребовало некоторых программистских усилий и применения ассемблера в критических процедурах (прием и передача IrDA фреймов, а также обработка прерываний UART). Такой подход позволил с хорошим запасом реализовать скорости до 115.2 кБод при частоте процессора 12 МГц. Полагаю, что при такой тактовой частоте и на скоростях до 57.6 кБод будет работать и хороший Си код.
Во-вторых, чтобы IrDA-совместимое устройство типа компьютера или наладонника могло работать с нашим мостом, необходима реализация довольно сложного стека протокола IrDA (см. рисунок ниже). Ни Windows любой масти, ни PalmOS - никто не захочет иметь с нами дело, если у нас не будут полноценно работать слои с SIR по TinyTP - все они абсолютно необходимы для установки связи и передачи данных. Кроме этого, нам надо уметь через канал IrDA конфигурировать наш UART - задавать скорость обмена, количество бит, четность и т.д. Для последнего лучше всего подходит дополнительный слой IrCOMM.
<Небольшое лирическое отступление о IrCOMM>
Протокол IrCOMM был предложен, как средство для беспроводного соединения компьютеров и различного рода периферийных устройств по аналогии соединения кабелем двух СОМ портов. В Windows 98/ME даже существовала поддержка виртуальных ИК СОМ портов. Т.е. при обнаружении системой любого IrDA-устройства с поддержкой IrCOMM, в ней появлялся виртуальный СОМ порт, работа с которым из любой программы не отличалась от работы с обычным СОМ.
Начиная с Windows2000, Майкрософт отказался от поддержки виртуальных ИК COM, мотивируя это тем, что пользователи "путаются в нумерации виртуальных ИК СОМ портов и физических СОМ, к которым подключены адаптеры IrDA". Вторым слабым местом следует признать отсутствие в IrLMP и IrCOMM механизма для маршрутизации команд и данных в случае наличия в устройстве сразу нескольких портов.
Так или иначе, виртуальные ИК СОМ порты в ОС от Майкрософт, похоже, канули в лету, а жаль - для данной цели они были бы просто идеальным решением.
</Небольшое лирическое отступление о IrCOMM>
Поддержка IrCOMM в данном проекте довольно условна - реализован лишь минимально необходимый набор команд по управлению UARTом моста, так сказать, для собственного употребления. Просто чтобы не изобретать велосипед и не придумывать для этого свои форматы команд, я взял их из IrCOMM.
Что касается остальных слоев, то без их честной поддержки никак не обойтись. И вот тут, на первый взгляд, все очень непросто. Протокол IrDA - довольно объемный и сложный, описание каждого слоя занимает десятки и даже сотни страниц. Слои максимально изолированы между собой, что требует наличия операционной системы с поддержкой процессов, сообщений и т.д. К счастью, понимая, что их стандарт чрезвычайно трудно реализовать на маломощных платформах, авторы стандарта выпустили рекомендацию по минимальной реализации IrDA - документ "Minimal IrDA Protocol Implementation (IrDA Lite)". В документе изложены идеи, как можно снизить сложность протокола с сохранением его работоспособности и совместимости с другими IrDA устройствами.
Именно эти предложения были взяты за основу и творчески переработаны при реализации программного обеспечения (ПО) данного проекта. Творческая переработка заключалась в полном отказе от Primary Role в IrLAP и режима клиента в IrLMP. Если объяснять доступным языком, то это означает что наш мост не будет способен самостоятельно искать другие IrDA устройства, не сможет инициировать с ними связь, не сможет определять их доступные сервисы и подключаться к ним. А вот реализация Secondary Role IrLAP, серверных функций IrLMP и IAS позволит любому компьютеру, наладоннику и т.п. обнаружить наш мост, связаться с ним, найти СОМ сервис, подключиться к нему, сконфигурировать UART моста и далее вести с ним обмен данными. Очевидно, это именно то, что нам и нужно. Далее, система межслойного сигналирования была заменена процедурными вызовами. Еще одним аспектом творческой переработки стала реализация скоростей обмена до 115.2 кБод в отличие от единственно возможной в IrDA Lite скорости 9600 Бод.
В-третьих, кроме стека IrDA, нам потребуется система буферизации данных UART. Дело в том, что прием-передача данных через IrDA и UART - совершенно асинхронные процессы. Кроме того, данные UART - символьные потоки, а данные IrDA передаются пакетами (фреймами). Поэтому в ПО необходимо организовать приемную и передающую очереди типа FIFO. Необходимые размеры очередей, очевидно, зависят от приложений, которые будут работать с мостом. В нашем случае максимальный размер блока данных, поступающего через UART в мост, к примеру, от гироскопа составляет 264 байта (размер страницы EEPROM). Поэтому размер приемного буфера был выбран равным 280 байт. Размер передающего буфера был установлен в 128 байт (это было почти все, что оставалось от ОЗУ ATmega8).
Итак, структура моста с ПО получается примерно такой:
Для проверки всех теоретических выкладок из подручных средств делаем макет:
Если все слои стека протокола функционируют нормально, то появление нашего моста в зоне видимости компьютера с IrDA не останется незамеченным:
В-четвертых, необходимо научиться работать с нашим мостом со стороны клиента - РС (Windows) и РРС (Windows Mobile). Другие ОС (Palm, Win CE и пр.) в рамках данной статьи не рассматриваются.
Независимо от платформы, программа клиента должна уметь обнаруживать доступные IrDA устройства и определять их сетевые идентификаторы. Далее, программа должна установить с каждым устройством связь и определить, есть ли в устройстве поддержка сервиса IrCOMM. В случае, если сервис доступен, клиент должен уметь подключиться к этому сервису и сконфигурировать UART. После этого клиент должен быть способен передавать и принимать данные. Программная реализация клиента целиком определяется операционной системой и ее API, предназначенным для работы с IrDA. К примеру, Майкрософт в Win32 предлагает использовать сетевые сокеты. Вот так может выглядеть текст программы обнаружения и подключения. А вот результат ее выполнения:
WinXP показывает установление связи:
При программировании под Windows Mobile 5.0 с .NET Compact Framework над сокетом существует удобный класс IrDAClient. Хороший пример его использования позволил довольно легко доработать конфигуратор регуляторов Pilotage и Hyperion для беспроводной связи через IrDA.
Добавляем опцию IrDA в меню:
И вот так выглядит протокол программирования регулятора через IrDA:
Макетный образец продемонстрировал полную работоспособность моста IrDA-COM. Теперь необходимо решить вопросы конструктивного исполнения и питания. Поэтому -
продолжение следует...
28-12-07 Пока только фотки...
© Вадим Кушнир (печатная плата - Александр Воронин, принципиальная схема - совместное творчество)
P.S.
При разработке данного устройства использовались стандарты:
"Infrared
Data Association Serial Infrared Physical Layer
Specification" - файл IrPHY_1p3.PDF
"Infrared Data Association Serial Infrared Link Access
Protocol (IrLAP)" - файл IrLAP11.pdf
"Infrared Data Association Link Management Protocol" -
файл IrLMP11.pdf
"Minimal IrDA Protocol Implementation (IrDA Lite)" -
файл IrLitev1p0.pdf или litever10.pdf
"Infrared Data Association ‘Tiny TP’: A Flow-Control
Mechanism for use with IrLMP" - файл Tinytp11.pdf
"Infrared Data Association ‘IrCOMM’: Serial and Parallel
Port Emulation over IR (Wire Replacement)" - файл
ircomm10.pdf
Буквально на днях я обнаружил, что все перечисленные стандарты, многие годы лежавшие в открытом доступе на www.irda.org, с открытого доступа сняты. Теперь указанная организация хочет $795 за возможность посмотреть на базовые стандарты и еще $225 за стандарт IrCOMM. Не думаю, что такие действия прибавят популярности стандарту и его авторам, но - это их право. Я не могу выложить документы здесь - это будет нарушением их авторских прав. Думаю, желающие смогут найти указанные стандарты в Сети, для этого я привел имена файлов. Если не удастся - пишите, что-нибудь придумаем.