Inhoudsopgave:

Xbox 360 Controller Accelerometer/gyro Steering Mod - Ajarnpa
Xbox 360 Controller Accelerometer/gyro Steering Mod - Ajarnpa

Video: Xbox 360 Controller Accelerometer/gyro Steering Mod - Ajarnpa

Video: Xbox 360 Controller Accelerometer/gyro Steering Mod - Ajarnpa
Video: Xbox 360 Gamepad with Arduino gyroscope MPU6050 / steering wheel / FPS / like on Steam controller 2024, November
Anonim
Xbox 360 Controller Accelerometer/gyro Steering Mod
Xbox 360 Controller Accelerometer/gyro Steering Mod

Ik speel Assetto Corsa met mijn Xbox 360-controller. Helaas is het sturen met de analoge stick erg onpraktisch en heb ik niet de ruimte voor een wielopstelling. Ik probeerde manieren te bedenken waarop ik een beter stuurmechanisme in de controller kon schoenlepelen, toen het bij me opkwam dat ik de hele controller als stuur kon gebruiken.

De analoge stick heeft twee potmeters. De ene meet verticale beweging en de andere meet horizontale beweging. Het zet 1,6 V door elk en meet de spanning die bij de wisser wordt geproduceerd om te bepalen hoeveel de stick heeft bewogen. Dit betekent dat het mogelijk is om de beweging van de stick te controleren door een bepaalde spanning aan de wisserpen te geven. (meer informatie hier:

Deze mod gebruikt een Arduino om de hoek te berekenen uit accelerometermetingen en deze via een DAC om te zetten in analoge stickbewegingen. Daarom zou het moeten werken met elk spel dat de analoge stick als invoer gebruikt.

Stap 1: Je hebt nodig:

Gereedschap:

  • Soldeerbout
  • Soldeer
  • Soldeerzuiger/vlecht
  • Draadstripper
  • Een schroevendraaier, misschien een Torx, afhankelijk van de schroeven in je controller (de mijne zijn kruiskop)
  • Lijm (liefst geen supersterke lijm om later uit elkaar te halen)
  • Een USB naar serieel adapter om de Arduino te programmeren

Materialen:

  • Xbox 360-controller (duh!)
  • Arduino Pro Mini (of een kloon) (bij voorkeur 3,3V. Als je de 5V-versie gebruikt, heb je waarschijnlijk een step-up spanningsomvormer nodig)
  • Een MPU-6050 gyroscoop/versnellingsmeter
  • Een MCP4725 DAC (twee als je beide assen wilt aansturen)
  • Wat dunne draad
  • Een breadboard zodat je alles kunt testen voordat je gaat solderen (optioneel, maar aanbevolen)

Stap 2: Haal de controller uit elkaar

Haal de controller uit elkaar
Haal de controller uit elkaar
Haal de controller uit elkaar
Haal de controller uit elkaar
Haal de controller uit elkaar
Haal de controller uit elkaar

Er zijn zeven schroeven die u moet verwijderen. Zes daarvan liggen voor de hand, maar de zevende zit achter een sticker. Ik neem aan dat het verwijderen van uw garantie uw garantie ongeldig maakt, dus ga op eigen risico te werk. Veel handleidingen zeggen dat je een Torx-schroevendraaier nodig hebt, maar de mijne is een kruiskop, dus controleer je controller.

Wrik daarna voorzichtig de achterklep los. Als je de voorkant loswrikt, vallen de knoppen naar buiten en gaan ze waarschijnlijk door de hele kamer. Til het vanaf de onderkant op. Koppel vervolgens de twee vibratiemotoren los. (die met het kleine gewicht moet aan de linkerkant zitten en die met het grote gewicht aan de rechterkant) Haal de print eruit en verwijder de rubberen dopjes van de analoge sticks. Ze trekken er gewoon uit.

Het volgende ding is om de linker analoge stick te verwijderen, zodat deze onze invoer niet verstoort, maar het linker triggermechanisme zit in de weg. Om het te verwijderen, moet u de drie pinnen van de potentiometer aan de voorkant van het bord losmaken en vervolgens het mechanisme van de print losmaken.

Desoldeer vervolgens de 14 pinnen die de linker analoge stick vasthouden. Trek dan de stok eraf.

Stap 3: Plak de componenten op hun plaats

Plak de componenten op hun plaats
Plak de componenten op hun plaats
Plak de componenten op hun plaats
Plak de componenten op hun plaats

Je zult merken dat er behoorlijk wat speling is tussen de achterkant van de printplaat en de behuizing. Dit maakt het mogelijk om alle hardware in de koffer te plaatsen zonder iets te verwijderen.

Ik realiseerde me pas later, maar dit zou een goed moment zijn om de resetknop op de Arduino te desolderen. Als je dat niet doet, zal het op de achterkant van de behuizing drukken en ervoor zorgen dat het project stopt met werken als je een van de schroeven te strak aandraait bij het opnieuw monteren.

Ik heb een dun stukje kaart op de achterkant van elke PCB geplakt om het te isoleren, en dat vervolgens op de PCB van de controller geplakt. Ik was terughoudend om lijm te gebruiken, maar kon geen betere manier bedenken om het te doen.

De posities in de afbeelding is de beste combinatie die ik kon vinden. De Arduino zit aan de linkerkant, met de rand met de resetknop vlak tegen het stuk plastic van het rechter triggermechanisme, met de andere kant onder de draad en met de hoek zo dicht mogelijk bij de witte connector. Er zit een kleine bobbel in de hoes, maar ik kon geen betere plek vinden om hem te plaatsen.

De versnellingsmeter bevindt zich rechts van de draad. Het moet zo plat en zo recht mogelijk zijn, anders moet je misschien later wat code schrijven om de offset te compenseren. Merk op dat er enkele uitstekende stukjes plastic aan de achterkant van de behuizing zijn die u voorzichtig moet vermijden. Ik heb ontdekt dat je iets plakkerigs en kleurrijks, zoals lippenstift, op de uitstekende stukjes plastic kunt doen en dan de achterkant erop kunt plaatsen om te zien waar het sporen achterlaat.

De DAC('s) gaan in de linkerbenedenhoek. Er is hier voldoende ruimte om twee DAC's op elkaar te stapelen, als je beide assen wilt besturen. Je hoeft ze niet vast te lijmen. Ze blijven waar ze zijn met alleen de gesoldeerde verbindingen. Als je er een kaart tussen steekt, zorg er dan voor dat je de kaart zo doorknipt dat SCL, SDA, VCC en GND toegankelijk blijven, omdat je ze van beide kanten kunt benaderen.

Als je twee DAC's gebruikt, vergeet dan niet om de adresjumper om te schakelen en de pull-up-weerstanden op een ervan uit te schakelen, zoals hier beschreven: https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog -converter-aansluitgids

Stap 4: Soldeer de draden aan

Soldeer de draden aan
Soldeer de draden aan
Soldeer de draden aan
Soldeer de draden aan
Soldeer de draden aan
Soldeer de draden aan

Nu moet je alles aansluiten. VCC, GND, SDA en SCL van alle 2/3 apparaten moeten respectievelijk worden aangesloten op VCC, GND, A4 en A5 op de Arduino. De DAC's zijn het lastigste onderdeel. Als je er twee hebt, moet je ze met elkaar verbinden, terwijl je ergens weggaat waar je de stroom en lijnen op de accelerometer kunt aansluiten, terwijl je de OUT-draden gescheiden houdt.

De OUT-pin op de DAC moet worden aangesloten op de pin op de printplaat van de controller die vroeger voor de middelste horizontale potentiometerpin voor de analoge stick was. Dat wil zeggen, waar de analoge stick was, is er een rij van drie pinnen aan de bovenkant. Sluit deze aan op de middelste. Als je een andere DAC hebt, sluit deze dan op dezelfde manier aan op de verticale potentiometerpin (de rij links). Je kunt niet vanaf de achterkant bij de pinnen komen als de trekker wordt vervangen, dus je moet een draad naar de voorkant van het bord leiden. Er is een cirkelvormige plastic "muur" rond het analoge stick-gebied, maar gelukkig zit er een handige opening in waar je draden door kunt steken. Zorg ervoor dat de draden niet in de weg zitten van de schroefpost aan de voorkant van de behuizing.

Mijn oorspronkelijke plan was om de Arduino van stroom te voorzien met de 5V van de USB-kabel aangesloten op de RAW-pin, maar toen ik het probeerde, werkte het niet. De Arduino voerde niets uit en zowel de Arduino als de controller gingen na een paar seconden uit. Ik ontdekte echter dat er een constante 3.3V-uitgang is van twee pinnen aan de voorkant van het bord in de buurt van de zwarte randaansluiting, vermoedelijk voor het voeden van randapparatuur. Het werkt met zowel VCC als RAW, maar ik heb voor VCC gekozen omdat het al de juiste spanning heeft en omdat ik het kan solderen aan de VCC-draad op de DAC die zich al in de buurt van de onderkant van het bord bevindt en op draden bespaart.

Houd er rekening mee dat er veel plastic onderdelen uit de behuizing steken waar je omheen moet werken, maar als je de draden op hun plaats lijmt, hoef je je daar maar één keer zorgen over te maken.

Dit alles is moeilijk met woorden te beschrijven, dus ik heb foto's en een grof diagram bijgevoegd.

Stap 5: Programmeer de Arduino

Nu moet je de Arduino programmeren. Hiervoor moet de USB-kabel op de controller worden verplaatst, zodat u toegang hebt tot de seriële pinnen op de Arduino. Ik heb de code toegevoegd die ik heb gebruikt. Het vereist de Adafruit MCP4725-bibliotheek, die hier te vinden is:

Zoals het is, stelt de code je in staat om het hele bewegingsbereik van de analoge stick gelijkmatig te doorlopen door de controller 90 graden naar links tot 90 graden naar rechts te bewegen, en hem in het midden te houden door hem plat te houden.

Het krijgt de hoek van de controller door de inverse tangens te berekenen van de g-kracht van de X-as gedeeld door de g-kracht van de Z-as. Dit betekent dat het werkt als de controller verticaal, plat of een willekeurige hoek daartussenin is. (meer informatie hier:

Het werkt op mijn controller, maar andere controllers hebben mogelijk andere spanningen nodig, waardoor het niet goed uitgelijnd is. Ik denk dat de beste manier om het spanningsbereik te vinden is met vallen en opstaan. Veel games laten je een schuifregelaar zien voor de analoge stickbeweging, maar de meest nauwkeurige manier die ik heb gevonden om beweging te bepalen, is met jstest op Linux. (https://wiki.archlinux.org/index.php/Gamepad#Joystick_API) Het geeft je een getal tussen -32, 767 en 32, 767 in plaats van een afbeelding, zodat je precies weet waar de stick is. Sluit zowel de controller als de Arduino USB-naar-serieel-adapter aan, laad jstest en probeer verschillende DAC-waarden totdat je de boven- en onderkant van het bereik bereikt, en noteer elk. Voor mij was het 1, 593 - 382.

Van bijzonder belang is regel 36:

dac-waarde = (controllerhoek + 2.5617859169446084418) / 0.0025942135867793503208 + 0,5;

Het is niet meteen duidelijk wat het doet. Simpel gezegd, het neemt de hoek van de controller (gemeten in radialen en tussen ~1,57 en ~-1,57) en converteert deze naar een waarde tussen 1, 593 en 382 voor de DAC. Als u een ander DAC-bereik heeft, moet u die lijn wijzigen.

De regel kan worden geschreven als:

dacwaarde = (controllerhoek +) / + 0,5;

Met en zijnde de nummers die je moet veranderen. is gelijk aan het bereik van de controllerhoek (pi) gedeeld door het totale bereik van DAC-waarden. (de bovenkant van het bereik minus de onderkant van het bereik) Hiermee kunt u de spanning wijzigen, hoewel de resultaten buiten het gewenste bereik zullen zijn. Daarom heb je nodig. is gelijk aan vermenigvuldigd met de onderkant van het bereik plus de helft van het bewegingsbereik van de controller. (pi / 2) Door de helft van het bewegingsbereik toe te voegen, weet je zeker dat het geen negatief getal is, en optellen vermenigvuldigd met de onderkant van het bereik zorgt ervoor dat het wordt gesynchroniseerd met het bereik dat je wilt.

Bij het converteren van de decimalen naar een geheel getal, rondt C++ niet af. Het snijdt in plaats daarvan het decimaalteken af, dus 9,9 wordt 9. Als u aan het einde 0,5 toevoegt, zorgt u ervoor dat alles boven de helft naar het volgende gehele getal gaat, dus het wordt afgerond.

Nadat u uw programma heeft geüpload, controleert u of het werkt met jstest.

Stap 6: Zet de controller weer in elkaar

Zet de controller weer in elkaar op dezelfde manier waarop je hem uit elkaar hebt gehaald, minus de linker analoge stick. Het zou nu moeten werken. Ik vind dat er geen merkbare vertraging is en het is een stuk beter dan het gebruik van de analoge stick. Omdat het een versnellingsmeter gebruikt, wordt het beïnvloed door plotselinge bewegingen, maar je moet je uiterste best doen om het op te merken.

Stap 7: Mogelijke verbeteringen

Er zijn enkele verbeteringen die kunnen worden aangebracht. Waaronder:

  • Minder omslachtige magneetdraad gebruiken
  • Alles op één PCB etsen die is ontworpen om in de controllerbehuizing te passen
  • De linker analoge stick opnieuw bevestigen en de benen aansluiten op de analoge ingangen op de Arduino zodat ze kunnen worden gebruikt om de Arduino aan te passen
  • De achterkant van de behuizing voor een draadloze controller krijgen en het project in het batterijcompartiment plaatsen (hiervoor zou een gat voor de USB-kabel moeten worden gesneden)

Aanbevolen: