Les secrets du Yocto-(Maxi)Knob

Les secrets du Yocto-(Maxi)Knob

La lecture par USB d'un potentiomètre, d'un bouton poussoir ou autre capteur résistif n'est a priori pas bien compliquée. D'ailleurs, le Yocto-Knob est l'un des tous premiers modules que nous avons mis en vente il y a plus de dix ans. Pourtant, selon les applications, les besoins ne sont pas toujours les mêmes. C'est pourquoi nous avons ajouté avec le temps des réglages permettant d'affiner les mesures. Voyons cela en détail...


Il suffit d'aller voir la section des Articles liés et exemples d'applications sur la page du Yocto-Knob pour se rendre compte de la diversité des applications de ce module. Originalement prévu pour la lecture de boutons physiques, nous l'avons aussi utilisé pour du chronométrage, pour de la mesure de position rotative, comme barrière lumineuse...

Fonctionnement de base

Le point commun à toutes ces applications est la lecture d'une entrée résistive. Le principe est simple: le Yocto-Knob crée un diviseur de tension sur la base de la résistance que vous connectez à une entrée du module et d'une résistance interne, et mesure la tension au point milieu du diviseur. La valeur mesurée est celle que vous retrouverez dans l'attribut rawValue de chaque AnButton: elle peut aller de 0 lorsque le contact d'entrée est fermé, à 4095 lorsque le contact est ouvert.

Pour lire la valeur brute du diviseur de tension, vous pouvez utiliser:

// Lire la valeur brute de l'entrée désirée
int rawVal = anButton.get_rawValue();



Sur la base de la tension au point milieu, le Yocto-Knob peut estimer la valeur de la résistance connectée. Comme il ne peut pas deviner la résistance maximale que vous souhaitez mesurer, il offre une procédure de calibration des entrées, qui permet - sur la base de la valeur de résistance la plus haute et la plus basse observées - de normaliser la valeur analogique mesurée de sorte à ce qu'elle varie linéairement entre 0 et 1000 sur la plage d'utilisation du potentiomètre. C'est la valeur que vous trouvez dans calibratedValue.

Vous pouvez effectuer la calibration,à l'aide de la fenêtre de configuration du module dans le VirtualHub. Si vous voulez le faire par logiciel, utilisez le code suivant:

anButton.set_analogCalibration(YAnButton.ANALOGCALIBRATION_ON);
// faire bouger l'entrée entre ses deux extrêmes
anButton.set_analogCalibration(YAnButton.ANALOGCALIBRATION_OFF);


Alternativement, vous pouvez aussi configurer la calibration sur la base de valeurs brutes min et max connues:

// Calibration prédéterminée avec des valeurs arbitraires
anButton.set_calibrationMin(10);
anButton.set_calibrationMax(3100);



Pour lire la valeur calibrée et linéarisée sur la plage de mesures, utilisez:

// Lire la valeur calibrée de l'entrée désirée
int inputVal = anButton.get_calibratedValue();



Fonctionnement réactif

Lorsque rien ne presse, vous pouvez vous contenter de la méthode décrite ci-dessus, qui permet d'obtenir par polling au maximum quelques mesures par seconde. Mais si vous voulez un comportement plus réactif, vous avez intérêt à utiliser la méthode des callbacks de changement de valeur (voir notre précédent article à ce sujet).

Pour lire la valeur calibrée et linéarisée par callback, utilisez plutôt:

static void myValueChangeCallback(YAnButton fct, string value)
{
        int inputVal = int.Parse(value);
        // utiliser la valeur ici
}

// Installer le callback sur l'entrée désirée
anButton.registerValueCallback(myValueChangeCallback);
// Note: appeler périodiquement YAPI.HandleEvents()



En mode réactif, le callback est appelé chaque fois que la valeur calibrée change. Sachant que les mesures sont effectuées à une fréquence de 1kHz, si le Yocto-Knob se contentait de faire suivre chaque mesure, la communication USB et l'application seraient rapidement submergées de mesures. Par exemple, lorsque le signal d'entrée est légèrement bruité, on recevrait des valeurs qui varient constamment d'un tout petit peu. Pour éviter cela, le module ne fait suivre que la valeur moyenne toutes les 32[ms] tant que la mesure est stable. Mais pour ne pas perdre en réactivité, dès qu'un changement significatif est détecté sur la base des trois derniers échantillons, alors il transmet instantanément la valeur médiane parmi ces trois échantillons, ce qui réduit la latence à 2[ms] pour la détection des changements. Ce mode de mesure analogique hybride est une particularité des fonctions anButton, qui permet de construire des interfaces analogiques efficaces et réactives.

Il est possible de configurer le seuil au-delà duquel une mesure est considérée comme un "changement significatif" à l'aide du code suivant:

anButton.set_sensitivity(20);


Une valeur plus grande induit une plus grande tolérance aux changements avant de quitter le mode moyenné. La valeur par défaut est une sensibilité de 5 points d'écart.

Modes de mesure différenciés

Si c'est nécessaire, il est possible de changer la méthode de mesure du Yocto-Knob et du Yocto-MaxiKnob:

  • Le mode Analog fast est le fonctionnement par défaut, décrit précédemment
  • Le mode Analog smooth est un mode purement moyenné sur 32[ms], sans adaptation aux changements. Il est utile lorsque la stabilité est plus importante que la réactivité.
  • Le mode Digital4 est destiné à la lecture d'entrées on/off et est décrit ci-dessous

Pour changer la méthode de mesure d'une entrée, vous pouvez soit utiliser la fenêtre de configuration du module dans le VirtualHub, soit utiliser le code suivant:

anButton.set_inputType(YAnButton.INPUTTYPE_DIGITAL4);



Lectures de boutons on/off

Pour lire des boutons on/off, nous avons introduit en 2020 un mode de fonctionnement spécifique, qui permet de multiplexer jusqu'à quatre boutons par entrée analogique (voir
l'article expliquant la méthode de multiplexage). Même si vous n'utilisez qu'un seul bouton on/off, vous aurez probablement intérêt à utiliser ce mode.

Ce mode est aussi réactif que le mode Analog fast, mais a l'avantage d'effectuer directement le décodage de la valeur mesurée pour déterminer la position des entrées binaires. Dans ce mode, la calibration n'est plus nécessaire; la valeur calibrée est toujours un nombre entre 0 et 15, qui une fois converti en base 2 donne directement l'état des boutons multiplexés.

Si avez besoin de moins de 4 boutons multiplexés, voici comment procéder:

  • Pour un seul bouton on/off, le plus simple est de le brancher directement sur l'entrée analogique. La valeur retournée sera zéro lorsque le bouton est ouvert, et 15 lorsqu'il est fermé.

  • Autre possibilité pour un seul bouton on/off: si vous soudez une résistance de 10kΩ en parallèle au bouton, la valeur retournée sera 7 lorsque le bouton est ouvert, 15 lorsqu'il est fermé, et zéro si vous avez un défaut de connexion entre le Yocto-Knob et le bouton.

  • Pour deux boutons on/off: comme décrit dans l'article cité ci-dessus, soudez une résistance de 10kΩ en parallèle au premier bouton et une autre de 4.7kΩ en parallèle au deuxième bouton. La valeur retournée sera 3 lorsque les deux bouton sont ouverts, 11 ou 7 lorsque l'un ou l'autre des boutons sont fermés, 15 lorsque les deux sont fermés, et zéro si vous avez un défaut de connexion entre le Yocto-Knob et les boutons.

  • Et ainsi de suite pour trois boutons on/off

Le code suivant vous aidera décoder ces valeurs binaires:

bool bouton1_pressed = ((inputVal & 8) != 0);
bool bouton2_pressed = ((inputVal & 4) != 0);
bool bouton3_pressed = ((inputVal & 2) != 0);
bool bouton4_pressed = ((inputVal & 1) != 0);


Si vous utilisez moins de 4 boutons et que vous avez mis une résistance sur les boutons utilisés, vous pouvez rajouter:

bool connectionProblem = (inputVal == 0);



Utilisation avec des capteurs de type NPN

Comme décrit dans cet autre article, il est possible de raccorder un capteur avec sortie NPN à un Yocto-Knob comme s'il s'agissait d'un bouton on/off. C'est valable en particulier pour les capteurs à effet Hall dont nous vous avons parlé la semaine dernière.

Pour ce cas d'utilisation, quelques méthodes supplémentaires peuvent s'avérer utiles:

  • La méthode get_pulseCounter() permet de retourner le nombre d'impulsions détectées depuis la dernière mise à zéro. Attention toutefois, comme la fréquence d'échantillonnage de ce module n'est que de 1kHz, cela ne sera fiable que si les impulsions font au moins quelques millisecondes.
  • Les méthodes get_lastTimePressed() et get_lastTimeReleased() permettent de lire le timing précis de la dernière transition dans chaque direction. Cela peut vous être utile par exemple pour faire une barrière lumineuse bon marché...


Alternatives au Yocto-(Maxi)Knob

Même s'il est assez flexible, le Yocto-Knob reste un produit simple avec des limitations comme la faible tension de mesure, qui le rend relativement sensible aux perturbations électromagnétiques, et l'absence d'isolation, qui le limite en général à une utilisation interne à un appareil ou à un panneau de contrôle.

Pour des applications nécessitant des mesures à distance, il conviendra plutôt d'utiliser l'un des modules suivants, qui sont un peu plus chers mais plus robustes et surtout dotés d'une isolation électrique:

  • Vous pouvez faire des mesures analogiques en utilisant des tensions plus élevées à l'aide du Yocto-0-10V-Rx, ou même via une boucle de courant à l'aide d'un Yocto-4-20mA-Rx.
  • Pour huit entrées binaires en tension plus haute, le Yocto-Maxi-IO-V2 est idéal.
  • Pour compter des impulsions rapides, visez le Yocto-PWM-Rx qui pourra même détecter des impulsions inférieures à la microseconde.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.