Inleiding
Iedereen die wel eens een spelletje in het genre First Person Shooter speelt heeft wel eens opgemerkt dat het vaak lastig is om tijdig op de toetsen te drukken die verder van de vingers afstaan. Het zou erg handig zijn als je ook op andere manieren input kan geven aan de computer om je handen een beetje te ontlasten. Helaas heb ik geen tijd om iets te ontwerpen ala project natal
. Ik zit al erg lang met het idee om je voeten te gebruiken als extra input. Je moet hierbij denken aan een soort pedaal. Er bestaan al commeriele systemen die een pedaal gebruiken als input (denk aan race games), echter of deze voor FPS games ook te gebruiken zijn weet ik niet. Verder is het natuurlijk veel leuker om zoiets zelf te maken.
Ontwerp
De twee belangrijkste dingen waarover nagedacht moest worden:
Hierbij gedraagt het apparaat zich als toetsenbord. In een game kan je dus gewoon de functies binden aan de key codes die het apparaat stuurt. De microcontroller die ik gebruik heeft geen hardware aan boord
voor USB. Dit lossen we op door een software USB stack te gebruiken. Deze USB stack voldoet niet helemaal aan de specificaties maar werkt goed genoeg voor hobbyisten. De voeding van het apparaat wordt verzorgd door de USB bus. Zolang we minder dan 100mA gebruiken hoeven we geen problemen te verwachten.
Om de voetbewegingen te registreren heb ik gebruik gemaakt van een gyroscoop. Hiervoor heb ik een module gekocht bij sure-electronics. Helaas is het geen 'normale' gyroscoop maar een 'angular rate sensor'. Het registreert dus de verandering van de hoek per tijdseenheid in plaats van de hoek zelf. Deze module heeft een onboard AD converter die te interfacen is via I2C. Verder wordt het analoge signaal van de gyroscoop ook naar buiten gebracht.
De schematics van mijn project zijn hier te vinden.
Implementatie
Schematische weergave

Hardware
Aanvankelijk was het de bedoeling een PCBtje te ontwikkelen echter door tijdgebrek heb ik van af gezien.
Mijn implementatie op gaatjesbord wijkt een klein beetje af van de schematics. Het voornaamste verschil is dat I2C niet is geimplementeerd. Ik maak gebruik van de ADC die in de Atmel AVR microcontroller zit.
foto's:
Microcontroller module boven en gyroscoop module onder:

Microcontroller module:

Gyroscoop module:

Software
Mijn implementatie is gebaseerd op het HIDKeys
project wat een demonstratie project is voor een toetsenbord interface met V-USB.
Toegevoegd is de initalisatie van de AD converter en een interrupt routine die uitgevoerd wordt als een conversie klaar is.
De oorspronkelijke code roept in een loop keyPressed() aan. Deze functie leest de toetsen in. De functie returned 0 als geen toets is ingedrukt of een index in de tabel met keys. Deze functie is aangepast door in plaats van naar de toetsen te kijken de ADC resultaten te gebruiken. Het ADC gedeelte is geimplementeerd als een soort (finite) state machine.
De belangrijkste delen code:
Demonstratie

