Ardu? No!Les boutons ≫ Lecture analogique de boutons

Lecture analogique de boutons

Répartition linéaire des lectures

On va supposer ici que l'on a qu'une broche repérée BOUTONS qui doit lire l'état de plusieurs boutons. Dans le cas ou il y aurait plusieurs broches dédiés à la lecture de boutons, il faudra répéter plusieurs fois l'algorithme.

La lecture des boutons se fera grâce à l'instruction valeurLue=digitalRead(BOUTONS); et par analyse de la variable valeurLue, on en déduira l'état des boutons.

Si on veut avoir le maximum de chances de ne pas se tromper (indiquer un bouton pour un autre), il faudrait que la répartition des valeurs possibles soit régulière. Une valeur possible est ce que l'on obtient sur un bouton ou sur plusieurs si on fait une lecture poly:

Graphe des lectures pour N possibilités régulièrement répartis

Pour connaître le numéro d'une possibilité, la valeur théorique est n.1024/N mais toute valeur s'en écartant de moins de ½.1024/2N sera aussi bonne. Si la courbe réelle s'en écarte un peu (à cause du procédé, des tolérances des composants...), la lecture sera encore valide.

En principe "Aucun bouton appuyé" se traduit par une valeur nulle ou de 1023.

Le programme de test est simple, mais l'utilisation d'analogRead() n'est pas très performante:

// Lecture analogique mono de boutons
const word MAX_CONVERSION = 1024; // Valeur max+1 du CNA, 1024 avec un AVR
const word N = 6; // Nombre de possibilités 
const byte BOUTONS = A0; // Broche pour des boutons


void setup()
{
}

void loop()
{
  word valeurLue = analogRead(BOUTONS); // Lecture
  valeurLue = (valeurLue + MAX_CONVERSION / (2 * N - 2)) / (MAX_CONVERSION / (N - 1));  // N° du bouton 0..N
  // valeurLue contient le nombre 0..N recherché
  // Ici, traitement de l'information
}

Répartition non linéaire des lectures

Si il y a des répartitions linéaires, il y en a aussi qui ne le sont pas. On peut avoir par exemple:

Graphe des lectures pour N possibilités irrégulièrement répartis

L'idéal serait de mesurer les différentes possibilités, et de ranger dans un tableau les valeurs moyennes de deux valeurs successives. Pour lire une valeur, on irait alors voir dans la table où elle se situe et on en déduirait ainsi le numéro cherché. Cela fonctionne aussi (mieux), même si les valeurs sont réparties linéairement.

Si on a beaucoup plus de valeurs possibles, le tableau devient grand, la recherche devient longue, et il faut remplir le tableau (manuellement?). Cette solution reste quand même la meilleure avec peu de boutons et avec des résistances dont les valeurs réelles sont loin des valeurs théoriques voulues.

Si on a peu de valeurs et si on n'est pas trop loin de la droite, on peut faire comme si on avait une droite car l'intervalle est suffisamment important.

Quand on a beaucoup de valeurs ou que l'on veut une solution sans avoir à mesurer les limites, on peut appliquer une correction pour aplanir au maximum la courbe. On applique ensuite la formule précédente.

Dans la suite, j'utilise souvent la correction de Martin qui est un polynôme sous la forme α(X - β)2 + γ La pratique montre que ce polynôme du second degré suffit dans la plupart des cas. Pour le montage Diviseur de tension à résistances série, l'erreur résiduelle est trop importante et j'utilise la vraie fonction.

L'avantage de ce type de correction est qu'elle fonctionne directement dans certains cas quel que soit le nombre de boutons, éventuellement en passant le nombre de boutons en paramètre.

Condition pour une lecture certaine

La conversion ne va pas donner toujours la même valeur dans les mêmes conditions. Si la lecture donne une valeur avec une dispersion de Δ/2 en plus ou en moins, il faut que l'écart des valeurs soit d'au moins Δ. Sinon on risque de lire une valeur pour une autre. Avec 1024 points de lecture, si Δ était nul, on pourrait lire 1024 boutons en lecture mono. Dans la pratique on est bien en deçà.

Si on ne mesure pas les limites, mais que l'on se fie aux valeurs théoriques calculées, cela va donner une dispersion supplémentaire. Par exemple en utilisant des résistances à 5%, il est possible que les valeurs lues soient bonnes à 5% aussi (voir plus si les erreurs sur deux valeurs se cumulent). Pour une lecture voisine de 1023, cela fait une erreur de 50 points et si par ailleurs tout le reste était parfait, on ne pourrait plus discerner que 10 ou 20 boutons en lecture mono de façon certaine.

Lire N bouton en lecture poly, demande les mêmes écarts qu'une lecture de 2N boutons en lecture mono. En gros si on est capable de lire 6 boutons en lecture poly, on devrait être capable de lire 64 boutons en lecture mono.

Pour diminuer les imperfections de mesure, je garde souvent la valeur lue à condition d'avoir lu deux fois consécutivement la même valeur. On pourrait augmenter pour ne garder la valeur que si trois lectures consécutives sont identiques. Cette méthode est simple et élimine systématiquement les lectures aberrantes. Mais rien ne me dit alors que le programme ne va pas boucler indéfiniment.

Une autre méthode classique est de faire N mesures, de retirer les M mesures les plus faibles et plus grandes et de faire la moyenne sur les N-M mesures restantes. Le programme est plus long en général, mais la durée est fixe. On ne peut plus alors boucler trop longtemps.