RadioRadar - Радиоэлектроника, даташиты, схемы

https://www.radioradar.net/radiofan/miscellaneous/usb_alarm_time_reception_medicines.html

USB-сигнализатор времени приёма лекарств

Люди пожилого возраста, вынужденные регулярно принимать лекарственные препараты, зачастую испытывают трудности с самостоятельным соблюдением режима их приёма. А ведь от своевременного выполнения предписаний врача иногда зависит не только здоровье, но и сама жизнь. В дополнение к обычным организационным методам решения проблемы можно использовать и технические средства. К ним относится и предлагаемый сигнализатор, который ежесуточно по введённому в него расписанию подаёт сигналы, напоминающие о необходимости приёма лекарств.

Многие пожилые люди по вполне понятным причинам испытывают затруднения в работе с современными программными продуктами. Что касается устройств-сигнализаторов, то большинство из них фактически представляют собой несколько модернизированные будильники, неспособные работать по расписанию даже с двумя-тремя видами препаратов и эргономически не приспособленные к использованию людьми пожилого возраста.

Общий вид разработанного автором сигнализатора, имеющего восемь независимых каналов (по числу ячеек для лекарств), каждый из которых может быть настроен на подачу до четырёх напоминающих сигналов в сутки (всего может быть подано 32 сигнала), показан на рис. 1. Для ввода или корректировки расписания приёма лекарств это устройство соединяют по интерфейсу USB с компьютером, на котором запускают специальную программу. Когда расписание загружено, сигнализатор работает автономно.

Общий вид сигнализатора

Рис. 1. Общий вид сигнализатора

 

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

Питают сигнализатор от сети ~230 В, а в случае пропадания в ней напряжения он автоматически переходит на питание от встроенной аккумуляторной батареи. Потребляемая от сети мощность не превышает 5 Вт, продолжительность работы от аккумуляторной батареи ёмкостью 800 мА·ч достигает трёх суток. Этим обеспечена сохранность расписания даже при длительном отключении сетевого питания.

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

Схема сигнализатора

Рис. 2. Схема сигнализатора

 

Использованный в сигнализаторе микроконтроллер ATmega8A-PU (DD1) способен работать при пониженном до 2,7 В напряжении питания. Тактовая частота микроконтроллера 12 МГц задана кварцевым резонатором ZQ1. Узел звуковой сигнализации собран на микросхеме музыкального синтезатора УМС8-08 (DD2). Микроконтроллер включает звуковой сигнал, подавая высокий уровень на вход S микросхемы синтезатора. Сигнал непрерывно звучит до нажатия на кнопку SB1. Источником звука служит пьезоизлучатель HA1. Громкость регулируют переменным резистором R16. Мелодии перебирают нажатиями на кнопку SB2 во время воспроизведения. Более подробная информация о микросхемах серии УМС приведенав [1].

В сигнализаторе имеется не показанный на схеме трансформаторный источник стабилизированного напряжения 5 В, собранный по традиционной схеме на интегральном стабилизаторе 7805. В случае пропадания напряжения в питающей сети устройство переходит на питание от аккумуляторной батареи GB1. Средний ток, потребляемый от неё, не превышает 5 мА. При наличии напряжения в сети батарея непрерывно подзаряжается благодаря цепи VD5, VD6, R18. Однако рекомендуется раз в месяц её отключать и производить полный цикл разрядки до напряжения 3 В и зарядки с помощью внешнего зарядного устройства.

Микросхему музыкального синтезатора УМС8-08 можно заменить другой из серий УМС7 и УМС8. Они различаются лишь набором мелодий. Транзистор КТ3102Б допустимо заменить на КТ3102Г, КТ3102Е или импортный BC547, а также на КТ315Б или КТ315Г, если уменьшить сопротивление резистора R17 до 51 кОм. Вместо диодов КД522Б подойдут КД521А, КД521Б, КД522А, 1N4148 и аналогичные. Все постоянные резисторы - С2-33Н или МЛТ. Оксидные конденсаторы С3 и C6 - К50-83, К50-16 или импортные. Остальные конденсаторы - керамические К10-73-1б, К10-17в. Светодиоды пригодны любые в корпусах диаметром 5 мм желаемого цвета свечения. В авторском варианте в качестве HL1 установлен светодиод зелёного цвета свечения, чтобы не беспокоить больного попусту, остальные - красного цвета. Разъём XS1 - розетка USB-BF.

