Программа управления нагрузками с usb. Управление нагрузкой через usb. Как пакеты USB декодируются в firmware микроконтроллера

В наше время в каждой мастерской по ремонту электротехники, да, в прочем, и у каждого радиолюбителя рабочий день начинается с включения ПК, а уж потом и вспомогательного электрооборудования. В прочем с включения ПК рабочий день начинается не только у радиолюбителей, но и во многих пользователей сего «девайса», плотно вошедшего в нашу жизнь. А вот каждый день включать утром и выключать вечером, ну, предположим, принтер, активные колонки, настольную лампу да мало ли чего можно встретить у рядового пользователя, немножко надоедает. Исходя из условленных задач была поставлена цель создать коммутатор нагрузки, предназначенный для включения-выключения всех сопутствующих устройств. Соглашусь можно пойти по пути наименьшего сопротивления и поставить на всё обыкновенный выключатель, но, похоже, это не путь для радиолюбителя. Мы будем делать гораздо удобнее - встроим автомат в сетевой фильтр:

Так как устройство отслеживает факт включения-выключения устройства по принципу «ведомый-ведущий» самый простой способ - использовать USB порт. Обозначу сразу, при использовании USB порта устройство работает в ноутбуках и компьютерах с блоком питания, отключающем все источники питания. К примеру, в последних моделях блоков питания +5 вольт USB порта присутствует как дежурное даже при выключенном блоке. С ними устройство работать не будет, точнее будет, но постоянно включено. Здесь необходимо как источник сигнала использовать какой либо иной порт, и, соответственно, согласовывать сигнал источника и исполнительного механизма.

В данном устройстве исполнительным механизмом служит реле, с контактами, рассчитаными на 16 ампер и с катушкой на 5 вольт. Использование реле выполняет гальваническую развязку источника сигнала и сети 220 вольт.

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

Но если планируется использовать ноутбук, то как бы прогонять дополнительные 150 мА через через компьютер не желательно, в таком случае необходимо использовать дополнительный блок питания 5 вольт. В данном варианте был использован импульсный источник питания от зарядного устройства от мобильного телефона. Можно использовать любой нестабилизированный источник питания при условии, что он может обеспечить напряжение 5 вольт и ток порядка 250 мА с учетом запаса. Также можно использовать и другое напряжение, но в таком случае необходимо будет взять и реле с соответственным напряжением питания. Для согласования источника сигнала с реле и источником питания необходимо установить транзисторный ключ типа:

Транзистор выбран типа КТ815 с любой буквой и резистор 1 кОм, диод - КД522. При такой схеме включения ток потребления показал 4 мА, что не столь существенно для ноутбука. Светодиод LED1 и LED2 обозначают состояние цепи. По желанию вместе с резисторами их можно исключить из схемы.

Устройство управления 220 В собрано в свободном месте корпуса розетки - сетевого фильтра. Файл схемы в сплане находится

Утилита для контроля над подключенными и отображения ранее используемых USB-устройств. USBDeview покажет детальную информацию о каждом составном устройстве. Позволит управлять активными USB-портами и диагностировать скорость передачи данных.

USBDeview обзор

Программа выводит сведения для каждого USB-устройства с возможностью его протестировать:

  • Название устройства
  • Описание
  • Тип устройства
  • Серийный номер (для устройств хранения данных)
  • Дата и время добавления устройства
  • VendorID, ProductID и многое другое

Полное управление над подключенным через порт USB оборудованием:

  • Удалить из системы, ранее используемые USB-устройства
  • Отсоединить, подключенное в данный момент устройство
  • Отключение и включение USB-устройств

USBDeview включает в себя несколько полезных инструментов. Например Speed Test for USB Flash Drives , который проводит диагностику скорости чтения – записи подключенного флэш-накопителя. Имейте в виду вам нужно, минимум 100 Мб свободного дискового пространства для того, чтобы успешно сделать этот тест скорости.

