Появление IgorPlug-USB
(приемник инфракрасного ДУ с USB-подключением к компьютеру) [1] показало, что
во многих случаях для периферийных USB-устройств необязательно использовать
специализированные чипы - микроконтроллер семейства AVR способен программно
выполнять обмен данными по интерфейсу USB. Кроме основной функции (прием
сигнала от пульта ДУ для управления WinAmp-ом и другими программами),
IgorPlug-USB позволяет компьютеру управлять выходами одного из параллельных
портов микроконтроллера, а также вводить данные с этого порта в компьютер.
Казалось бы: дорога открыта, пора переводить все любительские
разработки, которые для этого использовали COM- и LPT-порты компьютера
(программаторы ПЗУ, переключатели антенн радиостанции, выключатели света в
комнате и т.п.) на "рельсы" USB.
Не тут-то было. А дело даже не в низкой
пропускной способности (всего несколько килобайт в секунду) шины USB в режиме
Low Speed [7], в котором и работает микроконтроллер AVR. Главная проблема, с
которой сталкивался разработчик - необходимость создания драйвера устройства
для операционной системы Windows, а это дело исключительно сложное и
кропотливое, а главное - требующее опыта и больших затрат времени. И если не
заниматься этим профессионально, ничего хорошего не выйдет...
Один из
выходов из этой ситуации - использование спецификации HID (Human Interface
Device) [7]. Таким же образом, к примеру, работают USB-клавиатуры и мышки.
Разработчик соблюдает спецификацию, а Windows (Linux, MacOS и т.д.) использует
стандартные (готовые) драйвера, когда устройство оказывается подключенным к
компьютеру. Далее, управляющую программу для этого устройства можно написать
даже на Бейсике...
Джойстик MJoy [2] - это разработка, которая
иллюстрирует работу контроллера AVR с шиной USB, используя спецификацию HID.
Созданный на базе MJoy цифровой термометр имеет следующие отличительные
особенности:
Спецификация HID позволяет обойтись без написания драйвера для Windows.
Управляющая программа, кроме отображения температуры на экране компьютера,
передает ее другим программам (для передачи в эфир в цифровых видах связи,
например).
Схема
"Сердце" прибора - микроконтроллер
AT90S2313-10 (или ATTINY2313-12 или -16). Стандартным кабелем (GND - черный
провод, +5V - красный, DATA+ - зеленый, DATA- - белый) он подключается к
USB-порту компьютера. Важно, чтобы сопротивление резистора R1 было именно 1.5
кОм (а не 2.2, например), иначе компьютер может "не опознать" устройство.
Питание (+5В) - от шины USB. Микросхема термометра DS18B20 (или DS18S20)
включена по обычной схеме с применением "подтягивающего" резистора
R2.
Firmware (программа
микроконтроллера)
Программа "перекроена" из MJoy
[2] - убраны процедуры опроса АЦП и кнопок джойстика, добавлены подпрограммы
работы с микросхемой термометра (спасибо Виктору Голутвину, UT1WPR [3], за
помощь в освоении этого чипа термометра).
HID report [7], то есть формат
передаваемых в компьютер данных, описан следующим образом:
В компьютер передается
16-битное число - текущая температура в Кельвинах (в отличие от джойстика или
мыши, где передаются координаты X и Y, а также состояния кнопок ).
Конечно, HID report для этого термометра можно было описать как "просто
число", но спецификация HID содержит, в числе прочих, такую сущность как
"температура", для того чтобы программное обеспечение компьютера при
необходимости смогло просмотреть список всех подключенных устройств и выбрать из
них только те, которые измеряют температуру.
Сейчас эта возможность не
используется, и программа в компьютере "распознает" этот термометр по
идентификаторам VID (=0000) и PID (=0003) [7].
Для компиляции программы
используется ассемблер AVRA [4]. Запрограммировать микроконтроллер (то есть,
занести в его память содержимое готового hex-файла) можно, например, используя
программу AVREAL [5] с несколькими проводами, подключенными к LPT-порту
компьютера.
Для чипов термометра DS18B20 и DS18S20 подготовлены
соответствующие hex-файлы: usbthermb.hex и usbtherms.hex, а в исходном тексте
firmware присутствует строка ".define DS18B20", которая определяет тип
используемого чипа.
Программа для
компьютера
Программа работает под операционными
системами Windows 98/ME/2000/XP. Написана для компилятора Visual C++ 6 с
использованием HID-библиотек Windows DDK [8]. Основой послужила аналогичная
программа Cypress USB Thermometer (HIDTHERM) [6].
В окне отображается
температура в градусах Цельсия, а при сворачивании в system tray температура
появляется при наведении курсора мыши на иконку. Цвет иконки красный, если
температура положительная, синий - если нулевая или отрицательная, серый -
термометр не подключен к USB-порту.
Использование
термометра для цифровых видов связи и APRS
При работе
программы в ее директории создаются следующие текстовые файлы:
celsius.txt - температура в
градусах Цельсия
fahrenheit.txt - температура в
градусах Фаренгейта
temperature.txt - обе температуры,
например "Temperature: 26C (78F)"
В программе MixW можно создать следующий
клавиатурный макрос, который при его вызове передаст корреспонденту текущую
температуру:
<TEXTFILE:C:\WORK\USBTHERM\temperature.txt>
Это будет работать с MixW, начиная с
версии 2.16. При запуске программы в ее командной строке можно указать формат, в
котором фраза появится в файле temperature.txt (первое и второе "%d"
соответствуют температуре по Цельсию и Фаренгейту), например:
usbtherm.exe За окном холодно, %d°C
(%d°F).
(При запуске из *.bat-файла вместо "%d" нужно
писать "%%d".)
Такие хитрости с файлом temperature.txt нужны для того,
чтобы если программа не запущена (или термометр не подключен к компьютеру), в
эфир ничего не передавалось.
ui-view.txt - файл в формате WX
data file для программы UI-VIEW:
Oct 14 2005 22:06
000/000t078
Это позволяет передавать текущую температуру в
APRS-сеть.