Главная » Микроконтроллеры
Призовой фонд
на май 2017 г.
1. Тестер компонентов MG328
Паяльник
2. Осциллограф DSO138
Паяльник
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Руль, джойстик и геймпад с обратной связью (Force Feedback)

Поводом для этой статьи явился, принесенный мне на ремонт, руль GW21-FB китайского производства. Обычно в устройствах такого происхождения ужасная механика, дешевые электролитические конденсаторы, не качественная пайка и ремонт не вызывает проблем. Иногда выходит из строя контроллер (как правило бескорпусный, залитый компаундом), в этом случае приходится менять всю плату, т.е. создавать ее заново, т.к. купить ее негде. Если руль (джойстик, геймпад) без обратной связи, то схема получается небольшая и что-либо изобретать нет необходимости - примеров реализации таких устройств в сети предостаточно. Например: Mjoy16 , Analog Joystick

В данном случае обратная связь должна быть, и я, походив по Интернету, с удивлением обнаружил, что ни одной реализации с открытым кодом нет! Многие самодельщики (в основном англо- и немецкоязычные) брались за это, но безрезультатно. Ну, что же, попробуем восполнить этот пробел. И попытаемся сделать это дешево, иначе ремонт может стать просто нерентабельным.

Далее последуют нудные разъяснения, кому это скучно, могут сразу перейти в конец статьи и скачать архив с готовыми схемами, платой, исходниками и прошивками. 

Итак, для начала, как же работает "обратная связь"или точнее FFB (Force feedback)? Есть два ее вида - Вибрационная и Активная. В первом случае в устройство просто встроен вибромотор, такой же как в сотовом телефоне, только немного помощнее. В определенные моменты игры, например при столкновении, наезде на препятствие, этот мотор включается и руль (джойстик, геймпад) начинает вибрировать.

vibro.jpg

На этом фото показан вибромотор в ручке джойстика. На ось мотора напрессован груз со смещенным центром тяжести. При вращении груза мотор вместе с ручкой начинает вибрировать. Достоверность тактильных ощущений при этом, естественно, не велика, поэтому чаще ставят два мотора. Они одинаковые, но грузы на них разные, поэтому у одного частота вибрации выше, но амплитуда ниже, у другого наоборот - частота ниже, а амплитуда выше. Кроме того, моторы расположены под углом друг к другу, поэтому и направление вибрации различно. Комбинируя одновременное и раздельное включение моторов можно несколько разнообразить тактильные ощущения.

rumblepad-3.jpg

Однако, частоту, амплитуду и, главное, направление вибраций, при таком подходе, варьировать крайне сложно, поэтому в устройствах более высокого класса применяется Активная система FFB. В рулях это мотор, соединенный с колесом руля зубчатой или ременной передачей:

actlabsaxe.jpg

mecaforce.jpg

В джойстиках применяют два мотора - по осям X и Y:

joy-1.jpg

Я не для красоты привожу эти картинки. Возможно кто-то захочет доработать свой "безответный" аппарат системой FFB и они могут послужить наглядным пособием для этого. Как видите, ничего заумно-хитрого здесь нет...

Итак, с механикой все понятно, управление моторами не представляет особой сложности, но нужно знать как и когда их включать/выключать. Требуется получить по шине USB информацию от компьютера. Обычный руль, джойстик, геймпад это HID-устройство, даже не требующее драйвера, они есть в системе, но для FFB все сложнее. Нужно либо представиться системе устройством, способным самостоятельно формировать сигнал управления мотором, получая от компьютера все данные (длина волны, амплитуда, фаза и т.д.), либо использовать драйвер-преобразователь.

В первом случае потребуется постоянно принимать большие объемы информации и иметь контроллер с функциями DSP. Кроме того, нужно глубоко изучить систему формирования сигнала для написания управляющей прошивки при том, что для выставления правильных коэффициентов для DSP потребуется оригинал для сравнения.

Во втором случае можно использовать драйвер готового устройства. Он сам выполнит все нужные преобразования, а нам останется только принимать мгновенные значения силы и направления вращения и подавать их на мотор.

Собственно изначально задача была недорого и без головной боли отремонтировать (переделать) сабж, поэтому выбираем второй вариант. И без стеснений берем драйвер от фирмы Logitech. К концу повествования мы создадим несколько рулей, но начнем с самой сложной модели - G25:

Logitech G25

Модель топовая, имеет три педали и 22 кнопки управления. Точнее говоря, из-за рычага переключения передач их кажется меньше, но информация о его положении передается как отдельные кнопки, а нам для выбора схемы важно знать их максимальное число, поэтому запомним - 22 кнопки + 3 педали.

