Компьютерный USB-термометр для цифровых видов связи, APRS и EchoLink
(или просто: USB-термометр для компьютера)
Появление 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 цифровой термометр имеет следующие отличительные особенности:
- Дешевый микроконтроллер AVR (вместо спец-чипов USB) плюс цифровой датчик температуры.
- Спецификация HID позволяет обойтись без написания драйвера для Windows.
- Управляющая программа, кроме отображения температуры на экране компьютера, передает ее другим программам (для передачи в эфир в цифровых видах связи, например).
Схема
«Сердце» прибора – микроконтроллер AT90S2313-10 (или ATTINY2313-12 или -16). Стандартным кабелем (GND – черный провод, +5V – красный, DATA+ – зеленый, DATA- – белый) он подключается к USB-порту компьютера. Важно, чтобы сопротивление резистора R1 было именно 1.5 кОм (а не 2.2, например), иначе компьютер может «не опознать» устройство. Питание (+5В) – от шины USB. Микросхема термометра DS18B20 (или DS18S20) включена по обычной схеме с применением «подтягивающего» резистора R2.
Программа «перекроена» из MJoy [2] – убраны процедуры опроса АЦП и кнопок джойстика, добавлены подпрограммы работы с микросхемой термометра (спасибо Виктору Голутвину, UT1WPR [3], за помощь в освоении этого чипа термометра).
HID report [7], то есть формат передаваемых в компьютер данных, описан следующим образом:
USAGE (Vendor Usage 1) 09 01
COLLECTION (Application) A1 01
USAGE_PAGE (Generic Desktop) 05 01
USAGE (Vno) 09 46
LOGICAL_MINIMUM (0) 15 00
LOGICAL_MAXIMUM (1000) 26 E8 03
UNIT (SI Lin:Temperature) 67 01 00 01 00
UNIT_EXPONENT (0) 55 00
REPORT_COUNT (1) 95 01
REPORT_SIZE (16) 75 10
INPUT (Data,Var,Abs) 81 02
END_COLLECTION C0
В компьютер передается 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-порту.
При работе программы в ее директории создаются следующие текстовые файлы:
- celsius.txt – температура в градусах Цельсия
- fahrenheit.txt – температура в градусах Фаренгейта
- temperature.txt – обе температуры, например «Temperature: 26C (78F)»
В программе MixW можно создать следующий клавиатурный макрос, который при его вызове передаст корреспонденту текущую температуру:
<TEXTFILE:C:\WORK\USBTHERM\temperature.txt>
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-сеть.
Пользователи программы EchoLink могут вывести значение температуры на экран соединенного с ними корреспондента следующим образом:
usbtherm.exe Station UU9JDR\n\nop. Denis\n\nTemp is %d°C (%d°F).
(Здесь «\n» означает перевод строки).
При этом нужно указать путь к файлу temperature.txt в настройке Station Information file (меню Tools – Preferences, закладка Connections) программы EchoLink.
Ссылки
- Приемник ДУ IgorPlug-USB (Igor Cesko) – www.cesko.host.sk
- USB-джойстик MJoy (Mindaugas Milasauskas) – www.mindaugas.com
- USB – это просто! (Виктор Голутвин, UT1WPR) – www.qsl.net/ut1wpr/
- Ассемблер AVRA – avra.sourceforge.net
- Программатор AVREAL (Александр Редчук) – ln.com.ua/~real/
- Cypress USB Thermometer Example – www.cypress.com
- Спецификации USB и HID – usb.org
- Windows DDK – Microsoft Corporation – microsoft.com
Файлы
Денис Нечитайлов, UU9JDR