Chez Yoctopuce, on a récemment décidé d'enregistrer systématiquement le poids de chaque envoi, histoire de pouvoir comparer le poids pré-calculé avec le poids réel. Et comme on n'aime pas trop les tâches répétitives, on a décidé de le faire automatiquement. On s'est donc procuré quelques balances avec une sortie RS232, et cette semaine on profite de l'occasion de vous montrer en détail comment transformer une balance Kern en Yocto-Balance en deux temps trois mouvements.
L'idée de base est triviale: il s'agit de connecter un Yocto-RS232 à la sortie RS232 de la balance et de le configurer pour qu'il analyse automatiquement les données qui sortent de la balance et présente le résultat à la manière d'un capteur Yoctopuce. Brancher le Yocto-RS232 est l'affaire d'une seconde, la subtilité se trouve dans la configuration...
On aimerait transformer cette balance en balance USB
Fonctionnement de la balance
Le protocole série de la balance est des plus simple: si on envoie le caractère w la balance répond sur une même ligne:
- Un caractère espace ou le caractère M
- Le signe
- Le poids en grammes sur 10 caractères alignés à droite avec des espaces
- L'unité, en l'occurrence g pour grammes
- Un retour chariot
Par exemple:
w 797 g w 797 g w 797 g
Configuration du Yocto-RS232
Il est bien entendu possible de configurer le Yocto-RS232 par programmation, mais on va plutôt utiliser le VirtualHub. La première chose à faire est de configurer le protocole et la vitesse à Line ASCII Protocol, 9600 et 8N1 qui se trouvent être les valeurs par défaut.
Configuration du protocole et de la vitesse
Il s'agit ensuite de créer un job contenant une seule tâche qui va se charger de:
- Envoyer toutes les 500ms la commande w
- Lire la réponse et l'interpréter comme un entier et le mapper sur le genericSensor1.
Pour lire la réponse, on utilise une expression régulière: un point pour ignorer le premier caractère, puis "($1:INT)" pour lire un entier et le mapper sur le genericSensor1, et enfin on ignore tous les caractères jusqu'à la fin de ligne avec ".*" Ce qui, en fin de compte, se résume à deux commandes:
writeLine w expect .($1:INT).*
Création de la tâche de lecture des valeurs
Finalement, il faut lancer le job que l'on vient de créer, configurer le Yocto-RS232 pour que ce job démarre automatiquement à l'allumage du module et tout sauver.
Faire en sorte que le job de lecture démarre automatiquement
Optionnellement on peut assigner un nom logique au genericSensor1, par exemple "scale", et configurer son unité: "g" pour grammes. On peut finalement facilement vérifier que tout fonctionne correctement en affichant la liste des fonctions dans l'interface principale du VirtualHub.
Ça marche!
La programmation
A partir de là, la fonction genericSensor1 du Yocto-RS232 se comporte exactement comme un senseur Yoctopuce, voici un programme en Python qui affiche en boucle la valeur de la balance:
from yocto_api import *
from yocto_genericsensor import *
errmsg=YRefParam()
if YAPI.RegisterHub("usb", errmsg)!= YAPI.SUCCESS:
sys.exit("init error"+errmsg.value)
scale=YGenericSensor.FindGenericSensor('scale')
while (True):
if scale.isOnline():
print("%.0f%s" % (scale.get_currentValue(), scale.get_unit()))
YAPI.Sleep(1000)
Conclusion
En moins de cinq minutes, on a transformé une balance avec une sortie RS232 en un capteur USB Yoctopuce qui fonctionne sans driver. On pourrait même s'offrir le luxe d'ajouter un YoctoHub-Ethernet ou un YoctoHub-Wireless pour obtenir une balance avec une connexion réseau. C'est à se demander s'il n'y a pas un peu de magie dans les produits Yoctopuce :-)
Aujourd'hui, on a fabriqué une balance USB qui fonctionne sans drivers