Tous les exemples suivants sont disponibles dans le dossier confocal du repo ***.

Identifier les Modules avec leur numéro de série

Le programme suivant va faire clignoter l’écran des modules APT ayant les numéros de série “29501986” et “59000407”.

from apt_interface.device import Device
from time import sleep
 
# KPZ101
with Device("29501986", 115200) as dev:
    print("\nWriting")
    print(dev.write(0x0223, 2, 0x00))
    print("should make the KPZ screen blink")
    
sleep(8)
 
# KSG101
with Device("59000407", 115200) as dev:
    print("Writing")
    print(dev.write(0x0223, 2, 0x00))
    print("should make the KSG screen blink")

Exemple d’utilisation du module KPZ101

Le programme suivant est un exemple simple d’utilisation de python pour contrôler un KPZ101. Le programme permet soit d’envoyer une tension sinusoïdale au KPZ soit d’envoyer directement une consigne de tension.

from apt_interface.KPZ101 import KPZ101, KPZ101Config
from time import sleep
from math import sin, pi
 
def voltage_prompt(kpz):
    while True:
        p = int(input("desired voltage 0..32767: "))
        kpz.set_output_voltage(p)
 
def sinus_voltage(kpz):
    i = 0
    while True: 
        v = int(32767/2+(32767/2)*sin(i*4*pi/100))
        kpz.set_output_voltage(v)
        i+=1
        sleep(.1)
 
 
with KPZ101(config_file="conf/config_KPZ.yaml") as kpz:
    print(kpz.conf)
    print(kpz.get_info())
 
    kpz.enable_output()
 
    voltage_prompt(kpz)
    # sinus_voltage(kpz)

Ce programme nécessite un fichier de configuration situé dans le répertoire conf/config_KPZ.yaml par rapport au répertoire du fichier python. Voici son contenu :

name: X_axis_controller # nom du contrôleur
serial_nm: "29501986" # numéro de série du contrôleur
baudrate: 115200 # vitesse du port série
mode: open_loop # mode donne au contrôleur (ici open car contrôle en tension)
voltage_limit: 75 # tension maximale (il est possible de la changer mais le nanomax n'accepte pas des tensions superieur à 75V)

Exemple d’utilisation du module KSG101

Le programme suivant relève toutes les secondes la valeur lu par la gauge.

from apt_interface.KSG101 import KSG101, KSG101Config
from time import sleep
 
with KSG101(config_file="conf/config_KSG.yaml") as ksg:
    print(ksg.conf)
    print(ksg.get_max_travel())
 
    ksg.identify()
 
    while True:
        print(ksg.get_reading()) 
        sleep(1)

De même voici le contenu du fichier de configuration :

name: X_axis_gauge
serial_nm: "59000407"
baudrate: 115200
out: chann2 # la valeur de la gauge est disponible sur la voie 2
unit: pos 

Utilisation du KPZ et du KSG en boucle fermée

Ce programme demande la position, envoie la consigne au KPZ affiche la position actuelle avec le KSG et recommence.

from apt_interface.KSG101 import KSG101
from apt_interface.KPZ101 import KPZ101
from time import sleep
 
with KSG101("conf/config_KPZ.yaml") as ksg, KPZ101("conf/config_KSG.yaml") as kpz:
    print(ksg.conf)
    print(kpz.conf)
    ksg.get_io() 
    ksg.get_max_travel()
 
    kpz.enable_output()
    ksg.zeroing()
 
    while True:
        p = int(input("desired position 0..32767: "))
        kpz.set_position(p)
        sleep(2)
        print("reading -32768..32767: ", ksg.get_reading())

Voici les fichiers de configurations correspondants :

KPZ
name: X_axis_controller
serial_nm: "29501986"
baudrate: 115200
mode: closed_loop
feedback_in: chann2 # où récupérer le signal
voltage_limit: 75 
KSG
name: X_axis_gauge
serial_nm: "59000407"
baudrate: 115200
out: chann2 # où envoyer le signal
unit: pos 

Scan d’une zone avec un KPZ

Configuration

zoi: # zone of interest (define a parallelepiped)
  ref_point: # the nearest point from (0, 0, 0) in the parallelepiped
    X: 0 
    Y: 0 
    Z: null 
  dimensions:
    X: 32767 
    Y: 32767 
    Z: null 
scan_type: "spirale"
acquisition_time: 0.02
balayage:
  steps:
    X: 1000
    Y: 1000
    Z: null 
spirale:
  v: 50 
  w: 0.1256

Simulation

Le parcours que va effectué le plateau peut être visualisé avec le programme suivant :

from apt_interface.scan import Scan, ScanConfig
from time import sleep
 
s = Scan((None, None), config_file="conf/scan.yaml")
 
s.visualize()

On obtient une animation du type

Déplacement du plateau

from apt_interface.KPZ101 import KPZ101
from apt_interface.scan import Scan
from time import sleep
 
def mesure(*args, **kwargs):
    # il faut laisser assez de délais pour que les mouvements ne soient pas trop brusques si le pas est grand
 
    sleep(.01)
    return 1
 
with KPZ101(config_file="conf/x.yaml") as x, KPZ101(config_file="conf/y.yaml") as y:
    # La boucle fermée n'est pas utiliser ici, il aurait fallu instancier des ksg
    # pour les configurer sinon
 
    print(x.conf)
    print(y.conf)
 
 
    x.enable_output()
    y.enable_output()
 
    s = Scan((x, y))
 
    # Launching scan on nanomax
    m = s.scan(mesure)
 
    # m contains the matrix of measurement
    print(m)
 
    while True:
        pass