Аккумуляторная батарея GB1 составлена из трёх Ni-Mh аккумуляторов типоразмера AA ёмкостью 80о мА·ч. Можно использовать аккумуляторы и другой ёмкости, но при этом желательно подобрать резистор R18 такого сопротивления, чтобы начальный ток зарядки разряженной до напряжения 3 В батареи был численно равен 0,1 её номинальной ёмкости.

Сигнализатор собран на стандартной перфорированной монтажной плате размерами 70x50 мм с шагом перфорации 2,54 мм. Способ монтажа - навесной с фиксацией термоклеем. Ввиду простоты схемы печатный монтаж не применялся. Все элементы устройства, кроме светодиодов HL2-HL9, размещены в пластмассовой электротехнической распределительной коробке исполнения IP67 размерами 80x80x40 мм.

Разъём XS1 расположен на небольшой печатной плате, напротив него в стенке коробки вырезано отверстие соответствующих размеров. Элементы HA1, HL1, GB1, R16, SB1 зафиксированы на крышке коробки термоклеем. Кнопка SB2, не относящаяся к органам оперативного управления, находится на монтажной плате. На рис. 3 показано взаимное расположение монтажной платы и выносных элементов внутри распределительной коробки.

Взаимное расположение монтажной платы и выносных элементов внутри распределительной коробки

Рис. 3. Взаимное расположение монтажной платы и выносных элементов внутри распределительной коробки

 

Лекарственные препараты размещены в типовой кассетнице для радиодеталей из восьми ячеек с выдвижными ящиками. Каждая её ячейка имеет размеры 112x55x120 мм. Общие габариты кассетницы - 224x110x120 мм. Поскольку ячейки негерметичны, но достаточно вместительны, лекарства следует хранить в заводских упаковках. Кассетница обеспечивает также защиту от света, необходимую для хранения некоторых видов лекарств. На лицевых панелях ячеек предусмотрены пазы для табличек с названиями лекарств.

Распределительная коробка закреплена на левой боковой стенке кассетницы винтами М3 с гайками. Светодиоды HL2-HL9 расположены по одному на лицевой панели каждой ячейки и соединены с устройством гибкими проводами, уложенными в трубки ПХВ внутри ячеек и сожгутованными на тыльной стороне кассетницы. Запас длины каждой пары проводов, идущих к светодиодам, должен обеспечивать свободное выдвижение ячейки на 75...80 % полностью открытого состояния.

Прилагаемый к статье файл USB_HID_ Note.hex следует загрузить в программную память микроконтроллера. Конфигурация микроконтроллера должна соответствовать показанной в табл. 1. Налаживания правильно собранное устройство не требует. Желаемую яркость светодиодов можно установить, изменяя их ток в пределах 5...10 мА подборкой резисторов R7-R15.

Таблица 1

РазрядыСостояние

CKOPT

0

CKSEL[3:0]

1111

SUT[1:0]

10

BODEN

1

WDE

1

RSTDISBL

1

С точки зрения спецификации USB устройство относится к классу HID [2] с программной реализацией интерфейса USB на основе известного драйвера AVR V-USB [3]. Напомню, что в этом случае требуется переключить интерфейс в низкоскоростной режим USB 1.1, что согласно спецификации выполняют с помощью резистора, включённого между интерфейсными линиями D- и Vbus (в рассматриваемом случае это резистор R4).

Использован один из типовых вариантов подключения микроконтроллера с его питанием пониженным напряжением через диоды VD1 и VD2. Применение этих диодов желательно несмотря на наличие аккумуляторной батареи, поскольку исключает влияние её напряжения на согласование логических уровней шины USB и микроконтроллера.

Микроконтроллер работает с тактовой частотой 12 МГц, одной из ряда допустимых для V-USB. Его программа написана на языке C в среде разработки AVR Studio 4. Текст программы (файл main.c) содержит подробный комментарий. Использованы релиз драйвера vusb-20100715 [4] и компилятор WinAVR-20100110 [5].

Библиотека V-USB хорошо документирована, поэтому здесь будут рассмотрены только моменты, непосредственно касающиеся реализации проекта или относящиеся к его особенностям. Пошаговый процесс создания программы на основе библиотеки V-USB подробно описан в [6].

Основные моменты, на которые следует обратить внимание при создании программы в AVR Studio:

- в папку проекта должны быть скопированы все файлы из папки usbdrv архива V-USB;

- к проекту AVR Studio следует добавить файлы usbdrv.c, usbdrvasm.S, oddebug.c (через пункт контекстного меню "Add Existing Source File(s)..." в дереве проекта);

- в настройках проекта (Projects → Configuration Options → General → Frequency, Hz) тактовая частота микроконтроллера должна быть задана равной 12000000 Гц. На основании этого значения AVR Studio определит для компилятора константу F_CPU, которую использует V-USB.

Необходимую конфигурацию V-USB содержит файл usbconfig.h, который тоже должен находиться в папке проекта. Штатный файл конфигурации следует заменить прилагаемым к статье. В табл. 2 перечислены наиболее важные константы, определённые в этом файле. Возможность свободной разработки USB HID устройств связана с важным моментом - в ней должны применяться пары идентификаторов VID/PID согласно документу USB-IDs-for-free.txt из библиотеки V-USB [3].

Таблица 2

Константа

Значение

Содержание

USB CFG IOPORTNAME

D

Порт подключения шины

USB CFG DMINUS BIT

4

Разряд порта, к которому подключена линия D-

USBCFGDPLUSBIT

2

Разряд порта, к которому подключена линия D+ (должна быть соединена с входом прерывания INTO)

USB CFG INTERFACE CLASS

3 (HID)

Класс устройства

USB CFG MAX BUS POWER

100

Максимальный ток потребления от шины USB. мА

USB CFG HID REPORT DESCRIPTOR LENGTH

22*

Длина дескриптора HID-репорта

USB CFG VENDOR ID

OxCO, 0x16

Идентификатор производителя устройства

USB CFG DEVICE ID

OxDF, 0x05

Идентификатор продукта

*) Это значение должно быть равно размеру символьного массива PROGMEM usbHidReportDescriptor в программе.

 

В программе использован формат времени UNIX, где значение времени представляет собой число секунд, прошедших с 00:00:00 UTC 01.01.1970 г. Сигнализатор не отображает время визуально, что позволяет избежать излишнего усложнения схемы и алгоритма его работы. Для передачи timestamps - четырёхбайтных значений времени UNIX - служит переменная pdata.

Максимальное число подаваемых за сутки сигналов задано в программе константой NUM_ CALLS. Для хранения значений времени использован массив u_time размером NUM_CALLS+1. При этом элемент массива u_time[NUM_CALLS] содержит текущее время, а остальные - время подачи сигналов. Каждому каналу (ячейке кассетницы с лекарствами) отведено по четыре элемента массива. Например, первой ячейке - элементы c u_time[0] по u_time[3], второй - с u_time[4] по u_time[7] и т. д. Если значение элемента массива равно нулю, соответствующий сигнал считается неактивным. Такой подход позволяет упростить алгоритм передачи и обработки информации.

Описывающий структуру пакета дескриптор и процедуры передачи информации usbFunctionWrite и usbFunctionRead созданы на основе типовых решений. Базовые функции подробно описаны в заголовочном файле usbdrv.h из [3]. Процедуры дополнены условиями проверки числа обработанных каналов. Число элементов массива, получаемого устройством от компьютера, на единицу больше, чем отправляемого, поскольку для синхронизации компьютер всегда передаёт текущее время.

