Bibliothek einbinden HID

Serwus Arduino Gemeinde, Ich möchte gerne ein paar Joysticks an meinen Arduino Leonardo anschliesen und mit denen bei dem Spiel Landwirtschafts Simulator den Frontlader des Traktors oder die Kamera zu Steuern. Nun stehe ich vor dem Problem wie ich dem Simulator erklären soll dass es sich um einen HID handelt bzw. wie kann ich die Joysticks dazu bringen einen Befehl als HID zu schicken. Ich habe schon gesehen dass man die Bibliothek HID einbinden kann. Habe aber dazu noch nichts im Internet gefunden wie dies funktionieren sollte bzw was die Funktion dabei ist.

Bin neuling bei der Arduino Programmierung Also bitte auführlich er klären :D und ein Beispiel wäre auch cool

Vielen Dank schonmal im Voraus Gruß MillerB

Hi MillerB, N'Abend Zusammen,

baue mir auch grad einen Uno als Joystick, besser gesagt eine Controllerbox für meine CNC. Nach etlichem suchen und probieren bin ich nun auf UNOJOY gestoßen. Hier gibt es ein gutes Video, allerdings in Englisch, aber man kann es gut nach vollziehen. Was bei mir der erste Fehler war ich hatte wohl den "falschen" Uno dran mit einem Mega8U2. Zum flashen als HID wird aber wohl der 16U2 benötigt. Zumindest hat es dann funktioniert. Unter Win hab ich nicht getestet, da ich unter LinuxCNC arbeite, und da funzt es in Verbindung mit dem QJoypad einwandfrei.

Lange Rede kurzer Sinn: MillerB das sollte dir helfen...

Viele Erfolg :)

Für einen Leonardo sollte das einfacher gehen, da braucht man keinen eigenen Treiber auf dem PC zu installieren, siehe z.B. hier http://www.instructables.com/id/Arduino-LeonardoMicro-as-Game-ControllerJoystick/ da wird diese Lib verwendet https://github.com/MHeironimus/ArduinoJoystickLibrary

Damit kann man auch 2 oder 3 Joysticks über einen Leonardo (oder Micro, das ist das gleiche, nur mit kleinerer Platine) anbinden.

Vielleicht noch zur Erklärung, wie das beim Leonardo funktioniert

MillerB:
Ich habe schon gesehen dass man die Bibliothek HID einbinden kann. Habe aber dazu noch nichts im Internet gefunden wie dies funktionieren sollte bzw was die Funktion dabei ist.

Die Bibliothek ist für den Leonardo schon in der Arduino IDE enthalten. Da muss man nichts machen.

Die oben verlinkte Joystick Lib verwendet sie einfach, in dem in dieser Datei
https://github.com/MHeironimus/ArduinoJoystickLibrary/blob/master/Joystick/Joystick.h
ein #include “HID.h” steht.

Die ganze USB Übertragung ist vom Prinzip her simpel:

Eigentlich gibt es hier
https://github.com/MHeironimus/ArduinoJoystickLibrary/blob/master/Joystick/Joystick.cpp
in der Joystick Lib nur zwei wichtige Dinge:

Am Anfang steht etwas langes, was so beginnt

static const uint8_t _hidReportDescriptor[] PROGMEM = {
  
 // Joystick
 0x05, 0x01,      // USAGE_PAGE (Generic Desktop)
 0x09, 0x04,      // USAGE (Joystick)
 0xa1, 0x01,      // COLLECTION (Application)
 0x85, JOYSTICK_REPORT_ID, //   REPORT_ID (3)

// 32 Buttons

// ... geht noch ein ganzes Stück weiter

Das ist die Beschreibung des USB-Gerätes. Daran erkennt der PC was da angesteckt wurde und lädt den entsprechenden Treiber.

Wenn es etwas ist, was das Betriebssystem nicht kennt, muss dann erst mal ein Treiber installiert werden. Das ist bei dem Link von Tchefter oben der Fall, da gibt es auch noch Treiber für Mac und Windows, die installiert werden müssten. Falls der Simulator so was braucht, ist das dann keine Arduino Programmierung, sondern halt Mac oder Windows Programmierung.

Zurück zur Lib, da gibt es eigentlich nur eine Funktion, die zur Übertragung der Joystick Daten dient

void Joystick_::sendState()
{
  uint8_t data[JOYSTICK_STATE_SIZE];  // <- Das sind die Datenbytes, die zum PC gehen

  // ... hier steht viel Zeug, das die Bytes mit Inhalt füllt

  // ... ganz am Schluss erledigt die HID Library die Übergabe an das USB-Interface des Controllers

  // HID().SendReport(Report number, array of values in same order as HID descriptor, length)
  HID().SendReport(JOYSTICK_REPORT_ID, data, JOYSTICK_STATE_SIZE);
}

Änderungen des Joystick Wertes erfolgen einfach durch Ändern der entsprechenden Variable und Aufruf der obigen Funktion, damit der PC bei der nächten Abfrage die geänderten Daten bekommt.

Also erstmal danke dass Ihr es so schnell beantworten konntet, das mit dem UnoJoy gefällt mir schon sehr gut, habe auch schon mit meinem Mega2560 angefangen Schritt für Schritt alles nach zu "programmieren". Doch schon beim setzen des Arduinos in den DFU Mode scheitert es bei mir :confused: Welche pins muss ich beim Mega2560 verbinden?

Und die Datei "TurnInToAnJoystick" müsste die Datei "MegaJoy - Attack!" sein oder?

Da der Leonardo jetzt zum Mega geworden ist, klinke ich mich mal mangels passender Hardware aus.

MillerB: Also erstmal danke dass Ihr es so schnell beantworten konntet, das mit dem UnoJoy gefällt mir schon sehr gut, habe auch schon mit meinem Mega2560 angefangen Schritt für Schritt alles nach zu "programmieren". Doch schon beim setzen des Arduinos in den DFU Mode scheitert es bei mir :confused: Welche pins muss ich beim Mega2560 verbinden?

Und die Datei "TurnInToAnJoystick" müsste die Datei "MegaJoy - Attack!" sein oder?

Ich selbst habe (noch) kein Mega2560 mit dem 16U2, daher kann ich dir das auch nicht genau sagen, "müssten " aber die gleich wie beim Uno sein - ohne Gewähr" !!! Auch das "TurnInto" musst einfach probieren.

Btw.: Ich hab auch nur den UNOJOY genommen da ich kein Leonardo habe und zu geizig war einen zu kaufen, daher, wenn du eh einen hast, dann nimm die Beschreibung von ArduFe...

Ich würde vielleicht im ersten Schritt gar kein großes Bastelprojekt starten, sondern erst mal schauen, ob der Simulator so einen Joystick akzeptiert.

Minimales Vorgehen:

Die Software für den Leonardo von Github als Zip-Archiv herunterladen. (Grüner Button rechts.)

Mit der Arduino IDE einen neuen Sketch für den Leonardo anlegen, speichern, IDE schliessen.

Aus dem Zip die Joystick.h und Joystick.cpp in den Ordner des Sketches kopieren. Also nicht, wie oben auf Instructables geschrieben, als Library installieren. Das geht nicht.

Sketch wieder aufmachen und so editieren

#include "Joystick.h"

void setup() {
  // put your setup code here, to run once:
  Joystick.begin();
}

void loop() {
  // put your main code here, to run repeatedly:

}

Wenn man das jetzt hochlädt, läuft danach auf Windows erstmal ein "neues Gerät gefunden" Fenster im Hintergrund. Bei mir erscheint dann in der Systemsteuerung unter "Geräte und Drucker" das Bild von einem XBox-Controller mit Namen "Arduino Micro" (damit habe ich getestet).

Der Joystick tut jetzt absolut nichts, aber kann könnte ja mal schauen, ob er im Simulator irgendwie zugewiesen werden kann.

Übrigens beim Neuprogrammieren aufpassen: Leonardo oder Micro wechseln unter Windows nach jedem Upload den COM-Port. Meist belegen sie drei Nummern, die sie im Wechsel bekommen.

@ArduFe Das ist der ähnliche Ablauf wie beim UNOJOY, da gehts wie folgt:

UNOJOY Downloaden - das Besipiel in der IDE öffnen - uploaden zum UNO - IDE zu Nun in den DFU Mod gehen, 2 Pins wie beschrieben brücken, loslassen und dann die "TurnInto.. .bat" ausführen. Wie schon geschrieben brauchte ich dafür ein Uno-Board mit dem Atmel16U2. Hab heute Mittag mal eine Test mit allen Buttons und Achsen der beide Josticks gemacht unter LinuxCNC, funzt einwandfrei...