Ist es möglich, ein USB-Gerät herzustellen, das Mausdaten im laufenden Betrieb ändert?

7

Ich habe einen Freund, der Schwierigkeiten hat, Maustreiber / Hersteller zu finden, die verschiedene Optionen für Legasthenie unterstützen. Das Invertieren der X- und Y-Achse ist eine einfache Funktion, die die meisten Programme und Treiber nicht kennen.

Mir kam der Gedanke, dass es möglich sein könnte, ein kleines USB-Gerät (ähnlich einem USB-Stick oder PS / 2-Adapter) zu konstruieren, an das ein Benutzer eine USB-Maus anschließen und mit ein paar DIP-Schaltern einen oder beide invertieren könnte Achsen.

Ich bin mit Programmierung (C # / C +) und Elektronik vertraut, bin mir aber nicht sicher, ob es ein Standardprotokoll für USB-Mäuse gibt.

Ich würde es vorziehen, die Verwendung eines seriellen Konverters zu vermeiden (obwohl ich weiß, dass er ein mehr oder weniger Standardprotokoll hat). Hat jemand USB-Mäuse mit einem benutzerdefinierten Elektronikprojekt verwendet oder kann er erklären, ob der Aufbau eines USB-zu-USB-Adapters zum Umkehren der Bewegung möglich ist?

JYelton
quelle
1
Eine andere Möglichkeit, die X- und Y-Achse umzukehren, besteht darin, die Maus einfach auf den Kopf zu stellen. Probieren Sie es ein paar Minuten lang aus, die Herausforderung ist gut für Ihr Gehirn.
Kevin Vermeer
5
"Einfach" zu starten ist, mit einer nicht optischen USB-Maus (= alt) und einer Schnittstelle an den Drehunterbrechern vom Ball aus zu starten. Sie befinden sich vollständig außerhalb von Protokollen oder Software und arbeiten mit der physischen Umgebung. Sie können beispielsweise Signale von einer Maus aufnehmen, verarbeiten und bei Bedarf in eine andere einfügen. Weit davon entfernt, idalisch zu sein, aber dazu zu neigen, sehr schnell loszulegen.
Russell McMahon
@ Kevin Das Problem beim physischen Invertieren der Maus besteht darin, dass die verschiedenen Tasten dadurch schwieriger (wenn nicht sogar nahezu unmöglich) zu bedienen sind. Verstehen Sie mich nicht falsch, aber die betreffende Legasthenikerin hat genau das immer wieder getan, als keine andere Lösung verfügbar war.
JYelton

Antworten:

2

Dies ist wahrscheinlich alles andere als die billigste oder eleganteste Lösung, bietet Ihnen jedoch große Flexibilität.

Ein Arduino- Einplatinencomputer kann auf einen Windows-Hostcomputer wie ein Human Interface Device (HID), dh eine Maus, schauen . Es ist jedoch nicht auf Mäuse beschränkt; Tastaturen und andere Geräte sind ebenfalls versteckt.

Sie können eine serielle Maus direkt an den seriellen Anschluss des Arduino anschließen oder, wenn Sie eine USB-Maus bevorzugen, diese über ein USB-Host-Shield mit dem Arduino verbinden .

Da Sie das Arduino in C programmieren können, können Sie alle Arten von Eingaben von der Maus in beliebige Befehle übersetzen, die Sie gerne an den PC senden. Sie könnten beispielsweise einen dreifachen Klick mit der rechten Maustaste in einen Tastatureingabebefehl übersetzen, der Himmel ist die Grenze.

JonnyBoats
quelle
Ich denke, dies kommt der tatsächlichen Implementierung einer Hardwarelösung am nächsten. Die Software-Antworten waren hilfreich, ebenso wie die Vorschläge für die PS2-Serie, aber letztendlich werde ich dies wahrscheinlich versuchen, da ich Arduino-Prototyping-Kits habe und dies nach einem guten Ansatz klingt.
JYelton
1
In der Tat wäre die Verwendung einer PS / 2-Maus die beste Form dieser Idee, da dies die einzige Option ist, für deren Unterstützung keine zusätzliche Schnittstelle (Serial Level Converter oder USB Host Shield) erforderlich ist. Sobald Sie überlegen, ein Host-Schild auf ein Uno zu setzen, verwenden Sie die falsche Basisplatine für den Job.
Chris Stratton
6

Was ist mit einer Softwarelösung?

Unter Windows können Sie die Mausaktionen mit einer Anwendung abfangen, die so einfach sein kann wie dieses AutoHotKey- Skript:

#NoEnv
SetBatchLines -1
Process Priority,,R

BlockInput Mouse        ; user mouse input is ignored during MouseMove
CoordMode Mouse, Screen ; absolute coordinates
SysGet m, Monitor       ; get the screen edges
mLeft += 1, mRight -= 2, mTop += 1, mBottom -= 2
SetMouseDelay -1        ; fastest action

MouseGetPos x0, y0      ; get initial mouse pointer location
SetTimer WatchMouse, 1  ; run the subroutine fast (10..16ms)
Return

WatchMouse:
   MouseGetPos x, y     ; get current mouse position
   x0 += 2*(x0-x), x0 := x0 < mLeft ? mLeft : (x0 > mRight  ? mRight  : x0)
   y0 += 2*(y0-y), y0 := y0 < mTop  ? mTop  : (y0 > mBottom ? mBottom : y0)
   MouseMove x0, y0, 0  ; set new position as old, for the next timer
Return

!z::ExitApp             ; stop the madness; make the script persistent

Dieselbe Logik kann verwendet werden, um das Problem in jeder Anwendungsprogrammierumgebung (C ++, C # usw.) zu lösen, die auf die Windows-Cursorfunktionen zugreifen kann .

Unter Linux ist es so einfach wie das Ändern einer Eigenschaft für Ihre Maus xinput, wie Ben schrieb:

xinput set-int-prop "USB Optical Mouse"  "Evdev Axis Inversion" 8 0 1

Sie müssen xinput -list | grep -i 'mouse'"USB Optical Mouse" durch Ihren Gerätenamen ( ) ersetzen .

Weitere Fragen zu dieser Software richten Sie bitte an Stack Overflow , unsere Website für die Programmierung.

rluks
quelle
1
Aber ich stimme zu, dass es großartig wäre, eine USB-Gerätelösung "in-the-Box" zu haben, diese Person würde einfach in den USB-Anschluss stecken und das wäre es. Die Installation von sw dauert einige Zeit, aber das Erstellen, Programmieren und Funktionieren eines solchen Geräts würde noch mehr Zeit in Anspruch nehmen.
rluks
1
Softwarelösungen hierfür gibt es leider nur sehr wenige. Es scheint, dass Maushersteller dies standardmäßig in ihr Gerätebedienfeld aufnehmen sollten, um sicherzustellen, dass sie für Menschen mit Behinderungen so weit wie möglich von Nutzen sind. Es ist schließlich eine äußerst einfache mathematische Funktion.
JYelton
4

Dies wäre ziemlich schwierig zu erreichen. Ihr Gerät muss sich sowohl als USB-Host als auch als USB-Peripheriegerät verhalten. Es gibt vielleicht Mikrocontroller, die das können, aber am Ende müssen Sie möglicherweise zwei verwenden, einen als Host und einen als Slave.

Wenn Sie beispielsweise die Verwendung einer seriellen Maus vorschlagen, ist Ihre Arbeit viel einfacher zu erledigen. Sie benötigen lediglich einen Mikrocontroller mit 2 seriellen Schnittstellen sowie zwei Chips für die serielle Schnittstelle (wie MAX202 oder die neuere Version).

Eine noch einfachere Option könnte darin bestehen, ein Windows-Programm zu schreiben, das die Inversion ausführt.

Raketenmagnet
quelle
3
Ich bin damit einverstanden, dass Softwarelösungen einfacher und besser sind, um das zu erreichen, was Sie wollen.
Armandas
Ich würde gerne eine Softwarelösung schreiben, aber mein Wissen über Low-Level-Treiber fehlt. Ich bin mir auch nicht sicher, ob etwas leicht geschrieben werden kann, das mit Eingabegeräten verschiedener Marken kompatibel ist oder auf freundliche Weise mit den Treibern der einheimischen Hersteller zusammenarbeitet. MAFMouse existiert, scheint aber veraltet zu sein. Wenn es einfacher wäre, Software zu finden oder zu schreiben, hätte ich nicht daran gedacht, ein kleines USB-Gerät zu entwickeln. :)
JYelton
Wie wäre es mit einem PS2-Gerät?
Raketenmagnet
Ich habe eine Softwareversion geschrieben, da es nirgendwo eine gut funktionierende Lösung zu geben scheint. superuser.com/questions/406502/…
Polynom
@Poly Vielen Dank für Ihre Mühe! Ich werde es versuchen müssen, obwohl ich denke, dass ich immer noch eine Hardwarelösung nur für die Herausforderung versuchen werde.
JYelton
1

Sie können den Open-Source- LUFA-Stack verwenden , um native USB-HID-Projekte (Human Interface Device) durchzuführen. Adafruit verfügt über ein Open Source- Entwicklungsboard , das mit dem LUFA-Stack kompatibel ist.

Die Verwendung einer USB-Maus mit Ihrem benutzerdefinierten Board wäre schwierig. Die Verwendung einer PS / 2-Maus sollte jedoch viel einfacher sein. Das Protokoll ist einfacher und Sie können wahrscheinlich irgendwo eine Bibliothek finden. Hier ist eine Arduino-Bibliothek, die von einer PS / 2-Maus lesen kann, was von Nutzen sein könnte.

Für den PS / 2-Anschluss verfügt SparkFun über eine Breakout- Karte und einen Anschluss , die funktionieren sollten.

Wahrscheinlich können Sie auch einige Software auf dem Computer ändern, um dies zu tun. Dies wäre am billigsten, aber weniger portabel. Eine schnelle Google-Suche zeigt, dass dies im Grunde ein Befehl für einen Linux-Computer ist.

ben
quelle
1

OK, hier ist eine mögliche Lösung:

Wie Ben sagte, wäre dies viel einfacher, wenn Sie eine PS / 2-Maus verwenden würden, da dies im Grunde einfache serielle Daten sind.

Wenn Sie dies jedoch wirklich als USB-Gerät benötigen, können Sie möglicherweise einen USB-PS / 2-Konverter und einen PS / 2-USB-Konverter verwenden und Ihr Gerät dazwischen platzieren.

Ich habe mich umgesehen und konnte nicht sofort einen Chipsatz finden, der die Arbeit erledigt, obwohl sie existieren müssen. Aber Sie könnten einfach die Einheiten kaufen :

USB PS2 Konverter

Raketenmagnet
quelle
6
Leider handelt es sich bei den abgebildeten Geräten lediglich um Kabeladapter, mit denen einige Mäuse, die intern für die Verarbeitung von seriellen USB- und PS / 2-Protokollen mit niedriger Geschwindigkeit ausgelegt sind, an den anderen Anschluss angeschlossen werden können. Es gibt keine aktiven Schaltkreise im Inneren.
RBerteig
Ist das wahr? Kein Wunder, dass sie nicht immer funktionieren!
Raketenmagnet
HID-Geräte, die auf einem bestimmten Cypress-USB-Chipsatz mit niedriger Geschwindigkeit basieren, können beim Einschalten erkennen, ob die Datenkabel an einen PS2-Anschluss oder an USB mit niedriger Geschwindigkeit angeschlossen sind. Alles, was erforderlich ist, um eine Maus oder Tastatur zu verwenden, die auf diesen Chips an beiden Ports basiert, ist die richtige Form des Anschlusses, daher die Existenz dieser Dinge. Nicht alle Geräte mit niedriger Geschwindigkeit sind implementiert, um diesen Trick zu unterstützen, und ich glaube, es ist viel schwieriger, USB mit voller Geschwindigkeit (oder hoher Geschwindigkeit) von einem PS2-Anschluss zu unterscheiden, sodass diese Geräte diesen Trick im Allgemeinen nicht ausführen.
RBerteig