Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Ordinateurs embarqués (SBC) > La carte Raspberry PI > Matériel nécessaire pour Raspberry Pi > Un clavier bien tempéré

Un clavier bien tempéré

dimanche 30 décembre 2012, par Eric P.

Ok, le titre est un mauvais jeu de mots pour amateurs de musique classique, mais je n’ai pas pu m’en empêcher ;)

Le problème

La RasPi a pour elle sa compacité qui en fait un outil fort commode pour toutes les applications embarquées ou les manips itinérantes (par exemple des ateliers pédagogiques) pour lesquelles déplacer un ordinateur portable aussi petit soit-il est déjà trop.

Le problème par contre est qu’il faut toujours lui connecter un clavier, et si vous travaillez avec l’environnement graphique, une souris. Ce qui veut dire la plupart du temps deux câbles et un bureau un peu encombré.

La solution

C’est là que Logitech propose une alternative intéressante avec son clavier K400 :

Comme on peut le voir sur la photo, il s’agit d’un combiné clavier sans pavé numérique + trackpad.

Ce qu’on ne voit par pas vraiment sur la photo, c’est que :
 l’ensemble est plus étroit qu’un clavier sans pavé numérique
 qu’il se connecte par radio via un minuscule dongle USB (le Logitech Unifying Receiver)
 qu’il est disponible pour une petite 30aine d’Euros dans votre grande surface préférée

Bon, le toucher n’est pas extraordinaire et le feeling à la frappe fait un peu cheap, mais comme petit clavier pratique itinérant, ça rend le service attendu.

Ca donne quoi sur la RasPi ?

Eh bien ça marche très bien... mais en apparence seulement, en tout cas pour le moment.

1. Les bons côtés

 il est très bien reconnu d’entrée de jeu, comme en témoigne ce qui suit (cf dernière ligne) :

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 007: ID 046d:c52b Logitech, Inc. Unifying Receiver


 le layout est le bon, à savoir que si vous avez configuré la RasPi en clavier AZERTY (cf un des autres articles de cette section), les touches donnent les bons caractères, c’est à dire qu’appuyer sur la touche "A" donne bien un "a" à la console
 tous les caractères spéciaux (Euro,...) sont correctement obtenus
 le trackpad marche parfaitement sous X, y compris le multitouch : si vous êtes dans une fenêtre avec barres de scroll, glisser deux doigts provoque le scroll dans la direction correspondante
 les boutons du trackpad génèrent les bons événements souris

2. La mauvaise surprise maintenant

Sous X, le layout n’est pas respecté, et vous vous retrouvez avec un clavier QWERTY :(

C’est d’autant plus gênant dans l’écran de login lorsque vous essayez de taper le mot de passe par défaut.

En fait, il s’agit de la manifestation d’un bug actuel de X, qui est très bien expliqué dans cet article. Il n’y a en date de rédaction de cet article aucune correction simple (hormis de patcher des sources et de re-compiler).

Mais heureusement, il y a un workaround.

Comment s’en sortir ?

Attention, ce qui suit ne fonctionne que pour lightdm, qui est le display manager par défaut de la distrib. Si vous en changez, il faudra adapter en conséquence.

La manip consiste à modifier la configuration de lightdm en éditant le fichier /etc/lightdm/lightdm.conf de manière à exploiter un des hooks disponibles pour personnaliser les début et fin de sessions. Comme il s’agit d’un fichier système, son édition se fait via sudoedit (qui comme vous le savez équivaut à sudo nano).

Repérer la ligne :
#display-setup-script=
et la modifier en :
display-setup-script=/usr/bin/setxkbmap fr
Cela consiste simplement à :
 l’activer en retirant le symbole de commentaire
 demander à exécuter la commande "setxkbmap fr" lors de l’initialisation du display X, c’est à dire avant même que l’écran de login ne soit affiché (dans le cas où vous avez désactivé l’auto-login).

Redémarrez lightdm pour en vérifier l’effet :
$ sudo service lightdm restart

Dans un premier temps, vous pourrez constater que le mapping du clavier est correct en saisisant quelque chose dans la fenêtre de LXterminal. Puis déconnectez-vous de manière à revenir à l’écran de login. Vous devrez alors constater que là aussi le mapping du clavier est correct.

Pour ceux qui ne sont pas trop familier avec les arcanes de X, comment ça marche ? La commande setxkbmap a pour effet de spécifier quelle est la configuration de mapping du clavier à utiliser (ici ’fr’), parmi celle qui sont pré-définies dans le système. Il aurait été plus élégant de chercher dans quelle variable d’environnement ou fichier de config paramétré par raspi-config cette information est mémorisée plutôt que de la mettre en dur dans la commande, mais à moins que vous ne passiez votre temps à modifier ce genre de paramétrage système (ce qui est peu probable), pourquoi se casser la tête au-delà du nécessaire ?

Remarque :

En fait l’information est disponible dans le fichier /etc/default/keyboard, et au prix d’un petit script pour le parser ou d’un coup de awk [1] on peut l’extraire sans difficulté. Je laisse au lecteur le soin de tester cela à titre d’exercice ;) Et puis reste à savoir si ce fichier est effectivement mis à jour comme on le suppose lorsqu’on exécute raspi-config. Je reconnais ne pas avoir envie d’investir plus de temps là-dedans, car on commence à confiner à une pratique avec les mouches que la morale réprouve, si vous voyez ce que je veux dire ;)

Et c’est bon alors ?

En fait non, pas tout à fait.

Nous avons pour le moment vérifié que tout était ok dans la configuration où X est démarré automatiquement. Mais si on le démarre par startx depuis la console, on se retrouve avec du QWERTY sous LXterminal (par exemple).

Il y a deux solutions pour corriger cela :
 au niveau utilisateur, en ajoutant dans le home dir un fichier .xsessionrc (attention au point en début de nom de fichier), contenant la commande setxkbmap
 au niveau de la configuration globale de X, en modifiant le fichier /etc/xinit/xinitrc pour y ajouter la ligne :
/usr/bin/setxkbmap fr
avant la commande de lancement de la session.

Cette deuxième option est bien entendu préférable, au cas où vous ayez besoin d’ajouter d’autres utilisateurs à votre RasPi.

Ca donne en gros cela, si on part du fichier original :

#!/bin/sh

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

/usr/bin/setxkbmap fr

# invoke global X session script
. /etc/X11/Xsession

Pour vérifier que ça fonctionne, on commence par s’assurer que le service lightdm est bien arrêté :
$ sudo service lightdm stop
Puis on va sur une des consoles et on lance startx pour vérifier que maintenant sous LXterminal on retrouve bien notre configuration AZERTY.

Deuxième temps : on relance lightdm :
$ sudo service lightdm start
On refait la même vérification. Puis on fait un logout pour tester l’écran de login comme précédemment.

Normalement, tout est ok maintenant (en tout cas ça l’est chez moi ;)

Conclusion

On arrive donc à s’en sortir, mais tout sera pour le mieux dès que le bug à l’origine de ce désagrément aura été corrigé dans X.

Ce qui est curieux, c’est que malgré plusieurs heures passées à écumer le net je n’ai trouvé aucune indication de ce type de procédure. Bon, il faut reconnaître que la configuration concernée (à savoir un clavier avec récepteur universel et AZERTY de surcroît) n’est pas ce qui se trouve le plus fréquemment statistiquement parlant.

A suivre par conséquent...


[1par exemple :
awk 'BEGIN {FS="="} /XKBLAYOUT/{print substr($2,2,length($2)-2) }' /etc/default/keyboard

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.