Comment débuter en Python avec des modules Yoctopuce

Comment débuter en Python avec des modules Yoctopuce

Cette semaine, on explique aux gens qui utilisent des modules Yoctopuce pour la première fois comment les gérer avec un programme en Python au travers d'un exemple assez simple mais réaliste. Évidement, on présuppose que les gens en question ont au moins quelques notions de programmation en Python, mais on explique le reste en détail.




Comme application d'exemple, on vous propose de contrôler un Yocto-PowerRelay en fonction de la température donnée par un Yocto-Temperature. On imagine que vous avez lu avec attention les précédents articles de notre série pour les débutants en particulier celui sur la structure logique des modules Yoctopuce.

On veut changer l'état du  Yocto-PowerRelay en fonction de la température mesurée par le Yocto-température
On veut changer l'état du Yocto-PowerRelay en fonction de la température mesurée par le Yocto-température


Installation

La première chose à faire consiste installer la librairie Yoctopuce pour Python. Il se trouve que vous avez deux options. Attention, le choix de l'une ou l'autre de ces options a une petite conséquence sur la suite.

Option 1

Vous pouvez télécharger la librairie depuis le site de Yoctopuce, vous la trouverez sur la page idoine. Il s'agit d'un gros fichier zip que vous pouvez dé-zipper où bon vous semble sur votre machine. Le répertoire indispensable est le répertoire "Sources". Vous devez ensuite éditer votre variable d'environnement PYTHONPATH et y rajouter le chemin de ce répertoire "Sources". Si vous utilisez un IDE pour programmer en python, vous aurez probablement à lui indiquer où se trouve ce répertoire.

Option 2

Si vous utilisez une machine Linux, vous pouvez taper la commande suivante dans un shell:

pip install yoctopuce


Et la librairie sera automatiquement téléchargée et installée. Attention si vous choisissez cette option, les imports de la librairie Yoctopuce seront légèrement différents. On va y revenir.

Tests des exemples

Une fois la librairie installée, vous aurez probablement envie de tester les exemples. Si vous avez choisi la méthode 2, vous devez néanmoins téléchargez la librairie, et dé-zipper le contenu du répertoire "examples" où bon vous semble. Vous trouverez dans ce répertoire au moins un exemple pour chaque module Yoctopuce. Supposons que vous ayez un Yocto-Temperature, l'exemple correspondant se trouve dans "Doc-GettingStarted-Yocto-Temperature". Placez-vous dans ce répertoire, le script à lancer s'appelle "helloword.py". Si vous avez utilisé la méthode 2 pour installer la librairie, éditez le script et remplacez les deux lignes

from yocto_api import *
from yocto_temperature import *


par:

from yoctopuce.yocto_api import *
from yoctopuce.yocto_temperature import *


Si vous examinez attentivement le code source de cet exemple, vous remarquerez qu'il attend un argument sur sa ligne de commande. Cet argument est le numéro de série de votre Yocto-Temperature, ou "any" si vous le connaissez pas et que n'avez pas envie de le chercher. Vérifiez que votre votre Yocto-température est bien connecté puis tapez:

python helloworld.py any


et vous obtiendrez la température courante à raison d'une mesure toutes les secondes. Utilisez control-C pour arrêter le script. Attention, vous ne pouvez pas faire tourner cet exemple en même temps que le VirtualHub ou que tout autre programme qui utilise l'API Yoctopuce en mode USB natif. L'explication se trouve dans cet autre article..

L'exemple pour le Yocto-PowerRelay fonctionne de manière similaire. Il se trouve dans le répertoire "Doc-GettingStarted-Yocto-PowerRelay". En plus du numéro de série sur la ligne de commande il a besoin de l'état dans lequel il doit faire basculer le relais: A ou B. Essayez par exemple

python helloworld.py any B


pour faire basculer le relais dans l'état B puis

python helloworld.py any A


pour faire revenir le relais dans l'état A.

Notre premier programme

L'idée est d'écrire un petit programme qui bascule le relais quand la température passe au dessus d'une certaine température, disons 25°C. Procédons par étapes.

1. Les imports

La première chose à faire consiste à inclure les bons imports de la librairie. Il y a évidement l'indispensable "yocto_api.py". Comme on compte utiliser un capteur de température et un relais, on aura aussi besoin de "yocto_temperature.py" et "yocto_relay.py". Il faut donc commencer notre programme par:

from yocto_api import *
from yocto_temperature import *
from yocto_relay import *


Attention, si vous avez utilisé la méthode 2 pour installer la librairie, vous devrez mettre

from yoctopuce.yocto_api import *
from yoctopuce.yocto_temperature import *
from yoctopuce.yocto_relay import *


2. Initialisation de l'API

Il faut maintenant initialiser l'API en lui indiquant que l'on désire travailler en mode USB. tapez simplement:

errmsg = YRefParam()
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
    sys.exit("init error :" + errmsg.value)


L'appel est censé rendre la valeur YAPI.SUCCESS, dans le cas contraire l'objet errmsg contient le message d'erreur. La cause la plus commune d'erreur à ce stade est d'essayer de faire tourner en même temps deux programmes qui utilise l'API en mode USB. Vous trouverez plus de détails sur divers usages de registerHub dans un autre article.

