- sam. 23 janvier 2016
- Enseignement
- Michel GRIMALDI
- #Raspberry
Dans le précédent article, je présentais une solution pour installer un écran tactile de 7 pouces ELEDUINO sur un Raspberry PI.
Hélas, cette procédure d'installation n'est pas totalement satisfaisante car elle utilise des modules binaires du noyau et des drivers, ce qui ne permet plus de procéder à des mises à jour de ceux-ci.
La solution que je propose aujourd'hui consiste à récupérer directement les actions sur l'écran tactile, au niveau du driver usb, et à simuler les actions correspondantes de la souris au niveau du terminal X.
connexion de l'écran tactile
Le touch screen Eleduino est considéré comme un périphérique HID (Human Interface Device) au même titre que la souris ou le clavier. A ce titre, lorsqu'il est connecté au port usb, on peut y accéder par le biais d'un driver hidrawx (x= 0, 1, 2, … en fonction de l'ordre de montage des périphériques HID).
Dans le cas où le touch screen est connecté au moment du boot, il est monté sur /dev/hidraw0
première chose à faire: créer une règle udev
Nous allons créer une règle de montage udev, afin de donner les droits de lecture à l'utilisateur. Pour cela, sur le Raspberry, il faut créer un fichier dans le répertoire /etc/udev/rules.d/
sudo gedit /etc/udev/rules.d/52-touchscreen.rules
et y écrire les lignes suivantes
SUBSYSTEM=="usb", ATTR{idVendor}=="0eef", ATTR{idProduct}=="0005", MODE="0666"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", GROUP="plugdev"
Si l'écran cohabite avec d'autres périphériques HID (souris, clavier,.etc.) ou qu'on veut se garder la possibilité de le brancher à tout moment, on peut également faire en sorte qu'il ait un nom de device symbolique fixe, par exemple /dev/touchscreen. Dans ce cas, il faut rajouter à la règle précédente une instruction SYMLINK+="touchscreen"
ce qui donnerait
SUBSYSTEM=="usb", ATTR{idVendor}=="0eef", ATTR{idProduct}=="0005", MODE="0666"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", GROUP="plugdev", SYMLINK+="touchscreen"
dans ce cas, l'écran sera accessible via le lien symbolique /dev/touchscreen.
Fonctionnement
Lors de chaque action sur l'écran (touche avec ou sans déplacement ou relâchement), celui-ci envoie une trame constituée de 25 octets sur le driver /dev/hidraw0.
Cette trame est constituée comme suit:
- 1 octet de header contenant la valeur hexadécimal 0xaa
- 1 octet représentant l'état de l'événement (1 touché, 0 non touché)
- deux entiers sur 16 bits contenant les coordonnées3 x1 et y1 de l’événement
- 1 octet de séparation contenant la valeur hexadécimal 0xbb
- 1 octets représentant le nombre de touches simultanées sur l'écran – champ de bits (5 maxi pour les 5 doigts)
- 8 entiers sur 16 bits contenant les coordonnées respectives des touches (x2, y2, x3, y3, x4, y4, x5, y5)
- 1 octet de fin contenant la valeur hexadécimal 0xcc
exemple : la trame
aa 01 01 c2 01 1f bb 01 01 e0 03 20 01 e0 03 20 01 e0 03 20 01 e0 03 20 cc
correspond à une touche unique en x=450, y=287
Interprétation des touches écran
Nous avons défini les événements de souris correspondant aux touches de la manière suivante:
souris | écran tactile |
---|---|
click gauche - left mouseClick | une touche unique courte (<200 ms) |
click droit - rightmouseClick | une double touche courte (<200 ms) |
click avec maintien du bouton - mouseDown | touche longue (>1000 ms) |
relâchement de souris - mouseUp | laché de l'écran |
Installation du programme de commande touchscreen.c
Télécharger Le code source en C sur http://grimaldi.univ-tln.fr/files/touchscreen.c
Pour simuler des actions de la souris, nous allons devoir utiliser la bibliothèque libX11 qu'il faut installer
sudo apt-get install libx11-dev
compiler le programme
gcc -Wall -o "touchscreen" "touchescreen.c" -lX11
vous pouvez maintenant vérifier son fonctionnement en passant le nom du driver en paramètre
./touchscreen hidraw0 &
si vous avez installé le lien symbolique, dans la règle udev, l'argument de la commande devra être touchscreen
./touchscreen touchscreen &
Exécution au démarrage
Pour que le programme s'exécute automatiquement au démarrage vous avez deux solutions:
-
une simple: lancer la commande dans le fichier .profile de votre home directory (~/.profile)
-
une un peu plus compliquée: créer un service linux, un deamon pour être plus précis. A ce sujet, le Web foisonne de tutoriels expliquant, 1000 fois mieux que j'aurais pu le faire moi même, comment créer un service linux. Je vous engage à suivre un de ces tutoriels.
Bon courage ....