С помощью USBDeview, вы можете управлять свойствами автозапуска для USB-устройств хранения данных. Есть возможность работы на удаленном компьютере, но для этого необходимо войти в систему с правами администратора.

Устройство компьютерного управления различными приборами, схема которого показана на рис. 1, подключается к USB-порту компьютера, который сегодня есть в каждом из них. Единственная микросхема устройства - распространенный микроконтроллер ATmega8 . Он необходим для организации связи по шине USB . Хотя в нем и отсутствует специализированный аппаратный модуль, эта функция выполняется программно.

Рисунок 1

Резистор R1, подключенный между положительным выводом источника питания и линией D-шины USB, переводит ее в низкоскоростной режим LS со скоростью обмена 1,5 Мбит/с, что и позволяет расшифровывать посылки компьютера программным способом. Резисторы R4 и R5 устраняют переходные процессы, возникающие при обмене информацией, что увеличивает стабильность работы. Конденсатор С1 блокирует импульсные помехи в цепи питания, что также улучшает стабильность работы устройства Диоды VD1 и VD2 служат для понижения напряжения питания микроконтроллера приблизительно до 3,6 В - это требуется для согласования уровней с шиной USB.

Сигналы управления приборами формируются на выходах РВ0-РВ5 и РС0, РС1 микроконтроллера. Высокий логический уровень - напряжение около 3,4 В. Напряжение низкого уровня близко к нулю. К выходам можно подключать приборы, потребляющие ток не более 10 мА (от каждого выхода). Если требуются большие значения тока или напряжения, то следует использовать узлы согласования.

Устройство собрано на макетной плате, печатная не разрабатывалась Применены резисторы МЛТ, конденсаторы С2 и СЗ - керамические высокочастотные, С1 - К50-35 или аналогичный импортный. Диоды кремниевые с падением напряжения на переходе около 0,7 В.

Программа для микроконтроллера разработана в среде Bascom-AVR версии 1.12.0.0. Для работы с шиной USB использована библиотека swusb.LBX , которая выполняет программное декодирование сигналов USB в режиме реального времени. Полученный в результате компиляции код программы из файла с расширением HEX следует загрузить во FLASH-память микроконтроллера. Состояние разрядов конфигурации микроконтроллера должно соответствовать показанному на рис. 2.

Рисунок 2

При первом подключении устройства к компьютеру операционная система обнаружит новое USB НID совместимое устройство с именем "uniUSB " и установит необходимые драйверы. Через несколько секунд устройство настроено и готово к использованию. Для работы с ним была создана программа UniUSB. Она представлена в двух вариантах: для 32-разрядных (х86) и 64-разрядных (х64) операционных систем семейства Windows. Работа 32-разрядной версии проверена в операционных системах Windows 98, Windows ХР, Windows 7, а 64-разрядной - только в Windows ХР х64.

Программа UniUSB написана на языке PureBasic (версия 4.31) с использованием библиотеки пользовательских функций HID_Lib , поддерживающей работу с USB HID устройствами. Внешний вид окна программы показан на рис. 3.

Рисунок 3

В одной папке с ее исполняемым файлом должен находиться файл, называющийся UniUSB_KOfl.txt . В этом файле хранится сценарий управления внешними приборами. При запуске программы данные из файла загружаются в таблицу, расположенную в главном окне, а при завершении работы сохраняются в файле. Щелчок левой кнопкой мыши по ячейкам таблицы позволяет изменять их состояние: 1 - высокий логический уровень, 0 или пусто - низкий логический уровень.

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

Учтите, операционная система Windows - многозадачная! Это означает, что процессорное время делится между множеством иногда скрытых от пользователя процессов, которые выполняются по очереди с учетом установленных в системе приоритетов. Поэтому не стоит ожидать большой точности выдерживания интервалов времени менее 100 мс.

Для кратковременной остановки перебора столбцов используйте кнопку "Пауза". Повторное нажатие на нее продолжит перебор с места остановки. Кнопка "Стоп" полностью прекращает перебор столбцов таблицы. Если в процессе обмена информацией между компьютером и устройством произойдет сбой либо устройство будет отключено от разъема USB компьютера, программа сообщит об ошибке, выведя в строке состояния соответствующее сообщение.

