Yocto-RS232, SCPI et appareils de laboratoire

Yocto-RS232, SCPI et appareils de laboratoire

Skippy the bush kangaroo :-)De nos jours, la plupart des instruments de mesure de laboratoire disposent d'un port RS232 et/ou d'un port USB qui permet de les piloter à distance. En général les fabricants de ce genre d'appareils proposent un logiciel propriétaire plus ou moins pratique et pas forcément gratuit pour les piloter depuis un ordinateur. Évidemment, ça donne très envie de se passer des logiciels originaux et de piloter ces appareils soi-même. La question qu'on se pose cette semaine, c'est de savoir si il y a un moyen universel de piloter ce genre d'équipement depuis un programme arbitraire.

Vous vous doutez bien que si la réponse était non, on n'en aurait pas fait tout un article. La réponse s'appelle SCPI (prononcez "skippy") pour Standard Commands for Programmable Instruments. C'est un protocole très simple, basé lignes de caractères. La plupart des appareils récents sont compatibles SCPI. L'objectif de cette semaine n'est pas de vous faire un cours SCPI, mais de vous montrer qu'en s'appuyant sur ce standard et quelques modules Yoctopuce, on peut piloter une expérience automatiquement.

SCPI

La syntaxe de base de SCPI est archi-simple. Chaque commande se présente sous la forme d'une suite de mots clefs séparés par des deux points. Chaque mot clef décrit un contexte précis. Ainsi, sur un multimètre compatible SCPI, pour passer en mode voltmètre, vous écrirez:

:FUNCtion:VOLTage:DC


Une commande destinée à obtenir une réponse se termine par un point d'interrogation, à la manière d'une question. Par exemple pour connaître la tension DC aux bornes d'un voltmètre, vous écrirez:

:MEASure:VOLTage:DC?


Et le voltmètre vous renverra la réponse pour la forme d'un nombre flottant écrit en notation scientifique

SCPI: une syntaxe assez simple
SCPI: une syntaxe assez simple


Notez que seules les majuscules sont indispensables, la commande précédente peut aussi s'écrire:

:MEAS:VOLT:DC?


Application pratique

Voyons comment utiliser SCPI pour piloter une expérience toute simple: observer le comportement d'une diode Zener en fonction de la tension à ses bornes. Pour cela il nous faut:

  • Une alimentation de laboratoire, on a utilisé une AMEG HMP2020
  • Un voltmètre digital, on a utilisé un RIGOL DM3058E
  • Deux Yocto-RS232

Alimentation  Multimètre
Les deux appareils utilisés dans l'expérience


Les esprits chagrins feront certainement remarquer ces deux appareils disposent chacun d'un port USB en plus de leur port RS232 et insinueront probablement qu'il est par conséquent idiot d'acheter deux adaptateurs RS232/USB supplémentaires. En fait, pas tant que ça: pour faire fonctionner le port USB de votre appareil de laboratoire, vous aurez besoin d'un driver spécifique compatible avec votre système d'exploitation. En supposant que vous arriviez à installer ce driver sans problème, rien ne vous garantit qu'il mettra à votre disposition quelque chose d'utilisable comme un port COM virtuel. On ne voudrait pas médire, mais lors de nos tests, le driver du RIGOL n'a pas voulu s'installer, et le port COM du AMEG est tellement virtuel qu'on ne l'a pas trouvé, malgré l’installation réussie du driver.

Bref, après quelques expériences malheureuses, l'utilisation d'un Yocto-RS232 prend tout son sens: comme tous les produits Yoctopuce, il n'a pas besoin de drivers. On branche un Yocto-RS232 dans chaque appareil et ça marche.

Utilisez un Yocto-RS232 et vous n'aurez pas à installer le moindre driver
Utilisez un Yocto-RS232 et vous n'aurez pas à installer le moindre driver


Chacun des Yocto-RS232 met à disposition dans l'API Yoctopuce une fonction SerialPort à laquelle on peut donner des noms différents à l'aide du VirtualHub. Ce qui permet de les différencier facilement, on a utilisé:

  • AMEGHMP2020 pour l'alimentation
  • RIGOLDM3058 pour le multimètre

Une fois ces rapides travaux préparatoires achevés, il reste à coder le déroulement de l'expérience: il s'agit de piloter l'alimentation pour faire passer un courant à travers une diode Zener et une résistance connectées en série,puis de mesurer la tension aux bornes de la diode en fonction de la tension à laquelle est soumis le système.

Le schéma de l'expérience
Le schéma de l'expérience


Pour coder tout ça, on a choisi Python, parce que c'est un langage très pratique pour programmer un truc en vitesse sur un coin de table. Cependant, n'importe quel autre langage de programmation aurait convenu.

Le code

Le code est relativement court. La partie initialisation consiste à retrouver les fonctions SerialPort connectées aux deux appareils

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

multimeter = YSerialPort.FindSerialPort("RIGOLDM3058")
if not(multimeter.isOnline()):
    sys.exit("RIGOL DM3058 not connected")

powerSupply = YSerialPort.FindSerialPort("AMEGHMP2020")
if not(powerSupply.isOnline()):
    sys.exit("AMEG HMP2020 not connected")



Le code qui contrôle l'alimentation est trivial, on écrit une fonction qui sert à allumer et éteindre la sortie de l'appareil, et une fonction qui sert régler la tension de sortie. C'est aussi l'occasion de constater que la syntaxe utilisée par cet appareil est une variante du SCPI standard.

def setOutput(port,state):
    if state:
        port.writeLine("INST OUT1")
        port.writeLine("OUTP ON")
    else:
        port.writeLine("OUTP OFF")


def setVoltage(port,value):
    port.writeLine("VOLT %1.3f"%value)



Pour lire la tension mesurée par le multimètre, on pourrait se contenter d'envoyer une commande de lecture et parser le résultat. Mais on a préféré utiliser une des subtilités du Yocto-RS232. Il est capable d'interroger automatiquement un appareil et de présenter le résultat à la façon d'un capteur Yoctopuce. On a même écrit une fonction qui configure ce mécanisme sans avoir à passer par l'interface du VirtualHub:

 def configureVoltmeterJob(port):
    jobname = "voltmeter.job"
    jobdata = '{"task1":{"interval":100,"script":[{"writeLine":":MEASure:VOLTage:DC?"},{"expect":"($1:FLOAT)"}]}}'
    serial = port.get_module().get_serialNumber()
    sensor = YGenericSensor.FindGenericSensor(serial+'.genericSensor1')
    sensor.set_unit('V')
    sensor.set_resolution(0.001)
    port.uploadJob(jobname,jobdata)
    port.writeLine(":FUNCtion:VOLTage:DC")
    port.writeLine(":RATE:VOLTage:DC fast")
    port.writeLine(":MEASure AUTO");
    port.selectJob(jobname)
    return sensor
 



Cette fonction crée sur le module un job qui interroge le multimètre toutes les 100ms et place le résultat dans la fonction genericSensor1 représentée ici par l'objet sensor. Cette fonction configure aussi le multimètre en mode voltmètre à l'aide de commandes SCPI avant de lancer le job.


Le code qui pilote l'expérience consiste simplement à augmenter la tension aux bornes de l'expérience, attendre un peu pour être sûr que tout est stabilisé et lire la tension mesurée par le multimètre, puis recommencer.

def runExperiment(powerSupply,voltmeter,startVoltage,endVoltage,voltageInc):
   V =  startVoltage
   setVoltage(powerSupply,V)
   setOutput(powerSupply,True)
   print("V;A")
   while V<=endVoltage:
       YAPI.Sleep(250)
       A = voltmeter.get_currentValue()
       print(str(V)+";"+str(A))
       V = V + voltageInc
       setVoltage(powerSupply,V)
   setOutput(powerSupply,False)

voltmeter =  configureVoltmeterJob(multimeter)
runExperiment(powerSupply,voltmeter,1,10,0.1)


On a tracé le résultat sous forme de graphe dans Excel: la diode Zener qu'on a utilisé est bloquante jusqu'à environ 6.4V: en dessous de cette limite la tension à ces bornes est la même que celle de l'alimentation. Au-delà de cette limite, elle reste à 6.4V. Ce qui est le principe même d'une diode Zener.

Le résultat: la tension reste bloquée à 6.4V aux bornes de la diode Zener
Le résultat: la tension reste bloquée à 6.4V aux bornes de la diode Zener


Conclusion

A l'aide de deux modules Yocto-RS232 et de quelques commandes SCPI, on a pu monter une expérience automatique, certes triviale, mais qui aurait été bien fastidieuse s'il avait fallu relever les résultats à la main. Bref, si vous êtes fatigués de tourner les boutons de vos appareils de labo à longueur de journée, on a une solution :-)

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.