Styra Arduino med Gamepad (3 / 5 steg)

Steg 3: Att få INPUT från GAMEPAD



Nu, att vi vet hur att skicka information till Arduino, vi behöver bara lära sig att få input från XBOX gamepad.

I detta avsnitt kommer vi lära sig grunderna i XInput och skriva ett mycket enkelt program som visar nuvarande gamepad läge i konsolen utdata. Vi får också lära dig några viktiga aspekter av förbehandling indatavärden för att undvika problematiska thumbstick input spänner ("döda zoner").

GRUNDERNA

XInput API tillhandahåller de emot ljud från XBOX 360-handkontroller och innehåller en mängd verktyg ange controller effekterna (fars feedback), bearbeta ljud ingång/utgång för headset och göra andra saker.

XInput stöder upp till 4 controllers, men i vår situation endast controller #0 används som standard.

Vi kommer använda XInputGetState() -funktionen för att uppdatera det aktuella läget för gamepad. Det tar 2 parametrar: gamepad ID (som är 0 i de flesta fall) och pekaren till XInput staten variabel. Returvärdet för XInputGetState kan användas för att kontrollera tillgängligheten för gamepad. Värdet av ERR_SUCCESS innebär att gamepad är på, och XInput staten nu har sin nuvarande tillstånd.

XINPUT_STATE består av följande delar:

TypeDef struct _XINPUT_STATE {
DWORD-dwPacketNumber;
XINPUT_GAMEPAD Gamepad;
} XINPUT_STATE;

dwPacketNumber anger om gamepad staten har förändrats.

Gamepad är en datatyp, vilket motsvarar nuvarande gamepad staten, inklusive thumbstick positioner, trigger värden, D-knappen och knappen flaggor.

TypeDef struct _XINPUT_GAMEPAD {
ORDET wButtons;
BYTE bLeftTrigger;
BYTE bRightTrigger;
KORTA sThumbLX;
KORTA sThumbLY;
KORTA sThumbRX;
KORTA sThumbRY;
} XINPUT_GAMEPAD;

sThumbLX, sThumbLY, sThumbRX och sThumbRY är 16-bitars undertecknat heltal, som tar värden från −32, 768 till 32 767. Dessa motsvarar nuvarande thumbstick positioner.

bLeftTrigger och bRightTrigger ta värden i 0..255 sortiment.

wButtons representerar statligt av alla knappar på ett XBox controller, där varje bit motsvarar aktuell status för varje enskild knapp. Om vi vill kolla om på X-knappen trycktes vi behöver utföra följande operationer:

XINPUT_STATE gpState; Skapa staten variabel
MEMSET (& gpState,0,sizeof(XINPUT_STATE)); Tillstånd
DWORD-res = XInputGetState (0, & gpState); Få nya stat
IF(gpState.wButtons & 0x4000)
{
printf ("Xplosive kick! \n");
}

I följande lista visas alla knappar och deras motsvarande bitmaskar:

XINPUT_GAMEPAD_DPAD_UP 0X0001
XINPUT_GAMEPAD_DPAD_DOWN 0X0002
XINPUT_GAMEPAD_DPAD_LEFT 0X0004
XINPUT_GAMEPAD_DPAD_RIGHT 0X0008
XINPUT_GAMEPAD_START 0X0010
XINPUT_GAMEPAD_BACK 0X0020
XINPUT_GAMEPAD_LEFT_THUMB 0x0040 / / detta är thumbstick knappar
XINPUT_GAMEPAD_RIGHT_THUMB 0X0080
XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100 / / vänster stötfångare
XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200 / / höger stötfångare
XINPUT_GAMEPAD_A 0X1000
XINPUT_GAMEPAD_B 0X2000
XINPUT_GAMEPAD_X 0X4000
XINPUT_GAMEPAD_Y 0X8000


LÅT OSS ÖVA

På denna punkt har vi alla verktyg vi behöver för att skriva vårt första program med XInput. Det blir skrattretande enkla, men det hjälper för att förstå hur denna process fungerar och vilka delar av XInput vi behöver.

#include "stdafx.h"
#include < Windows.h >
#include < XInput.h >

#pragma kommentar (lib, "XInput.lib") / / krävs för linker