Вот мы и подошли к схемной реализации. Сначала определимся с контроллером:

В современных рулях, джойстиках применяют высокоскоростной протокол USB 2.0, но мы попробуем обойтись низкоскоростным 1.1. Во первых принимаемый/передаваемый объем информации не столь уж велик, а во вторых микроконтроллеры с аппаратным USB довольно дороги, да и конвертеры USB/RS232 тоже. Попробуем применить "ширпотреб" - ATmega8 с программным вариантом реализации USB.

Прежде чем составить схему управления мотором FFB, требуется выяснить, в каком виде драйвер выдает эту информацию. Естественно, никакой документации на него нигде нет, обращение в службу поддержки завершилось отказом - протокол обмена секрет фирмы. Пришлось создать макет устройства, пытаться передавать драйверу данные и изучать его ответы. После нескольких дней мучений удалось выяснить, что комбинация

11 08 ХХ 80 00 00 00

означает включение мотора FFB, при этом ХХ определяет силу и направление вращения. ХХ принимает значение от 0 до 255, при этом 128 - "начало координат", все, что меньше - вращение влево, больше- вращение вправо. Т.е. данные можно сразу подавать на 8-битный ШИМ с мостовой схемой включения мотора. Комбинация

13 00 00 00 00 00 00

означает выключение мотора. Это тоже важно, т.к. при ШИМ=128 мотор, конечно, не крутится, но ток через него идет и, если уж компьютер разрешает, то лучше ток отключать.

Итак со схемой теперь все понятно:

Схема G25

Чтобы меньше сверлить отверстий в плате, применим SMD резисторы и конденсаторы:

SDC18527.jpg

Прошивку контроллера напишем в среде Bascom-AVR . Для программной реализации USB воспользуемся библиотекой SWUSB.LBX . Для удобства работы оформим дескрипторы и константы USB отдельными файлами, соответственно Descriptors.inc и USB_config.inc.

Сразу зададим начальное состояние портов ввода/вывода:

Ddrb = &B00011000   'направление линий порта B: 1 - на вывод

Portb = &B00100111   'исходное состояние линий B

Ddrc = &B00110000   'направление линий порта C: 1 - на вывод

Portc = &B00000000   'исходное состояние линий C

Ddrd = &B00010011   'направление линий порта D: 1 - на вывод

Portd = &B11100000   'исходное состояние линий D

Назначим выводы D+ и D- для USB (D+ должна быть на INT0):

_usb_port Alias Portd

_usb_pin Alias Pind

_usb_ddr Alias Ddrd

Const _usb_dplus = 2

Const _usb_dminus = 3

Зададим PID и VID, соответствующие Logitech G25:

Const _usb_vid = &H046D   'Vendor ID

Const _usb_pid = &HC299   'Product ID

В нашем распоряжении всего 8 байт для передачи хосту, а устройство имеет , как мы помним, 22 кнопки, руль и три педали. Плюс к этому нужно еще передать байт "Combined Pedals" - как выяснилось, при активации/деактивации этой опции драйвер не передает никаких управляющих сигналов устройству и даже не пытается скомбинировать этот режим из имеющейся информации о педалях. Оригинального дескриптора достать не удалось, да он нам и не помог бы, ведь настоящий G25 работает в USB 2.0 и не ограничен пространством - может передавать до 64 байт за раз. Поэтому пришлось ограничить разрядность данных для педалей до 7 бит, а для руля до 12 бит, и репорт-дескриптор в финале получился таким:

   Data &H05 , &H01   ' Usage Page (Desktop),

   Data &H09 , &H04   ' Usage (Joystik),

   Data &HA1 , &H01   ' Collection (Application),

   Data &HA1 , &H02   '   Collection (Logical),

   Data &H95 , &H01   '   Report Count (1 field),

   Data &H75 , &H0C   '   Report Size (12 bit),

   Data &H14   '   Logical Minimum (0),

   Data &H26 , &HFF , &H0F   '   Logical Maximum (4095),

   Data &H34   '   Physical Minimum (0),

   Data &H46 , &HFF , &H0F   '   Physical Maximum (4095),

   Data &H09 , &H30   '   Usage (X),

   Data &H81 , &H02   '   >>>> Input (Variable), *** Wheel ***

   Data &H05 , &H01       '   Usage Page (Desktop),

   Data &H95 , &H01   '   Report Count (1 field),

   Data &H75 , &H04   '   Report Size (4 bit),

   Data &H25 , &H07   '   Logical Maximum (7),

   Data &H46 , &H3B , &H01   '   Physical Maximum (315),

   Data &H65 , &H14   '   Unit (Degrees),

   Data &H09 , &H39   '   Usage (Hat Switch),

   Data &H81 , &H42   '   >>>> Input (Variable), *** Hat ***

   Data &H95 , &H13   '   Report Count (19 fields),

   Data &H75 , &H01   '   Report Size (1 bit),

   Data &H25 , &H01   '   Logical Maximum (1),

   Data &H45 , &H01   '   Physical Maximum (1),

   Data &H05 , &H09   '   Usage Page (Button),

   Data &H19 , &H01   '   Usage Minimum (01h),

   Data &H29 , &H13       '   Usage Maximum (13h),

   Data &H81 , &H02         '   >>>> Input (Variable), *** Buttons ***

   Data &H05 , &H01       '   Usage Page (Desktop),

   Data &H95 , &H01       '   Report Count (1 field),

   Data &H75 , &H07      '   Report Size (7 bit),

   Data &H14      '   Logical Minimum (0),

   Data &H26 , &H7F , &H00         '   Logical Maximum (127),

   Data &H34         '   Physical Minimum (0),

   Data &H46 , &H7F , &H00         '   Physical Maximum (127),

   Data &H09 , &H32      '   Usage (Z),

   Data &H81 , &H02      '   >>>> Input (Variable), *** Accelerator ***

   Data &H95 , &H01      '   Report Count (1 field),

   Data &H75 , &H07      '   Report Size (7 bit),

   Data &H14         '   Logical Minimum (0),

   Data &H26 , &H7F , &H00         '   Logical Maximum (127),

   Data &H34         '   Physical Minimum (0),

   Data &H46 , &H7F , &H00       '   Physical Maximum (127),

   Data &H09 , &H35         '   Usage (Rz),

   Data &H81 , &H02         '   >>>> Input (Variable), *** Brake ***

   Data &H95 , &H01      '   Report Count (1 field),

   Data &H75 , &H07         '   Report Size (7 bit),

   Data &H14         '   Logical Minimum (0),

   Data &H26 , &H7F , &H00      '   Logical Maximum (127),

   Data &H34         '   Physical Minimum (0),

   Data &H46 , &H7F , &H00      '   Physical Maximum (127),

   Data &H09 , &H36         '   Usage (Slider),

   Data &H81 , &H02       '   >>>> Input (Variable), *** Clutch ***

   Data &H95 , &H01         '   Report Count (1 field),

   Data &H75 , &H08         '   Report Size (8 bit),

   Data &H14         '   Logical Minimum (0),

   Data &H26 , &HFF , &H00      '   Logical Maximum (255),

   Data &H34         '   Physical Minimum (0),

   Data &H46 , &HFF , &H00      '   Physical Maximum (255),

   Data &H09 , &H31          '   Usage (Y),

   Data &H81 , &H02         '   >>>> Input (Variable), *** Combined pedals ***

   Data &HC0          '   End Collection,

   Data &HA1 , &H02         '   Collection (Logical),

   Data &H09 , &H02         '   Usage (02h),

   Data &H95 , &H07         '   Report Count (7 fields),

   Data &H91 , &H02      '   <<<< Output (Variable), *** FFB & Control ***

   Data &HC0         '   End Collection,

   Data &HC0   ' End Collection

Т.е. получилась дискретность педалей 0,78% , а руля 0,024% . Не так уж и плохо.

Для составления репорт-дескриптора можно воспользоваться справочником HID Usage Tables или специальной программой HID Descriptor tool.

Дескриптор продукта и изготовителя не важны, можно поставить любые - драйвер все равно вместо них подставит в систему название "Logitech G25".

В основной программе принимаем данные от хоста и по первому байту сортируем: если $11 (dec 17), то включаем мотор и выставляем ШИМ, если $13 (dec 19) - выключаем мотор:

   Select Case _usb_rx_buffer(2)   'Тип данных

   Case 17

   If _usb_rx_buffer(3) = 8 Then   'Данные ШИМ для мотора

   Pwm2 = _usb_rx_buffer(4)

   Ffb_motor = 1   'Включение мотора

   End If

   Case 19   'Выключение мотора

   Pwm2 = 128

   Ffb_motor = 0

   End Select

Частоту ШИМ задаем 375кГц (12МГц/32), т.о. частота на выходе будет около1,5кГц (375/256):

Config Timer2 = Pwm , Prescale = 32 , Compare Pwm = Clear Up

