Вверх ↑
Этот топик читают: Гость
Ответов: 27
Рейтинг: 2
#1: 2017-06-25 22:41:47 ЛС | профиль | цитата
Купил я сегодня геймпад от 8 битки за 140р, отрезал кабель, подключил к ардуине и через com порт получаю состояние нажатых кнопок. Каждую кнопку привязал к эмуляции нажатии кнопки на клавиатуре в винде и поиграл в эмуляторе в ретро игры.


Код залитый в atmega328 через arduino IDE
const int ground = 6;
const int pitanie = 5;
const int data = 3;
const int latch = 4;
const int clock = 2;

const int TICK = 2;

void init_joystick(int data, int latch, int clock)
{
pinMode(ground, OUTPUT);
digitalWrite(ground, LOW);
pinMode(pitanie, OUTPUT);
digitalWrite(pitanie, HIGH);

pinMode(data, INPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);

digitalWrite(clock, HIGH);
}

int get_keys_state_joystick(int data, int latch, int clock)
{
digitalWrite(latch, HIGH);
delayMicroseconds(TICK);
digitalWrite(latch, LOW);

int keys_state = 0;

for (int i = 0; i ‹ 8; ++i) {
delayMicroseconds(TICK);
digitalWrite(clock, LOW);

keys_state ‹‹= 1;
keys_state += digitalRead(data);

delayMicroseconds(TICK);
digitalWrite(clock, HIGH);
}

return keys_state;
}

void setup()
{
init_joystick(data, latch, clock);

Serial.begin(57600);
}

void loop()
{
Serial.write(get_keys_state_joystick(data, latch, clock));
//delay(100);
}
В начале кода описываются пины к которым подключён геймпад.

Код в схемы
Add(MainForm,2953706,28,210)
{
}
Add(KeyEvent,16304651,791,210)
{
Code=70
link(Code,1858476:Value,[(804,202)(797,202)])
}
Add(Edit,8622413,532,49)
{
Left=185
Top=60
}
Add(Edit,3551408,224,42)
{
Left=10
Top=5
Text="10"
}
Add(Button,3414775,42,42)
{
Left=65
Top=5
Width=100
Caption="Открыть порт"
link(onClick,15099814:doOpen,[(104,48)(104,111)])
}
Add(Button,5666030,39,81)
{
Left=170
Top=5
Width=100
Caption="Закрыть порт"
link(onClick,15099814:doClose,[(102,87)(102,118)])
}
Add(COM,15099814,224,105)
{
BaudRate=18
link(onRead,3801151:doConvert,[])
link(Port,3551408:Text,[])
}
Add(Hub,8432047,413,112)
{
OutCount=3
link(onEvent2,2793908:doEvent1,[(449,125)(449,167)])
link(onEvent3,15099814:doRXClear,[(438,132)(438,157)(212,157)(212,125)])
}
Add(Timer,6576675,35,126)
{
Interval=5
link(onTimer,1301431:doData,[])
}
Add(DoData,1301431,77,126)
{
Data=Integer(1)
link(onEventData,15099814:doRead,[(121,132)(121,139)])
}
Add(Convertor,3801151,280,112)
{
Mode=3
Digits=8
link(onResult,7886364:doConvert,[])
}
Add(Convertor,7886364,350,112)
{
Mode=8
Digits=8
link(onResult,8432047:doEvent1,[])
}
Add(Copy,37953,497,161)
{
Position=1
Count=1
link(onCopy,2105035:doCompare,[(540,167)(540,216)])
}
Add(IndexToChanel,6051477,679,210)
{
link(onEvent1,16304651:doPressDown,[(759,216)(759,223)])
link(onEvent2,16304651:doPressUp,[(751,223)(751,230)])
}
Add(Memory,1858476,791,161)
{
Default=Integer(90)
}
Add(Memory,9726723,574,154)
{
link(onData,6051477:doEvent,[(642,160)(642,216)])
}
Add(If_else,2105035,567,210)
{
Type=5
link(onTrue,9726723:doValue,[(611,216)(611,199)(556,199)(556,160)])
link(Op2,9726723:Value,[])
}
Add(Hub,2793908,455,161)
{
OutCount=5
link(onEvent1,37953:doCopy,[])
link(onEvent2,8111869:doCopy,[(492,174)(492,314)])
link(onEvent3,5434267:doCopy,[(479,181)(479,440)])
link(onEvent4,11566599:doCopy,[(479,188)(479,538)])
link(onEvent5,14266160:doEvent1,[(442,195)(442,151)(879,151)(879,167)])
}
Add(KeyEvent,1675389,798,357)
{
Code=70
link(Code,10825467:Value,[(811,349)(804,349)])
}
Add(Copy,8111869,511,308)
{
Position=2
Count=1
link(onCopy,12816122:doCompare,[(547,314)(547,363)])
}
Add(IndexToChanel,12902943,686,357)
{
link(onEvent1,1675389:doPressDown,[(766,363)(766,370)])
link(onEvent2,1675389:doPressUp,[(758,370)(758,377)])
}
Add(Memory,10825467,798,308)
{
Default=Integer(88)
}
Add(Memory,9656653,581,301)
{
link(onData,12902943:doEvent,[(649,307)(649,363)])
}
Add(If_else,12816122,574,357)
{
Type=5
link(onTrue,9656653:doValue,[(618,363)(618,346)(563,346)(563,307)])
link(Op2,9656653:Value,[])
}
Add(KeyEvent,9819586,798,483)
{
Code=70
link(Code,1451119:Value,[(811,475)(804,475)])
}
Add(Copy,5434267,490,434)
{
Position=3
Count=1
link(onCopy,3513055:doCompare,[(547,440)(547,489)])
}
Add(IndexToChanel,9874587,686,483)
{
link(onEvent1,9819586:doPressDown,[(766,489)(766,496)])
link(onEvent2,9819586:doPressUp,[(758,496)(758,503)])
}
Add(Memory,1451119,798,434)
{
Default=Integer(67)
}
Add(Memory,4737465,581,427)
{
link(onData,9874587:doEvent,[(649,433)(649,489)])
}
Add(If_else,3513055,574,483)
{
Type=5
link(onTrue,4737465:doValue,[(618,489)(618,472)(563,472)(563,433)])
link(Op2,4737465:Value,[])
}
Add(KeyEvent,15331875,798,581)
{
Code=70
link(Code,11023253:Value,[(811,573)(804,573)])
}
Add(Copy,11566599,490,532)
{
Position=4
Count=1
link(onCopy,8426926:doCompare,[(547,538)(547,587)])
}
Add(IndexToChanel,10338145,686,581)
{
link(onEvent1,15331875:doPressDown,[(766,587)(766,594)])
link(onEvent2,15331875:doPressUp,[(758,594)(758,601)])
}
Add(Memory,11023253,798,532)
{
Default=Integer(86)
}
Add(Memory,16067553,581,525)
{
link(onData,10338145:doEvent,[(649,531)(649,587)])
}
Add(If_else,8426926,574,581)
{
Type=5
link(onTrue,16067553:doValue,[(618,587)(618,570)(563,570)(563,531)])
link(Op2,16067553:Value,[])
}
Add(KeyEvent,7981141,1253,210)
{
Code=70
link(Code,8475793:Value,[(1266,202)(1259,202)])
}
Add(Copy,1113545,959,161)
{
Position=5
Count=1
link(onCopy,12295877:doCompare,[(1002,167)(1002,216)])
}
Add(IndexToChanel,4059665,1141,210)
{
link(onEvent1,7981141:doPressDown,[(1221,216)(1221,223)])
link(onEvent2,7981141:doPressUp,[(1213,223)(1213,230)])
}
Add(Memory,8475793,1253,161)
{
Default=Integer(38)
}
Add(Memory,6136433,1036,154)
{
link(onData,4059665:doEvent,[(1104,160)(1104,216)])
}
Add(If_else,12295877,1029,210)
{
Type=5
link(onTrue,6136433:doValue,[(1073,216)(1073,199)(1018,199)(1018,160)])
link(Op2,6136433:Value,[])
}
Add(Hub,14266160,917,161)
{
OutCount=4
link(onEvent1,1113545:doCopy,[])
link(onEvent2,15733713:doCopy,[(954,174)(954,314)])
link(onEvent3,12057448:doCopy,[(941,181)(941,440)])
link(onEvent4,2209892:doCopy,[(941,188)(941,538)])
}
Add(KeyEvent,15056666,1260,357)
{
Code=70
link(Code,1186809:Value,[(1273,349)(1266,349)])
}
Add(Copy,15733713,973,308)
{
Position=6
Count=1
link(onCopy,7177938:doCompare,[(1009,314)(1009,363)])
}
Add(IndexToChanel,15754519,1148,357)
{
link(onEvent1,15056666:doPressDown,[(1228,363)(1228,370)])
link(onEvent2,15056666:doPressUp,[(1220,370)(1220,377)])
}
Add(Memory,1186809,1260,308)
{
Default=Integer(40)
}
Add(Memory,4153591,1043,301)
{
link(onData,15754519:doEvent,[(1111,307)(1111,363)])
}
Add(If_else,7177938,1036,357)
{
Type=5
link(onTrue,4153591:doValue,[(1080,363)(1080,346)(1025,346)(1025,307)])
link(Op2,4153591:Value,[])
}
Add(KeyEvent,9753738,1260,483)
{
Code=70
link(Code,1861134:Value,[(1273,475)(1266,475)])
}
Add(Copy,12057448,952,434)
{
Position=7
Count=1
link(onCopy,14685882:doCompare,[(1009,440)(1009,489)])
}
Add(IndexToChanel,784659,1148,483)
{
link(onEvent1,9753738:doPressDown,[(1228,489)(1228,496)])
link(onEvent2,9753738:doPressUp,[(1220,496)(1220,503)])
}
Add(Memory,1861134,1260,434)
{
Default=Integer(37)
}
Add(Memory,14774826,1043,427)
{
link(onData,784659:doEvent,[(1111,433)(1111,489)])
}
Add(If_else,14685882,1036,483)
{
Type=5
link(onTrue,14774826:doValue,[(1080,489)(1080,472)(1025,472)(1025,433)])
link(Op2,14774826:Value,[])
}
Add(KeyEvent,5662107,1260,581)
{
Code=70
link(Code,424297:Value,[(1273,573)(1266,573)])
}
Add(Copy,2209892,952,532)
{
Position=8
Count=1
link(onCopy,5373165:doCompare,[(1009,538)(1009,587)])
}
Add(IndexToChanel,16306244,1148,581)
{
link(onEvent1,5662107:doPressDown,[(1228,587)(1228,594)])
link(onEvent2,5662107:doPressUp,[(1220,594)(1220,601)])
}
Add(Memory,424297,1260,532)
{
Default=Integer(39)
}
Add(Memory,5689337,1043,525)
{
link(onData,16306244:doEvent,[(1111,531)(1111,587)])
}
Add(If_else,5373165,1036,581)
{
Type=5
link(onTrue,5689337:doValue,[(1080,587)(1080,570)(1025,570)(1025,531)])
link(Op2,5689337:Value,[])
}


Кнопки которые эмулируются:

    Кнопка A = Z
    Кнопка B = X
    Кнопка Start = C
    Кнопка Mode = V
    Крестовина = Кнопки со стрелками на клавиатуре

Редактировалось 1 раз(а), последний 2017-06-25 22:44:43
карма: 0

2
Голосовали:ser_davkin, tig-rrr
vip
#1.1контекстная реклама от партнеров
Ответов: 88
Рейтинг: 20
#2: 2017-06-25 22:48:58 ЛС | профиль | цитата
Классно, вот сам хотел сделать, большое спасибо!
карма: 0
Ильичёв IKA
0
2
Сообщение
...
Прикрепленные файлы
(файлы не залиты)