Le 17/12/2020 dans DevBlog

Un Arduino Uno comme clavier d'appoint

Avoir un problème de clavier, ça arrive. C’est notamment arrivé à une collègue dernièrement, sa touche Command ⌘ ne fonctionnait plus !

Il se trouve que cette personne était aussi mon Secret Santa cette année, et j’ai donc décidé de l’aider à résoudre son problème. De la façon la moins pragmatique, pratique, économique et utile possible !

Je savais qu’il était possible d’utiliser un Arduino comme clavier ou souris USB, j’ai donc fouillé un peu dans mon stock pour sortir un beau et rutilant (mais ancien) Arduino Uno R3 (ATmega328P).

À ma grande déception, la librairie Keyboard n’y est pas exploitable – il me faudrait au minimum un Leonardo…

Flash du firmware

Beaucoup aidé par cet article, j’ai découvert qu’il était possible de changer le mode USB de mon Uno pour l’exploiter comme un clavier USB au standard HID.

Une fois flashé en mode clavier, il n’est plus possible de mettre à jour le code, il faut donc revenir au firmware d’origine.

Sous Linux, voici ma procédure pour passer en mode clavier et en revenir.

Les dépendances :

sudo apt-get install dfu-programmer dfu-util
wget https://github.com/nylen/auto-f1-presser/raw/master/Arduino-keyboard-0.3.hex
wget https://github.com/arduino/ArduinoCore-avr/raw/master/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Uno-Rev3.hex

Keyboard-0.3.hex est plutôt compliqué à trouver… Et je n’ai jamais retrouvé la source, excepté que l’auteur se nomme Darran (son blog n’existe plus).

Le second fichier est votre firmware USB classique, vous trouverez toutes les versions ici.

Ensuite, il faut passer la board dans un mode qui accepte le changement de firmware (DFU), en reliant avec un fil, pendant une seconde, les deux pins suivants :

PIN DFU Arduino

Il faudra le refaire avant chaque changement de mode.

Pour vérifier que ça a fonctionné, vous pourrez constater avec lsusb que « Arduino SA Uno R3 » n’est plus visible.

Puis, pour passer en mode clavier :

sudo dfu-programmer atmega16u2 erase
sudo dfu-programmer atmega16u2 flash --debug 1 Arduino-keyboard-0.3.hex
sudo dfu-programmer atmega16u2 reset

Et pour passer en mode normal / USB Serial :

sudo dfu-programmer atmega16u2 erase
sudo dfu-programmer atmega16u2 flash --debug 1 Arduino-usbserial-atmega16u2-Uno-Rev3.hex
sudo dfu-programmer atmega16u2 reset

Vous devez débrancher et rebrancher la board après chaque changement de mode.

Envoyer des pressions du clavier

Une fois en mode clavier, nous pouvons communiquer avec l’ordinateur comme si nous étions un clavier HID.

Pour cela on s’appuie sur la HID Usage Table et un peu de code !

uint8_t buf[8] = { 0 };

// This is the Command key ⌘ / Apple Key / Windows Key
#define KEY_LEFT_GUI 0x08

void setup() {
    // Key button
    pinMode(2, INPUT);

    Serial.begin(9600);
}

void loop() {
    delay(10);
    
    int sensorValue = digitalRead(2);

    if (sensorValue == LOW) {
        releaseKey();
    } else {
        if (buf[0] == 0) {
            buf[0] = KEY_LEFT_GUI;
            Serial.write(buf, 8);
        }
    }
}

void releaseKey()
{
    if (buf[0] != 0) {
        buf[0] = 0;
        Serial.write(buf, 8);
    }
}

Comme KEY_LEFT_GUI n’est pas vraiment une lettre mais plutôt un modifieur, i l doit être envoyé en Dynamic Flags (DV), donc dans le 1er bit. Si nous voulions envoyer une touche plus classique, ça serait dans buf[2].

Le montage électronique

Comme vous l’avez vu dans le code, nous écoutons le pin 2 de la board pour savoir quand envoyer un signal.

Le montage est en fait identique au tutoriel « bouton » officiel !

Le tour est joué : j’ai un bouton Command ⌘ !

L’enrobage

Le bouton poussoir de test n’est pas super classe ni très pratique. J’ai donc mis un pied dans le monde incroyable des claviers mécanique (oh god qu’ai-je fait) et j’ai fini par conclure que je devais acheter un switch Cherry MX RED – ce qui se fait de mieux.

Ce genre de switch équipe tous les claviers haut de gamme, et il est possible d’en acheter à l’unité (sur reichelt.com – mais si vous connaissez une boite française qui propose ça je prends !)

J’ai compris beaucoup trop tard que les switch RGB de Cherry ne sont pas équipés de LED, ils ont ce nom uniquement parce que la lumière passe à travers… J’ai donc implémenté une petite LED RGB – ça occupe l’Arduino entre deux pressions !

Pour le keycap, après des heures de recherche (on trouve des choses incroyables !) j’ai fini par demander à un copain une impression 3D (merci Loïck).

Et pour le boîtier, simplement du bois de récupération… il y a de la cagette à légume et de la plinthe de salle à manger ici !

Webm vidéo, 19mo

Le résultat est… rustique !

Photo du bouton

Test sur un MacBook Pro = le drame

Après des heures de travail et de tests concluants sur Linux et Windows, je me suis quand même assuré du fonctionnement de l’objet sur un MacBook Pro…

Première surprise, MacOS souhaite absolument identifier le clavier et affiche un écran de configuration « Clavier non identifiable ». Il suffit de fermer l’assistant et le périphérique est tout de même actif.

Par contre un autre problème survient : sous MacOS les touches de modification (Command ⌘, Alt, Shift…) ne sont pas partagées entre les claviers !

Ma touche est inutilisable !

Le problème est connu notamment des utilisateurs de Foot Switch USB (pour commander l’ordinateur avec les pieds)

J’ai trouvé deux solutions logicielle à ce problème (car il n’y a aucune option dans MacOS pour ça) :

  • Multimod qui ne semble pas très maintenu, dont le code est fermé et demande un paiement après installation mais sans exposer de prix avant…
  • Karabiner Elements qui sert à customiser son clavier et qui a comme effet de bord positif de justement partager les modificateurs entre tous les claviers. Open-source et à jour c’est la solution que je recommande !

En conclusion

Le projet est un succès, la touche Command ⌘ pressé depuis l’Arduino se complète bien avec d’autres touches pressées depuis le clavier classique ! Et ma collègue a maintenant une touche garantie 100 million d’opérations !

Les usages de ce bricolage sont multiples :

  • créer des macros ;
  • customiser à foison les signaux pour lui faire faire d’autres opérations plus utiles, comme verrouiller l’écran ou déployer un site en prod ;
  • contrôler les « média », régler le son ;
  • faire un joystick ou un clavier custom pour osu! (jeu de rythme) ;
  • créer son clavier mécanique à base d’Arduino Uno…

J’ai beaucoup appris en réalisant ce petit objet et je vais m’intéresser de beaucoup plus près au monde des claviers mécaniques !