Installation d'un écran tactile 7" sur Raspberry PI, suite...


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 ....