Forum: Mikrocontroller und Digitale Elektronik USB HID Maus


von Martin S. (drunkenmunky)


Lesenswert?

Hallo,
ich will ein PIC18 als HID Maus einsetzen. Die Beispiele, die ich bis 
jetzt gesehen habe, senden eine relative Positionsänderung, die sich der 
Cursor bewegen soll.

Ist es auch möglich eine absolute Position zu verwenden, z.B. von der 
linken unteren Ecke des Bildschirmrandes?

Für Touchscreen wäre es sonst ja schwer oder garnicht möglich als HID 
Maus zu verwenden, oder sehe ich das falsch?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Ist es auch möglich eine absolute Position zu verwenden, z.B. von der
> linken unteren Ecke des Bildschirmrandes?

Nicht, wenn es eine Maus sein soll.

Absolut positionierende Geräte verwenden eigene Devicetreiber, sind also 
keine HID-Mäuse.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Doch, das geht. Ich habe mit der V-USB library von
http://www.obdev.at/products/vusb/index.html
ein Adapter gebaut, das ein älteres serielles Tektronix Tablett in eine 
absolute USB Maus umwandelt. Läuft an Mac und Windows ohne Treiber. Der 
Trick ist einfach der USB Deskriptor:
1
PROGMEM char usbHidReportDescriptor[60] = {
2
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
3
    0x09, 0x02,                    // USAGE (Mouse)
4
    0xa1, 0x01,                    // COLLECTION (Application)
5
    0x09, 0x01,                    //   USAGE (Pointer)
6
    0xa1, 0x00,                    //   COLLECTION (Physical)
7
    0x05, 0x09,                    //     USAGE_PAGE (Button)
8
    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
9
    0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)
10
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
11
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
12
    0x95, 0x03,                    //     REPORT_COUNT (3)
13
    0x75, 0x01,                    //     REPORT_SIZE (1)
14
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
15
    0x95, 0x01,                    //     REPORT_COUNT (1)
16
    0x75, 0x05,                    //     REPORT_SIZE (5)
17
    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
18
    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
19
    0x09, 0x30,                    //     USAGE (X)
20
    0x09, 0x31,                    //     USAGE (Y)
21
    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)
22
    0x46, 0x9d, 0x0b,              //     PHYSICAL_MAXIMUM (2973)
23
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
24
    0x26, 0x9d, 0x0b,              //     LOGICAL_MAXIMUM (2973)
25
    0x65, 0x11,                    //     UNIT (SI Lin:Distance)
26
    0x55, 0x0e,                    //     UNIT_EXPONENT (-2)
27
    0x75, 0x10,                    //     REPORT_SIZE (16)
28
    0x95, 0x02,                    //     REPORT_COUNT (2)
29
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
30
    0xc0,                          //   END_COLLECTION
31
    0xc0                           // END_COLLECTION
32
};
Wie man sehen kann, ist mein Tablett auf eine Auflösung von 2973 dots 
eingestellt. Das ganze Dings ist ein 12" x 12" Monstrum.
Das gesamte Projekt für einen ATTiny45/85
kannste hier einsehen :
http://www.schoeldgen.de/avr/

von Martin S. (drunkenmunky)


Lesenswert?

Hi,
danke für die Antwort!
Gut zu wissen, dass es überhaupt geht :-)

Kannst du erklären, wie die Datenbytes in der report structure zu stehen 
haben?

Wieviel bytes muss der Ausgabepuffer haben?

Sorry für meine Fragen, ich versuch mich grad erst in USB einzuarbeiten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.