Erstellen Sie Ihren eigenen Gamecontroller

Quelle der Inspiration


Auf Gaming-Ausstellungen zeigten die Entwickler von Objects in Space eine Demo ihres Spiels mit einem Controller im Cockpit eines riesigen Raumschiffs. Es wurde durch Beleuchtungstasten, analoge Geräte, Statusanzeigen, Schalter usw. ergänzt. Dies wirkt sich stark auf das Eintauchen in das Spiel aus:


Auf der Website des Spiels wurde ein Arduino-Tutorial mit einer Beschreibung des Kommunikationsprotokolls für solche Controller veröffentlicht.

Ich möchte dasselbe für mein Spiel erstellen

In diesem Beispiel werde ich ungefähr 40 US-Dollar ausgeben, um dem Cockpit eines Rennsimulators schöne, große und schwere Schalter hinzuzufügen. Die Hauptkosten sind mit diesen Schaltern verbunden - wenn ich einfache Schalter / Knöpfe verwenden würde, wäre der Preis halb so hoch! Dies ist eine echte Ausrüstung, die 240 Watt Leistung aushält, und ich werde nur etwa 0,03 Watt davon abgeben.

Warnung: Ich habe beschlossen, Geld zu sparen, und hinterlasse einen Link zu einer billigen chinesischen Website, auf der ich eine Reihe verschiedener Komponenten / Werkzeuge kaufe. Einer der Nachteile beim Kauf billiger Komponenten besteht darin, dass sie häufig keine Dokumentation enthalten. In diesem Artikel werde ich dieses Problem lösen.

Hauptkomponenten






Ausgewählte Werkzeuge



Software


  • Arduino IDE zur Programmierung des Arduino Prozessors
  • So erstellen Sie einen Controller, der als echter Hardware-USB-Controller / Joystick angezeigt wird:
    • FLIP zum Flashen neuer Firmware im Arduino USB-Controller
    • Arduino-USB- Bibliothek auf Github
  • So erstellen Sie einen Controller, mit dem das Spiel direkt kommuniziert ( oder der als virtueller USB-Controller / Joystick angezeigt wird )
    • Meine ois_protocol Bibliothek auf Github
    • VJoy-Treiber, wenn Sie den Controller als virtuellen USB-Controller / Joystick verwenden möchten.

Warnung


Ich habe in der High School Elektronik studiert, gelernt, wie man einen Lötkolben benutzt, gelernt, dass die roten Drähte mit den roten und die schwarzen mit den schwarzen Drähten verbunden werden müssen ... Volt, Ampere, Widerstand und die Gleichungen, die sie verbinden - das ist alles, was meine formale Ausbildung in Elektronik erschöpft hat.

Für mich war es ein Trainingsprojekt, daher könnte es schlechte Ratschläge oder Fehler geben!

Teil 1. Controller zusammenbauen!


Wir arbeiten mit Schaltern ohne Dokumentation ...


Wie oben erwähnt, kaufe ich billige Teile bei einem Einzelhändler mit geringen Gewinnspannen. Als Erstes müssen Sie herausfinden, wie diese Schalter / Tasten funktionieren.

Einfacher Druckknopf / Schalter


Mit der Taste ist alles einfach - es gibt keine LEDs und nur zwei Kontakte. Schalten Sie das Multimeter in den Durchgangs- / Wählmodus ( ) und berühren Sie die Sonden verschiedener Kontakte - OL (offener Regelkreis, offener Stromkreis) wird auf dem Bildschirm angezeigt: Dies bedeutet, dass keine Verbindung zwischen den beiden Sonden besteht. Dann drücken wir die Taste und berühren immer noch die Kontaktsonden - etwa 0,1 Ω sollten jetzt auf dem Bildschirm erscheinen und das Multimeter beginnt zu piepen ( was darauf hinweist, dass zwischen den Sonden ein sehr geringer Widerstand besteht - ein geschlossener Stromkreis ).

Jetzt wissen wir, dass beim Drücken der Taste der Stromkreis geschlossen und beim Drücken geöffnet wird. Im Diagramm kann dies als einfacher Schalter beschrieben werden:

Wir verbinden den Schalter mit Arduino


Suchen Sie zwei Pins auf der Arduino-Platine: GND und „2“ (oder eine andere beliebige Zahl - dies sind universelle E / A-Pins, die wir über Software steuern können).

