Lorsque le support Yoctopuce discute avec des clients, on se rend compte qu'il y a parfois quelques malentendus à propos du fonctionnement interne des capteurs Yoctopuce. Ces incompréhensions peuvent parfois amener à des utilisations sous-optimales des capteurs en question. C'est pourquoi on vous propose cette semaine de clarifier un peu tout ça.
Les capteurs Yoctopuce ne sont pas des capteurs natifs
Les clients potentiellement intéressés par des capteurs Yoctopuce se demandent souvent si ces capteurs seront reconnus comme tels par le système d'exploitation de leur ordinateur. Parmi les questions typiques on a:
- Si je branche un Yocto-Light-V3 sur mon PC, est-ce que la luminosité de l'écran va se mettre à s'ajuster automatiquement?
- Est-ce que si je branche un Yocto-GPS-V2 sur mon téléphone, est-ce que les apps qui utilisent la géo-localisation vont se mettre à marcher?
- Si je branche un Yocto-3D-V2 sur mon autoradio Android, est-ce qu'il sera capable d'afficher à quel point ma voiture penche?
Dans tous les cas, la réponse est non parce que le système d'exploitation de la machine hôte ne reconnaîtra pas les capteurs Yoctopuce comme des capteurs natifs. En fait, tous les modules Yoctopuce utilisent un protocole dit "HID vendor specific" pour communiquer avec leur hôte USB, ce qui fait que lorsqu'on branche un capteur Yoctopuce sur un ordinateur, ce dernier ne se rend pas compte qu'il s'agit d'un capteur.
On a choisi ce protocole parce qu'il permet d’épargner à l’utilisateur l'installation d'un driver pour utiliser ses modules Yoctopuce. En effet, tous les systèmes d'exploitation capables de gérer un clavier ou une souris USB ont déjà un driver HID disponible et qui permet de discuter avec les périphériques "HID vendor specific" sans driver supplémentaire.
De plus, cette manière de faire est suffisamment flexible pour nous permettre d'implémenter librement toutes les fonctionnalités que l'on juge intéressantes, ce qui n'aurait probablement pas été le cas d'un driver classique dont l'architecture est souvent imposée.
Le revers de la médaille, c'est que les modules Yoctopuce ne fonctionnement qu'avec les applications qui ont été spécifiquement programmées pour les utiliser. Dans la mesure où les produits Yoctopuce ne sont pas pas destinés au grand public mais à une clientèle désireuse de construire elle-même des solutions à des problèmes spécifiques, cela ne nous a jamais paru être un grand problème.
Quelques capteurs Yoctopuce, il est important de comprendre leur fonctionnement.
get_currentValue() n'est pas synchrone
La manière la plus simple et la plus intuitive pour obtenir la valeur d'un capteur Yoctopuce consiste à appeler la méthode get_currentValue() de son API. Cependant, il est important de comprendre que les mesures effectuées par le capteur et les appels à get_currentValue() ne sont pas synchrones. Le capteur effectue des mesures en boucle à sa propre cadence et l'appel à get_currentValue() ne fait que renvoyer le résultat de la dernière mesure.
Par conséquent, si vous interrogez un capteur en appelant get_CurrentValue() en boucle, augmenter la vitesse de votre boucle ne va pas forcément augmenter la fréquence de vos échantillons. De plus, à cause des délais de communications, interroger un capteur par polling est loin d'être efficace, vous auriez meilleur temps d'utiliser un mécanisme de callback.
On a choisi cette façon de fonctionner pour deux raisons.
- Quelque soit le capteur, effectuer matériellement la mesure n'est pas instantané, cela peut facilement prendre quelques millisecondes, voire quelques dixièmes de seconde dans les cas les plus extrêmes. Si get_CurrentValue() déclenchait effectivement une mesure, l'appel prendrait le temps pour faire la mesure plus les 20-30ms pour effectuer la communication aller-retour entre l'hôte et le module.
- Tous les capteurs Yoctopuce offrent une fonction enregistreur de données qui permet d'effectuer automatiquement des mesures et stocker le résultat dans la mémoire flash du module pour une utilisation ultérieure. Ce qui signifie que lorsque l’enregistreur de données est actif, il faut de toute manière que le module fasse des mesures en permanence.
A quelques exceptions près, la fréquence d'échantillonnage interne d'un capteur Yoctopuce est fixe, elle ne peut pas être changée par l'utilisateur. Elle a été choisie comme un compromis entre vitesse d'acquisition, bruit de mesure, et la modeste capacité de transfert d'USB 1.1.
Il est donc utile de comprendre que non seulement cela ne sert à rien d'essayer d'obtenir des données d'un capteur Yoctopuce à une vitesse plus élevée que sa fréquence d'échantillonnage interne, mais en plus c'est contre-productif. Vous trouverez cette fameuse fréquence dans les spécifications de chaque produit. Même si vous n'être pas intéressé par une fréquence élevée, la technique des callback périodiques peut se montrer intéressante parce qu'en dessous de 1Hz, vous obtiendrez automatiquement des valeurs moyennées ainsi que les deux valeurs extrêmes pour chaque période.
Fréquence maximale
Le taux de transfert théorique maximum dont dispose les modules Yoctopuce est de un paquet de 64 octets toutes les millisecondes. Ce que signifie que des callbacks à plus de 1000Hz sont matériellement impossibles. Dans la pratique, il n'existe pas de capteur Yoctopuce capable d'offrir une vitesse de rafraîchissement supérieure à 100Hz.
Programmation: Les classes
Il nous a paru utile de rappeler que l'API Yoctopuce n'est pas construite sur le modèle "un module / une classe" mais plutôt "une fonctionnalité / une classe". Par exemple un module qui héberge un ou plusieurs capteurs de lumière pourra être exploité avec la classe YLightSensor, un module qui contient des relais devra être exploité à l'aide de la classe YRelay, un module qui dispose d'un capteur de température et d'un capteur de pression pourra être exploité avec les classes YTemperature et YPressure, etc... On a écrit un article plus exhaustif à ce sujet il y a quelques années.
La classe YSensor
Il est utile de savoir que, du point de vue programmation, toutes les classes de l'API Yoctopuce qui permettent de travailler avec des capteurs Yoctopuce héritent de la même classe YSensor. Ainsi, si votre application utilise des capteurs différents et que n'avez besoin d'utiliser que les fonctions de base de vos capteurs, vous pourriez grandement simplifier votre code en le basant sur cette classe YSensor plutôt que sur les classes spécifiques à chaque type de senseurs. Par contre, il n'y a pas d'équivalent pour les actuateurs.
En guise de conclusion
On espère que ces quelques points vous permettront de tirer le meilleur parti de vos capteurs Yoctopuce. Si vous avez d'autres questions n'hésitez pas à contacter l'adresse de support Yoctopuce.