3. Récupération des fonctionnalités

Comme vous avez lu l'article sur la structure logique des modules Yoctopuce vous savez que le Yocto-Temperature et le Yocto-PowerRelay hébergent différentes fonctionnalités parmi lesquelles on trouve temperature et relay. Ce sont ces deux fonctionnalités qui nous intéressent. Pour les récupérer il y a plusieurs manières.

FirstXXX

Si vous êtes sûr de n'avoir qu'une seule fonctionnalité temperature et une seule fonctionnalité relay disponible, vous pouvez faire au plus simple et utiliser la méthode FirstXXX des classes YTemperature et YRelay.

t = YTemperature.FirstTemperature()
if t is None : sys.exit("No temperature sensor found");
r = YRelay.FirstRelay()
if r is None : sys.exit("No relay found");


Ces méthodes renvoient la première occurrence de la fonctionnalité cherchée, ou None si rien ne correspond.

FindXXX et numéro de série

Vous pouvez aussi utiliser les méthodes FindXXX des classes YTemperature et YRelay avec le numéro de série des modules. Supposons que le numéro de série du Yocto-Temperature soit TMPSENS1-3EA8F et que le numéro de série du Yocto-PowerRelay soit RELAYHI1-56FC0, vous pouvez utiliser:

r = YRelay.FindRelay("RELAYHI1-56FC0.relay1")
if not(r.isOnline()) : sys.exit("No relay found")
t = YTemperature.FindTemperature("TMPSENS1-3EA8F.temperature")
if not(t.isOnline()) : sys.exit("No temperature sensor found")


A la différence de FirstXXX, FindXXX renvoie toujours un objet valide, c'est pourquoi il faut tester si il correspond bien à un module connecté avec la méthode isOnline(). Cela permet d'instancier des objets qui correspondent à des modules qui pourront être connectés plus tard dans la vie du programme.

FindXXX et noms logique

A la place du numéro de série, vous pouvez utiliser un nom logique que vous aurez par exemple affecté à l'aide du VirtualHub.

Affection d'un nom logique au relais du Yocto-PowerRelay
Affection d'un nom logique au relais du Yocto-PowerRelay


Mettons que vous ayez appelé le relay "myRelay" et capteur de température "myTemp". Il vous suffira alors d'écrire:

r = YRelay.FindRelay("myRelay")
if not(r.isOnline()) : sys.exit("No relay found")
t = YTemperature.FindTemperature("myTemp")
if not(t.isOnline()) : sys.exit("No temperature sensor found")


L'intérêt des noms logiques est double: d'une part ils permettent de s'y retrouver plus facilement dans les systèmes complexes composés de nombreux modules Yoctopuce et d'autre part ils permettent de fabriquer des systèmes en plusieurs exemplaires sans avoir à adapter le code aux numéro de séries des modules de chaque exemplaire.

4. La boucle principale

La boucle principale de notre programme consiste à lire la température du capteur:

  while True:
    value = t.get_currentValue()


Puis à ajuster la position du relais en fonction de cette température

 
    if value>25: r.set_state(YRelay.STATE_B)
    if value<24: r.set_state(YRelay.STATE_A)


Vous remarquerez qu'on passe le relais à l'état B si la température passe au dessus de 25 alors qu'on ne revient a l'état A que si la température passe en dessous de 24. Cela s'appelle un schmitt trigger et évite que le relais ne se mette à osciller quand la température se trouve juste à la limite de déclenchement.

On pourrait s'arrêter là, mais il n'est pas forcément nécessaire de faire tourner cette boucle à la vitesse maximale. De toutes manières la fréquence de rafraîchissement du Yocto-temperaturey est 10Hz. On peut donc insérer une petite pause de 100ms dans la boucle sans que cela n'affecte la réactivité du système.

    YAPI.Sleep(100,errmsg)


Notez qu'il vaut mieux utiliser YAPI.Sleep() plutôt que la fonction time.sleep() de Python, cette dernière bloque complètement l'exécution de programme alors que celle de YAPI permet à l'api de continuer à gérer son petit business interne avec les modules pendant la pause.

Conclusion

Cet article est un peu long, on en convient. Mais si vous mettez bout à bout tous les morceaux de code qu'on a décrit, vous vous rendrez compte que l'utilisation de modules Yoctopuce dans un programme python ne nécessite en fin de compte quelques lignes de code:

from yocto_api import *
from yocto_temperature import *
from yocto_relay import *

errmsg = YRefParam()
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
    sys.exit("init error: " + errmsg.value)

t = YTemperature.FirstTemperature()
if t is None : sys.exit("No temperature sensor found")
r = YRelay.FirstRelay()
if r is None : sys.exit("No relay found")

while True:
    value = t.get_currentValue()
    if value>25: r.set_state(YRelay.STATE_B)
    if value<24: r.set_state(YRelay.STATE_A)
    YAPI.Sleep(100,errmsg)



Pour finir, sachez que vous trouverez une doc interactive de l'API Yoctopuce pour Python dans le répertoire Documentation de la libraire et sur notre site web.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.