Wenn wir den Schalter auf diese Weise anschließen und dann Arduino anweisen, Pin 2 als INPUT-Pin zu konfigurieren, erhalten wir die links gezeigte Schaltung (in der Abbildung unten). Wenn die Taste gedrückt wird, wird Pin 2 direkt mit Masse / 0 V verbunden, und wenn sie gedrückt wird, wird Pin 2 mit nichts verbunden. Dieser Zustand ( mit nichts verbunden ) wird als "schwebend" (hochohmiger Zustand) bezeichnet, und dies ist leider keine sehr gute Bedingung für unsere Zwecke. Wenn wir Daten von einem Kontakt in der Software lesen ( mit digitalRead (2) ), erhalten wir LOW, wenn der Kontakt geerdet ist, und ein unvorhersehbares Ergebnis (LOW oder HIGH), wenn der Kontakt schwebt!

Um dies zu beheben, können wir den Kontakt so konfigurieren, dass er sich im INPUT_PULLUP-Modus befindet, der mit dem Widerstand im Prozessor verbunden wird und die rechts gezeigte Schaltung erstellt. In dieser Schaltung hat Pin 2 bei geöffnetem Schalter einen Pfad von +5 V, sodass das Ergebnis beim Lesen immer HIGH ist. Wenn der Schalter geschlossen ist, hat der Kontakt immer noch einen Pfad mit hohem Widerstand gegen +5 V sowie einen Pfad ohne Widerstand gegen Masse / 0 V, der „gewinnt“. Wenn wir also den Kontakt lesen, erhalten wir ein NIEDRIG.


Für Softwareentwickler scheint die Reihenfolge umgekehrt zu sein - wenn wir auf die Schaltfläche klicken, lesen wir false / LOW und wenn gedrückt, lesen wir true / HIGH.

Sie können das Gegenteil tun, aber der Prozessor verfügt nur über integrierte Pull-Up-Widerstände und es gibt keine Pull-Down-Widerstände. Wir werden uns also an dieses Modell halten.

Das einfachste Programm für Arduino, das den Status des Switches liest und dem PC seinen Status mitteilt, sieht ungefähr so ​​aus wie das unten gezeigte. Sie können in der Arduino IDE auf die Schaltfläche zum Herunterladen klicken und dann den seriellen Monitor (im Menü Extras) öffnen, um die Ergebnisse anzuzeigen.

void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); } void loop() { int state = digitalRead(pin); Serial.println( state == HIGH ? "Released" : "Pressed" ); delay(100);//artifically reduce the loop rate so the output is at a human readable rate... } 

Andere Schalter fast ohne Dokumentation ...


Dreipoliger LED-Schalter


Glücklicherweise sind auf den Hauptschaltern meines Panels drei Kontakte markiert:


Ich bin mir nicht ganz sicher, wie es funktioniert, daher schalten wir das Multimeter wieder in den kontinuierlichen Modus und berühren alle Kontaktpaare, wenn der Schalter ein- und ausgeschaltet wird. Diesmal piept das Multimeter jedoch überhaupt nicht, wenn wir die Sonden [GND] und [+] mit „ einschalten! Die einzige Konfiguration, in der das Multimeter piept ( eine Verbindung erkennt ), ist, wenn der Schalter eingeschaltet ist und die Sonden eingeschaltet sind [+] und [Lampe].

Die LED im Schalter blockiert die Durchgangsmessungen. Aus den obigen Tests geht hervor, dass die LED direkt mit dem [GND] -Pin und nicht mit den Kontakten [+] und [Lampe] verbunden ist. Als nächstes schalten wir das Multimeter in den Diodentestmodus (Symbol) ) und überprüfen Sie das Kontaktpaar erneut, diesmal ist jedoch die Polarität wichtig ( rote und schwarze Sonde ). Wenn wir nun die rote Sonde an [Lampe] und die schwarze an [GND] anschließen, leuchtet die LED auf und 2,25 V werden am Multimeter angezeigt. Dies ist die Gleichspannung der Diode oder die minimale Spannung, die zum Einschalten erforderlich ist. Unabhängig von der Schalterstellung leuchtet die LED bei 2,25 V von [Lampe] bis [GND] auf. Wenn wir die rote Sonde an [+] und die schwarze an [GND] anschließen, leuchtet die LED nur, wenn der Schalter eingeschaltet ist.

