Optimiser la lecture des capteurs Yoctopuce

Optimiser la lecture des capteurs Yoctopuce

L'API Yoctopuce dispose de différents mécanismes pour optimiser l'accès aux capteurs, aussi bien par USB que par le réseau. Nous avons déjà évoqué dans un article précédent les méthodes de polling et de callback et comparé leurs avantages respectifs. Aujourd'hui, nous vous proposons une nouvelle méthode intermédiaire permettant d'optimiser l'accès à certains attributs des capteurs, lorsque ce n'est pas possible de le faire par callback.


Polling et mémoire cache


La méthode la plus simple pour lire un capteur est en général d'appeler la méthode get_currentValue(). Un exemple typique d'utilisation du Yocto-Meteo pourrait être:


double temp = tempSensor->get_currentValue();
double press = pressSensor->get_currentValue();
double hum = humSensor->get_currentValue();
 


Comme ces trois mesures proviennent du même module, l'API utilise un mécanisme de mémoire cache pour rapatrier toutes les mesures simultanément, ainsi que les informations annexes comme l'unité physique de chaque mesure, etc. Au premier accès, toutes les valeurs sont transférées, et si une autre valeur est demandée dans les 5ms suivantes, la valeur mémorisée est rendue instantanément.

Le seul désavantage de ce mécanisme est que le transfert de toutes les valeurs prend initialement plus de temps que ne prendrait le chargement d'un seul attribut, car la quantité de données à transférer est plus grande.

Alternatives plus réactives


L'utilisation d'une fonction de callback appelée à chaque changement de valeur est la solution idéale et la plus performante pour obtenir le plus rapidement possible toute nouvelle valeur. Mais elle n'est utilisable que pour obtenir l'attribut principal de chaque mesure, qui est en général la mesure courante.

Si vous avez besoin d'obtenir très rapidement un attribut secondaire, il existe désormais une nouvelle méthode: loadAttribute(nomAttribut). Cette méthode court-circuite tout le mécanisme de cache et va directement rechercher la valeur de l'attribut demandé dans le capteur. Attention: tout comme les callbacks de changement de valeur, cette méthode retourne toujours une chaîne de caractères. C'est donc à vous de la convertir en nombre le cas échéant.

Exemple concret


Supposons que vous désiriez compter des impulsions lumineuses à l'aide d'un phototransistor. Vous pourriez utiliser un Yocto-PWM-Rx qui est capable de générer un callback avec le compte d'impulsion, mais si pour des raisons de nombre d'entrées et de coût vous avez décidé d'utiliser un Yocto-Knob, vous ne pouvez pas utiliser le callback de changement de valeur. Vous pouvez désormais utiliser le code suivant pour charger efficacement juste le compteur d'impulsions:


string attrVal = anButton->loadAttribute("pulseCounter");
int count = std::stoi(attrVal);
 



Nous avons fait quelques mesures de performance pour comparer les différentes méthodes. Voici les résultats:

MéthodeFréquence d'acquisition max.Fréquence d'acquisition max.
 (desktop PC)(Raspberry Pi 3)
get_pulseCounter()30 Hz30 Hz
loadAttribute()200 Hz175 Hz
registerValueCallback()>650 Hz>650 Hz



Bien entendu, il ne faut pas oublier que si vous avez besoin de charger 5 valeurs, par exemple pour lire les compteurs des 5 canaux du Yocto-Knob, la performance de la méthode loadAttribute() se trouvera divisée par autant, alors que la performance de la méthode get_pulseCounter() basée sur la mémoire cache restera la même. Mais cette nouvelle méthode peut néanmoins s'avérer très utile lorsqu'on n'a besoin de lire qu'un petit nombre de valeurs, mais très vite.

Commenter aucun commentaire
Retour au blog












Yoctopuce, get your stuff connected.