![image](http://datapoliten.ru/files/94/d5/94d5ad328208d414e30d0c3721813ccf/2343.jpg)
Подобная вещь, собранная из малого количества деталей, может пригодиться для моддинга или просто для подсветки клавиатуры.
Для подключения к USB используется AVR микроконтроллер AtTiny45 компании Atmel. Этот микроконтроллер не имеет аппаратного USB интерфейса, поэтому он реализуется программно, с помощью библиотеки V-USB от Objective Development. Также этот восьминогий таракан имеет встроенный ФАПЧ (PLL), что позволяет избавиться от кварца и обвязки, и освободить итак не многочисленные ноги, а самое главное настроить на нужную для USB тактовую частоту ~16,5 МГц. Так же, ФАПЧ позволяет подстраивать эту частоту при необходимости, используя те же такты USB. Что, собственно, и делается при первом подключении устройства. После чего значение подстройки сохраняется в памяти EEPROM, и при следующем подключении выгружается из нее. Далее идет программный USB-стек, так что ресурсов у микроконтроллера остается не много. Tiny45 легко прошивается любым внутрисхемным программатором, я использовал USBasp.
![image](http://datapoliten.ru/files/94/d5/94d5ad328208d414e30d0c3721813ccf/IMG_1112_2small.jpg)
Так как я существо ленивое, мне было не охота разводить самому платку, поэтому она была приобретена на сайте microsin.ru/content/view/655/44, там же есть схема подключения, а также переведенная на русский библиотека V-USB и описание как с ней работать microsin.ru/content/view/613/44.
Используя пример библиотеки V-USB из папки \examples\hid-custom-rq\ прикрутив ФАПЧ \libs-device\, откомпилировал под AtTiny45. Прошил. Проверил с помощью командной строки. Работает. Для работы надо установить библиотеку libusb sourceforge.net/projects/libusb-win32/files, по идее ее можно и не устанавливать, а просто положить файл libusb0.dll в директорию рядом с программой вызывающей ее функции. Но у меня не заработало.
Командная строка конечно хорошо, но не практично. Решил подправить и пересобрать в DLL пример из \examples\hid-custom-rq\commandline\ и прикрутить к нему GUI оболочку.
Сначала собрал DLL пользуясь MinGW компилятором и мануалом отсюда www.adp-gmbh.ch/win/misc/mingw/dll.html, пришлось попотеть, что бы все компилилось с библиотекой libusb-win32. Внутри DLL'ки получились две функции:
void led_set( int isOn ){
...
}
int led_get( void ){
...
}
* This source code was highlighted with Source Code Highlighter.
Потом написал небольшую программку на C#, вызывающую эту DLL’ку из под командной строки, пользуясь мануалом www.adp-gmbh.ch/csharp/call_dll.html. На XP все заработало почти сразу, единственное что .NET под win7'64 не хочет общаться с моей DLL, остальные ОС не проверял.
Получившийся код программы командной строки:
using System.Runtime.InteropServices;
using System;
class call_led {
[DllImport("led.dll")]
private static extern int led_get();
[DllImport("led.dll")]
private static extern void led_set( int isOn );
public static void Main()
{
led_set(0);
Console.WriteLine("led is {0}", led_get());
}
}
* This source code was highlighted with Source Code Highlighter.
Поставил Microsoft Visual C# 2008 Express Edition и на базе простейшего проекта WindowsFormsApplication создал маленькую программку с одним единственным ChekBox’ом, который включает и выключает светодиод. А так же проверяет каждые 300мс подключено ли устройство, и в каком оно состоянии.
![image](http://datapoliten.ru/files/94/d5/94d5ad328208d414e30d0c3721813ccf/led%20is%20off.jpg)
![image](http://datapoliten.ru/files/94/d5/94d5ad328208d414e30d0c3721813ccf/led%20is%20on.jpg)
![image](http://datapoliten.ru/files/94/d5/94d5ad328208d414e30d0c3721813ccf/no%20connect.jpg)
Это моя первая программа на C# поэтому никаких классов я не реализовывал, а в лоб вызывал функции из dll’ки. Собственно видео получившегося девайса:
Собственно схема + hex + исходники + проект студии:
led_t45.rar