Ardu? No!MTobjectsLes ensembles de boutons ≫ MTanalogButtons

MTanalogButtons
(lecture analogique)

Gestion par événements pour Uno, Nano, Mega

Un objet MTanalogButtons gère un ensemble de boutons câblés sur une seule broche analogique et lu grâce à une table. On peut lire quasiment tous les montages, mais la présence d'une table peut être gênante si le nombre de boutons est élevé. Sur une seule broche analogique, il est possible de lire plus de 100 boutons, et à raison d'un word par boutons, cela consomme plus de 200 octets. Pour créer la table, il faut en plus faire le montage et presser tous les boutons... et prier pour que cela fonctionne.

Pour éviter d'avoir une table et consommer de la RAM, une lecture avec extraction du numéro du bouton est intéressante, mais ce n'est pas encore disponible dans MTobjects. Certains montages ayant moins d'intérêts, les objets de MTobjetcs n'existeront sans doute jamais. La lecture sans table n'est pas aussi performante en nombre de boutons.

Pour créer la table, voir si la qualité est suffisante, et avoir un programme de test, je conseille d'utiliser un programme d'apprentissage conçu pour MTanalogButtons.

Quelques idées de montages

Je ne peux pas donne tous les montages utilisables, les pages sur les boutons donnent plus de détails, notamment sur le calcul des valeurs des résistances. En résumé:

Diviseur de tension à résistances parallèles


- tous les boutons on une borne commune à la masse
- on peut utiliser une matrice pré-câblée 4x1 par exemple
- peu utilisable si les boutons sont éloignés
- l'incertitude sur les résistance limite le nombre d'interrupteurs
- lecture mono

Diviseur de tension à résistances série


- pas de borne ni commune , ni à la masse
- si les boutons sont espacés, il faut 2 fils pour aller de l'un à l'autre
- même avec des résistances à 10% le montage fonctionne
- c'est le montage qui permet le plus grand nombre de boutons

Sommateur de courants à lecture poly


- borne commune mais pas à la masse
- on peut utiliser une matrice pré-câblée 4x1 par exemple
- peu utilisable si les boutons sont éloignés
- permet une lecture poly
- les tolérances sur les résistances limitent le nombre de boutons
- les valeurs multiples de 2 posent problème

Suppression de résistances poly


- permet une lecture poly
- si les boutons sont espacés, il faut 1 seul fil pour aller de l'un à l'autre
- les tolérances sur les résistances limitent le nombre de boutons
- les valeurs multiples de 2 posent problème

Suppression de résistances mono


- si les boutons sont espacés, il faut 1 seul fil pour aller de l'un à l'autre
- les valeurs multiples de R1 posent problème

Keypad ou matrice carrée à lecture analogique


- on peut utiliser des matrices déjà câblées (keypad)
- c'est le montage qui possède le moins de résistances
- il faut que tous les boutons soient proches

Include à rajouter

#include <MTobjects.h> // Voir http://arduino.dansetrad.fr/MTobjects

Je conseille fortement de laisser le commentaire, si une autre personne voulait essayer le programme, elle aurait directement un lien de téléchargement. C'est valable pour toutes les bibliothèques que vous utilisez.

Constructeur

MTanalogButtons(pin,
      SEUILS,
      onSelectFunction = PAS_D_ACTION,
      onUnselectFunction = PAS_D_ACTION);

SEUILS

Inspirez vous de:

const word TABLE_DES_SEUILS[] = {982, 920, 880, 840, 797, 754, 710, 665, 619, 571, 523, 471, 421, 369, 316, 260, 204, 145, 87, 28, 0}; // Valeurs des seuils de comparaisons

MTanalogButtons Keypad(PIN, TABLE_DES_SEUILS);

Les seuils doivent être dans un tableau constant de word et classé:
- par ordre croissant si sans appuis sur les boutons le convertisseur donne une valeur proche de 0, et se terminer par 1023
- par ordre décroissant (comme ci-dessus) si sans appuis sur les boutons le convertisseur donne une valeur proche de 1023, et se terminer par 0.

L'ordre croissant ou décroissant bien choisi permet de passer moins de temps si aucun bouton n'est appuyé (le plus souvent).

Si pour le bouton n°N le convertisseur donne entre 96 et 100 et pour le bouton n°N+1 il donne entre 140 et 143, le seuil à utiliser est le milieu de (100, 140) soit 120. Comme c'est un peu fastidieux je conseille d'utiliser le programme d'apprentissage.

erreur de conversion

Quand on lit le convertisseur analogique numérique, il se peut que, un bouton venant d'être appuyé ou relâché, la valeur ne soit pas encore stable au moment de la lecture. On peut aussi avoir du bruit qui vient fausse la mesure. Pour éviter cela, une valeur n'est prise en compte que si on lit deux fois la même valeur à une erreur près:
- si erreur=0 (par défaut) il faut lire deux fois de suite la même valeur. Cela élimine pas mal de fausses lectures
- si erreur=10 si le convertisseur donne 523 puis 533 (ou toute valeur dans [513, 533]), on considérera que c'est pareil
- avec erreur=0 on pourrait lire en théorie 500 boutons, mais avec erreur=10, on ne pourrait plus avoir que 100 boutons
- si erreur est trop grande, on lira un bouton pour un autre.
Plus l'erreur est petite, plus on s’affranchit d'une erreur de lecture. Mais si le système est très bruyant, on risque de ne jamais prendre en compte le bouton. Lassez la valeur par défaut, et augmentez ce nombre.

Fonctions utiles

byte getKey(void);
virtual void onSelect(uint8_t touche);
virtual void onUnselect(void);
void setError(word error = 0);
word getError(void);

getKey: renvoie le numéro de la touche appuyée, 0 si aucune
onSelect: fonction à surcharger appelée quand on appuie sur un bouton
onUnselect: fonction à surcharger appelée quand on relâche tous les bouton setError: permet de fixer la tolérance de la lecture (erreur acceptable) setError: lit la tolérance de la lecture (erreur acceptable)

Fonctions bonus

void setOnSelectFunction(onSelectFunction);
void setOnSelectFunction();
void setOnUnselectFunction(onUnselectFunction);
void setOnUnselectFunction();

setOnSelectFunction: change la fonction appelée lors d'un appui
setOnSelectFunction: sans paramètres supprime la fonction appelée lors d'un appui
setOnUnselectFunction: change la fonction appelée lors du relâchement
setOnUnselectFunction: sans paramètres supprime la fonction appelée lors du relâchement

Exemples