Cerca nel blog

Caricamento in corso...

martedì 3 febbraio 2015

Una Wiild senza Wii

Da qualche tempo sto seguendo il progetto WiildOS che ha l'obbiettivo di fornire un sistema operativo (OS) e di puntamento (Wiild) per la gestione di una lavagna interattiva multimediale.

Il cuore del sistema è il controller Nintendo Wiimote che, collegato e configurato opportunamente su un sistema Linux, consente mediante una penna con led ad infrarossi di "pilotare" il mouse della LIM:


La mia idea è quella di utilizzare, al posto della penna ad infrarossi e del relativo Wiimote, una mouse-pen:


Sostanzialmente è un mouse ottico montato su uno stelo ergonomico a forma di penna, con tanto di tasti "sx/dx", scroll e tasto centrale.
Il costo, almeno nell'amazzonia, va dai 10€ ai 15€.
La forma, a sezione rettangolare, consente di tenere sotto controllo la posizione degli assi X ed Y durante il movimento.

Il suo utilizzo, oltre alle ragioni economiche, ritengo sia molto più semplice ed immediato rispetto ad un Wiimote in quanto il collegamento avviene analogamente ad un comune mouse wireless, quind plug&play anche su sistemi Linux-based.

Quello che manca è un programma che consenta di eseguire la calibrazione, ovvero di rilevare il coefficiente che faccia corrispondere il segnale di movimento con lo spostamento fisico della penna.  In buona sostanza, quando muovo il mouse (un qualunque mouse) di 1cm sul tappetino, questo di default non corrisponde ad un movimento della freccia di 1cm.


COMANDI UTILI

  • udevadm monitor --udev   (avviato prima del collegamento, restituisce i messaggi di udev riferiti alla periferica che collego);
  • xinput list (elenca tutti i dispositivi di input);
  • xinput list-props <id> (elenca tutti i parametri ed i valori in essere per il dispositivo con quel <id>);
  • xinput set-prop <id> <n°parametro> <valore> (consente di modificare i parametri)

ESEMPI DI OUTPUT CON UNA MOUSE PEN GENERICA

udevadm monitor --udev
~$ udevadm monitor --udev
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing

UDEV  [6380.352209] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4 (usb)
UDEV  [6380.354478] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.0 (usb)
UDEV  [6380.355883] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.1 (usb)
UDEV  [6380.358817] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.1/0003:062A:4101.000F (hid)
UDEV  [6380.359607] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.0/0003:062A:4101.000E (hid)
UDEV  [6380.360480] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.1/usbmisc/hiddev1 (usbmisc)
UDEV  [6380.361029] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.0/0003:062A:4101.000E/hidraw/hidraw3 (hidraw)
UDEV  [6380.361186] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.1/input/input21 (input)
UDEV  [6380.364479] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.0/input/input20 (input)
UDEV  [6380.366310] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.1/input/input21/mouse4 (input)
UDEV  [6380.366786] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.1/input/input21/event12 (input)
UDEV  [6380.371037] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.1/0003:062A:4101.000F/hidraw/hidraw4 (hidraw)
UDEV  [6380.371084] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.4/1-1.2.1.4:1.0/input/input20/event11 (input)

xinput list
~$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Logitech Unifying Device. Wireless PID:1028    id=10    [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad            id=12    [slave  pointer  (2)]   
⎜   ↳ DualPoint Stick                             id=13    [slave  pointer  (2)]
⎜   ↳ MOSART Semi. 2.4G Keyboard Mouse            id=16    [slave  pointer  (2)]   <-----
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Power Button                                id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=11    [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                            id=14    [slave  keyboard (3)]
    ↳ MOSART Semi. 2.4G Keyboard Mouse            id=17    [slave  keyboard (3)] 
<----- 
Come indicato dalle frecce rosse, il mouse viene visto con due diversi <id>, ovvero 16 e 17.


xinput list-props 16


~$ xinput list-props 16
Device 'MOSART Semi. 2.4G Keyboard Mouse':
    Device Enabled (134):    1
    Coordinate Transformation Matrix (136):    1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (264):    0
    Device Accel Constant Deceleration (265):    1.000000
    Device Accel Adaptive Deceleration (266):    1.000000
    Device Accel Velocity Scaling (267):    10.000000
    Device Product ID (253):    1578, 16641
    Device Node (254):    "/dev/input/event12"
    Evdev Axis Inversion (268):    0, 0
    Evdev Axes Swap (270):    0
    Axis Labels (271):    "Rel X" (144), "Rel Y" (145), "Rel Horiz Wheel" (262), "Rel Dial" (677), "Rel Vert Wheel" (263)
    Button Labels (272):    "Button Left" (137), "Button Middle" (138), "Button Right" (139), "Button Wheel Up" (140), "Button Wheel Down" (141), "Button Horiz Wheel Left" (142), "Button Horiz Wheel Right" (143), "Button Side" (257), "Button Extra" (258), "Button Unknown" (256), "Button Unknown" (256), "Button Unknown" (256), "Button Unknown" (256)
    Evdev Middle Button Emulation (273):    0
    Evdev Middle Button Timeout (274):    50
    Evdev Third Button Emulation (275):    0
    Evdev Third Button Emulation Timeout (276):    1000
    Evdev Third Button Emulation Button (277):    3
    Evdev Third Button Emulation Threshold (278):    20
    Evdev Wheel Emulation (279):    0
    Evdev Wheel Emulation Axes (280):    0, 0, 4, 5
    Evdev Wheel Emulation Inertia (281):    10
    Evdev Wheel Emulation Timeout (282):    200
    Evdev Wheel Emulation Button (283):    4
    Evdev Drag Lock Buttons (284):    0



xinput list-props 17

~$ xinput list-props 17
Device 'MOSART Semi. 2.4G Keyboard Mouse':
    Device Enabled (134):    1
    Coordinate Transformation Matrix (136):    1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Product ID (253):    1578, 16641
    Device Node (254):    "/dev/input/event11"


Da un primo approfondimento ho riscontrato che i parametri principali che influenzano il movimento sono :

Device Accel Constant Deceleration (265):    1.000000
Device Accel Velocity Scaling (267):    10.000000

In particolare aumentando il primo (cod.265) il movimento del puntatore rallenta, mentre il secondo (cod.267) che regola l'accelerazione.


PRIMA PROVA SU "MONITOR"


Da una prima prova empirica sono riuscito a usare la mouse pen sul monitor del PC (un LCD a 19"), impostando il parametro 265 a 13.50 ed il 267 a 0.000001:

~$ xinput set-prop 16 265 13.5
~$ xinput set-prop 16 267 0.00001

Con questi parametri ad uno spostamento fisico della mouse-pen corrisponde lo stesso spostamento della freccia di pari dimensione.



 
COSA C'E DA FARE

La mia idea è di scrivere un programma che:
  • legga i dispositivi collegati per scegliere quale sia quello da settare (o individuazione mediante hot-plug);
  • consenta di calcolare ed aggiustare il coefficiente del parametro 265;
  • salvi la configurazione e la possa impostare di default al prossimo plug di quel determinata mouse-pen, così da fare la calibrazione una sola volta e non ad ogni riavvio.
Essendo il progetto in fase embrionale, qualsiasi tipo di collaborazione è ben gradita.

Grazie,
Denis

Archivio blog