Tccr2.3 = 1   

Tccr2.6 = 1

Выше частоту выставлять не рекомендую - транзисторы моста начнут греться, т.к. для их раскачки применен самый примитивный вариант (для удешевления конструкции). При этом в близи среднего положения руля мотор воспроизводит частоту 1,5кГц и для борьбы с этим эффектом последовательно с мотором включен дроссель, а параллельно конденсатор. Если имеются в наличии, то лучше для раскачки применить стандартные драйверы верхнего и нижнего плеч CMOS, тогда частоту ШИМ можно повысить до максимума (47кГц), не опасаясь перегрева и исключить дроссель.    

АЦП в ATmega8 10-разрядный, поэтому для получения 12-разрядного значения сложим 4 последовательных значения с потенциометра колеса руля, заодно таким образом уменьшив флуктуации сигнала:

 Wheel = 0

 For I = 1 To 4   

   Temp_word = Getadc(0)

   Wheel = Wheel + Temp_word

 Next I

Состояние кнопок определим, выставляя поочередно на линиях Row0... Row3 низкий уровень. Резисторы, включенные в линии кнопок, защищают порты контроллера от короткого замыкания при одновременном нажатии двух и более кнопок. Программно для этого так же предусмотрены защитные временные интервалы.

Разъем GEAR дублирует кнопки S1 и S2 - его наличие необязательно.

На вторую ножку разъема кнопок выведен порт С3 - сюда можно будет подключить светодиод (пока не задействовано).

Данные переключателя видов "HAT" перед передачей хосту нужно перевести в градусы. Дискретность - 45°, при этом отжатое состояние соответствует 360°. Кроме того, эти данные нужно вписать в свободный верхний нибл старшего байта колеса руля, т.к. мы так задали в дескрипторе:

   Select Case Hat

   Case 0 : Wheel.15 = 1   'Hat не нажат

   'Case 1   'нажат /\ , все биты = 0

   Case 2 : Wheel.13 = 1   'нажат >

   Case 3 : Wheel.12 = 1   'нажаты /\ и >

   Case 4 : Wheel.14 = 1   'нажат \/

   Case 6

   Wheel.12 = 1 : Wheel.13 = 1   'нажаты > и \/

   Case 8

   Wheel.13 = 1 : Wheel.14 = 1   'нажат <

   Case 9

   Wheel.12 = 1

   Wheel.13 = 1 : Wheel.14 = 1   'нажаты < и /\

   Case 12

   Wheel.12 = 1 : Wheel.14 = 1   'нажаты < и \/

   End Select

Потенциометры педалей опрашиваем аналогично колесу руля, так же 4 раза для снижения флуктуаций, затем делим на 32 (сдвигом на 5 разрядов вправо). В результате получаем данные в масштабе 7 бит. Далее создаем "Combined Pedals" - если не нажата педаль "тормоза", то она равна данным педали "газа". Если нажат "тормоз", то равна его инверсии - так требует драйвер.

  Accelerator = 0 : Brake = 0 : Clutch = 0

   For I = 1 To 4   

   Temp_word = Getadc(1)   'педаль "Сцепление"

   Clutch = Clutch + Temp_word

   Temp_word = Getadc(2)   'педаль "Тормоз"

   Brake = Brake + Temp_word

   Temp_word = Getadc(3)   'педаль "Газ"

   Accelerator = Accelerator + Temp_word

   Next I

   Shift Clutch , Right , 5   'масштабирование до 127

   Shift Brake , Right , 5   'масштабирование до 127

   Shift Accelerator , Right , 5   'масштабирование до 127



   Combined_pedals = Accelerator

   If Brake < 123 Then   

   Combined_pedals = 255 - Brake

   End If

