Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie

[el-contest / juli] USB Gyro

Pagina: 1
Acties:

  • Sphere-
  • Registratie: november 2003
  • Laatst online: 19:15
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:
  1. Op welke manier communiceert het apparaat met de PC?
  2. Hoe registreren we de voetbewegingen?
Ik gebruik een Atmel AVR (ATmega8) microcontroller die via USB communiceert met de PC.
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:
quote: USBGyro
llllllllplllllllllpppppllllllppppplllllllllp


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 ;)


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
Ethiek in online games
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.

Sphere- wijzigde deze reactie 29-07-2009 13:19 (62%)


  • real_FireFly
  • Registratie: april 2003
  • Laatst online: 17-01 10:55
quote:
Sphere- schreef op dinsdag 21 juli 2009 @ 23:18:

Om de voetbewegingen te registreren wil ik gebruik maken 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.

Meer over mijn project later.
Elke gyroscoop meet hoekversnellingen ;) Als je absolute hoeken wil meten heb je een accelerometer nodig, waarbij je de zwaartekracht als referentie gebruikt.

Een mems gyro heeft trouwens heel erg last van drift. Als je hem niet beweegt zal hij nooit op 0 staan.

  • Sphere-
  • Registratie: november 2003
  • Laatst online: 19:15
Startpost geupdate :)

  • Scud_racer
  • Registratie: juli 2004
  • Laatst online: 04-05-2012
Nice nice :)

Je kan het signaal van de gyro integreren om de hoek te verkrijgen ipv de hoeksnelheid. Kan evt ook hardwarematig, opamp integratortje. Potmeter gebruiken als bleedweerstand en dan kan je nog wat finetunen ook.

Probleem daarbij is dat je hierbij pas drift problemen begint te krijgen (aangezien je fouten blijft optellen)

Bricoleur by name, chipoteur by fame


  • IWriteCode
  • Registratie: juli 2000
  • Laatst online: 10-07 12:47

IWriteCode

Less = more

Ziet er indrukwekkend uit :-)!

Less = more


  • Anthor
  • Registratie: juni 2002
  • Niet online
Zeker mooi gedaan.

Ga je na de contest nog verder met het uitwerken van dit systeem?

En over het ethische aspect: Als je beter kan fraggen omdat je een zelfgebouwd apparaat aan je voet hebt, dan verdien je die voorsprong :P

  • Sphere-
  • Registratie: november 2003
  • Laatst online: 19:15
Ik denk dat ik de gyro maar weg doe na de contest.
Voor wat ik nodig heb is een mechanisch systeem handiger :)
Pagina: 1


Nintendo Switch Google Pixel XL 2 LG W7 Samsung Galaxy S8 Google Pixel 2 Sony Bravia A1 OLED Microsoft Xbox One X Apple iPhone 8

© 1998 - 2017 de Persgroep Online Services B.V. Tweakers vormt samen met o.a. Autotrack en Hardware.Info de Persgroep Online Services B.V. Hosting door True

*