Avant toutes choses, je tiens à préciser que le développement du nouveau firmware se fait sur la même plateforme matérielle que les claviers déjà vendus et ceux en cours de production.

Il est donc inutile d’attendre la finalisation du firmware pour acheter un clavier. D’une part parce que c’est un projet majeur nécessitant facilement un an à un an et demi, d’autre part, une simple mise à jour avec un petit utilitaire de flash permettra d’obtenir le nouveau firmware maison.

J’avais déjà expliqué ce qu’est le debounce rate dans un ancien article. Je vais rapidement rappeler le fonctionnement et les enjeux et expliquer le fonctionnement du nouvel algorithme en comparaison de l’ancien.

Le debounce : filtrer le bruit

Comme vous le savez, un switch est un interrupteur. Cet interrupteur contient à l’intérieur, des feuillets métalliques qui servent de contacteurs électriques.

Les deux flèches en violet

Quand vous actionnez le switch, vous allez déplacer ces feuillets et les mettre en contact. À la manière d’un ballon qui rebondirait sur le sol plusieurs fois avant de s’arrêter, les feuillets en métal rebondissent plusieurs fois entre eux avant de se stabiliser.

Si nous regardons sur un oscilloscope, nous observerons une suite de coupure et de passage de courant.

Comme ceci :

Ce qu’il faut comprendre : 1 = contact, un courant électrique passe, 0 = pas de contact, le courant ne passe pas.

Ainsi, une seule frappe sur un clavier causerait plusieurs contacts entre les feuillets et donc la détection de plusieurs frappes, c’est ce qui se passe quand vous tapez une fois sur la lettre “a” et que “aa” apparaît sur votre écran. C’est ce qu’on appelle le key chatter.

Une seule frappe donne 4 contacts en prenant en compte le rebond des feuillets, détection de frappes multiples

La méthode mise en place pour l’éviter, c’est le debounce. Globalement, l’algorithme dit au clavier : “Si tu détectes une frappe, attend x millisecondes, le temps que les contacteurs se stabilisent et re vérifie. “

Le temps de debounce permet simplement de laisser le temps au switch de se stabiliser.

Le debounce permet ainsi de filtrer les bruits, notamment les contacts accidentels. Dans le cas suivant par exemple, la première détection n’est pas suivie par une confirmation, il n’y aura pas de frappes détectées sur le clavier.

Le debounce permet de filtrer le bruit.

Le fonctionnement actuel : la double vérification

L’algorithme de debounce actuellement employé sur les claviers est on ne peut plus simple. Lors du balayage de la matrice, le contrôleur vérifie si un contact a eu lieu. Si un tel contact se produit, le contrôleur repasse quelques millisecondes plus tard pour confirmer la frappe.

Un debounce simple avec une double confirmation

C’est simple et le fonctionnement est impeccable dans la mesure où je n’ai eu aucune remontée de problèmes de frappes.

Cependant ce fonctionnement engendre un scénario dans lequel on pourrait perdre jusqu’à 10 millisecondes en terme de réactivité.

La première détection se fait à t = 0ms

Imaginez la situation suivante :

  • Cycle 1, t = 0ms : le premier balayage détecte un contact
  • Cycle 2, t = 5ms : le second balayage tombe malheureusement sur une absence de contact, ce qui provoque une remise à 0
  • Cycle 3, t = 10ms : le troisième balayage détecte un contact
  • Cycle 4, t = 15 ms : le 4ème balayage confirme la frappe

Une frappe qui aurait dû être prise en compte à t+5 ms, se retrouve détectée à t+15ms seulement.

Le nouvel algorithme : un marquage des valeurs

Je pense que si vous avez déjà joué à League Of Legends, vous allez comprendre le nouvel algorithme très rapidement.

Vous avez certains personnages qui après une attaque, pose une marque sur un ennemi. Après 3/4 marques, l’attaque suivante inflige des dégâts supplémentaires.

Cependant, si vous n’attaquez plus l’ennemi pendant quelques secondes, les marques disparaissent.

Voilà… C’est exactement ce que nous allons faire sur le clavier. Quand on enchaîne la détection de plusieurs signaux positifs, on valide, autrement on oublie.

  • Cycle 1, t = 0 ms : détection d’un contact, valeur = 1
  • Cycle 2, t = 1 ms : détection d’un second contact, valeur = 2
  • Cycle 3, t = 2 ms : comme dans le scénario précédent, absence de détection de contact, valeur retombe à 0
  • Cycle 4, t = 3 ms : détection d’un contact, valeur = 1
  • Cycle 5, t = 4 ms : détection d’un nouveau contact, valeur = 2
  • Cycle 6, t = 5 ms : valeur +1
  • Cycle 7, t = 6 ms : valeur +1
  • Cycle 8, t = 7 ms : valeur = 5, on valide la frappe