В начале главной процедуры main() происходит конфигурирование регистров ввода-вывода, установка коэффициента деления тактовой частоты равным 256 и начальная загрузка регистра таймера TCNT1 числом, нужным для формирования интервала времени длительностью 1 с. Прерывания по переполнению таймера по умолчанию выключены.

После этого программа входит в основной цикл. Если подключение к USB отсутствует, будут разрешены прерывания глобально и по переполнению таймера 1. В цикле for каждый элемент массива u_time[i] с ненулевым значением будет проверен на равенство текущему времени. Если равенство обнаружено, будут включены звуковой сигнал и светодиод соответствующей ячейки, а время срабатывания этого канала увеличено на 86400 с (на сутки).

Затем происходит проверка уровня на входе PB0. Если он низкий (кнопка SB1 нажата в подтверждение приёма сигнала), на всех выходах будут установлены низкие логические уровни, что выключит сигналы.

Параллельно с этим ежесекундно по переполнению таймера 1 происходит запуск процедуры обработки прерывания TIMER1_OVF_vect. Она восстанавливает предустановку счётчика TCNT1, инкрементирует значение текущего времени в элементе массива u_time[NUM_ CALLS], изменяет состояние выхода PB1 (подключённый к нему светодиод HL1 мигает с периодом 2 с).

При подключении устройства к USB на вход PC5 поступает высокий уровень с линии Vbus шины USB. В этом случае выполнение условия if (PINC & (1<<5)) запрещает прерывания по переполнению таймера 1 и активизирует драйвер V-USB. Включается и непрерывно светит светодиод HL1.

После активизации драйвера V-USB становится возможным обмен информацией по USB. В цикле вызывается функция usbPoll(), поддерживающая интерфейс в активном состоянии при отсутствии обмена информацией. Подробнее процесс передачи информации описан в разделе статьи, касающемся программы для компьютера.

Перейдём к рассмотрению компьютерной программы ввода расписания в сигнализатор USB_HID_Note. Как видно уже по её главному окну (рис. 4), особое внимание в процессе разработки было уделено оптимизации интерфейса для обеспечения удобства работы пользователям почтенного возраста. Программа работает под управлением ОС Windows XP, Windows Vista, Windows 7, Windows 8, Windows Server 2003, Windows Server 2008. Её работоспособность под Windows 10 и Windows Server 2012 не проверена, но есть основания предполагать, что она будет работать нормально.

Главное окно компьютерной программы ввода расписания в сигнализатор

Рис. 4. Главное окно компьютерной программы ввода расписания в сигнализатор 

 

После запуска программы с присоединённым к компьютеру сигнализатором нажмите на экранную кнопку  "Подключить". Будет выведено сообщение о результате попытки подключения. Если она прошла успешно, станут доступны экранные кнопки  "прочитать всё" и  "Сохранить".

Для ввода расписания достаточно выбрать номер ячейки из первого выпадающего списка (селектора), а номер сигнала для этой ячейки - из второго списка. Затем установить нужное время подачи сигнала, щелчком по флажку слева от номера разрешить или запретить выбранную комбинацию ячейки и сигнала (при этом изменяется цвет флажка) и написать название препарата в единственной доступной строке. Название препарата привязывается к номеру ячейки, поэтому содержимое строки изменяется только при переключении первого селектора. Флаг разрешения относится к выбранной комбинации номеров ячейки и сигнала.

Так заполняют все необходимые ячейки. Состояние ячеек по умолчанию - выключено, активировать их все нет необходимости. Если нужно, настройки ячеек можно изменять. Введённые значения сохраняются динамически.

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

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

Впрочем, даже разница в несколько минут в рассматриваемом случае некритична, поэтому никаких мер по устранению этой особенности не принято. Если же после завершения работы программы USB_HID_Note сигнализатор случайно остался надолго подключённым к компьютеру, достаточно запустить эту программу заново, нажать на экранную кнопку  , затем на  и тут же на  или просто закрыть программу. Правильный отсчёт времени сигнализатором будет восстановлен, после чего USB-кабель можно отсоединить.

Наименования лекарственных препаратов хранятся в файле конфигурации программы и выводятся на экран компьютера при подключённом сигнализаторе. Вместе с вводом в программу расписания следует позаботиться о том, чтобы каждая ячейка кассетницы была снабжена биркой с соответствующей надписью.

Программа USB_HID_Note написана на языке C++ в среде программирования Qt 5.3.2. Выбор этой среды обусловлен её бесплатностью, кроссплатформен-ностью, широкими возможностями и уникальными встроенными средствами для создания и отладки приложений любого уровня в сочетании с гибкостью интерфейсных решений. Тип реализации приложения - Qt Widget. Исходный текст виджета - файл widget.cpp. Полностью проект собран в архив USB_HID_Note_ pro.zip, приложенный к статье.

Особенность программы - прямое обращение к функциям библиотек SetupAPI и HID. Поэтому в компьютере, на котором происходит компиляция, необходимо наличие файлов setupapi.lib и hid.lib, соответствующих версии его операционной системы. Эти файлы обычно входят в пакет WinDDK. Чтобы не было необходимости полностью устанавливать весь пакет WinDDK, файлы различных версий из WinDDK 7600. 16385.1 собраны автором в одну папку winddk_libs, которая имеется на FTP-сервере редакции. Компиляция и отладка могут проводиться под ОС Windows 7, Windows Server 2008 R2, Windows Vista SP1, Windows Server 2003 SP1, Windows XP SP3 или более поздних. В файле .pro должны быть явно указаны полные пути к библиотекам, например, как в табл. 3.

Таблица 3

Откомпилированный исполняемый файл программы вместе с файлами конфигурации (.cfg) и стилей (.qss) находятся в приложенной к статье папке USB_HID_Note. Там же находятся необходимые динамические библиотеки Qt (файлы .dll). Как известно, это требование обязательно для любого приложения, разработанного в Qt. Список этих библиотек для рассматриваемого случая приведён в табл. 4.

Таблица 4

Все библиотеки копируют из папки ..ToolsQtCreatorin, за исключением двух последних, которые копируют из ..5.3mingw482_32pluginsplatforms и размещают в соответствующей подпапке рабочей папки программы. Можно также самостоятельно скопировать их с компьютера, на котором выполнялась компиляция программы, в рабочую или системную папку программы (размер архива - 126 Мбайт, в распакованном виде - 400 Мбайт).

