Данный проект родился случайно, когда мой друг как-бы шутя сказал, что вот было бы здорово, если сделать небольшой индикатор и выводить на него показания скорости. Идея показалась очень занятной. После этого я начал перебирать всевозможные варианты постройки. Самым простым и дешевым вариантом стал спидометр с трехразрядным семисегментным индикатором. От COM порта я уже давно отказался, т.к. в большинстве новых компьютеров он уже встречается реже, плюс ко всему проект делался под ноутбук. Поэтому спидометр делался под управлением USB.
Применения специальных микроконтроллеров с аппаратной поддержкой USB не
было взято во внимание из-за своей дороговизны, благо существуют библиотеки
функций, т.н. VirtualUSB,
с помощью которых можно реализовывать низкоскоростной обмен по шине USB. Более подробно с ней
можно ознакомится на сайте http://www.obdev.at/products/vusb/index.html Самый
простой вариант обмена по USB-это
через HID (аббревиатура расшифровывается как human interface device). Основной плюс HIDа в том, что не требуется
написание специального драйвера. Для HID он уже есть в ОС. Принципиальная
схема устройства изображена на рис1.
Основу устройства составляет
микроконтроллер ATmega8-16PU фирмы ATMEL. Т.к. почти все микроконтроллеры ATMEL имеют схожую структуру,
то можно использовать и другие (например, ATmega88, ATmega48
и др.). Главное, чтобы объема памяти хватило и, в соответствии с выбранным МК,
подправить прошивку. Резисторы R1
и R2 являются
защитными, R3 необходим
для подтяжки D- и его
сопротивление обязательно должно быть 1.5 кОм. Семисегментный трехразрядный
индикатор BT-N-511RD фирмы YellowStone красного свечения с
общим анодом. Его можно заменить на любой, схожий с этим, индикатор, в том
числе и с общим катодом (при этом придется немного изменить исходный код).
Многие наверняка скажут, что так нельзя подключать индикатор. Если просмотреть
даташит на ATmega8, то
в ней сказано "DC Current per I/O Pin - 40.0 mA" В индикаторе 8 сегментов (в каждом символе) по 5 mA. Вот и получается
как-раз 40 mA, плюс ко всему восьмой сегмент (точка) в данной прошивке не используется.
Теперь настал момент рассказать о прошивке. Основу программы составляет драйвер
V-USB, написанный mr. Ollopa. Ее (т.е. swusb.LBX, он есть в архиве) необходимо скопировать в Program
Files\MCS Electronics\BASCOM-AVR\LIB\ Без нее программа не будет
компилироваться. Теперь пару слов о дескрипторе HID. Именно HID
дескриптор определяет тип устройства. От него зависит, будет ли устройство,
клавиатурой, мышкой, джойстиком и т. д.
В рассматриваемом устройстве, HID
дескриптор имеет вид:
Data 20 ' Length = 20 bytes Data &H06 , &H00 , &HFF '
Usage_page(vendor Defined Page 1) Data &H09 , &H01 '
Usage(vendor Usage 1) Data &HA1 , &H02 '
Collection(logical) Data &H09 , &H01 '
Usage(pointer) Data &H15 , &H00 '
Logical_minimum(0) Data &H25 , &HFF '
Logical_maximum(255) Data &H75 , &H08 '
Report_size(8) Data &H95 , &H01 '
Report_count(8) Data &H91 , &H02 '
Output(data , Var , Abs) Data &HC0 'End_collection
В первой строке, указанно число байт дескриптора. Вторая и
третья строка, описывает тип устройства. В нашем случае, это нестандартное HID
устройство. Далее следует описание входной и выходной конечных точек. Параметры
Logical_minimum и Logical_maximum определяют допустимый интервал значений,
хранящийся в буфере конечной точки. Параметр Report_count определяет число
байт, передаваемых или принимаемых за одну посылку. Допустимое значение 1…8.
Как микроконтроллер выводит данные на индикатор я описывать не буду, т.к.
довольно много отдельных статей есть по этому поводу. Теперь самое главное. Сам
драйвер может работать с кварцами на 12 и 15 МГц (вот насчет 15 я точно не могу
сказать, т.к. не проверял, хотя mr.
Ollopaуказывал, что может работать). Если Вы собираетесь менять порты, куда
«подвешены» пины USB,
то следует изменить данные параметры
'Определение портов МК, к которым подключен USB _usb_port Alias Portd _usb_pin Alias Pind _usb_ddr Alias Ddrd
'Определение пинов D+ и D- Const _usb_dplus = 2 '4 Const _usb_dminus = 3 '5
'Конфигурация пинов как входы Config Pind.2 = Input Config Pind.3 = Input
Причем обязательно нужно помнить, что пинD+ должен подходить на пин с
прерыванием. Без этого устройство работать не будет. Так же не рекомендуется
для нескольких USB устройств оставлять одинаковые Vendor ID и Product ID. Их тоже можно
поменять (так-же необходимо их менять и в программе со стороны компьютера, об
этом чуть позже):
'USB Vendor ID and Product ID (Assigned by
USB-IF) Const _usb_vid = &HAAAA Const _usb_pid = &HEF22
Итак, после того, как Вы соберете устройство,
обязательно проверьте, не замыкают ли контакты (особенно со стороны USB) иначе последствия могут быть печальными. Загрузите программу USB-7SEG
LED.hex из архива. Для корректной работы устройства необходимо установить FUSE-биты, в соответствии с рис2.
Учтите, что FUSE-биты ИНВЕРСНЫЕ (как в PonyProg). Неправильная установка этих битов может
привести в негодность микроконтроллер! Будьте внимательны! После того, как МК
прошит, его необходимо перезагрузить (включить и выключить), после чего Windows автоматически установит
нужные драйвера. Если драйвера не установились или устройство не определилось,
следует проверить монтаж и правильность установки Fuse-битов. После того, как
драйвера успешно установятся, можно приступать к работе с устройством. Для
проверки правильности подключения индикатора можно воспользоваться программой
из архива «USB-7SEG LED.rar». Внешний вид показан на рис3.
Двигая ползунком
можно менять числа в интервале от 0 до 999. Если все отображается как положено,
то можно переходить к самой сути-спидометра. Наверное, это была самая
трудоемкая часть в моем проекте. В итоге я пришел к мнению, что «вытаскивать»
показания скорости из игр намного проще методом ARTmoney. Весь принцип
заключается в том, что все переменные хранятся в памяти компьютера и каждая
переменная имеет свой адрес. Зная адрес и название процесса программы (в нашем
случае-игры) можно с легкостью считывать их из памяти. Основная проблема в этом
- адрес переменной. Вот тут нам и приходит на помощь ARTmoney. Делается это
следующим образом. Запускаем игру. Даем машинке набрать некоторую скорость,
запоминаем ее и выходим в паузу. Сворачиваем игру. Запускаем ARTmoney. В графе «выбери процесс» выбираем название игры. Нажимаем кнопку
«Искать», вводим значение скорости и ОК. Выводится целый список адресов. Теперь
переключаемся обратно в игру и меняем скорость, опять в паузу, переключаемся в ARTmoney, нажимаем кнопку «Отсеять», вводим число, ОК. И так делаем, пока
количество адресов не уменьшится до единиц. Теперь, когда у нас есть адрес,
можно модифицировать и программу для вывода данных на индикатор.
В проекте VB.NET найдите строчку: ReadMemory("GTA: SanAndreas", &HA548B4) Здесь необходимо указать следующее ReadMemory("Название процесса(он есть в диспетчере задач)",
&H+адрес
переменной)
Меняем, компилируем, запускаем. Вот и все, программа
готова к работе. Ее можно запускать как до запуска игры, так и после. Данный
девайс успешно был проверен на старой игре GTASanAndreas с модом спидометра (без него
найти адрес было бы невозможно). Единственное, в чем может быть загвозтка. Не
все переменные игр в памяти имеют фиксированный адрес. К примеру, в той же GTA адрес переменной
передачи постоянно меняется после запуска игры, а адрес переменной
скорости-нет. Вот собственно и все.
На первый взгляд кажется, что все очень
сложно, но на самом деле устройство очень просто. Благодаря тому, что в
микроконтроллере всего занято 40% всей памяти, можно модифицировать устройство,
сделав его, к примеру, для четырех-, пяти- разрядных индикаторов. Устройство
можно увидеть на рис. 5, 6, 7.
Особую благодарность хочется объявить форуму http://bascomavr.3bb.ru
, в особенности Radan’у и Петру за помощь в HIDдрайвере, людям из форума http://www.vbnet.ru/forum/ за подсказку использования чтения памяти процессов, ну, и наверное, моему
другу, который надоумил меня сделать сей девайс.
Автор - Филатов Артур.
|