Далее следует пересортировать биты данных в соответствии с заданной очередностью в репорт-дескрипторе. Обычно такого делать не требуется, но в данном случае мы вынужденно пошли на такие сложности из-за стесненных условий. Зато мы уместили в пакете большой объем информации. После пересортировки передаем данные хосту:

   Buffer_6.3 = Accelerator.0   'пересортировка данных для отправки

   Buffer_6.4 = Accelerator.1

   Buffer_6.5 = Accelerator.2

   Buffer_6.6 = Accelerator.3

   Buffer_6.7 = Accelerator.4

   Buffer_7.0 = Accelerator.5

   Buffer_7.1 = Accelerator.6

   Buffer_7.2 = Brake.0

   Buffer_7.3 = Brake.1

   Buffer_7.4 = Brake.2

   Buffer_7.5 = Brake.3

   Buffer_7.6 = Brake.4

   Buffer_7.7 = Brake.5

   Buffer_8.0 = Brake.6

   Buffer_8.1 = Clutch.0

   Buffer_8.2 = Clutch.1

   Buffer_8.3 = Clutch.2

   Buffer_8.4 = Clutch.3

   Buffer_8.5 = Clutch.4

   Buffer_8.6 = Clutch.5

   Buffer_8.7 = Clutch.6



    '------------------------- Отправка данных в ПК --------------------------

   _usb_tx_buffer2(2) = Low(wheel)

   _usb_tx_buffer2(3) = High(wheel)

   _usb_tx_buffer2(4) = Low(buttons)

   _usb_tx_buffer2(5) = High(buttons)

   _usb_tx_buffer2(6) = Buffer_6

   _usb_tx_buffer2(7) = Buffer_7

   _usb_tx_buffer2(8) = Buffer_8

   _usb_tx_buffer2(9) = Combined_pedals

   Call Usb_send(_usb_tx_status2 , 8)

Программа закончена, можно ее скомпилировать и зашить в контроллер.

Скачиваем драйвер с сайта Logitech, устанавливаем его и подключаем наше устройство. Драйвер определит его как G25, заходим в свойства, здесь можно протестировать поворот руля, нажатие педалей - все сразу отразится на экране. Кроме того, нажимая на кнопки, можно протестировать FFB - "езда по деревянному мосту", "лопнувшая покрышка", "взрыв"...

 Второй руль, который мы будем создавать - Logitech Driving Force™ Pro:

Driving Force Pro.jpg

Это престижная модель с двумя педалями и переключателем передач на встроенной консоли. Передачи переключаются только "вперед/назад". На консоли руля больше кнопок, чем на G25, но их суммарное число меньше - 18. Такая конфигурация очень распространена среди рулей с FFB, поэтому прошивка под нее будет наиболее востребована для ремонта или апгрейда.

Схема остается прежняя, вместо отсутствующей педали сцепления подключим потенциометр чувствительности. С его помощью можно будет, не заходя в настройки, прямо во время игры подстроить силу воздействия FFB:

Schematic DFP.png

У нас освободились 11 бит, поэтому мы можем установить на педали разрядность в 8 бит, а на колесо руля - 14. Это повысило точность и плавность управления. Изменения в дескрипторе и программе здесь приводить не буду - их можно посмотреть в прилагаемых исходниках.

Теперь попробуем сделать геймпад. За основу возьмем Logitech Rumblepad 2:

rumblepad-1.jpg

Здесь FFB вибрационного типа, т.е. установлены два вибромотора, направление вращения которых не регулируется, только скорость. Поэтому вместо мостовой схемы применяются просто ключевые транзисторы и два выхода ШИМ. В ATmega8 два выхода имеет Таймер1, они уже выведены на разъем. Кроме того, для одномоторного случая можно задействовать освободившийся выход Таймера2 и подавать на него мажоритарный уровень левого и правого моторов FFB:

schematic Rumble.png

Теперь, не меняя схему и прошивку, можно подключить либо один, либо два мотора, в зависимости от конструкции устройства.

Конфигурируем Таймер1:

Config Timer1 = Pwm , Pwm = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up , Prescale = 8

Compare1a = 0

Compare1b = 0

Config Portb.1 = Output

Config Portb.2 = Output 

И Таймер2:

Config Timer2 = Pwm , Prescale = 8 , Compare Pwm = Clear Up

Съем данных с потенциометров и кнопок аналогичен предыдущим. Репорт-дескриптор имеет незначительные изменения.

Пакет для отправки хосту имеет следующий вид:

    _usb_tx_buffer2(2) = Low(dpad_x)

   _usb_tx_buffer2(3) = Low(dpad_y)

   _usb_tx_buffer2(4) = Low(rjoy_x)

   _usb_tx_buffer2(5) = Low(rjoy_x)

   _usb_tx_buffer2(6) = Low(rjoy_y)

   _usb_tx_buffer2(7) = Low(buttons)

   _usb_tx_buffer2(8) = High(buttons)

   _usb_tx_buffer2(9) = 64

   Call Usb_send(_usb_tx_status2 , 8)

Последний байт всегда равен 64, таково требование драйвера - это своеобразный пароль.

Вот теперь, собственно, и все. По аналогии с вышеизложенным можно сделать джойстик, самолетный штурвал и проч. В приложении все схемы, пример платы в формате Cadsoft Eagle, исходники и откомпилированные коды. Библиотеку SWUSB.LBX перед компиляцией следует поместить в каталог Lib.

P.S. Использование драйвера не противозаконно, у меня были сомнения на этот счет, поэтому я испросил разрешение у фирмы Logitech и ответ был таков: мы не можем запретить Вам такое использование, однако, в этом случае мы не несем никакой ответственности за ... и т.д.   

Последнюю версию драйвера можно скачать здесь.

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
IC1 МК AVR 8-бит
ATmega8
1 Поиск в FivelВ блокнот
Q2, Q8 Биполярный транзистор
BC807
2 Поиск в FivelВ блокнот
Q3, Q5, Q6 MOSFET-транзистор
IRF9540
3 Поиск в FivelВ блокнот
Q4, Q7, Q9 ТранзисторIRLML24023 Поиск в FivelВ блокнот
Q10, Q11 MOSFET-транзистор
IRF530
2 Поиск в FivelВ блокнот
D1, D2 Стабилитрон3.6 В1 Поиск в FivelВ блокнот
D4 Выпрямительный диод
UF5404
1 Поиск в FivelВ блокнот
D3, D5, D6, D7 Диод4 Поиск в FivelВ блокнот
С1-С7, C13 Конденсатор0.1 мкФ8 Поиск в FivelВ блокнот
С8, С14, С16 Электролитический конденсатор47 мкФ3 Поиск в FivelВ блокнот
С9, С10 Конденсатор18 пФ1 Поиск в FivelВ блокнот
С11 Электролитический конденсатор22 мкФ1 Поиск в FivelВ блокнот
С12 Электролитический конденсатор1000 мкФ 35В1 Поиск в FivelВ блокнот
С15 Конденсатор1 мкФ1 Поиск в FivelВ блокнот
R1, R14, R18, R34, R20, R29 Резистор
10 кОм
6 Поиск в FivelВ блокнот
R3-R13 Резистор
470 Ом
10 Поиск в FivelВ блокнот
R15 Резистор
1.5 кОм
1 Поиск в FivelВ блокнот
R16, R17 Резистор
68 Ом
1 Поиск в FivelВ блокнот
R18 Резистор
4.7 кОм
1 Поиск в FivelВ блокнот
R22, R35 Резистор
10 Ом
2 Поиск в FivelВ блокнот
R23 Резистор
2 кОм
1 Поиск в FivelВ блокнот
R24, R31, R32, R33 Переменный резистор4 Поиск в FivelВ блокнот
R25, R26, R30 Резистор
270 Ом
3 Поиск в FivelВ блокнот
R27, R19, R28, R21 Резистор
1 кОм
4 Поиск в FivelВ блокнот
LED1 Светодиод1 Поиск в FivelВ блокнот
Q1 Кварцевый резонатор12 МГц1 Поиск в FivelВ блокнот
L1 Катушка индуктивности10 мГн1 Поиск в FivelВ блокнот
L2 Катушка индуктивности22 мкГн1 Поиск в FivelВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 Участие в конкурсе 4
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.9 Проголосовало: 4 чел.

Комментарии (40) | Я собрал (0) | Подписаться

0
Elecktron #
Как выставлять фьюзы для сборки данных джойстиков?
Ответить
0

[Автор]
Mrshilov #
Из фьюзов нужно только выставить внешний кварц.
Ответить
0
Сергей #
Подскажите пожалуйста, какие именно фьюзы ставить? Ставил SPIEN, SUT0 и CKOPT - не работает
Ответить
0
Elecktron #
Спасибо, разобрался. G25 заработал, DFP - нет. Кнопки и FFB еще не подключал.
Ответить
0

[Автор]
Mrshilov #
В прошивке к DFP есть неточность с регулятором чувствительности, но она проявится только на FFB. Здесь это исправлено
Ответить
0
Олег #
Посоветуйте пожалуйста, откуда моторчик для руля выдернуть? На 24 вольта что-то в голову не приходит вариантов
Ответить
0

[Автор]
Mrshilov #
Не обязательно на 24, можно и на меньшее напряжение.
Ответить
0
Николай #
Подскажите пожалуйста, что за конденсаторы такие на 0.1пФ? SMD я еще могу представить такой емкости, как и на 18пФ (к сожалению смог найти только на 18). А вот металлопленочный С13 на 0.1пФ вообще сомневаюсь, что такой есть в природе. Второй день голову ломаю.
Ответить
0
Goodefine #
А кто сказал что там пФ? Если без размерности и в виде десятичной дроби - то мкФ.
Ответить
0
killer044 #
G25 кто-нибуть соберал, обратная связь работает?
Ответить
0
killer044 #
Я конечно плохой электронщик, но собрав данное устройство, конечно не в smd варианте но точно следуя схеме, убедился в том, что схема мало работоспособна. Пришлось вместо bc807 pnp структуры применить подобные транзисторы npn структуры, ибо на bc807 драйвер тупо грелся и при работе обратной связи шли конкретные наводки по usb кабелю, если это вообще можно было назвать обратной связью. На npn в некоторых играх типа Flatout 2 присутствует подобие обратки, но только при езде (когда стоиш на месте поворачивая руль нагрузки не чувствуеш) когда едеш чувствуються кочки, камни, удары и руль сам возвращаеться в исходную точку, но мост все равно очень сильно грееться и шумит даже через колонки, наводки идут, хотя в плане наводок мне кажеться, что я плохо заэкранировал плату, но помоему в плане обратки еще есть недоработки в прошивке, предлагаю по этой теме создать тему на форуме
Ответить
0
ka3a4ok #
Смоделировал в протеусе схему для G25 - не работает. На 17-ом пине прямоугольные импульсы. Винда не определяет новое устройство.
Ответить
0
Юрий #
Подскажите, как мне сделать FFB на джойстик Logitech 3D Pro (имеется ввиду сама процедура возни с драйвером и т.д. так как не очень понял описание этого в статье)
Ответить
0
Николай #
Logitech опубликовал протокол обмена: https://opensource.logitech.com/opensource/index.php/Technical_Information
Ответить
0
Max #
Driving Force - определился виндой только без драйвера от Logitech, с ним - мертвый.
G25 - определился нормально, единственно не работает отдача.
В основе безымянный руль с отдачей (на основе A3955SLB).
в общем есть 2 входа:
1. Направление вращения, 0 - в одну сторону, 1 - в другую
2. Сила вращения, китайцы объединили 3 линии в одну, у микрухи это 3-х битный вход, с поддержкой ШИМ (0 - off/1 - on).
Подскажите, что куда подключить?
Ответить
0
Max #
Отдача заработала, забыл подключить мотор к драйверу
Единственно жутко пищит и сильно греется сам драйвер.
Походу что-то не так.
Насколько я понял, контроллер на 17 ногу (направление) выдаёт ШИМ, это не совсем правильно - мотор дергается туда-сюда.
Нужно на 17 ногу выдавать 0 или 1 в зависимости от направления, а вот на 18 подавать ШИМ, тогда драйвер греться не будет (или транзисторы) и пищать не будет.
Ответить
0
Max #
В общем что-то получилось, спасибо автору за комментарии, без них разбирался наверно неделю.

В моём варианте:
- 17 нога отвечает за усилие (0 -off, 1- on);
- 18 нога отвечает за направление (1- вправо, 0 - влево).
Я программист так себе, особенно по AVR, поэтому Надо поменять местами 17 и 18 выводы на схеме
- при малых значениях (10/255) ШИМ совсем отключается и не пищит;
- увеличена частота ШИМа с 1,5 кГц до ~ 64кГц, теперь мотор не слышно совсем

Если у кого не потянет драйвер такие частоты измените значение делителя "Prescale" на 64 или 128, промежуточные значения не поддерживаться, оригинальное значение 32 (1,5кГц)
Прикрепленный файл: G25.rar
Ответить
0
Max #
Чуть не забыл, рекомендую ставить диодики (1N4148 или любой другой импульсный) последовательно с каждой кнопкой, в противном случае фантомные срабатывания вам обеспечены!
Ответить
0
Nureke #
Скажите на Atmega 328 можно, если можно как?
Ответить
0

[Автор]
Mrshilov #
Да, можно 88, 168 и 328. Плата и схема остается. В исходнике нужны изменения:
Tccr2.0 = 1 'режим FastPWM - частота 1,5кГц
Tccr2.1 = 1
Pwm2a = 128

Далее в тексте так же заменить Pwm2 на Pwm2a .
Ответить
0
dir2585 #
Есть руль Logitech g27 хочу заменить на нем редуктор вместе с моторами от logitech g25. Интересно моторы у них по мощности одинаковые или можно спалить основную плату если подключу редуктор с моторами от logitech g25?
Ответить
0
Александр #
Я так и не понял, какой вариант рабочий? И какая роль мотора на руле?
Ответить
0
Евгений #
Заливаю ваш hex в нано через xloader и ничего не происходит, есть предположение, что это из-за загрузчика CH340. возможно ли это обойти?
И 2 вопрос, хотелось бы подключить полу мостовой драйвер l298n или l293d . Является ли это возможным?
Ответить
0
Max #
Эти прошивки сделаны не для нано. Соберите схему данную автором.
Ответить
0
Max #
Решил доработать прошивку - добавить автокалибровку. Но возникла проблема, заново скомпилированная прошивка даёт неопознанное устройство.Заливаю старый hex все работает. Просто перекомпилировал исходник без внесения изменений - не работает.
В чем может быть проблема?
Ответить
0

[Автор]
Mrshilov #
Если версия BASCOM ниже 2.0.7.6, то нужно убрать строчку
Config Error = Ignore , 380 = Ignore
Ответить
0
Max #
Эта строчка не влияет. У меня версия 2.0.5.0 и все работало с этой строкой.
Какие-то настройки баскома надо делать?
Есть код который раньше нормально компилировался, сейчас не хочет, вернее он компилируется, но контроллер не работает
Ответить
0
Max #
Решение нашлось случайно.
swusb.LBX который идет в проекте какой-то глючный, кто пользуется ломанным баскомамом - у вас уже есть эта библиотека, не меняйте её!
Ответить
0
Max #
Подскажите как сделать правильно преобразование типов?
Dim Clutch_max As Word
Dim Clutch As Word
Dim Koef As Single

Koef =4095/Clutch_max
Вот здесь происходит косяк, как результат получаем 0
Clutch=Clutch*Koef
Ответить
0
Max #
Выкладываю свою прошивку (и исходник) с автокалибровкой педалей.

Работает просто: запоминает крайние значения бля осей, а потом растягивает до "размера" переменной которая передаются на ПК.
результаты не сохраняются, по этому после включения руля надо нажать до упора все педали.

Если используете отдачу - Надо поменять местами 17 и 18 выводы на схеме
Прикрепленный файл: G25.rar
Ответить
0
Max #
Походу много ресурсов я потратил на эту автокалибровку - отдача глючит
Ответить
0
Max #
Вся проблема в swusb.lbx, скачал свежую с офф сайта и все заработало.
добавил светодиоды:
27 нога - высокий уровень когда работает отдача (делал для диагностики)
19 нога - пока не задействован. тоже высокий уровень, планирую сделать "STOP" когда включен ручник, но ручника пока нет(((
Если кто объяснит опубликованный протокол обмена буду благодарен и попытаюсь реализовать больше оригинальных функций, в основном интересует индикация.
Прикрепленный файл: G25.rar
Ответить
0
Max #
Я тут заметил, что "комбинированная педаль" не используется в играх а в некоторых только мешает.
Предлагаю вместо этой виртуальной педали сделать ручник, те кому нужна эта педаль - вместо резистора ставят перемычку на "0" и "комбинированная педаль" работает по старому алгоритму.
единственный минус эту 5 ось не видно в свойствах руля, но игры видят.
Работаю над реализацией
Ответить
0
Евгений #
Сделал все по вашей схеме, прошил вашей прошивкой через arduino uno программой "SinaProg 2.1.1" устройство видится как неопознанное, установка драйверов не помогает. hex файл который считываю чуть отличается от первоисточника. хотя авто проверка" говорит", все норм.
Прикрепленный файл: P_20151229_201315.jpg
Прикрепленный файл: P_20151229_201331.jpg
Ответить
0
Harut #
А как геймпад сделать? Кнопки и переменники джойстиков не подписаны... не понятно, что куда ставить.
Ответить
0
Max #
Подскажите возможно ли разделить на 2 USB устройства, отдельно педали и отдельно руль?
Играм в принципе все равно сколько устройств управления.
Ответить
0
da4nik #
Спаял, прошил (прошивка Driving Force Pro), фьюзы зашил только BOOTSZ1, BOOTSZ0 и SUT1. Драйвера установил, но комп видит неопознанное устройство. Подскажите, где может быть косяк? Может фьюзы? Было бы неплохо, еслибы кто-то скрин фьюзов выложил.
Ответить
0
teknikman #
Can you add centering spring?
Прикрепленный файл: setting.jpg
Ответить
0

[Автор]
Mrshilov #
"Centering spring" is software feature. It will work without any changes in hardware.
Ответить
0
Дмитрий #
Подскажите, кто нибудь реализовывал эту схему под arduino leonardo (atmega32u4)? Она может легко распознаваться как HID устройство. Или знает как определить ее как g25 или g27?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Набор для сборки - LED лампа AVR-программатор USB ASP
вверх