Dit stukje is met de USB Gyro getypt:
Naar links en rechts leunen in Medal of Honor:
Naar links en rechts draaien in Medal of Honor:
Look mom, no hands!
Aan een pedaalachtig iets ben ik niet toegekomen maar klitteband is een goede vervanger
[YouTube: http://www.youtube.com/watch?v=Eqr9CX7oSF0]
Status ledjes
Project Downloaden
Mijn project is hier te downloaden en te gebruiken onder de GPLv2 Licentie.
De zipfile bevat het volgende:
Vinden jullie dat je dit soort dingen mag gebruiken in online games?
Mits goed toegepast kan dit voordeel opleveren tov de tegenstander.
Ik ben van mening dat je het mag gebruiken. Volledige gelijkheid heeft nooit bestaan.
Nu heeft de een een snellere computer, snellere grafische kaart, snellere internetverbinding, speciaal gamers toetsenbord etc. dat de ander niet heeft.
Iedereen die wel eens een spelletje in het genre First Person Shooter speelt heeft wel eens opgemerkt dat het vaak lastig is om tijdig op de toetsen te drukken die verder van de vingers afstaan. Het zou erg handig zijn als je ook op andere manieren input kan geven aan de computer om je handen een beetje te ontlasten. Helaas heb ik geen tijd om iets te ontwerpen ala project natal
Ontwerp
De twee belangrijkste dingen waarover nagedacht moest worden:
- Op welke manier communiceert het apparaat met de PC?
- Hoe registreren we de voetbewegingen?
Hierbij gedraagt het apparaat zich als toetsenbord. In een game kan je dus gewoon de functies binden aan de key codes die het apparaat stuurt. De microcontroller die ik gebruik heeft geen hardware aan boord
voor USB. Dit lossen we op door een software USB stack te gebruiken. Deze USB stack voldoet niet helemaal aan de specificaties maar werkt goed genoeg voor hobbyisten. De voeding van het apparaat wordt verzorgd door de USB bus. Zolang we minder dan 100mA gebruiken hoeven we geen problemen te verwachten.
Om de voetbewegingen te registreren heb ik gebruik gemaakt van een gyroscoop. Hiervoor heb ik een module gekocht bij sure-electronics. Helaas is het geen 'normale' gyroscoop maar een 'angular rate sensor'. Het registreert dus de verandering van de hoek per tijdseenheid in plaats van de hoek zelf. Deze module heeft een onboard AD converter die te interfacen is via I2C. Verder wordt het analoge signaal van de gyroscoop ook naar buiten gebracht.
De schematics van mijn project zijn hier te vinden.
Implementatie
Schematische weergave

Hardware
Aanvankelijk was het de bedoeling een PCBtje te ontwikkelen echter door tijdgebrek heb ik van af gezien.
Mijn implementatie op gaatjesbord wijkt een klein beetje af van de schematics. Het voornaamste verschil is dat I2C niet is geimplementeerd. Ik maak gebruik van de ADC die in de Atmel AVR microcontroller zit.
foto's:
Microcontroller module boven en gyroscoop module onder:

Microcontroller module:

Gyroscoop module:

Software
Mijn implementatie is gebaseerd op het HIDKeys
project wat een demonstratie project is voor een toetsenbord interface met V-USB.
Toegevoegd is de initalisatie van de AD converter en een interrupt routine die uitgevoerd wordt als een conversie klaar is.
De oorspronkelijke code roept in een loop keyPressed() aan. Deze functie leest de toetsen in. De functie returned 0 als geen toets is ingedrukt of een index in de tabel met keys. Deze functie is aangepast door in plaats van naar de toetsen te kijken de ADC resultaten te gebruiken. Het ADC gedeelte is geimplementeerd als een soort (finite) state machine.
De belangrijkste delen code:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| #define NEUTRAL 0 #define RIGHT 1 #define LEFT 2 #define V_NEUTRAL 70 /* ADC value when gyroscope is not rotating, 1350mV */ #define V_DIF_HIT 4 /* units of ~19.5mA, this value determines the sensitivity */ #define LED_R PD7 #define LED_L PB0 #define LED_R_ON() PORTD |= (1<<LED_R) #define LED_R_OFF() PORTD &= ~(1<<LED_R) #define LED_L_ON() PORTB |= (1<<LED_L) #define LED_L_OFF() PORTB &= ~(1<<LED_L) uint8_t result; volatile unsigned char state = NEUTRAL; /* ADC conversion complete interrupt * service routine */ ISR(ADC_vect) { result = ADCH; if (result >= (V_NEUTRAL + V_DIF_HIT)) { state = RIGHT; LED_R_ON(); LED_L_OFF(); } else if (result <= (V_NEUTRAL - V_DIF_HIT)) { state = LEFT; LED_L_ON(); LED_R_OFF(); } else { state = NEUTRAL; LED_R_OFF(); LED_L_OFF(); } } #define NUM_KEYS 17 //#define SINGLE_KEY /* The following function returns an index for the key to send. * if SINGLE_KEY is defined it will send 0 back if the state did not change * or the state changed to neutral. If it is not defined it does not check for * state changes but just sends back the value representing the state. * See keyReport array for the keys that are returned. */ static uchar keyPressed(void) { char temp_state = state; /* buffer the state value to avoid concurrency problems */ #ifdef SINGLE_KEY static char prev_state = NEUTRAL; if (prev_state != temp_state) { prev_state = temp_state; #endif switch(temp_state) { case NEUTRAL: return 0; case RIGHT: return 1; case LEFT: return 2; default: /* illegal state! */ return 0; } #ifdef SINGLE_KEY } else { /* no state change so send 0 back */ return 0; } #endif } |
Demonstratie

Dit stukje is met de USB Gyro getypt:
[YouTube: http://www.youtube.com/watch?v=stvdJf0cJSM]quote: USBGyrollllllllplllllllllpppppllllllppppplllllllllp
Naar links en rechts leunen in Medal of Honor:
Naar links en rechts draaien in Medal of Honor:
Look mom, no hands!
Aan een pedaalachtig iets ben ik niet toegekomen maar klitteband is een goede vervanger
[YouTube: http://www.youtube.com/watch?v=Eqr9CX7oSF0]
Status ledjes
Project Downloaden
Mijn project is hier te downloaden en te gebruiken onder de GPLv2 Licentie.
De zipfile bevat het volgende:
- Schematics
- Sourcecode firmware
- Hex file firmware
- Altium Designer work files voor schematic, pcb (niet af) en lib
- Gebruikte datasheets
Vinden jullie dat je dit soort dingen mag gebruiken in online games?
Mits goed toegepast kan dit voordeel opleveren tov de tegenstander.
Ik ben van mening dat je het mag gebruiken. Volledige gelijkheid heeft nooit bestaan.
Nu heeft de een een snellere computer, snellere grafische kaart, snellere internetverbinding, speciaal gamers toetsenbord etc. dat de ander niet heeft.
[ Voor 62% gewijzigd door Sphere- op 29-07-2009 13:19 ]