Разделы сайта
Выбор редакции:
- Крейсер "красный крым" черноморского флота
- «31 спорный вопрос» русской истории: житие императора Николая II
- Лечебные свойства корня лопуха и его широкое применение в домашних условиях
- Природные ресурсы западной сибири
- Совместимость петуха и змеи в любовных отношениях и браке Он петух она змея совместимость
- Чемерица черная: прекрасная и опасная Противопоказания и побочные действия
- Чем интересна Свято-Михайло-Афонская Закубанская пустынь?
- Порционная сельдь под шубой на праздничный стол
- К чему снится шить во сне
- Примета — разбить зеркало случайно: что делать, если оно треснуло
Реклама
Схема управления нагрузками через компьютер. Управляем нагрузками от COM или USB. Как пакеты USB декодируются в firmware микроконтроллера |
Устройство компьютерного управления Устройство собрано на макетной плате, Для работы с ним была создана программа При подключении устройства к USB-порту Учтите, операционная система Windows ЛИТЕРАТУРА 1. Носов Т. Управление приборами 2. Рыжков А. US-программатор От редакции
. Программы для микроконтроллера и компьютера находятся В статье сделана попытка предоставить пошаговую инструкцию - как соединить самодельное устройство 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, и использовать для компиляции именно его.
В верхней строчке этого окна введите имя компилятора WinAVR (произвольное), а в нижней строке введите полный путь, куда установлен сам компилятор тулчейна (с указанием папки \bin) и нажмите кнопку Add . В списке Flavours появится добавленный компилятор, как показано на скриншоте. Выделите мышкой наш новый добавленный компилятор WinAVR и нажмите кнопку Set As Default (сделать его тулченом по умолчанию), и нажмите OK. После этой процедуры наша AS6 будет использовать компилятор WinAVR. Пора настроить свойства нашего проекта, для этого курсором в Solution Explorer левым щелчком выберите имя проекта и нажмите Alt+F7 (меню Project -> Properties), появится окно с настройками: Сделайте следующие настройки:
В выпадающем списке 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. Теперь этот атавизм не нужен.
Появится ещё одно окно Здесь нужно найти путь на диске, где находится библиотека LinUsbDotNet.dll (по умолчанию она устанавливается папку C:\Program Files\LibUsbDotNet, но лучше сделать копию файла DLL в рабочий каталог проекта. После подключения библиотеки её нужно объявить в проекте, для этого добавьте в главный модуль программы (файл Form1.cs) строки: Using LibUsbDotNet;
using LibUsbDotNet.Info;
using LibUsbDotNet.Main;
Сделайте обработчик события загрузки формы. Он нужен для того, чтобы при старте программы происходила инициализации экземпляра класса LibUsbDotNet, через который осуществляется обмен с устройством USB. Перед началом обмена необходимо открыть доступ именно к нашему устройству, потому что к компьютеру может быть подключено несклько устройств USB HID, и необходимо уметь обращаться к каждому по отдельности. Для целей идентификации USB-устройств служат специальные идентификаторы, которые имеют абсолютно все устройства USB, это VID и PID. Примечание. Иногда для идентификации устройства дополнительно используется уникальный серийный номер или отдельный текстовый дескриптор - когда к компьютеру подключено несколько устройств USB с одинаковыми VID и PID, но это не наш случай. Поскольку обычно у каждого USB-устройства, подключенного к компьтеру, своя пара VID/PID, отличающаяся от других устройств, то найти нужное устройство и обратиться к нему не составляет проблем.
Public static UsbDevice MyUsbDevice;
public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x16c0, 0x05df);
Private void Form1_Load(object sender, EventArgs e)
{
MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
if (MyUsbDevice != null)
{
label2.Text = " подключено!";
}
else label2.Text = " не найдено!";
}
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 порт. Обозначу сразу, при использовании USB порта устройство работает в ноутбуках и компьютерах с блоком питания, отключающем все источники питания. К примеру, в последних моделях блоков питания +5 вольт USB порта присутствует как дежурное даже при выключенном блоке. С ними устройство работать не будет, точнее будет, но постоянно включено. Здесь необходимо как источник сигнала использовать какой либо иной порт, и, соответственно, согласовывать сигнал источника и исполнительного механизма. В данном устройстве исполнительным механизмом служит реле, с контактами, рассчитаными на 16 ампер и с катушкой на 5 вольт. Использование реле выполняет гальваническую развязку источника сигнала и сети 220 вольт. После проведения ряда экспериментов было установлено, что при питании, согласно паспортных данных, +5 вольт реле потребляет 150 мА тока. Если использовать стационарный компьютер - нет никаких проблем, ибо +5 вольт USB порта идут непосредственно с блока питания и не сильно нагружают его. Если всё вышесказанное устраивает на этом - можно остановиться и сделать свой вариант по ниже приведенной схеме. Но если планируется использовать ноутбук, то как бы прогонять дополнительные 150 мА через через компьютер не желательно, в таком случае необходимо использовать дополнительный блок питания 5 вольт. В данном варианте был использован импульсный источник питания от зарядного устройства от мобильного телефона. Можно использовать любой нестабилизированный источник питания при условии, что он может обеспечить напряжение 5 вольт и ток порядка 250 мА с учетом запаса. Также можно использовать и другое напряжение, но в таком случае необходимо будет взять и реле с соответственным напряжением питания. Для согласования источника сигнала с реле и источником питания необходимо установить транзисторный ключ типа: Транзистор выбран типа КТ815 с любой буквой и резистор 1 кОм, диод - КД522. При такой схеме включения ток потребления показал 4 мА, что не столь существенно для ноутбука. Светодиод LED1 и LED2 обозначают состояние цепи. По желанию вместе с резисторами их можно исключить из схемы. Устройство управления 220 В собрано в свободном месте корпуса розетки - сетевого фильтра. Файл схемы в сплане находится |
13-01-2014 ATiny2313Захаров Денис, Украина Как известно, существует достаточное количество интерфейсов, с помощью которых микроконтроллер (МК) может общаться с внешними устройствами. Если необходимо связать МК с персональным компьютером или ноутбуком, то с уверенностью можно сказать, что лучше всего использовать интерфейс COM-порта RS-232. Причина такого выбора очевидна - практически все контроллеры имеют аппаратные модули UART, с помощью которых можно передавать информацию при минимальном расходе ресурсов МК. Кроме того, существует множество хорошо зарекомендовавших себя программ, предназначенных для работы с COM-портом. Поскольку сигналы МК имеют уровни TTL, для согласования с интерфейсом RS-232 необходим преобразователь уровней. Часто его выполняют на основе доступной и популярной микросхемы MAX232 .
Представленное устройство (Рисунок 1) предназначено для управления приборами с помощью любого ПК, имеющего порт USB. Современные компьютеры и ноутбуки имеют по несколько таких портов. С помощью этого комплекса можно производить управление светом, телевизором и другими приборами. Исполняющие устройства не обязательно должны находиться в непосредственной близости от ПК. Прибор состоит из вполне доступных и распространенных элементов. Обе микросхемы - микроконтроллеры ATtiny2313 семейства . Первый контроллер подключен к USB-порту компьютера и выполняет функцию конвертора форматов USB-COM. Второй подключается к первому и все время сканирует команды, которые посылаются с ПК через терминальную программу Terminal v1.9b. Подключенный к выводу 2 USB резистор R4 переводит устройство в низкоскоростной режим LS, позволяющий при обмене данными со скоростью 1.5 Мбит/с с помощью программы выпонять расшифровку посылок от ПК. С помощью резисторов R2 и R3 происходит устранение переходных процессов. Конденсатор С5 блокирует импульсные помехи в цепи питания. Стабилитроны D1 и D2 необходимы для согласования логических уровней МК и USB входа ПК. Для безошибочной передачи данных между контроллерами частоты кварцевых резонаторов должны быть равны 12 и 4 МГц. Собрать устройство можно на макетной плате, хотя лучше, все же, на полноценной печатной плате. Элементы можно разместить, например, так, как показано на Рисунке 3. Программа для микроконтроллера U1 разработана товарищем GetChiper в среде Bascom-AVR. Для работы с шиной USB использована библиотека swusb.LBX . С ее помощью выполняется программное декодирование USB протокола в режиме реального времени. Для работы устройства с ПК, нужно установить соответствующие драйверы, скопировав их на жесткий диск. При первом подключении устройство опознается и запросит драйвер. Далее нужно указать путь к папке с файлами, и все заработает. Программа микроконтроллера U2 была написана мною в среде AVRStudio на языке ассемблера. Блок-схема алгоритма работы МК представлена на Рисунке 4. Аппаратный модуль UART следует настроить на прерывание по завершению приема данных. Сам МК не будет выполнять ни одной функции, пока не наступит прерывание. Для снижения энергопотребления можно воспользоваться режимом sleep, но в данной конструкции этого делать не понадобилось. Как только из терминала ПК последуют команды, МК мгновенно перейдет к их сканированию. На данный момент контроллер поддерживает следующую систему команд: -on1, on2, on3, on4, on5, on6, on7, on8
- команды установки портов в «лог. 1»; После окончания ввода каждой команды необходимо нажимать Enter. Таким образом МК сможет определить конец команды и приступить к ее сканированию. На каждую верную команду контроллер будет отвечать «ok». Если ввести неверные данные, то в терминальную строку вернется «error». Пример выполнения команды показан на Рисунке 5. Версия прошивки 1.0. Выставлять фьюзы необходимо в соответствии с Рисунком 6. Разрабатывается следующая версия прошивки, где будет происходить самообучение МК и изменение систем команд в терминале. Программное обеспечение МК, виртуальная модель Proteus и драйвер для ПК -
НовоеКак востановить менструальный цикл после родов:
|