Стиль форума обновлен, нажмите Ctrl + F5 (PC), либо Cmd + Shift + R (Mac) для синхронизации

Кнопко-ящик (ButtonBox)

morganchik M
Аватара
morganchik M
Возраст: 35
Репутация: 2187
Имя: Андрей
Контроллер: Thrustmaster T300 RS
Откуда: Нижний Новгород
Steam ID Skype YouTube ВКонтакте

#1 morganchik » 13.11.2016, 00:41

Видимо страсть ко всякого рода доработкам и устройствам для симрейсинга и не только, подтолкнула меня сделать кнопко-ящик. Пока мне почти хватает кнопок на бороде кпп Logitech G27, но когда-нибудь я всеже перейду на Thrustmaster и вот там то этот кнопко-ящик будет просто необходим. Цели у меня были следующие:
1. Цена устройства должна быть в разумных пределах. (хотя я не сильно экономил, на всяких радио-рынках и интернет магазинах можно купить все дешевле, в китайских магазинах тем паче, но мне не терпелось взяться за работу)
2. Наличие не менее 10-ти кнопок.
3. Устройство должно быть приятно для меня как визуально, так и тактильно.
4. Все это должно иметь возможность как крепиться к кокпиту (которого у меня нет =)), так и просто устойчиво лежать на столе.
5. Устройство должно быть достаточно мобильно, чтобы иметь возможность храниться на краю стола, за мониторами, короче там, где не будет мне мешать.
Покупать подобный девайс я категорически отказался, во-первых хочется сделать самому, во-вторых цены, стартующие с отметки в $100.
Здесь же я хочу вам рассказать и показать как все сделано, ну и некое краткое, но цельное руководство. Так же буду указывать где, почем и что покупал. Никакой рекламы.
Итак поехали.
За основу устройства я взял геймпад. Так как от него нужна была только плата, то выбор пал на самый дешевый без аналоговых стиков, которые ну никак не нужны. Цена вопроса 390 рублей.
Спойлер
Изображение
Изображение
Далее все комплектующие я покупал в одном магазине.
Корпус 420 руб. (есть серые, расположение как портретное, так и альбомное). Качество этого корпуса просто восхитительное. Очень качественный пластик, все подогнанно, пластик толщиной в 3мм!
Спойлер
Изображение
http://www.chipdip.ru/product/g1188b/
Ножки для корпуса 150 руб.
Спойлер
Изображение
http://www.chipdip.ru/product/sj5003-black-16pcs/
Кнопки 14 шт. 654 руб. На кнопках не экономил от слова вообще.
Спойлер
Изображение
Многие используют в своих кнопко-ящиках очень симпатичные переключатели типа вот таких,
Спойлер
Изображение
но я откзался от этой затеи, так как все они достаточно жесткие, что может быть крайне неудобным для использования устройства на столе без крепления.
Соединительные провода. Взял два метра витой пары (4 пары). 68 руб.
Спойлер
Изображение
Светодиоды 3мм, 12 штук = 84 руб. Брал тусклые, 25 мКд вроде, специально. При включенном свете чтобы не отвлекали (их практически не видно), в темноте чтобы не отвлекали. Красные 1,8мм пришлось заменить на теже 3мм, слишком маленькие.
Спойлер
Изображение
Все обошлось в 1376 рублей. Больше тысячи - это корпус и кнопки. Так что есть куда экономить.
Процесс изготовления.
Разобрал геймпад (Ботик не расстраивайся). Просверлил на плате те места, от куда планировал брать контакт на кнопки и припаял провода примерно 30 см - это с запасом. Для фиксации "залил" термоклеем.
Спойлер
Изображение
Изображение
Изображение
Распечатал макет для кнопок, наложил на корпус и накернил центры под сверления для кнопок и светодиодов. Для D-Pad использую маленькие синие кнопки и красные светодиоды.
Спойлер
Изображение
Рассверлил отверстия под кнопки и светодиоды.
Спойлер
Изображение
Тут стоит упомянуть о том, что под некоторые кнопки необходимы были отверстия в 12мм и 16мм. Так как в шуруповерт как правило входят сверла до 10мм включительно, да и сверла на 16мм у меня нет, купил ступенчатое сверло. Работал с ним впервые и могу сказать однозначно - вещь просто шикарная и почти необходимая в хозяйстве.
Спойлер
Изображение
Установил кнопки, посадил светодиоды на капельку цианоакрилата (суперклей), припаял контакты к кнопкам.
Спойлер
Изображение
Распаял выводы от платы геймпада.
Спойлер
Изображение
Мини гравером (типа Dremel) выбрал углубление для фиксации провода USB на обоих крышках корпуса.
Спойлер
Изображение
Изображение
Прикрепил плату к корпусу термоклеем. Всала плата как родная.
Спойлер
Изображение
Наклил ножки на тыльную сторону корпуса. По три штуки на угол, для усилиния противоскользящего эффекта.
Спойлер
Изображение
Вот так выглядит устройство в сборе. По мне так очень аккуратно. Сделаной работой доволен. По времени все можно сделать за половину дня, день. Ну и как говорится подписывайтесь, ставьте лайки, комментируйте =)
Спойлер
Изображение
Изображение

Очень любопытный факт. Мы с Дэнчиком не сговариваясь начали делать баттон боксы практически в один день. Думаю в ближайшее время он выложит свой buttonbox, там есть на что посмотреть. Сделан он немного иначе и используются там другие компоненты.
дельта бесполезна за рулём, отвлекающий эффект. карс1- революция, карс2- эволюция. kapkan
ты первый, значит ты капитан. VADIK
Эй, где моя недоношенность, страдание и импотенция? thorax
Довороты по крену появляются при попытках остановить самораскачивание из за чего на руль приходят удары

Xeno-man M
Аватара
Xeno-man M
Репутация: 706
Имя: Илья
Контроллер: Logitech G27
Steam ID

#2 Xeno-man » 13.11.2016, 00:48

А ничего так выглядит, хоть сейчас в массовое производство :ninja:
Идентифицирую себя как Chevrolet Camaro Z/28 RS 1968 модельного года

GMTR M
Аватара
GMTR M
Возраст: 31
Репутация: 1077
Имя: Евгений
Контроллер: Logitech G27
Откуда: Пенза
Steam ID

#3 GMTR » 13.11.2016, 00:49

Маньячина! :shock:
ps: а вообще молодец :D

morganchik M
Аватара
morganchik M
Возраст: 35
Репутация: 2187
Имя: Андрей
Контроллер: Thrustmaster T300 RS
Откуда: Нижний Новгород
Steam ID Skype YouTube ВКонтакте

#4 morganchik » 13.11.2016, 00:50

Xeno-man писал(а):А ничего так выглядит, хоть сейчас в массовое производство :ninja:
Отпускная цена никому не понравится :D
дельта бесполезна за рулём, отвлекающий эффект. карс1- революция, карс2- эволюция. kapkan
ты первый, значит ты капитан. VADIK
Эй, где моя недоношенность, страдание и импотенция? thorax
Довороты по крену появляются при попытках остановить самораскачивание из за чего на руль приходят удары

бабай M
Аватара
бабай M
Возраст: 64
Репутация: 524
Имя: Игорь
Контроллер: Logitech G27
Откуда: г.Королёв, М.О.
Steam ID YouTube

#5 бабай » 13.11.2016, 01:29

Голь на выдумки хитра!
Только как его к компу подключить? Вернее, как его комп распознает?
И как с Майкрософтом будешь связываться, чтобы дрова написали ? :?

morganchik M
Аватара
morganchik M
Возраст: 35
Репутация: 2187
Имя: Андрей
Контроллер: Thrustmaster T300 RS
Откуда: Нижний Новгород
Steam ID Skype YouTube ВКонтакте

#6 morganchik » 13.11.2016, 01:31