В статье сделана попытка предоставить пошаговую инструкцию - как соединить самодельное устройство USB HID на микроконтроллере AVR и компьютер с операционной системой Windows 7 x64 , чтобы обмениваться данными и управлять портами микроконтроллера. Пример приложения управляет через USB ножкой порта микроконтроллера (к ней подключен индикационный светодиод). Есть возможность также прочитать состояние состояние светодиода - потушен он или горит. Топик предназначен для новичков, поэтому большая просьба к знатокам программирования - приберегите тухлые яйца и гнилые помидоры иронические комментарии для более удобного случая.

Используемое программное обеспечение

1 . Для микроконтроллера - библиотека V-USB компании Objective Development и IDE Atmel Studio 6 компании Atmel. Нужно также скачать и установить тулчейн WinAVR для компиляции firmware микроконтроллера (для спецов это необязательно, потому что можно обойтись тулчейном, который входит в состав Atmel Studio).
2 . Для написания программы Windows (ПО хоста) использовалась библиотека LibUsbDotNet Тревиса Робинсона и IDE Visual Studio C# 2010 компании Microsoft.

Все программное обеспечение, кроме Visual Studio 2010, бесплатное, хотя есть возможность использовать Visual Studio C# 2010 Express бесплатно в течение ограниченного срока. Все действия проводились в среде операционной системы Windows 7 x64, но наверняка подойдет и любая другая операционная система семейства Windows (Windows XP и более свежая).

Используемое железо

Благодаря библиотеке V-USB для создания устройства USB HID подойдет любой микроконтроллер AVR. Если Вы дружите с паяльником, то даже можете собрать подключение к USB самостоятельно по одной из опубликованных схем. Такая схема (взята из пакета V-USB ) в качестве примера приведена на картинке.

Чтобы экономить время и усилия, лучше использовать готовую макетную плату. Особенно удобно, если в плату будет записан USB-загрузчик (bootloader), тогда не понадобится покупать программатор для перепрошивки платы. Я использовал макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32A, в ней загрузчик есть (USBasploader, эмулирующий поведение программатора USBasp). Вот так платка выглядит в натуральную величину:

Можно взять также metaboard (на нем стоит ATmega168 или ATmega328), или даже программатор на микроконтроллере ATmega8. Подобные железки можно дешево купить на ebay.com или dx.com .

Создание firmware микроконтроллера с помощью Atmel Studio 6 и библиотеки V-USB

Сделайте новый проект в Atmel Studio 6 (далее просто AS6). Когда AS6 предложит выбрать микроконтроллер, выберите Atmega32 без буквы A , не Atmega32A (хотя на плате стоит Atmega32A ) - это важно, так как тулчейн WinAVR не видит разницы, он знает только Atmega32. Эти микроконтроллеры по внутреннему устройству идентичны, так что для нас разницы нет, а для AS6 есть.

Теперь нужно правильно настроить компилятор. В верхнем меню AS6 нажите Tools , далее Options.. и появится вот такое окно:

Слева в списке выберите Toolchain . Справа появится список Flavours. Этим словечком Atmel закодировала возможные варианты используемого инструментария (тулчейны).

Примечание. В списке уже присутствует тулчейн Native, который используется по умолчанию (Default). Тулчейн Native - это компилятор GCC вместе с заголовочными файлами и библиотеками, которые предоставляют необходимую среду компилирования исходного кода для микроконтроллера. Этот тулчейн предоставила Atmel, он устанавливается автоматически вместе с установкой AS6. Как я уже упоминал, для компиляции можно использовать и этот тулчейн, но тогда в исходный код примеров V-USB (на основе примера USB HID будет работать наше устройство USB) придется вручную вносить исправления. Они несложные, но для новичков будет лучше добавить сюда тулчейн WinAVR, и использовать для компиляции именно его.
Для добавления в список Flavours тулчейна WinAVR нажмите кнопку Add Flavour , появится следующее окно:

В верхней строчке этого окна введите имя компилятора WinAVR (произвольное), а в нижней строке введите полный путь, куда установлен сам компилятор тулчейна (с указанием папки \bin) и нажмите кнопку Add . В списке Flavours появится добавленный компилятор, как показано на скриншоте.

Выделите мышкой наш новый добавленный компилятор WinAVR и нажмите кнопку Set As Default (сделать его тулченом по умолчанию), и нажмите OK. После этой процедуры наша AS6 будет использовать компилятор WinAVR.

Пора настроить свойства нашего проекта, для этого курсором в Solution Explorer левым щелчком выберите имя проекта и нажмите Alt+F7 (меню Project -> Properties), появится окно с настройками:

Сделайте следующие настройки:

  • В разделе AVR/GNU C Compiler -> Symbols добавляем в поле -D строчку F_CPU=12000000UL - это соответствует частоте микроконтроллера 12 МГц (такой кварц установлен на моей макетной плате AVR-USB-MEGA16).
  • В разделе AVR/GNU Assemler -> General в поле Assembler flag надо добавить -DF_CPU=12000000UL .
  • В разделе AVR/GNU C Compiler -> Optimization в поле Optimization Level должно стоять Optimize for size (-Os) .
Далее очень важный момент - в левой части окна, в списке выберите раздел Advanced , как показано на рисунке ниже.

В выпадающем списке Toolchain Flavour выберите добавленный компилятор WinAVR, чтобы при компилировании проекта AS6 использовала его. На этом настрока AS6 закончена.

Далее необходимо в созданный проект добавить файлы исходного кода проекта - см. папку firmware\VUSB, файлы VUSB.c, usbdrv.c, usbdrvasm.S и oddebug.c. Проект ASS6 создан на основе одного из примеров библиотеки V-USB: hid-custom-rq, который изначально компилировался с помощью утилиты make из командной строки. На основе библиотеки V-USB можно найти много других примеров кода - в основном это устройства USB HID (мыши, клавиатуры, устройства ввода и вывода), но есть также и устройства USB CDC (виртуальный COM-порт). Если Вам лень самому создавать проект, просто откройте в AS6 файл проекта VUSB.atsln, в нем уже сделаны все необходимые настройки и добавлены все нужные файлы.

Если у Вас используется другая макетная плата, то нужно правильно настроить файл usbconfig.h . Это конфигурационный файл библиотеки V-USB, в нем задаются многие настройки и параметры (VID, PID, ножки микроконтроллера, значения для дескрипторов и другие настройки). Подробное описание всех настроек дано в комментриях этого файла. Основное внимание следует уделить назначению выводов микроконтроллера, которые используются под сигналы USD D+ и D- (макроопределения USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT, USB_CFG_DPLUS_BIT), к этим ножкам предъявляются особые требования. Конфигурационный файл usbconfig.h из архива предназначен под разводку ножек макетной платы AVR-USB-MEGA16, и он гарантированно работает. Моргать программа будет светодиодом, который уже имеется на макетной плате и подключен к ножке 0 порта B.

Создание программы для компьютера (ПО хоста)

Наша программа должна посылать через подключение USB пакеты, которые будут управлять микроконтроллером.

Примечание. Программа была создана на основе примера консольного приложения из той же библиотеки V-USB. Компиляция исходного кода консольного приложения выполнялась с помощью makefile и пакета MinGW, и использовала библиотеку LibUSB. В нашем примере мы будем использовать графическую среду Visual Studio и библиотеку LibUsbDotNet. Однако главный цимус использования LibUsbDotNet вовсе не в том, что теперь легко и удобно можно делать не только консольные, но и графические приложения. Самый большой плюс - теперь не нужен драйвер фильтра, который таскала за собой библиотека LibUSB много лет. Для тех, кто в танке, драйвер фильтра - это особая программная надстройка над библиотекой LibUSB, через которую осуществлялся обмен данными с устройствами USB на платформе Windows. Теперь этот атавизм не нужен.
Запустите Microsoft Visual C# 2010 Express и создайте новый проект на основе Windows Form. Теперь нужно подключить к проекту библиотеку LibUsbDotNet.dll . В обозревателе решений нажмите правой кнопкой мыши на названии проекта, и выберите «Добавить ссылку».