Aus diesen Messwerten können wir annehmen, dass die Innenseiten dieses Schalters ungefähr so ​​aussehen wie in der folgenden Abbildung:

  1. [+] und [Lampe] werden kurzgeschlossen, wenn der Schalter ein- / geschlossen ist.
  2. Eine positive Spannung von [Lampe] bis [GND] leuchtet immer auf.
  3. Eine positive Spannung von [+] bis [GND] leuchtet die LED nur auf, wenn der Schalter eingeschaltet / geschlossen ist.



Ehrlich gesagt können wir nur das Vorhandensein eines Widerstands erraten. Die LED muss an den entsprechenden Widerstand angeschlossen werden, um den Strom zu begrenzen, da sie sonst durchbrennt. Meins ist nicht ausgebrannt und es sieht so aus, als ob es richtig funktioniert. Im Forum der Website des Verkäufers habe ich einen Beitrag gefunden, in dem es um einen installierten Widerstand geht, der bis zu 12 V unterstützt. Dies hat mir Zeit bei der Überprüfung / Berechnung eines geeigneten Widerstands gespart.

Wir verbinden den Schalter mit Arduino


Am einfachsten ist es, den Schalter mit Arduino zu verwenden und dabei den [Lampen] -Pin zu ignorieren: Verbinden Sie [GND] mit dem GND in Arduino und verbinden Sie [+] mit einem der nummerierten Arduino-Kontakte, z. B. 3.

Wenn wir Pin 3 als INPUT_PULLUP konfigurieren ( wie bei der vorherigen Schaltfläche ), erhalten wir das unten gezeigte Ergebnis. Oben links wird der Wert angezeigt, den wir durch Ausführen von "digitalRead (3)" im Arduino-Code erhalten.

Wenn der Schalter ein- / geschlossen ist, lesen wir LOW und die LED leuchtet auf! Um einen solchen Schalter in dieser Konfiguration zu verwenden, können wir denselben Arduino-Code wie im Schaltflächenbeispiel verwenden.


Probleme dieser Lösung


Nach dem Anschließen an das Arduino sieht die gesamte Schaltung folgendermaßen aus:


Hier können wir jedoch sehen, dass bei geschlossenem Schalter zusätzlich zu dem kleinen Strombegrenzungswiderstand vor der LED (ich nehme an, dass sein Widerstand 100 Ohm beträgt) auch ein Pull-up-Widerstand um 20 kOhm vorhanden ist, wodurch die durch die LED fließende Strommenge weiter reduziert wird. Dies bedeutet, dass die LED zwar funktioniert, die LED jedoch nicht sehr hell ist.

Ein weiterer Nachteil dieses Schemas ist, dass wir keine Softwaresteuerung über die LED haben - sie wird eingeschaltet, wenn der Schalter eingeschaltet ist, und im umgekehrten Fall deaktiviert.

Sie können sehen, was passiert, wenn wir den [Lampen] -Pin entweder an 0 V oder + 5 V anschließen.

Wenn [Lampe] an 0 V angeschlossen ist, leuchtet die LED ständig ( unabhängig von der Schalterstellung ) und die Arduino-Positionserkennung wird weiterhin durchgeführt. Dadurch können wir die LED programmgesteuert deaktivieren!


Wenn [Lampe] an + 5V angeschlossen ist, leuchtet die LED ständig ( unabhängig von der Position des Schalters ) , die Erkennung der Arduino-Position ist jedoch unterbrochen - HIGH wird immer vom Kontakt abgelesen.


Wir verbinden diesen Schalter korrekt mit Arduino


Wir können die oben beschriebenen Einschränkungen ( geringer Strom / geringe Helligkeit der LED und mangelnde Programmsteuerung der LED ) überwinden, indem wir mehr Code schreiben! Um den Konflikt zwischen der Fähigkeit zur Steuerung der LED und der dadurch unterbrochenen Positionserkennung zu lösen, können wir die beiden Aufgaben zeitlich trennen, d. H. Die LED beim Lesen des Sensorkontakts (3) vorübergehend ausschalten.

Verbinden Sie zuerst den [Lampen] -Pin mit einem anderen Allzweck-Arduino-Pin, z. B. mit 4, damit Sie die Lampe steuern können.