Алгоритм программы основан на стандартных решениях, приведённых в [7]. Особенности реализации связаны, в первую очередь, с использованием разных языков программирования (в отличие от описанных в источнике Delphi и C#). Для использования функций HID API и SetupAPI необходимо подключить заголовочные файлы hidsdi.h и setupapi.h соответственно.

Обработчик нажатия на экранную кнопку - процедура on_Connect Button_clicked(). Сначала с помощью функции драйвера HidD_GetHidGuid определяется GUID, связанный с HID. Затем вызываются функции SetupAPI для создания перечислителя интерфейса и получения HID-имени устройства. Подробно это описано в [7] на с. 333. В рассматриваемом случае намеренно не использованы функции определения имени продукта или его серийного номера. Производится только проверка пары VID/PID. Так сделано, чтобы избежать возможности коммерческого использования устройства. Значения VID/PID заданы константой Dev_VID_PID в файле global_vars.h.

После обнаружения устройства управление снова передаётся драйверу HID. Функция CreateFile запрашивает его дескриптор, HidD_GetPreparsedData возвращает указатель на буфер, содержащий информацию о параметрах устройства, а HidP_GetCaps возвращает структуру со значениями этих параметров.

В отличие от обычно используемого способа с размером репорта, присваиваемым непосредственно в программе, здесь его значение определяет элемент структуры Caps.FeatureReportByteLength, получаемый из дескриптора. Это позволяет создать более универсальное решение, не требующее внесения изменений в программу и повторной её компиляции при изменении размера репорта в дескрипторе устройства.

Собственно обмен информацией происходит с помощью функций HidD_Get Feature (чтение) и HidD_SetFeature (запись), вызываемых в соответствующих процедурах data_read() и data_transfer() в циклах в соответствии с числом ячеек. Как уже отмечалось, число элементов массива, принимаемых сигнализатором, на единицу больше, чем отправляемых, поскольку для синхронизации компьютер всегда передаёт текущее время.

Подробный комментарий с описанием назначения наиболее важных процедур имеется в тексте программы. Назначение остальных процедур либо стандартное, либо интуитивно понятное, например, on_comboBox_ currentIndexChanged() - обработчик события изменения индекса comboBox. Закомментированные строки qDebug и им сопутствующие были предназначены только для отладки программы. При необходимости отладки и просмотра в окне встроенного отладчика Qt хода обмена информацией все эти инструкции следует раскомментировать.

Общую конфигурацию программа хранит в файле settings.cfg. Он имеет обычный текстовый формат, при необходимости его можно редактировать вручную. Его секция [General] содержит число ячеек NUM_BOX=8 и число сигналов на ячейку NUM_BOX_CALL=4, в секции [view] целыми числами задано положение окна программы на экране. Секция [names] содержит наименования препаратов по ячейкам, секция [used] - флаги активности ячеек, секция [times] - значения времени срабатывания в формате UNIX timestamp. Последние носят в основном информационный характер, поскольку рабочие значения находятся в памяти микроконтроллера сигнализатора. При ручном редактировании файла следует учесть, что параметры name имеют формат C/C++/Java source code (например, u3256).

И в заключение несколько рекомендаций тем, кто желает самостоятельно изменить число сигналов, подаваемых устройством. Если число ячеек фиксировано, число сигналов на ячейку изменить сравнительно несложно. В программе микроконтроллера для этого необходимо, во-первых, изменить константу NUM_CALLS. Её значение должно быть равно произведению числа ячеек на максимальное число сигналов на каждую ячейку. В рассмотренном в статье случае оно равно 8x4=32. Во-вторых, в процедуре switch... case... число операторов case в каждой строке должно быть равно числу сигналов на одну ячейку. При этом аргументы операторов case должны образовывать непрерывную последовательность от 0 до NUM_CALLS-1. Тело функции и оператор break остаются без изменений. Затем программу необходимо сохранить и заново откомпилировать.

В программе для компьютера никаких корректировок не требуется. Достаточно изменить значение константы NUM_BOX_CALL (число сигналов на ячейку) в файле settings.cfg. Оно должно строго соответствовать заложенному в программу микроконтроллера.

Программы для микроконтроллера и компьютера можно найти здесь.

Литература

1. Дриневский В., Сироткина Г. Музыкальные синтезаторы серии УМС. - Радио, 1998, № 10, с. 85.

2. Universal Serial Bus. HID Information. - URL: http://www.usb.org/developers/ hidpage/ (05.09.16).

3. V-USB. - URL: https://www.obdev.at/ products/vusb/index. html (05.09.16).

4. Архивдрайвераvusb-20100715. - URL: https://www.obdev.at/downloads/vusb/ vusb-20100715.tar.gz (05.09.16).

5. Компилятор WinAVR-20100110. - URL: https://sourceforge.net/projects/winavr/ files/WinAVR/2010011 0/WinAVR-201 0 0110-install.exe/download (05.09.16).

6. USB для AVR. Часть 2. HID Class на V-USB. - URL: http://we.easyelectronics.ru/ electro-and-pc/usb-dlyaavr-chast-2-hid-class-na-v-usb.html (05.09.16).

7. Агуров П. Практика программирования USB. - С.-Пб.: "БХВ-Петербург", 2006.

Автор: Д. Панкратьев, г. Ташкент, Узбекистан