Ich baue gerade an einem USB-Joystick auf Grundlage eines Pi Pico mit
CircuitPython. Das ganze funktioniert mit mehreren Achsen und Buttons
wie erwartet. Ich benötige für meine Achsen allerdings eine höhere
Auflösung als 8 Bit.
Ich habe dafür den HID descriptor und den offiziellen Beispielcode in
hid_gamepad.py (siehe
https://github.com/adafruit/Adafruit_CircuitPython_HID/blob/main/examples/hid_gamepad.py)
angepasst auf 16 Bit. Das Problem ist das nach wie vor Windows nur 8 Bit
Werte akzeptiert obwohl ich 16 Bit pro Achse sende. D.h. alle Werte über
127 ergeben einen vollen Ausschlag der Achse, nicht wie erwartet erst ab
65535. Ich habe auch schon andere Wertebereiche für logical
minimum/maximum probiert (-32767 to 32767, 0 to 32767, 0 to 65535) das
ändert aber leider auch nichts.
Hat jemand eine Idee woran es liegen könnte? Offensichtlicher Fehler im
Descriptor? Hat Windows etwas dagegen wenn das Gerät plötzlich einen
neuen Descriptor liefert?
1
import usb_hid
2
3
# This is only one example of a gamepad descriptor, and may not suit your needs.
Matthias 🟠. schrieb:> 0x16,0x00,0x80, // LOGICAL_MINIMUM (-32768)> 0x26,0xFF,0x7F, // LOGICAL_MAXIMUM(32767)
Wenn die Werte so bei mir ersetze habe ich nach wie vor das gleiche
Problem. Bei einem Wert von 127 habe ich den Maximalausschlag der Achse
erreicht. Bei 0 ist sie genau in der Mitte.
ansi90 schrieb:> 0x27, 0xff, 0xff, 0x00, 0x00, # Logical Maximum (65535)
das ist Käse:
-> 0x20 | 0x04 | 3 -> 3 Bytes du sendest aber 4 bytes.
Übrigens sind schon 8 Bit mit den üblichen Potis wegen des begrenzten
Drehwinkels nur schwer zu erreichen. 16 Bit ist einfach unmöglich
> Übrigens sind schon 8 Bit mit den üblichen Potis wegen des begrenzten> Drehwinkels nur schwer zu erreichen. 16 Bit ist einfach unmöglich
Das ist mir bewusst. Deswegen kommt auch kein Poti zum Einsatz sondern
hochauflösende Encoder. Am Ende werde ich im Bereich 12 bis 14 Bit
Auflösung, nicht Genauigkeit, landen.
Nach langem hin und her hat sich herausgestellt, dass das Problem nicht
der Descriptor war sondern Windows. Windows kam nicht damit klar dass
sich das Gerät verändert hat. Nach einem Reset des Controllers auf
Standardwerte ging direkt alles.