Um ein Programm zu erstellen, das die Position des Schalters korrekt liest und die LED steuert (wir lassen sie blinken), müssen Sie nur die LED ausschalten, bevor Sie den Status des Schalters lesen. Die LED erlischt nur einen Bruchteil einer Millisekunde, sodass das Flackern nicht wahrgenommen werden sollte:

 int pinSwitch = 3; int pinLed = 4; void setup() { //connect to the PC Serial.begin(9600); //connect our switch's [+] connector to a digital sensor, and to +5V through a large resistor pinMode(pinSwitch, INPUT_PULLUP); //connect our switch's [lamp] connector to 0V or +5V directly pinMode(pinLed, OUTPUT); } void loop() { int lampOn = (millis()>>8)&1;//make a variable that alternates between 0 and 1 over time digitalWrite(pinLed, LOW);//connect our [lamp] to +0V so the read is clean int state = digitalRead(pinSwitch); if( lampOn ) digitalWrite(pinLed, HIGH);//connect our [lamp] to +5V Serial.println(state);//report the switch state to the PC } 

In Arduino Mega können die Pins 2-13 und 44-46 die analogWrite-Funktion verwenden, die tatsächlich keine Spannung von 0 V bis + 5 V erzeugt, sondern diese mithilfe einer Rechteckwelle approximiert. Falls gewünscht, können Sie damit die Helligkeit der LED steuern! Dieser Code lässt das Licht pulsieren und nicht nur flackern:

 void loop() { int lampState = (millis()>>1)&0xFF;//make a variable that alternates between 0 and 255 over time digitalWrite(pinLed, LOW);//connect our [lamp] to +0V so the read is clean int state = digitalRead(pinSwitch); if( lampState > 0 ) analogWrite(pinLed, lampState); } 

Montagetipps


Der Beitrag ist bereits ziemlich groß, daher werde ich das Löt-Tutorial nicht hinzufügen. Sie können es googeln!

Ich werde jedoch die grundlegendsten Tipps geben:

  • Stellen Sie beim Anschließen von Drähten mit großen Metallkontakten zunächst sicher, dass der Lötkolben heiß ist, und erhitzen Sie den Metallkontakt eine Weile. Die Bedeutung des Lötens besteht darin, durch Erstellen einer Legierung eine dauerhafte Verbindung herzustellen. Wenn jedoch nur ein Teil der Verbindung heiß ist, können Sie leicht eine „kalte Verbindung“ erhalten, die wie eine Verbindung aussieht, aber nicht tatsächlich verbunden ist.
  • Wenn Sie die beiden Drähte verbinden, ziehen Sie zuerst einen Schrumpfschlauch an. Nach dem Anschließen kann der Schlauch nicht mehr angelegt werden. Dies scheint offensichtlich, aber ich vergesse es ständig und muss anstelle der Röhre Klebeband verwenden ... Ziehen Sie die Schrumpfröhre von der Verbindung weg, damit sie sich nicht vorzeitig erwärmt. Schieben Sie das Rohr nach Überprüfung der Lötverbindung darauf und erhitzen Sie es.
  • Die dünnen kleinen Verbindungsdrähte, die ich am Anfang erwähnt habe, eignen sich gut für lötfreie Verbindungen (zum Beispiel, wenn sie an ein Arduino angeschlossen sind!), Aber eher zerbrechlich. Verwenden Sie nach dem Löten eine Klebepistole, um sie zu befestigen und alle Spannungen von der Verbindung selbst zu entfernen. Zum Beispiel können die roten Drähte in der Abbildung unten während des Betriebs versehentlich gezogen werden. Nach dem Löten habe ich sie mit einem Tropfen Heißkleber befestigt:


Teil 2. Wir verwandeln das Gerät in einen Gamecontroller!


Damit das Betriebssystem das Gerät als USB-Gaming-Controller erkennt, benötigen Sie einen recht einfachen Code. Leider müssen Sie auch die Arduino USB-Chip-Firmware durch eine andere ersetzen, die hier abgerufen werden kann: https://github.com/harlequin-tech/arduino-usb .

Nach dem Hochladen dieser Firmware auf Arduino wird das Gerät jedoch zu einem USB-Joystick und ist kein Arduino mehr. Um es neu zu programmieren, müssen Sie daher die ursprüngliche Arduino-Firmware neu flashen. Diese Iterationen sind ziemlich schmerzhaft - laden Sie den Arduino-Code, flashen Sie die Joystick-Firmware, testen Sie, flashen Sie die Arduino-Firmware, wiederholen Sie ...

Ein Beispiel für ein Programm für Arduino, das mit dieser Firmware verwendet werden kann, ist unten dargestellt. Es konfiguriert drei Schaltflächen als Eingaben, liest ihre Werte, kopiert die Werte in die von dieser Firmware erwartete Datenstruktur und sendet dann die Daten. Abwaschen, einseifen, wiederholen.

 // define DEBUG if you want to inspect the output in the Serial Monitor // don't define DEBUG if you're ready to use the custom firmware #define DEBUG //Say we've got three buttons, connected to GND and pins 2/3/4 int pinButton1 = 2; int pinButton2 = 3; int pinButton3 = 4; void setup() { //configure our button's pins properly pinMode(pinButton1, INPUT_PULLUP); pinMode(pinButton2, INPUT_PULLUP); pinMode(pinButton3, INPUT_PULLUP); #if defined DEBUG Serial.begin(9600); #else Serial.begin(115200);//The data rate expected by the custom USB firmware delay(200); #endif } //The structure expected by the custom USB firmware #define NUM_BUTTONS 40 #define NUM_AXES 8 // 8 axes, X, Y, Z, etc typedef struct joyReport_t { int16_t axis[NUM_AXES]; uint8_t button[(NUM_BUTTONS+7)/8]; // 8 buttons per byte } joyReport_t; void sendJoyReport(struct joyReport_t *report) { #ifndef DEBUG Serial.write((uint8_t *)report, sizeof(joyReport_t));//send our data to the custom USB firmware #else // dump human readable output for debugging for (uint8_t ind=0; ind<NUM_AXES; ind++) { Serial.print("axis["); Serial.print(ind); Serial.print("]= "); Serial.print(report->axis[ind]); Serial.print(" "); } Serial.println(); for (uint8_t ind=0; ind<NUM_BUTTONS/8; ind++) { Serial.print("button["); Serial.print(ind); Serial.print("]= "); Serial.print(report->button[ind], HEX); Serial.print(" "); } Serial.println(); #endif } joyReport_t joyReport = {}; void loop() { //check if our buttons are pressed: bool button1 = LOW == digitalRead( pinButton1 ); bool button2 = LOW == digitalRead( pinButton2 ); bool button3 = LOW == digitalRead( pinButton3 ); //write the data into the structure joyReport.button[0] = (button1?0x01:0) | (button2?0x02:0) | (button3?0x03:0); //send it to the firmware sendJoyReport(joyReport) } 

Teil 3. Wir integrieren das Gerät in unser eigenes Spiel!


Wenn Sie die Kontrolle über das Spiel haben, mit dem das Gerät interagieren soll, können Sie alternativ direkt mit dem Controller kommunizieren - Sie müssen es nicht als Joystick für das Betriebssystem sichtbar machen! Zu Beginn des Beitrags erwähnte ich Objekte im Raum; Dies ist der Ansatz, den die Entwickler verwendet haben. Sie erstellten ein einfaches ASCII-Kommunikationsprotokoll, mit dem der Controller und das Spiel miteinander kommunizieren können. Listen Sie einfach die seriellen Anschlüsse des Systems auf ( es handelt sich unter Windows um COM-Anschlüsse; sehen Sie übrigens, wie schrecklich es in C aussieht ), suchen Sie den Anschluss, an den das Gerät mit dem Namen „Arduino“ angeschlossen ist, und beginnen Sie über diesen Link mit dem Lesen / Schreiben von ASCII.

Auf der Arduino-Seite verwenden wir nur die Serial.print-Funktionen, die in den obigen Beispielen verwendet wurden.

Zu Beginn dieses Beitrags habe ich auch meine Bibliothek zur Lösung dieses Problems erwähnt: https://github.com/hodgman/ois_protocol .

Es enthält C ++ - Code, der in das Spiel integriert und als "Server" verwendet werden kann, und Arduino-Code, der im Controller ausgeführt werden kann, um ihn als "Client" zu verwenden.

Passen Sie Arduino an


In example_hardware.h habe ich Klassen erstellt, um einzelne Schaltflächen / Optionsfelder zu abstrahieren. Beispiel: "Schalter" ist eine einfache Schaltfläche aus dem ersten Beispiel. "LedSwitch2Pin" ist ein Schalter mit einer gesteuerten LED aus dem zweiten Beispiel.

Der Beispielcode für meine Schaltflächenleiste ist in example.ino .

Nehmen wir als kleines Beispiel an, wir haben eine einzelne Schaltfläche, die an das Spiel gesendet werden muss, und eine spielgesteuerte LED. Der erforderliche Arduino-Code sieht folgendermaßen aus:

 #include "ois_protocol.h" //instantiate the library OisState ois; //inputs are values that the game will send to the controller struct { OisNumericInput myLedInput{"Lamp", Number}; } inputs; //outputs are values the controller will send to the game struct { OisNumericOutput myButtonOutput{"Button", Boolean}; } outputs; //commands are named events that the controller will send to the game struct { OisCommand quitCommand{"Quit"}; } commands; int pinButton = 2; int pinLed = 3; void setup() { ois_setup_structs(ois, "My Controller", 1337, 42, commands, inputs, outputs); pinMode(pinButton, INPUT_PULLUP); pinMode(pinLed, OUTPUT); } void loop() { //read our button, send it to the game: bool buttonPressed = LOW == digitalRead(pin); ois_set(ois, outputs.myButtonOutput, buttonPressed); //read the LED value from the game, write it to the LED pin: analogWrite(pinLed, inputs.myLedInput.value); //example command / event: if( millis() > 60 * 1000 )//if 60 seconds has passed, tell the game to quit ois_execute(ois, commands.quitCommand); //run the library code (communicates with the game) ois_loop(ois); } 

Passen Sie das Spiel an


Der Spielcode ist im Stil eines "einzelnen Headers" geschrieben. Um die Bibliothek zu importieren, füge oisdevice.h in das Spiel ein.

Schreiben Sie in eine einzelne CPP-Datei vor dem Ausführen des # include-Headers #define OIS_DEVICE_IMPL und #define OIS_SERIALPORT_IMPL. Dadurch wird der CPP-Datei der Quellcode der Klassen hinzugefügt. Wenn Sie über eigene Anweisungen, Protokollierungen, Zeichenfolgen oder Vektoren verfügen, können Sie vor dem Importieren des Headers mehrere andere OIS_ * -Makros definieren, um die Funktionen der Engine zu nutzen.

Verwenden Sie den folgenden Code, um COM-Ports aufzulisten und eine Verbindung mit einem bestimmten Gerät herzustellen:

 OIS_PORT_LIST portList; OIS_STRING_BUILDER sb; SerialPort::EnumerateSerialPorts(portList, sb, -1); for( auto it = portList.begin(); it != portList.end(); ++it ) { std::string label = it->name + '(' + it->path + ')'; if( /*device selection choice*/ ) { int gameVersion = 1; OisDevice* device = new OisDevice(it->id, it->path, it->name, gameVersion, "Game Title"); ... } } 

Nachdem Sie eine OisDevice-Instanz erhalten haben, müssen Sie regelmäßig die Poll-Member-Funktion aufrufen (z. B. in jedem Frame). Mit DeviceOutputs () können Sie den aktuellen Status der Controller-Ausgabe abrufen, mit PopEvents () Geräteereignisse verwenden und mit SetInput () Werte an das Gerät senden.

Eine Beispielanwendung für all dies finden Sie hier: example_ois2vjoy / main.cpp .

Teil 4. Was ist, wenn ich Teil 2 und 3 gleichzeitig möchte?


Damit der Controller in anderen Spielen funktioniert (Teil 2), müssen Sie Ihre eigene Firmware und ein Arduino-Programm installieren. Damit der Controller jedoch vollständig vom Spiel programmiert werden kann, haben wir die Standard-Arduino-Firmware und ein anderes Arduino-Programm verwendet. Aber was ist, wenn wir beide Möglichkeiten gleichzeitig haben wollen?

Die Beispielanwendung, zu der ich den obigen Link ( ois2vjoy ) gegeben habe, löst dieses Problem.

Diese Anwendung kommuniziert mit dem OIS-Gerät (dem Programm aus Teil 3) und konvertiert diese Daten dann auf dem PC in reguläre Controller- / Joystick-Daten, die dann auf den virtuellen Controller / Joystick übertragen werden. Dies bedeutet, dass Sie Ihrem Controller erlauben können, die OIS-Bibliothek ständig zu verwenden (es ist keine andere Firmware erforderlich). Wenn Sie sie als regulären Controller / Joystick verwenden möchten, führen Sie einfach die Anwendung ois2vjoy auf dem PC aus, der die Konvertierung durchführt.

Teil 5. Fertigstellung


Ich hoffe, jemand fand diesen Artikel nützlich oder interessant. Vielen Dank für das Lesen bis zum Ende!

Wenn Sie neugierig sind, lade ich Sie ein, an der Entwicklung der Bibliothek ois_protocol teilzunehmen ! Ich denke, es wird großartig sein, ein einziges Protokoll zu entwickeln, das alle Arten von hausgemachten Controllern in Spielen unterstützt und Spiele dazu ermutigt, selbstgemachte Controller direkt zu unterstützen!

Source: https://habr.com/ru/post/de442816/


All Articles