int _tmain (int argc, _TCHAR * argv[])
{
XINPUT_STATE gpState; Gamepad staten
int spelare = -1; Gamepad-ID

Polling alla 4 spelkontroller för att se vem som är vid liv
för (int jag = 0; jag < 4; i ++)
{
DWORD-res = XInputGetState (i, & gpState); Att få tillstånd
IF(res==ERROR_SUCCESS) / / om levande - print meddelande
{
printf ("Controller #%d är ON! \n", i + 1);
Player = i. Tilldela sista levande gamepad som aktiv
}
}
IF(Player<0) / / om spelare ==-1 alltså...
{
printf ("har inte hittat någon gamepads...\n");
}
annat
{
While(true)
{
system("CLS"); Tydlig skärm
MEMSET (& gpState,0,sizeof(XINPUT_STATE)); Tillstånd
DWORD-res = XInputGetState (0, & gpState); Få nya stat
printf("LX\tLY\tRX\tRY\tLTrig\tRTrig\tButtons\n"); Skriva ut huvudet

Thumbstick värden är dividerat med 256 för bättre konsistens
printf ("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
gpState.Gamepad.sThumbLX/256,
gpState.Gamepad.sThumbLY/256,
gpState.Gamepad.sThumbRX/256,
gpState.Gamepad.sThumbRY/256,
gpState.Gamepad.bLeftTrigger,
gpState.Gamepad.bRightTrigger,
gpState.Gamepad.wButtons);
}
}
system("PAUSE");
Return 0;
}

En gång du bygger lösningen och köra ditt program, kommer du att se utdata ändrar när du flyttar styrspakar eller tryckknappar på din gamepad. Vi skickar informationen till Arduino ombord i nästa avsnitt av denna handledning.

Just nu jag vill du ska uppmärksamma utdata, när du inte gör något. Värden av LX, RX, LY och RY är inte lika med 0, som vi förväntar oss att de. Detta sker för ett antal skäl, men det viktigaste är att vi är medvetna om detta fenomen!

Dessa svängningar och inkonsekvenser i värden kallas "döda zoner". Vi måste hitta lägsta marginell värdet som vi kan överväga att med styrspak faktiskt trycks i någon riktning för att bli av denna otäck anomali.

Så vi måste definiera en deadzone tröskel och jämför aktuella värden. Kolla in MSDN referens för mer information.

Under tiden använda denna exempelkod för att korrigera dessa värden:

flyta LX = gpState.Gamepad.sThumbLX; Få LX
flyta LY = gpState.Gamepad.sThumbLY; Få LY
storlek = sqrt(LX*LX+LY*LY); Beräkna radien av nuvarande position
IF(Magnitude < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) / / insida död zon?
{
Ställ allt till 0
LX = 0,0;
LY = 0,0;
}
Gör samma sak för RX och RY

Det finns också fördefinierade död zon värden för vänster och höger styrspakar och utlösare. Du kan använda dessa, eller definiera dina egna trösklar (i mitt fall ~ 6500 arbetat för vänster och höger sticka), men tänk på att dessa värden till stor del beror på hur beat-up din gamepad är!

#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849
#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD 30


YTTERLIGARE LÄSNING

Endast ytterligare medel jag ska nämna är den här en: XInput spel Controller API: er

Det har allt du behöver veta om XInput, inbegripet komplett och användbar programmering guide.

Det var allt för denna del. Nu, låt oss försöka att kombinera våra kunskaper i programmering gamepads och seriella anslutningar till kontroll Arduino distans! ... om du glömde där vi började...

Se Steg
Relaterade Ämnen

Styra Arduino med Android-telefon via Bluetooth

Hej gott folk, här kan du lära dig hur man styr Arduino med Android-telefon via Bluetooth. Du kan använda din smartphone som en fjärrkontroll för dig hem belysningssystem eller du kan använda som en drone remote etc.För att göra anslutningen mellan A...

Styra Arduino med Blynk [USB] [nybörjare] trådlöst var som helst i världen

här är hur du styr arduino med blynk via USB från var som helst i världen!Steg 1: Här är hur du styr arduino med blynk via USB från var som helst i världen!titta och njut!...

Hur man styr arduino med ett mail

Det finns många lösningar för att styra en Arduino ombord: web lösningar, desktopen applicering lösningar, lösningar. Men hur mail? Ja, du kan hitta något på nätet men de behöver ethernet sköldar och ofta är Arduino som skickar e-post. Jag kontroll A...

Styra arduino med Blynk över usb

Detta är min andra instructable. I detta instructable jag visar hur man styr LED med Blynk.Blynk är program som ger oss instrumentpanel samt connectivity. som du kan hämta den från google spela store (för Android). & app store (för apple) .using blyn...

Styra Arduino med python based web API (ingen php)

I denna guide kommer jag visa dig hur att kontrollera din arduino enhet från en webbsida! Efteråt, jag ska visa dig hur man styr din arduino från din mobila enhet och även skapa en webb-baserad API för att styra din arduino från din webbsida med andr...

Styra arduino med Blynk via usb

Detta är min andra instructable. I detta instructable jag visar hur man styr LED med Blynk.Blynk är program som ger oss instrumentpanel samt connectivity. som du kan hämta den från google spela store (för Android). & app store (för apple) .using blyn...

Styra Arduino med Facebook - det enkla sättet

Hej vänner idag jag ska visa dig hur du ansluter din Arduino till FACEBOOK och fjärrstyra din Arduino från var som helst i världen genom ditt Facebook-konto. OK det här är hur det fungerar, det finns en Facebook-konto som är ansluten till Arduino via...

Styra Arduino med PHP

Jag har nyligen sett en hel del problem när det gäller PHP och Arduino. Många människor vet inte om fakta som en arduino behöver en 2 sekunders fördröjning för (!) innan den kan ta emot meddelanden genom följetong. Det finns några andra fakta du behö...

Styra Arduino med Bluetooth (tvåspråkig Lesson)(Arabic/English)

يتيح لك هذا الدرس التحكم بتشغيل ضوء الليد عن طريق الجوال بنظام الاندرويد و يشرح كيفية عمل لوح التحكم الاردوينو مع قطعة البلوتوثDenna lektion gör att du kan styra en LED använder en Android-telefon samt förklara hur Arduino interagerar med Bluetooth-m...

Styra arduino med visual studio via bluetooth

Hej alla,Här kommer att vi kontrollera en ledde via bluetooth med din dator av en progam wirtten med visual studiovad du behöver är:1) Arduino (en)2) Bluetooth-modul (hc05 eller hc 06)3) ledde4) 2 motstånd (10ko och 15ko)och du kan göra det ;)alla ko...

Styra Arduino med visual basic 6.0

Detta instructable är en del av min bok Arduino + visual basic 6.0 (gör din egen mjukvara till kontroll arduino Robot.Visual basic 6.0 är en mycket gammal version som vissa människor kan fråga varför vi vill använda visual basic 6.0. Visual basic 6.0...

Styra arduino med joystick

efter ungefär en månad av har min arduino fick jag uttråkad så jag surfade på nätet och fann detta cool sätt att kontrollera arduinoOm du gör någon sak olaglig är jag inte hållas ansvarigaSteg 1: saker som behövs 1. arduino (duh)2. dator (om du läser...

Pyduino, gränssnitt Arduino med Python via seriell kommunikation

Lär dig hur gränssnittet arduino via seriell kommunikation med python med hjälp av pyduino biblioteket. Det finns några andra tutorials ute på instructables om hur gränssnittet arduino med python men de Visa inte dig hur man gör allt, där förhoppning...

Hack-A-lampan eller hur man kontrollerar Arduino med din smartphone

Jag fick en ikea-lampa i min lägenhet, det fungerar bra, vänd om, vänd bort... som allt det gör. Det är kindy tråkig, inte sant? Jag tänkte, Tänk om jag hacka den? Sedan kommer RGB-lysdioder till mitt huvud och idéer började flöda.På jobbet visste ja...

Styra en Arduino med PHP

här är hur man gör din Arduino göra saker från över internet utan en ethernet eller wifi sköld. Detta är ett enkelt sätt att göra ditt projekt kunna kontrolleras från var som helst i världen!Steg 1: Plattform kompatibilitetDenna metod kommer inte att...

Styra Arduino trådlöst med MATLAB

varit att se några DIYs på hur du upprättar en kommunikation mellan MATLAB ansökan och Arduino som är hårdkodade till PC. Men har inte jag stött på något som styr Arduino via MATLAB trådlöst via ENC28J60 kompatibel Ethernet shield. I denna kompatibel...

Styra enheter med röststyrning med android och arduino

Denna kompatibel kommer att tjäna frågor som, hur att styra enheter av röstkommandon, taligenkänning finns i android.Alla android enheter levereras med den inbyggda taligenkänningen. Detta kan användas för att konvertera tal till text, genom att blue...

Styra Arduino RoverBot med TV-fjärrkontrollen

jag är en dålig 15 år gammal Arduino hacka, som har liten tillgång på delar och material för att bygga en högteknologisk robot. Jag är säker på att det finns många andra där ute som är i min situation. Detta lilla Instructable kommer förklara och vis...

Arduino Nano och Visuino: styr Servo med Rotary Encoder

Det finns en hel del Instructables på hur man styr Servo med potentiometer, men ibland är det bra att styra med en Rotary Encoder. I detta Instructable kommer jag visa dig hur lätt det är att genomföra detta med hjälp av Visuino - en enkel att använd...