- LiTime Speicher und Akkus         
Ergebnis 1 bis 9 von 9

Thema: Maximale Delta-Richtungswerte einer Maus über USB

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.01.2014
    Beiträge
    6

    Frage Maximale Delta-Richtungswerte einer Maus über USB

    Anzeige

    Praxistest und DIY Projekte
    Hi @ all

    Weiß jemand zufällig wie groß die maximalen Delta-Werte einer Maus über USB sind?

    Meine Anwendung:
    Ich lese die Maus in Linux aus und möchte mit den Delta-Richtungswerte die Position bestimmen. Diese Deltas sind im 2. und 3. Byte des Mausstreams. Wenn ich mir diese dezimal anzeigen lasse, bekomme ich nur Werte zwischen -127 und +127 heraus. Das Skript habe ich von diesem Thread. In den Kommentaren steht auch, dass Werte bei -255 und +255 überlaufen.

    Was mache ich falsch?

    Viele Grüße
    tuxologie

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Die Werte machen genau das, was du von ihnen im Code verlangst.

    char b[3];

    Die Werte sind zwar ein Byte groß, werden aber in einem signed char gehalten.
    Das heißt, dass beim Bit 7 nur das Vorzeichen unterschieden wird. Steht da eine 1 ist es negativ sonst positiv.
    Damit bleiben nur jeweils Bit 0 bis 6 für die Werte und darin lassen sich nur 128 unterschiedliche Werte abbilden.
    Es ist also gleichgültig, ob du dann diesen Wert in eine größere Variable speicherst.

    Was ist jetzt daran so schlimm, dass du nur insgesamt 256 Werte je Richtung hast?

    sast

    雅思特史特芬
    开发及研究

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.01.2014
    Beiträge
    6
    Vielen Dank für deinen Beitrag! Was ich noch nicht verstehe ist das in dem Skript ein Wertebereich von -255 bis +255 angegeben wurde, bevor ein Überlauf angezeigt wird.

    Nochmal zur Anwendung:
    Ich möchte mit dieser Maus eine Positionsbestimmung durchführen. Die Maus bewegt sich und aus den Delta errechne ich die Gesamtstrecke. Wenn die Werte nur einen Bereich von -127 bis +127 haben ist die Messung bei schnellen Bewegungen der Maus ungenau. Es wird weniger Weg angezeigt, als die Maus eigentlich gefahren ist. Aus diesen Daten will ich ein Sensormodell der Maus erstellen. Damit sollen sich dann Simulationen ermöglichen.

    Viele Grüße
    tuxologie

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Soo, hab jetzt mal im Internet kurz nach den Daten der Mäuse gesucht und bin unter http://wiki.osdev.org/Mouse_Input fündig geworden.
    Danach erhältst du tatsächlich ein volles Byte (8Bit == 256) als Bewegungsdaten. Das Vorzeichen steht in zwei extra Bits in Byte 0.
    Wenn du die 256 als positive Werte haben willst, musst du nur das Auslesearray als unsigned char behandeln und die Bewegungsrichtung aus Byte 0 auslesen. Das steht zumindest so in diesem Wiki.
    Probieren musst du es nun natürlich selbst.

    sast

    Habe gerade mal auf dem Raspi einen Test mit dem Code aus deiner Quelle gemacht. xvz und yvz sind die Vorzeichen Flags aus b[0]. 1 bedeutet negativ. Man erkennt, dass die negativen Zahlen im unsigned char als 255 abwärts dargestellt werden. Im Zweierkoplement ist 255(b1111 1111) == -1 und -128 wäre dann b1000 0000
    Code:
    lb=0 rm=0 mb=0 xvz=0 yvz=0 xo=0 yo=0 xd=0 yd=1
    lb=0 rm=0 mb=0 xvz=0 yvz=0 xo=0 yo=0 xd=1 yd=1
    lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=255
    lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=254
    lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=255 yd=253
    lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=252
    lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=255 yd=250
    lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=252
    Daraus folgt.
    Wenn ich die Bytes 2 und 3 als signed behandle ist zu erkennen, dass tatsächlich nur +-127 ausgegeben wird. char ist auf dem Raspian anscheinend ein unsigned char.
    Code:
    lb=0 rm=0 mb=0 xvz=1 yvz=0 xo=0 yo=0 xd=-7 yd=0
    lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=-6 yd=-2
    lb=0 rm=0 mb=0 xvz=1 yvz=0 xo=0 yo=0 xd=-9 yd=0
    lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=-11 yd=-1
    lb=0 rm=0 mb=0 xvz=1 yvz=0 xo=0 yo=0 xd=-11 yd=0
    lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=-11 yd=-1
    Geändert von sast (22.01.2014 um 07:35 Uhr) Grund: Test auf raspian(linux debian)

    雅思特史特芬
    开发及研究

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    21.01.2014
    Beiträge
    6
    Vielen Dank sast! Ich habe es jetzt auch mal mit dem unsigned Char probiert. Ergebnis für Delta-X-Werte: bewegt man die Maus schnell nach links ist bei -129 Schluss, der Start war -256 macht wieder eine Differenz von 127! Wird die Maus schnell nach rechts bewegt geht sie ebenfalls nur bis 127... Bedeutet es, dass die Wertebereich unabhängig von dem Char-Array des Mausstreams ist und nur von -127 bis +127 geht.

    Meine Messung würde dann ergeben, dass meine Lasermaus nur korrekte Deltas für für Geschindigkeit bis 0,4m/s erfassen kann. Bei höheren Geschwindigkeiten würde Strecke "verloren" gehen, da der Wertebereich limitiert ist. Meinst du meine Annahmen sind richtig?

    Viele Grüße,
    tuxologie

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Hattest du denn bei den schnellen Bewegungen auch einen Überlauf? Das würde dann die +-127 bestätigen. Ich hab meine Vermutungen jetzt nur aus dem Link den ich beim letzten Post angegeben habe und von meinen nächtlichen Tests.
    Eventuell ist es auch eine Fehlinterpretation beim Datentyp. Hab lange nicht mehr in C auf einem Rechner programmiert. Obwohl mir jetzt auf die Schnelle auch nicht einfällt, was da falsch sein könnte.

    Ich habs nicht hinbekommen, dass ein Überlauf angezeigt wurde.

    sast

    雅思特史特芬
    开发及研究

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    21.01.2014
    Beiträge
    6
    Hallo sast,

    ich habe es bei mir auch probiert, ohne Erfolg es wird weder in x- noch in y-Richtung ein Überlauf angezeigt. Plattformen beider Tests waren X86 und ARM11. Die Limitierung bei schnellen Bewegung blieb bestehen. Kann das ein Fehler im Code sein? Ich versuche heute Abend ein Python-Programm, das auch auf die Maus zugreift und die Deltas ausgibt.

    Viele Grüße
    tuxologie

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    21.01.2014
    Beiträge
    6
    Hallo,

    ich habe es nun mit dem Python-Programm versucht. Es wurde auch hier keine Überläufe in X- oder Y-Richtung angezeigt. Ich habe nun eine andere Maus getestet. Es handelt sich um eine Logitech MX-518. Diese ist zwar auch bis 127 beschränkt jedoch ist sie auch bei schnellen Bewegungen genauer als die Lasermaus.

    Was meint ihr? Ist es die Lasermaus oder liegt es an der Verarbeitung der Daten vom USB-Bus. Ich könnte ja noch die Deltas direkt vom Maussensor abgreifen...

    Viele Grüße
    tuxologie

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    21.01.2014
    Beiträge
    6
    Hallo,

    was meint ihr dazu? Sind alle USB-Mäuse in diesem Bereich beschränkt? Die MX-518 war aber viel genauer bei schnellen Bewegungen als meine Lasermaus.
    Ich habe auch probiert die USB-Pollingrate als Kernelparameter anzupassen (Quelle). Auslesen kann man ihn mit: cat /sys/module/usbhid/parameters/mousepoll
    Leider wurde die Pollingrate dadruch nicht schneller... Vorschläge?

    Viele Grüße
    tuxologie
    Geändert von tuxologie (07.02.2014 um 09:24 Uhr)

Ähnliche Themen

  1. Schaltung zum Laden einer 1S Lipo Batterie über USB
    Von sony-psp007 im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 02.07.2010, 14:58
  2. "Delta"Maus mit Vb
    Von Thomas$ im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 01.02.2009, 18:44
  3. Interface von einer USB Maus.
    Von PAT_McUser im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 27.11.2008, 10:12
  4. (Maximale) Größe einer Interrupt Service Routine
    Von Psiyou im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 27.01.2006, 12:38
  5. C-Control über USB Maus/Tastatur steuern
    Von jomammele im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 4
    Letzter Beitrag: 14.01.2005, 21:59

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus