Программирование BASCOM
Меню сайта
Категории каталога
Мои статьи [115]
Наш опрос
Оцените мой сайт
Всего ответов: 1292
Главная » Статьи » Мои статьи

Проект «Спидометр-мини» (USB)
Данный проект родился случайно, когда мой друг как-бы шутя сказал, что вот было бы здорово, если сделать небольшой индикатор и выводить на него показания скорости. Идея показалась очень занятной. После этого я начал перебирать всевозможные варианты постройки. Самым простым и дешевым вариантом стал спидометр с трехразрядным семисегментным индикатором. От 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/ за подсказку использования чтения памяти процессов, ну, и наверное, моему другу, который надоумил меня сделать сей девайс.



Автор - Филатов Артур.

 
Категория: Мои статьи | Добавил: bascom (18.09.2010)
Просмотров: 10971 | Комментарии: 17
Всего комментариев: 171 2 »
17 gryphon  
0
Кстати, я ж видео работы устройства забыл скинуть. http://www.youtube.com/watch?v=8AJwn4_w-jQ

16 gryphon  
0
Mrshilov, нет проблем. ШИМ решаЭ.

15 Mrshilov  
0
Еще бы к нему вентилятор добавить - быстрее едешь - сильнее ветер в лицо...

14 VAital3000  
0
))Не один я такой)) Тоже делал подобное,ток жаль не во всех играх получаеться нормально выдрать скорость,кое где она кодируеться,и приходиться долго разбираться с этим кодированием

13 Пётр  
0
Виктор, посмотри здесь http://bascom.at.ua/publ/kak_podruzhit_bascom_avr_s_usb_russkij_variant_an_178_software_implementation_of_ usb_in_avr/1-1-0-34
Там есть примеры.

12 Виктор  
0
Помогите разобраться как на mega8 через USB переключать порты на ввод и вывод (соответственно считывать состояния выводов, передавать программе и устанавливать состояния портов). Может есть готовые примеры, буду признателен. Хочу автоматизировать измерения есть прибор с интерфейсом (КОП) GPIB.

11 bascom  
0

10 gryphon  
0
Петр, вот весь кайф было сделать именно на светодиодных индикаторах :) Если хочется более полную версию, то имеет смысл сделать на каком-нить ЖКИ (можно даже рискнуть сделать на семисегментном ЖКИ от стационарных телефонов).

9 Пётр  
0
Если использовать не светодиодные индикаторы, а ЖК со встреным контроллером, то думаю, что задача сильно упроститься.
За основу можно взять это устройство http://bascom.at.ua/publ/podkljuchaem_zhki_k_usb/1-1-0-35
Останется только немного под корректировать программу для компьютера.

8 Dubishe  
0
Значит будем ждать. Музу торопить низзя. Эт я вам как работник театра могу сказать ))

1-10 11-16
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright Radan Studio © 2024