бабай писал(а):Голь на выдумки хитра!
Только как его к компу подключить? Вернее, как его комп распознает?
И как с Майкрософтом будешь связываться, чтобы дрова написали ? :?
Это обычный геймпад, никаких дров не надо.
дельта бесполезна за рулём, отвлекающий эффект. карс1- революция, карс2- эволюция. kapkan
ты первый, значит ты капитан. VADIK
Эй, где моя недоношенность, страдание и импотенция? thorax
Довороты по крену появляются при попытках остановить самораскачивание из за чего на руль приходят удары

Eugene Gajkin M
Супермодератор
Супермодератор
Аватара
Eugene Gajkin M
Супермодератор
Супермодератор
Возраст: 32
Репутация: 620
Имя: Евгений
WMD (CARS 1): Team Member
WMD (CARS 2): Bronze
Контроллер: Logitech G25
Откуда: Дедовск
Steam ID Facebook Skype Twitter YouTube

#7 Eugene Gajkin » 13.11.2016, 01:42

morganchik, вот эта штука может джостик заменить
phpBB [media]

morganchik M
Аватара
morganchik M
Возраст: 35
Репутация: 2187
Имя: Андрей
Контроллер: Thrustmaster T300 RS
Откуда: Нижний Новгород
Steam ID Skype YouTube ВКонтакте

#8 morganchik » 13.11.2016, 02:16

Evgeniy Gaykin, я вкурсе за ардуино, вообще начал собирать buttonbox прочитав эту статью. Но во-первых, программа для данного "сетапа" составляет 354 строки
Спойлер
#include "LedControl.h"
#include <rotary.h>
#include <Keyboard.h>


// PINS for LED
#define DINPIN 10 //PIN to DIN
#define CSPIN 16 //PIN to CS
#define CLKPIN 14 //PIN to CLK

// 1st encoder - for fuel
#define ROTARY_PIN1 3
#define ROTARY_PIN2 2
// 2nd encoder - for next/prev control
#define ROTARY_PIN3 0
#define ROTARY_PIN4 1
// 3rd encoder - for change value
#define ROTARY_PIN5 4
#define ROTARY_PIN6 5
// define to enable weak pullups.
#define ENABLE_PULLUPS


#define NumSwitches 4
#define ShortPressTime 200
#define ShowPressuresSwitchTime 2000

#define FT B00100010 // BOTH FRONT TIRES
#define RT B00010100 // BOTH REAR TYRES
#define WDS B00000001 // WINDSCREEN
#define FRP B01000000 // FAST REPAIR


#define KeysPin1 A3
#define KeysPin2 A2
#define NumAnalogWires 2

int FrontTiresPress=0, RearTiresPress=0;
long TimeTmp;//,TTmpKeys;
boolean ShowPressuresFlag = 0;
boolean ChangeFlag = 0;


struct AnalogKeysStruct {
int PIN;
int AnalogKeyValue;
int PrevAnalogKeyValue;
long TTmpKeys;
};

AnalogKeysStruct buttons[NumAnalogWires] = {
{KeysPin1, 0, 0, 0},
{KeysPin2, 0, 0, 0},
};


Rotary r1 = Rotary(ROTARY_PIN1, ROTARY_PIN2);
Rotary r2 = Rotary(ROTARY_PIN3, ROTARY_PIN4);
Rotary r3 = Rotary(ROTARY_PIN5, ROTARY_PIN6);


volatile unsigned int encoderPos = 0; // a counter for the dial


struct SwitchStates { // struct's def for holding states of our switches
int PIN; // switch's PIN
boolean State;
boolean PrevState;
long TimePressed;
boolean ShortPress;
};

SwitchStates Switches[] = {
{6,false,false,0,false},
{7,false,false,0,false},
{8,false,false,0,false},
{9,false,false,0,false},
};



byte PitCombo,PrevPitCombo = 0;


LedControl lc=LedControl(DINPIN,CLKPIN,CSPIN,1);




void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);

for (byte i=0;i<NumSwitches;i++) {
pinMode(Switches[i].PIN, INPUT_PULLUP);
}

pinMode(ROTARY_PIN1, INPUT_PULLUP);
pinMode(ROTARY_PIN2, INPUT_PULLUP);
pinMode(ROTARY_PIN3, INPUT_PULLUP);
pinMode(ROTARY_PIN4, INPUT_PULLUP);
pinMode(ROTARY_PIN5, INPUT_PULLUP);
pinMode(ROTARY_PIN6, INPUT_PULLUP);

Keyboard.begin();

TimeTmp = millis();
}



void loop() {

CheckSwitches(); //check current switches' states and populate structure

ProcessSwitches(); //process switches' structure and show corresponding pictograph

CheckFuelEncoder(); //check position of fuel encoder and show requested number of fuel

CheckControlEncoder(); //check and process control encoder

CheckChangeEncoder(); //check and process change encoder

CheckButtons();

ShowPressures();

}


void ProcessPitCombo(void) {
String StrResult = "#clear";
String tmp;
Keyboard.write('t');
delay(500);
// Keyboard.print("#clear");
// delay (50);
if (FrontTiresPress) {
FrontTiresPress > 0 ? tmp = "+" : tmp = "";
StrResult = String(StrResult + " lf " + tmp + FrontTiresPress + " rf " + tmp + FrontTiresPress);
}
if (RearTiresPress) {
RearTiresPress > 0 ? tmp = "+" : tmp = "";
StrResult = String(StrResult + " lr " + tmp + RearTiresPress + " rr " + tmp + RearTiresPress);
}
if (PitCombo) {
if (PitCombo & FT && !FrontTiresPress) {
StrResult = String(StrResult + " lf rf");
}
if (PitCombo & RT && !RearTiresPress) {
StrResult = String(StrResult + " lr rr");
}
}
if (encoderPos) {
StrResult = String(StrResult + " fuel " + encoderPos);
}
if (PitCombo) {
if (PitCombo & FRP) {
StrResult = String(StrResult + " fr");
}
if (PitCombo & WDS) {
StrResult = String(StrResult + " ws");
}
}

// StrResult = String(StrResult + "$");
Keyboard.print(StrResult);
delay(ShortPressTime);
Keyboard.write(KEY_RETURN);
// delay(ShortPressTime);
}


void ShowPressures(void) {
if ((millis() - TimeTmp) > ShowPressuresSwitchTime) {
TimeTmp = millis();
ShowPressuresFlag = ShowPressuresFlag ^ 1;
}

if ((FrontTiresPress != 0) && (RearTiresPress == FrontTiresPress)) {
ShowNumber(RearTiresPress,4);
lc.setRow(0,7,RT|FT);
return;
}

if (ShowPressuresFlag && FrontTiresPress) {
ShowNumber(FrontTiresPress,4);
lc.setRow(0,7,FT);
ChangeFlag = 0;
return;
}

if (!ShowPressuresFlag && RearTiresPress) {
ShowNumber(RearTiresPress,4);
lc.setRow(0,7,RT);
ChangeFlag = 0;
return;
}

if ((FrontTiresPress == 0) && (RearTiresPress == FrontTiresPress)) {
//ShowNumber(RearTiresPress,4);
lc.setRow(0,7,0);
lc.setRow(0,6,0);
lc.setRow(0,5,0);
lc.setRow(0,4,0);
return;
}
}

void CheckButtons(void) {
for (int i=0;i<NumAnalogWires;i++) {
buttons[i].AnalogKeyValue = analogRead(buttons[i].PIN);

if (buttons[i].AnalogKeyValue>150 && buttons[i].PrevAnalogKeyValue>150 && (millis() - buttons[i].TTmpKeys) > ShortPressTime) {
buttons[i].TTmpKeys = millis();
if (buttons[i].AnalogKeyValue > 600 && buttons[i].PrevAnalogKeyValue > 600) {
if (!i) FrontTiresPress --; ShowPressuresFlag=1;
if (i) Keyboard.write(KEY_ESC);
delay(ShortPressTime);
}
if (buttons[i].AnalogKeyValue > 350 && buttons[i].AnalogKeyValue <= 600 && buttons[i].PrevAnalogKeyValue > 350 && buttons[i].PrevAnalogKeyValue <= 600) {
if (!i) FrontTiresPress ++; ShowPressuresFlag=1;
if (i) Keyboard.write(KEY_TAB);
delay(ShortPressTime);
}
if (buttons[i].AnalogKeyValue > 250 && buttons[i].AnalogKeyValue <= 350 && buttons[i].PrevAnalogKeyValue > 250 && buttons[i].PrevAnalogKeyValue <= 350) {
if (!i) RearTiresPress --; ShowPressuresFlag=0;
if (i) Keyboard.write(0x20);
delay(ShortPressTime);
}
if (buttons[i].AnalogKeyValue > 200 && buttons[i].AnalogKeyValue <= 250 && buttons[i].PrevAnalogKeyValue > 200 && buttons[i].PrevAnalogKeyValue <= 250) {
if (!i) RearTiresPress ++; ShowPressuresFlag=0;
if (i) ProcessPitCombo();
delay(ShortPressTime);
}
if (!i) TimeTmp = millis();
}

if (buttons[i].AnalogKeyValue>150 && buttons[i].PrevAnalogKeyValue<150) {
buttons[i].TTmpKeys = millis();
}

if (buttons[i].AnalogKeyValue != buttons[i].PrevAnalogKeyValue) buttons[i].PrevAnalogKeyValue = buttons[i].AnalogKeyValue;
}
}



void CheckChangeEncoder(void) {
unsigned char result = r3.process();
if (result) {
Keyboard.write(result == DIR_CCW ? KEY_LEFT_ARROW : KEY_RIGHT_ARROW );
}

}


void CheckFuelEncoder(void) {
unsigned char result = r1.process();
if (result) {
if (result == DIR_CCW && encoderPos < 999) encoderPos++ ;
if (result == DIR_CW && encoderPos > 0) encoderPos--;
ShowNumber(encoderPos,0);
}
}

void CheckControlEncoder(void) {
unsigned char result = r2.process();
if (result) {
Keyboard.write(result == DIR_CCW ? KEY_UP_ARROW : KEY_DOWN_ARROW);
}
}

// Shows 3 digit number beginning from _pos position
void ShowNumber (int _encoderPos, byte _pos) {
int tmp;

tmp = abs(_encoderPos);

// if (_encoderPos != 0) {
lc.setDigit(0,_pos,tmp%10,false);
// } else lc.setRow(0,_pos,0);

tmp /= 10;

if (tmp != 0) {
lc.setDigit(0,_pos+1,tmp%10,false);
tmp /= 10; //_encoderPos/100;
if (tmp != 0) {
lc.setDigit(0,_pos+2,tmp%10,false);
if (_encoderPos < 0) lc.setRow(0,_pos+3,WDS);
} else {
lc.setRow(0,_pos+2,0);
if (_encoderPos < 0) lc.setRow(0,_pos+2,WDS);
}
} else {
lc.setRow(0,_pos+1,0);
if (_encoderPos < 0) lc.setRow(0,_pos+1,WDS);
}
}


void ProcessSwitches(void) {
for (byte i=0;i<NumSwitches;i++) {
switch (i) {
case 0:
if (Switches[i].State) PitCombo |= FT; else PitCombo &= ~FT; // switch 0 - request to change front tyres
break;
case 1:
if (Switches[i].State) PitCombo |= RT; else PitCombo &= ~RT; // switch 1 - request to change rear tyres
break;
case 2:
if (Switches[i].State) PitCombo |= WDS; else PitCombo &= ~WDS; // switch 2 - request to clean wildscrean
break;
case 3:
if (Switches[i].State) PitCombo |= FRP; else PitCombo &= ~FRP; // switch 3 - request to make fast repair
}
}

if (PitCombo != PrevPitCombo) {
lc.setRow(0,3,PitCombo);
PrevPitCombo = PitCombo;
}

}