Появится ещё одно окно

Здесь нужно найти путь на диске, где находится библиотека LinUsbDotNet.dll (по умолчанию она устанавливается папку C:\Program Files\LibUsbDotNet, но лучше сделать копию файла DLL в рабочий каталог проекта. После подключения библиотеки её нужно объявить в проекте, для этого добавьте в главный модуль программы (файл Form1.cs) строки:

Using LibUsbDotNet; using LibUsbDotNet.Info; using LibUsbDotNet.Main;
Перейдите к визуальному редактору формы, и приведите её приблизительно к такому виду (добавьте 3 кнопки Button и 3 текстовых метки Label):

Сделайте обработчик события загрузки формы. Он нужен для того, чтобы при старте программы происходила инициализации экземпляра класса LibUsbDotNet, через который осуществляется обмен с устройством USB. Перед началом обмена необходимо открыть доступ именно к нашему устройству, потому что к компьютеру может быть подключено несклько устройств USB HID, и необходимо уметь обращаться к каждому по отдельности. Для целей идентификации USB-устройств служат специальные идентификаторы, которые имеют абсолютно все устройства USB, это VID и PID.

Примечание. Иногда для идентификации устройства дополнительно используется уникальный серийный номер или отдельный текстовый дескриптор - когда к компьютеру подключено несколько устройств USB с одинаковыми VID и PID, но это не наш случай. Поскольку обычно у каждого USB-устройства, подключенного к компьтеру, своя пара VID/PID, отличающаяся от других устройств, то найти нужное устройство и обратиться к нему не составляет проблем.
VID это идентификатор производителя (Vendor ID), а PID - идентификатор устройства (Product ID). Наше USB-устройство имеет VID: 0x16C0 , PID: 0x05DF , эти значение указаны в конфигурационном файле usbconfig.h (об этом файле мы уже упоминали) проекта микроконтроллера AS6. Чтобы ПО хоста обратилась к именно к нашему USB-устройству, нужно инициализировать объект MyUsbFinder такими же параметрами VID: 0x16c0, PID: 0x05df, как указаны в файле usbconfig.h . Для этого в область определения глобальных переменных класса Form1 добавьте следующий код:

Public static UsbDevice MyUsbDevice; public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x16c0, 0x05df);
После того как мы определились с каким USB-устройством будем работать, можно к нему подключаться, и это удобно сделать в момент старта программы (открытия окна формы). Для этого выберите основную форму программы, и в редакторе свойств создайте обработчик события загрузки Form1_Load. В теле обработчика введите следующий код:

Private void Form1_Load(object sender, EventArgs e) { MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder); if (MyUsbDevice != null) { label2.Text = " подключено!"; } else label2.Text = " не найдено!"; }
Сделайте обработчик события клика на кнопке button1 («Вкл»), для этого сделайте в визуальном редакторе на кнопке двойной щелчок, и добавьте в тело обработчика события код:

Private void button1_Click(object sender, EventArgs e) { // Передать пакет, который включает светодиод на макетной плате AVR-USB-MEGA16. UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (short)1, 0, 0); int countIn; byte data = new byte; MyUsbDevice.ControlTransfer(ref packet, data, 0, out countIn); }
Для обработчика кнопки «Выкл» добавьте код:

Private void button3_Click(object sender, EventArgs e) { // Передать пакет, который погасит светодиод на макетной плате AVR-USB-MEGA16. UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (short)0, 0, 0); int countIn; byte data = new byte; MyUsbDevice.ControlTransfer(ref packet, data, 0, out countIn); }
Код для обработки кнопки «Чтение»:

Private void button2_Click(object sender, EventArgs e) { //Получение данных от макетной платы AVR-USB-MEGA16 - состояние светодиода. UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_In), 2, (short)0, (short)0, (short)0); int countIn; byte data = new byte; if (MyUsbDevice.ControlTransfer(ref packet, data, 1, out countIn) && (countIn == 1)) { label3.Text = "Прочитано значение " + data.ToString(); } }
Обработчик события закрытия формы (завершение работы программы) гасит светодиод, если он горит:

Private void Form1_FormClosed(object sender, FormClosedEventArgs e) { UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (short)0, 0, 0); int countIn; byte data = new byte; MyUsbDevice.ControlTransfer(ref packet, data, 0, out countIn); }

Как пакеты USB декодируются в firmware микроконтроллера

Прием и обработка данных на стороне микроконтроллера осуществляется в функции usbFunctionSetup (находится в главном модуле VUSB.c проекта firmware AS6). Вот эта функция:

UsbMsgLen_t usbFunctionSetup(uchar data) { usbRequest_t *rq = (void *)data; if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR){ DBG1(0x50, &rq->bRequest, 1); /* отладочный вывод: печатаем наш запрос */ if(rq->bRequest == CUSTOM_RQ_SET_STATUS){ if(rq->wValue.bytes & 1){ /* установить LED */ LED_PORT_OUTPUT |= _BV(LED_BIT); }else{ /* очистить LED */ LED_PORT_OUTPUT &= ~_BV(LED_BIT); } }else if(rq->bRequest == CUSTOM_RQ_GET_STATUS){ static uchar dataBuffer; /* буфер должен оставаться валидным привыходе из usbFunctionSetup */ dataBuffer = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0); usbMsgPtr = dataBuffer; /* говорим драйверу, какие данные вернуть */ return 1; /* говорим драйверу послать 1 байт */ } }else{ /* вызовы запросов USBRQ_HID_GET_REPORT и USBRQ_HID_SET_REPORT не реализованы, * поскольку мы их не вызываем. Операционная система также не будет обращаться к ним, * потому что наш дескриптор не определяет никакого значения. */ } return 0; /* default для нереализованных запросов: не возвращаем назад данные хосту */ }
Наше устройство USB HID простейшее, и реагирует оно только на управляющие передачи (control transfer), которые проходят через конечную точку 0 (default control endpoint). По типу запроса (поле bRequest) декодируется направление передачи данных. Если CUSTOM_RQ_SET_STATUS, то это данные, предназначаемые для микроконтроллера. Данные декодируются и микроконтроллер выполняет заложенную там команду. В этом случае в самом первом по порядку принятом байте данных закодировано состояние светодиода - если там в младшем бите единичка, то светодиод включается, а если нолик, то гаснет. Если же в поле bRequest принято значение CUSTOM_RQ_GET_STATUS, то в ответ заполняется буфер текущим состоянием светодиода, и данные буфера отправляются обратно хосту. Все очень просто, и при желании поведение кода можно легко переделать под свои нужды.

Видео, как это работает:

Буду рад ответить в комментариях на вопросы и конструктивные замечания.



С точки зрения программирования модуль предлагает весьма интересное решение. Во-первых, что следует указать, при подключении к компьютеру он определяется ОС Windows (и Linux тоже) как виртуальный COM порт, т.е. в диспетчере устройств у Вас появится дополнительный COM порт. Соответственно, управление модулем осуществяляется через обычный последовательный порт. Это означает, что для работы с модулем Вам вообще нет необходимость даже вспоминать о USB - Вы работаете только с COM портом. Значит для работы с модулем можно использовать любой язык / среду / компонент прграммирования, главное только чтобы он поддерживал работу с последовательными портами. Для непосредственного управления модулем предусмотрен набор текстовых . Т.е. выбираем нужную команду, записываем ее в COM порт и модуль выполняет то что заказано. Весьма просто и удобно. Благодаря тому что команды текстовые, модулем можно управлять из любой программы-терминала для COM портов, например HyperTerminal, входящей в состав Windows.

Помимо возможности управления линиями ввода/вывода модуль также имеет встроенный 10-ти разрядный АЦП с частотой дискретизации до 400 Гц + еще парочку интересных настроек и свойств, о которых мы поговорим позже.


Итак, приступим к практическому использованию модуля. Первым делом необходимо установить драйвера для него. Весть процесс установки модуля подробнейшим образом описан в соответствующем оффициальном документе . Здесь я дублировать информацию не буду, обращю только внимание на то, что фактически драйвер, требуемый для модуля уже находится в составе Windows. Это так называемый стандартный драйвер виртуального COM порта. Итого из файлов установки нам нужен только ke-usb24.inf в котором указаны параметры установки.

После установки устройства, давайте создадим на основе модуля самую простенькую схемку - будем управлять светодиодами, подключенными к модулю, а именно зажигать или тушить их по нашей команде. Схема подобного устройства показана на рисунке ниже. Схема расчитана на маломощные светодиоды. Я использую L-934 фирмы Kingbright. Если используемые Вами светодиоды помощнее и Вы чувствуете что корпус модуля или светодиода изрядно нагревается, лучше между светодиодом и выводом модуля включить токоограничивающий резистор номиналом в 200-600 Ом.

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

Итак, схему собрали. Пора взяться непосредственно за софт. Тут есть два варианта. Первый, это использовать готовую терминальную программу и подавать в ней команды модулю в ручную. К таким программам относятся, например, HyperTerminal или . Последняя хороша тем, что для нее доступны исходные коды и при желании ее можно модернизировать под свои нужды. Второй вариант, болле интересный, разработка собственнго софта. Давайте так и сделам. Напишем небольшую Windows программку на С++ в среде Microsoft Visual C++ 6.0 для управления линиями модуля, настроенными на выход.

Внешне она выглядит вот так. Т.е. вводим номер порта, нажимаем кнопку "Open". Далее галочками выбираем каким светодиодам светиться, а каким нет. Все весьма просто.

Посмотрим на код этой программы. Начнем с функции открытия порта. Тут все уже рассматривалось не раз. Единственное, на что я хотел бы обратить Ваше внимание, так это на скорость порта. Для модуля Ke-USB24A она не имеет НИКАКОГО значения. Можно было подключаться и на 1200 и 115200. Хоть мы и работаем с COM портом, он всеже виртуальный, и реально данные передаются по USB каналу. А ему знания о скорости виртуального COM порта совершенно не нужны. Здесь они указываются только для поддержания совместимости.

Рассмотрим код формирования команды модулю и ее отправки в порт. Для установки линии модуля Ke-USB24A служит текстовая команда $KE,WR, . Собственно в этой функции мы такую команду и формируем. Обратите внимание на \r\n в конце команды. Таков синтаксис команд модуля - все должно заканчиваться символами возврата каретки и перевода на новую строку.

void CLineControlDlg::WriteDataToLine(int line, bool value) { if (line 24 || m_hFile == NULL) { MessageBox("Can`t Write\nCommand", "Error", MB_ICONERROR); return ; } DWORD lpdwBytesWritten; char buf; int len = sprintf(buf, "$KE,WR,%d,%d\r\n", line, value); WriteFile(m_hFile, buf, len, &lpdwBytesWritten, NULL); }

Итак, с кодом наверное все понятно. Запускаем программу, не забыв при этом подключить модуль. Открываем порт (номер порта можно посмотреть в диспетчере устройств). Щелкаем галочками - управляем светодиодами.

Вот таким вот образом можно за минимальный срок собрать схему управления светодиодами через USB. Ke-USB24A может использоваться и для управления нагрузками помощнее, но для этого к нему будет необходимо добавить дополнительную внешнюю схему в виде реле или мощного транзистора. Об этом мы поговорим позже.