Ainsi, contrairement à l’algorithme existant où on se contente d’une double vérification avec le risque qu’une instabilité remette le compte à 0 et provoque une latence supplémentaire, le nouvel algorithme prend en compte les 5 derniers relevées stables.

Cette nouvelle méthode permet donc d’offrir une filtration améliorée du bruit et de stabiliser les performances même sur des switches vieillissants puisque nous mesurons bien 5 valeurs positifs d’affilée et pas seulement deux états en deux mesures.

Par exemple, dans le cas d’un switch vieillissant et rebondissant comme une balle en caoutchouc sur une durée prolongée, la méthode de la double validation aurait quand même détecté plusieurs frappes alors que notre nouvelle méthode attendra automatiquement la stabilisation du switch pour valider la frappe.

Dans ce scénario, la détection de deux frappes malgré la présence d’un debounce.

Avec notre nouvel algorithme nous obtenons ceci : une invalidation des premières mesures et une validation seulement après la stabilisation des contacteurs du switch.

Le nouvel algorithme ignore automatiquement les mesures instables.

J’en profite pour dire merci à Jonathan R. de m’avoir suggéré cette méthode.

Un firmware cinq fois plus rapide

“Pardon mais… pourquoi dans le premier cas, nous sommes à 5 millisecondes par cycle et dans le second cas, nous sommes à 1 milliseconde par cycle ? “

Parce que nous nous sommes fait escroquer.

Non, sans rire.

Le firmware qui tourne actuellement sur nos claviers a été sous-traité par une SSII, j’en parlais dans l’article précédent.

Il nous a été vendu comme “capable d’atteindre 1000Hz”, mais après une vérification sur oscilloscope, le nombre d’impulsions par seconde était de 200. Soit une fréquence de 200Hz.

Quand j’ai contacté la SSII en question en leur mettant face à la situation, leurs ingénieurs ont répondus que c’était impossible d’atteindre une fréquence de 1 000Hz.

Bizarrement, le firmware maison atteint 1000Hz sans optimisation particulière tout en contrôlant le RGB et notre ingénieur est en train de tester la possibilité de monter à 4 000Hz.

Apparemment, c’est totalement impossible de monter à 1000Hz, selon la SSII s’occupant de nous… Vraiment?

Conclusion : l’importance du debounce

Comme nous l’avons vu aujourd’hui, un algorithme de debounce correctement travaillé permet d’avoir trois avantages majeurs :

  • La première est une plus grande fiabilité. Avec le nouvel algorithme de debounce, nous pouvons utiliser des switches qui seraient autrement trop usés pour l’ancien algo ou bien qui nécessiteraient un ajustement du temps de debounce.
    De plus, nous pouvons aussi réajuster le nombre de mesures nécessaires pour valider le changement d’état du switch. En théorie, nous pourrions utiliser de manière fiable des switches déjà usés jusqu’à la moelle.
  • La seconde est une meilleure stabilité du temps de réponse. Le contrôleur ne vérifie plus l’état dans un écart de temps successif mais une suite d’état, et valide la frappe quand le switch s’est stabilisé.
  • La troisième est l’ajustement automatique du temps de réaction en fonction de la qualité du switch. Contrairement à la première méthode qui compte un temps fixe entre la première détection et la validation, notre nouvelle méthode compte le délai depuis la stabilisation du switch.

    Ainsi un switch neuf se stabilisant rapidement, offrira rapidement les mesures stables nécessaires à l’algorithme pour valider la frappe, tandis qu’un switch vieillissant nécessitera automatiquement plus de temps pour offrir cette succession de mesures.

    D’une manière générale, ce nouvel algorithme devrait nous permettre d’exploiter tous les switches au maximum de leur potentiel, au lieu de nous forcer à calibrer le debounce du clavier entier sur le switch nécessitant le plus de temps à se stabiliser.

Bref, cette nouvelle méthode devrait permettre d’améliorer encore plus la durée de vie déjà monstrueuse de nos claviers.

Vous savez, je trouve révoltant que des claviers à 200€ ne proposent pas un réglage du debounce et qui un an, deux ans après l’achat commencent à détecter des frappes en double.

Une simple option de réglage dans le logiciel, ne coûtant pas un seul centime à mettre en place, permettrait de sauver 95% de ces claviers qui partent à la poubelle et d’améliorer leur durée de vie de plusieurs années.

Ne me demandez pas les marques, vous les connaissez déjà, elles sont toutes plus connues et réputées que moi. De plus, la plupart d’entre vous ont déjà vécus cette malheureuse expérience de première main.

Un commentaire sur “Un nouvel algorithme de debounce

  1. ni.cornu02 says:

    Le “durable et réparable” est une politique sensée et qui est gagnante sur le long terme car les mentalités changent. Y’en a marre du “jetable”. Pour cela et votre professionnalisme je passe commande d’un clavier et j’offrirais le petit dernier TKL à mon fils à sa sortie. Bravo pour votre démarche de qualité à prix abordables, je vais faire marcher le bouche à oreilles !

Laisser un commentaire