Как стать автором
Обновить

Управление самодельным USB-HID светодиодом, c помощью GUI оболочки на .NET

Время на прочтение 3 мин
Количество просмотров 39K
image
Подобная вещь, собранная из малого количества деталей, может пригодиться для моддинга или просто для подсветки клавиатуры.


Для подключения к USB используется AVR микроконтроллер AtTiny45 компании Atmel. Этот микроконтроллер не имеет аппаратного USB интерфейса, поэтому он реализуется программно, с помощью библиотеки V-USB от Objective Development. Также этот восьминогий таракан имеет встроенный ФАПЧ (PLL), что позволяет избавиться от кварца и обвязки, и освободить итак не многочисленные ноги, а самое главное настроить на нужную для USB тактовую частоту ~16,5 МГц. Так же, ФАПЧ позволяет подстраивать эту частоту при необходимости, используя те же такты USB. Что, собственно, и делается при первом подключении устройства. После чего значение подстройки сохраняется в памяти EEPROM, и при следующем подключении выгружается из нее. Далее идет программный USB-стек, так что ресурсов у микроконтроллера остается не много. Tiny45 легко прошивается любым внутрисхемным программатором, я использовал USBasp.

image

Так как я существо ленивое, мне было не охота разводить самому платку, поэтому она была приобретена на сайте 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мс подключено ли устройство, и в каком оно состоянии.

imageimageimage

Это моя первая программа на C# поэтому никаких классов я не реализовывал, а в лоб вызывал функции из dll’ки. Собственно видео получившегося девайса:


Собственно схема + hex + исходники + проект студии:
led_t45.rar
Теги:
Хабы:
+44
Комментарии 54
Комментарии Комментарии 54

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн