Daten aus einem USB-Gerät auslesen (Thrustmaster TH8RS Shifter)

Hallo zusammen,

folgende Herausforderung: Ich habe ein SimRacing Rig, das u.a. aus einem Fanatec V2 Lenkrad. An diesem kann man direkt die hauseigenen Shifter zum Schalten anschließen. Ich habe jedoch günstig einen TH8RS Shifter der Marke Thrustmaster erstanden und kann diesen nicht direkt mit der Basiseinheit verwenden, dazu bräuchte man die original Basis von Thrustmaster oder man schließt den Shifter dirtekt via USB an den PC an. In meinem Fall ist es aber eine PS4, USB direkt geht also nicht. An die Basis geht es wie gesagt auch nicht, aber es gibt einen sündhaft teuren Adapter, den man von einem Bastler in den USA beziehen kann. Stolze 120$ inkl. Versand, finde ich zu teuer. SFA1 - Shifter Adapter | BasherBoards

Mein Wunschziel: Den Shifter über den Arduino mit 5V versorgen, Daten + und Daten - an den Arduino anschließen und via Arduino auslesen was passiert, wenn Gang 1 eingelegt wird, Gang 2, neutral etc. . Wäre es ein analoges Signal wäre, dann gäbe es ja einen bzw. zwei xy Werte, aber wie man das digitale Signal vom USB einliest und verwertet, keine Ahnung. Irgendwie scheint es zu gehen, denn es gibt ja den besagten Adapter. Ich würde auch gar nicht so weit gehen und den TH8RS Shifter an die Basis anschließen wollen wie es mit dem Adapter geht, sondern einfach den Arduino Leonardo als Tastatur via keyboard.h an die PS4 anschließen und wenn Gang 1 eingelegt ist Zahl 1, Gang 2 = Zahl 2 etc. an die PS4 ausgeben wollen. Im Game-Setup kann man dann einzelnen Gänge den jeweiligen Tasten bzw. den Stellungen am Shifter zuordnen.

Einen analogen xy PS3 Joypad habe ich schonmal dazu gebracht, bei bestimmten xy Werten diese und jene Taste (links, rechts, hoch, runter) auszugeben, aber ich habe keine Ahnung, wie man einen digitalen Wert aus dem USB Shifter erhält, wie diser aussehen könnte etc. . Ich erhoffe mir, dass als Wert bei Gangposition wie z.B. 123345 ausgegeben wird. Und dann einfach "wenn wert 12345, dann keyboard.press(0x31) an ps4" ...

Kann mir jemand weiterhelfen?

Sorry, das ist mir zu viel Kauderwelsch :o
Gibt's zu dem Teil ne Doku? Dann stell sie hier rein.
Kannst auch aufschrauben und nachschauen was drin ist.
Und sicherlich kann man die Schalter anzapfen und daraus was machen. Ist vielleicht die einfachste Variante, aber ich kenn die Dinger alle nicht. Also reine Vermutung.

Hallo,

du brauchst auf jeden Fall einen USB-Host. Das ist das Shield https://www.arduino.cc/en/Main/ArduinoUSBHostShield

Ein paar Projekte zu dem Teil: https://www.circuitsathome.com/arduino_usb_host_shield_projects

Ich würde vermutlich mal den TH8RS Shifter auseinander nehmen und schauen, ob man nicht die eingebaute Elektronik umgehen kann und den Arduino direkt an die Schalter oder Potis anschließen kann.

Hallo,

eine Doku gibts nur in der Form der Bedienungsanleitung, keine technischen Daten. Es soll jedenfalls mit Hall-Sensoren gearbeitet worden sein. Anbei mal ein Video von einem nackten Shifter ohne Außenhülle. Ich werde mal versuchen ihn zu öffnen, um dann ggf. direkt etwas von dort abzugreifen, aber lieber wäre es mir gewesen, wenn man das Signal vom USB-Stecker abgreift. Es muss ja irgwendwas ausgegeben werden, wenn die Gänge gewechselt werden. Kann man da nicht einfach Data + und Data - via Arduino anzapfen und loggen was passiert? Dachte, das gehört zu den Arduino 1x1 Basics, die ich leider nur sehr begrenzt beherrsche :slight_smile:

Video vom geöffneten TH8RS

Der teure Adapter, um den Thrustmaster Shifter an die Lenkrad-Basis einer anderen Firma "Fanatec" anschließen zu können, damit dann der Shifter über den Treiber dieser Basis an der PS4 läuft:

http://www.basherboards.com/SFA1

Thrustmaster Hersteller Beschreibung::

Absolute Präzision:

H.E.A.R.T HallEffect AccuRate Technology™

  • Kontaktloser Magnetsensor gewährleistet zeitlose
    Beständigkeit
  • Kein "Taktschalter", kein Potentiometer für unbegrenzte
    Produktlebensdauer

Theseus:
Hallo,

du brauchst auf jeden Fall einen USB-Host. Das ist das Shield https://www.arduino.cc/en/Main/ArduinoUSBHostShield

Ein paar Projekte zu dem Teil: https://www.circuitsathome.com/arduino_usb_host_shield_projects

Ich würde vermutlich mal den TH8RS Shifter auseinander nehmen und schauen, ob man nicht die eingebaute Elektronik umgehen kann und den Arduino direkt an die Schalter oder Potis anschließen kann.

Danke für den Tip. Ich habe noch einen Due, dieser verfügt ja über den nativen USB Port. Beispiele für den Anschluss einer Tastatur, Maus oder Bluetooth Controller etc. gibt es ja, aber ich würde oder müsste ganz einfach mitlesen was dort ausgegeben wird. Ich werde nun versuchen, mit z.B. dem Sketch für die USB-Maus zu gucken, ob irgendwas passiert, sich die xy Werte ändern, aber das wird wohl nichts, denn es ist ja keine Maus angeschlossen bzw. der Due erkennt das angeschlossene Gerät nicht als Maus, die er aber erwartet bzw. ich im Sketch vorgebe. Tja, stocher aus Unwissenheit etwas (viel) im dunkeln herum.

Anbei ein paar Bilder. Das ist also die Platine mit der wohl proprietären Verarbeitung. 1. Entweder ich kann irgendwie auslesen, was über den USB Port an den PC etc. ausgegeben wird, um den Wert dann zu verarbeiten (weiß nicht wie ich es mit dem Due machen soll, MouseController bringt als seriellen Input keine Daten, mit angeschlossener Maus funktioniert es natürlich), oder 2. ich gehe an den Magneten mit einem eigenen Hall Sensor, damit habe ich mich aber noch nie beschäftigt, und baue quasi die Funktion der Platine weitestgehend nach.

Letzeres sollte klappen? Gibt zu beidem einen Rat oder Erfahrungswerte oder hat jemand sowas schon gemacht?

Hm, ich glaube für mich ich als eher "copy and paste" Bastler ist das Thema Hall Sensor zu komplex. Eine LED einschalten wenn sich ein Magnet nähert werde ich noch hinbekommen, aber die unterschiedlichen Positionen abzutasten wird mir nicht gelingen. Das einzige wäre wohl noch je Gang einen Hall Sensor zu benutzen, aber die Distanz der Positionen empfinde ich als zu gering, um 7 Sensoren mehr oder weniger dicht beieinander zu positionieren.

Tja, bleibt mir nur das Auslesen des USB Ports, um es mit meinen einfachen Worten zu benennen, um dann den unterschiedlichen Wert zu verarbeiten und als keyboard.pressed zu benutzen. Weiß also jemand wie ich, egal welches USB Gerät angeschlossen ist am nativen Due USB Port, das eingehende Signal einlese? Das Teil muss dort irgendwas ausgeben?

Hallo,
"Shifter dirtekt via USB an den PC an"

Ich gehe mal davon aus, das es eine WinDOSe ist mit der Du arbeitest.
Du kannst den Shifter direkt an den PC anschließen? D.h. der PC versteht das?
Dann nehme doch einmal ein schnödes TerminalProgramm und schaue, was dort gesendet wird.
Vielleicht funktioniert es ja.
Für einen Arduino mit zwei USB-Schnittstellen sollte es einen Sketch zu finden geben, der eine von
beiden "lesen" kann.
Nur so ein Gedanke.
Gruß und Glück
Andreas

Der PC kann die Daten in einem Hersteller Programm verarbeiten. Auf einer GUI werden dann die Gänge angezeigt etc. . Im Gerätemanager wird das Gerät als USB Eingabegerät HID angezeigt. Wohl auch nur, und ich bin wie gesagt Laie, weil der entsprechende Treiber installiert ist und dadurch das Gerät und Windows bzw. das Programm miteinander kommunizieren können, denke ich. Wie man mit einem Putty, das meinst du doch wohl, die USB Daten auslesen kann, weiß ich leider nicht, auch nicht nach entsprechendem Recherchieren. Ich hätte gedacht, dass man irgendwie mit Arduino und dem nativen USB Host einlesen kann, egal was angeschlossen ist, egal wie die Datenstruktur ist etc. .

Hallo,
wie wäre etwas in der Art?
Sniffer
Gruß und Spaß
Andreas

Ich möchte nichts zumüllen, aber hier mal die Ergebnisse beim Schalten in Gang 1, 2 und 3. Aufgezeichnet habe ich die HID View:

Connection Information
Port: 1
Speed: Full Speed
Device address: 2
Open pipes: 2
Connection status: Device connected

Device Descriptor
USB version: 2.0
Device class: 0x0 - (Defined at Interface level)
Device subclass: 0x0 - Unknown
Device protocol: 0x0 - Unknown
Control pipe max size: 8 bytes
Vendor ID: 0x44f (ThrustMaster, Inc.)
Product ID: 0xb660 (Unknown)
Product version: 1.0
Manufacturer: Not specified
Product: Not specified
Serial Number: Not specified
Configurations: 1

Report View:

000000: Data Structures Parsed! (UP), 2016-06-14 00:48:45,9389287
000003: Report Arrived (UP), 2016-06-14 00:48:47,9618318 +1,0000252
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 156

000005: Report Arrived (UP), 2016-06-14 00:48:48,9618160 +0,9999564
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 125
Unknown[0..255]/[0..255]: 234

000007: Report Arrived (UP), 2016-06-14 00:48:49,1998956 +0,2380582
Report Name:Joystick
BUTTON1 pressed: 1
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 169
Unknown[0..255]/[0..255]: 237

000009: Report Arrived (UP), 2016-06-14 00:48:50,1997883 +0,9998708
Report Name:Joystick
BUTTON1 pressed: 1
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 210
Unknown[0..255]/[0..255]: 237

000011: Report Arrived (UP), 2016-06-14 00:48:51,2008358 +1,0010326
Report Name:Joystick
BUTTON1 pressed: 1
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 210
Unknown[0..255]/[0..255]: 237

000013: Report Arrived (UP), 2016-06-14 00:48:51,7447762 +0,5439164
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 168
Unknown[0..255]/[0..255]: 237

000015: Report Arrived (UP), 2016-06-14 00:48:51,9728259 +0,2280245
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 1
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 73
Unknown[0..255]/[0..255]: 234

000017: Report Arrived (UP), 2016-06-14 00:48:52,9728293 +0,9999178
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 1
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 30
Unknown[0..255]/[0..255]: 226

000019: Report Arrived (UP), 2016-06-14 00:48:53,5438274 +0,5709806
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 74
Unknown[0..255]/[0..255]: 225

000021: Report Arrived (UP), 2016-06-14 00:48:54,5438338 +0,9999148
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 0
BUTTON3 pressed: 0
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 155

000023: Report Arrived (UP), 2016-06-14 00:48:54,9948085 +0,4508896
Report Name:Joystick
BUTTON1 pressed: 0
BUTTON2 pressed: 0
BUTTON3 pressed: 1
BUTTON4 pressed: 0
BUTTON5 pressed: 0
BUTTON6 pressed: 0
BUTTON7 pressed: 0
BUTTON8 pressed: 0
BUTTON9 pressed: 0
BUTTON10 pressed: 0
X[0..255]/[0..255]: 128
Y[0..255]/[0..255]: 128
Unknown[0..255]/[0..255]: 169
Unknown[0..255]/[0..255]: 155

Aber wie ich das nun für den Arduino Due verwenden kann? Wahrscheinlich bringt mir das nichts, da ich wohl eher die Packete aufzeichnen muss und diese dann mittels Arduino verwerten muss. Puh, ich denke, das ist alles ne Nummer zu hoch...

Der Vollständigkeit halber ein Auszug aus dem Textfile, Report 25, der 4. Gang:

25	0x00000000	0	$print instruction	 	Direction	"Up"	14.06.2016 01:00:40	
25	0x00000000	140	URB	 	urb	{…}	14.06.2016 01:00:40	
25	0x00000000	24	URB_HEADER	 	UrbHeader	{…}	14.06.2016 01:00:40	
25	0x00000000	2	unsigned short	 	Length	128	14.06.2016 01:00:40	
25	0x00000002	2	URB_FUNCTION	  	Function	URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER (9)	14.06.2016 01:00:40	
25	0x00000004	4	USBD_STATUS	   	Status	{ Status=SUCCESS (0); Type="Success" }	14.06.2016 01:00:40	
25	0x00000004	4	StatusCode	   	Status	SUCCESS (0)	14.06.2016 01:00:40	
25	0x00000008	0	$print instruction	    	Type	"Success"	14.06.2016 01:00:40	
25	0x00000008	8	unsigned __int64	    	UsbdDeviceHandle	18446708891412814256	14.06.2016 01:00:40	
25	0x00000010	8	unsigned __int64	     	UsbdFlags	34	14.06.2016 01:00:40	
25	0x00000018	116	URB_BULK_OR_INTERRUPT_TRANSFER	  	BulkOrInterrupt	{ PipeHandle=0xffffe0007f56c6f8; TransferFlags=DirectionIn | ShortTransferOk (3); TransferBufferLength=12; TransferBuffer=0xffffe0007e3e91b0; TransferBufferMDL=0… }	14.06.2016 01:00:40	
25	0x00000018	8	unsigned __int64	  	PipeHandle	0xffffe0007f56c6f8	14.06.2016 01:00:40	
25	0x00000020	4	USBD_TRANSFER_FLAGS	   	TransferFlags	DirectionIn | ShortTransferOk (3)	14.06.2016 01:00:40	
25	0x00000024	4	unsigned long	    	TransferBufferLength	12	14.06.2016 01:00:40	
25	0x00000028	8	unsigned __int64	     	TransferBuffer	0xffffe0007e3e91b0	14.06.2016 01:00:40	
25	0x00000030	8	unsigned __int64	      	TransferBufferMDL	0	14.06.2016 01:00:40	
25	0x00000038	8	unsigned __int64	       	UrbLink	0	14.06.2016 01:00:40	
25	0x00000040	64	URB_HCD_AREA	        	hca	{ Reserved8={ 18446744073709551615, 16045744989752127501, 0, 0, 0… } }	14.06.2016 01:00:40	
25	0x00000040	64	unsigned __int64[8]	        	Reserved8	{ 18446744073709551615, 16045744989752127501, 0, 0, 0… }	14.06.2016 01:00:40	
						00000000   ffffffffffffffff deadf00ddeadf00d 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 
25	0x00000080	12	UsbPayload	         	Payload	{ Payload={ 1, 8, 0, 128, 128… } }	14.06.2016 01:00:40	
25	0x00000080	12	unsigned char[12]	         	Payload	{ 1, 8, 0, 128, 128… }	14.06.2016 01:00:40	
						00000000   01 08 00 80 80 49 9d 00 00 00 00 00                .....I......

Hallo,
USB ist ja ein Standart der offen liegt. Man müßte sich da mal mit viel Mühe
schlau lesen.
"Device Descriptor"
liefert Dir ja schon einmal Informationen über das Gerät, die sollte man mit
dem Due ja schon einmal abfragen können.

Wenn sich Report xx, 4. Gang von Report xx, 3. Gang unterscheiden, dann hätte
man da auch etwas.

Du brauchst einen Sketch, der auf die USB des Due zugreift.
So etwas wird es geben. Ich kann mir nicht vorstellen, das die Leute dort nur
Tastatur und Maus anschließen.

Ich würde das Ding an den Due stöpseln, und etwas an Sketch suchen das eine
Reaktion verursacht. Wenn ich da nichts finde, würde ich es begraben.
Da kann ich Dir aber nicht weiter helfen, keine Ahnung…
Gruß und Glück
Andreas

Hi Andreas,

erstmal danke für die Anteilnahme :). Ja, ich brauche irgendeinen Sketch der diese die Daten abfragen kann. Habe schon einige Examples probiert, der einzige der funktioniert ist der MouseController aus der USB Host Library, aber eben mit einer Maus dran :). Es gibt andere Beispiele für einen Joystick xy, PS3 Joystick, BT Adapter etc, aber beim Anschluss des Shifters wird im seriellen Monitor nichts angezeigt. Hier wird mir wohl niemand helfen können.

Hall Sensor selber bauen ist mir zu schwer bzw. ist es ja ein hall sensor mit zwei achsen und somit der sensor sicher nicht günstig und das programmieren zu komplex, ggf. werde ich noch einen XY-Axis joystick breakout dran basteln, sofern es passt, andernfalls wohl auf das Angebot des Adapter-Bastlers zurückgreifen, und den Adapter für 89$ bzw. 79 Euro aus den USA ordern. Schade eigentlich...

Hallo,
jedes USB sendet eine Geräte-ID, z.B. xxxx1 - ich bin eine Tastatur, xxxx2 - ich bin eine Maus.
In dem Sketch und in der Lib des Arduino ist die ID des Shifters nicht bekannt.
Das schimpft sich Geräteklasse.
Versuche mal rauszubekommen welche Dein Shifters sendet.
Dann ganz frech in der Lib und dem Sketch des Arduino ändern.
Gruß und Spaß
Andreas

Danke für deine Hinweise, aber ich denke, ich muss an dieser Stelle erstmal aufhören. In den Bibliotheken direkt habe ich mich noch nicht bewegt. Vielleicht setze ich irgendwann nochmal an dieser Stelle an, dann habe ich ja hiermit einen guten Startpunkt :). Danke nochmals für die Unterstützung.

Hallo,
wenn Du Dir diesen Adapter bestellen solltest, dann wären GUTE Foto´s vom InnenLeben nicht schlecht.
Gruß und Spaß
Andreas

Ja, ist das erste was ich mache :slight_smile:

So sieht er aus. Scheint schon etwas aufwändiger zu sein. Er funktioniert wie gedacht, insofern eine gute Investition, hätte es selber mit einer Bastellösung nicht in dieser Form hinbekommen.