void CheckSwitches(void) {
long CheckTime;

for (byte i=0;i<NumSwitches;i++) {
if (digitalRead(Switches[i].PIN) == LOW) Switches[i].State = true;
else {
Switches[i].State = false;
}
}
}



в коих я вообще не разбираюсь, ну а во-вторых пришлось бы заливать на пекарс отдельную прошивку, на иракинг вторую, на, допустим, РР третью. Если вдруг приспичит освоить эту ардуину, то нет никаких проблем собрать еще один кнопко-ящик. А вообще вместо прошивок можно просто ящик подключать новый =)
дельта бесполезна за рулём, отвлекающий эффект. карс1- революция, карс2- эволюция. kapkan
ты первый, значит ты капитан. VADIK
Эй, где моя недоношенность, страдание и импотенция? thorax
Довороты по крену появляются при попытках остановить самораскачивание из за чего на руль приходят удары

Eugene Gajkin M
Супермодератор
Супермодератор
Аватара
Eugene Gajkin M
Супермодератор
Супермодератор
Возраст: 32
Репутация: 620
Имя: Евгений
WMD (CARS 1): Team Member
WMD (CARS 2): Bronze
Контроллер: Logitech G25
Откуда: Дедовск
Steam ID Facebook Skype Twitter YouTube

#9 Eugene Gajkin » 13.11.2016, 02:26

не ты не прав, там загружается одна прошивка, её можно сделать чтобы она как геймпад определялась или как доп клава, и во всех играх будет одинаково определяться
phpBB [media]

morganchik M
Аватара
morganchik M
Возраст: 35
Репутация: 2187
Имя: Андрей
Контроллер: Thrustmaster T300 RS
Откуда: Нижний Новгород
Steam ID Skype YouTube ВКонтакте

#10 morganchik » 13.11.2016, 02:46

Evgeniy Gaykin, я маленько про другое. В той статье, что я тебе привел в пример. Некоторые кнопки делают определнное действие. К примеру какие то увеличивают или уменьшают давление в шинах, какие то настраивают тактику пит-стопа (менять шины или не менять), переменные резисторы регулируют громкость игры и внутриигрового чата, и все это в иракинге. Т.е. написана прога специально для иракинга. Соответственно для пекарса нужна своя. А что касается геймпада, то у меня он и так как геймпад определяется. Не совсем понимаю о чем ты Жень. :?
дельта бесполезна за рулём, отвлекающий эффект. карс1- революция, карс2- эволюция. kapkan
ты первый, значит ты капитан. VADIK
Эй, где моя недоношенность, страдание и импотенция? thorax
Довороты по крену появляются при попытках остановить самораскачивание из за чего на руль приходят удары

D.man M
Администратор
Администратор
Аватара
D.man M
Администратор
Администратор
Возраст: 32
Репутация: 5276
Имя: Дмитрий
WMD (CARS 1): Manager
WMD (CARS 2): Gold
Платформа: PC
Контроллер: Thrustmaster TX
Steam ID Skype Twitter YouTube ВКонтакте Flickr

#11 D.man » 13.11.2016, 09:23

Отлично сделано! Вот что значит руки из правильного места. А я вот заинтересовался Adruino-вариантом. Пойду шерстить Ali в поисках всего необходимого у одного продавца
MB: ASUS Z87-PRO CPU: Intel Core i7-4770 GPU: MSI GeForce GTX1070 RAM: Hynix 16Gb DDR3-1333 OS: Windows 10 Pro x64

RSI M
Аватара
RSI M
Возраст: 36
Репутация: 399
Имя: Станислав
Контроллер: Logitech G27
Откуда: Сургут
Steam ID

#12 RSI » 13.11.2016, 09:32

morganchik, Андрюх где корпус брал, от чего это вообще и как он называется?
Stanislav Repakov

GMTR M
Аватара
GMTR M
Возраст: 31
Репутация: 1077
Имя: Евгений
Контроллер: Logitech G27
Откуда: Пенза
Steam ID

#13 GMTR » 13.11.2016, 11:31

RSI писал(а):morganchik, Андрюх где корпус брал, от чего это вообще и как он называется?
morganchik писал(а):http://www.chipdip.ru/product/g1188b/
:ninja:

Freid M
Супермодератор
Супермодератор
Аватара
Freid M
Супермодератор
Супермодератор
Возраст: 31
Репутация: 1906
Имя: Александр
WMD (CARS 1): Junior
WMD (CARS 2): Bronze
Контроллер: Logitech G27
Откуда: Великий Новгород
Steam ID Skype

#14 Freid » 13.11.2016, 12:33

Душа перфекциониста ликует!! :good:

Guncha M
Аватара
Guncha M
Возраст: 40
Репутация: 582
Имя: Гунча
WMD (CARS 1): Full Member
Контроллер: Thrustmaster T300 RS
Откуда: Latvia
Steam ID Skype ВКонтакте

#15 Guncha » 13.11.2016, 13:29

Ай да молодец Андрюха, нет слов! :drinks:

Cake M
Аватара
Cake M
Возраст: 32
Репутация: 405
Имя: Николай
Контроллер: Thrustmaster T500 RS
Откуда: Moscow
Steam ID ICQ Skype ВКонтакте

#16 Cake » 13.11.2016, 13:30

Неистово плюсую! Всегда завидовал таким самоделкиным, т.к. самому даже лампочку в доме вкрутить лень :)

бабай M
Аватара
бабай M
Возраст: 64
Репутация: 524
Имя: Игорь
Контроллер: Logitech G27
Откуда: г.Королёв, М.О.
Steam ID YouTube

#17 бабай » 13.11.2016, 17:29

morganchik писал(а):Evgeniy Gaykin программа для данного "сетапа" составляет 354 строки
Спойлер
#include "LedControl.h"
#include <rotary.h>
#include <Keyboard.h>


// PINS for LED
#define DINPIN 10 //PIN to DIN
#define CSPIN 16 //PIN to CS
#define CLKPIN 14 //PIN to CLK

...
в коих я вообще не разбираюсь
phpBB [media]

HoRnet M
Аватара
HoRnet M
Возраст: 29
Репутация: 1809
Имя: Александр
Контроллер: Logitech G27
Откуда: Jvcr
Steam ID

#18 HoRnet » 13.11.2016, 17:42

Андрюшаааа молооодеец!!! :good:
Круто смотрится!
Тоже всегда завидовал таким ребятам, так как сам ничерта не могу.
MB: ASROCK Z68 Pro3 CPU: i7-2600k.4.5Ghz GPU: Inno3d GTX 1080 RAM: Hyper X 16Gb DDR3-1866 OS: Windows 10 Pro x64

DeNiSoN M
Аватара
DeNiSoN M
Возраст: 28
Репутация: 398
Имя: Денис
Контроллер: Thrustmaster TX
Откуда: Оренбург
Steam ID ВКонтакте

#19 DeNiSoN » 13.11.2016, 23:36

Intel Core I7 6700K @ 4.5 GHz| MSI Z270 Tomahawk| Zotac GTX 1080 TI | 16gb Corsair Vengeance 4*4 DDR4 3000 Mhz| Thrustmaster TX

morganchik M
Аватара
morganchik M
Возраст: 35
Репутация: 2187
Имя: Андрей
Контроллер: Thrustmaster T300 RS
Откуда: Нижний Новгород
Steam ID Skype YouTube ВКонтакте

#20 morganchik » 13.11.2016, 23:47

Den246ru, больше фоток давай.
дельта бесполезна за рулём, отвлекающий эффект. карс1- революция, карс2- эволюция. kapkan
ты первый, значит ты капитан. VADIK
Эй, где моя недоношенность, страдание и импотенция? thorax
Довороты по крену появляются при попытках остановить самораскачивание из за чего на руль приходят удары


Вернуться в «Беседка»



Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость