Skip to content

Commit 2d8be85

Browse files
committed
class KSG101 (set_io, max_travel, zeroing, identify but problem with get_reading (don't know how to convert the number receive to match what is displayed on the screen)), sinusoidale voltage test, problem with set output_pos (after test with microscope it seems that the position goes from 0 to 10 micrometers (for data in 0 32767))
1 parent 9276b96 commit 2d8be85

10 files changed

Lines changed: 111 additions & 15 deletions

File tree

apt_interface/KPZ101.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ def set_io(self) -> None:
5959

6060
self.dev.write_with_data(0x07d4, 10, data)
6161

62-
def set_output_voltage(self, tension: float) -> None:
63-
assert self.conf.mode == "open_loop", 'Cannot specify a voltage in open_loop mode'
62+
def set_output_voltage(self, tension: int) -> None:
63+
"""
64+
assert self.conf.mode == "open_loop", 'Cannot specify a voltage in closed_loop mode'
6465
assert tension >= 0 and tension <= self.conf.voltage_limit, f'{tension} volt is not allowed'
6566
6667
# TODO: add an offset
@@ -71,8 +72,20 @@ def set_output_voltage(self, tension: float) -> None:
7172
data = pack("HH", 0x0001, int(tension * self.device_unit))
7273
7374
print(int(tension * self.device_unit))
75+
"""
76+
data = pack("HH", 0x0001, tension)
77+
print(data)
7478
self.dev.write_with_data(0x0643, 4, data)
7579

80+
def set_position(self, pos: int) -> None:
81+
assert self.conf.mode == "closed_loop", 'Cannot specify a position in open_loop mode'
82+
assert pos >= 0 and pos <= 32767 # according to the documentation, negative values aren't used
83+
84+
data = pack("HH", 0x0001, pos)
85+
86+
self.dev.write_with_data(0x0646, 4, data)
87+
88+
7689
def enable_output(self) -> None:
7790
print("Warning High Voltage !!")
7891
self.dev.write(0x0210, 2, 0x01)

apt_interface/KSG101.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from pydantic import BaseModel, field_validator, Field, ValidationInfo
33
from pydantic_yaml import parse_yaml_file_as
44
from apt_interface import VALID_BAUDRATES
5-
from struct import pack
5+
from struct import pack, unpack
66
from typing import Iterable
77
from typing import Literal, Annotated
88

@@ -14,6 +14,7 @@ class KSG101Config(BaseModel):
1414
serial_nm: Annotated[str, Field(pattern=r"^59.*")]
1515
baudrate: VALID_BAUDRATES = 115200
1616
out: Literal["chann1", "chann2"] = "chann2"
17+
unit: Literal["pos", "volt", "force"]
1718

1819
class KSG101():
1920
pass
@@ -26,8 +27,39 @@ def __init__(self, config_file="config_KSG.yaml") -> None:
2627
self.dev = Device(self.conf.serial_nm, self.conf.baudrate)
2728

2829
def __enter__(self) -> KSG101:
30+
print("test")
2931
self.dev.begin_connection()
32+
self.set_io()
3033
return self
34+
35+
def set_io(self) -> None:
36+
unit_dict = {"pos": 0x01, "volt": 0x02, "force": 0x03}
37+
self.unit = unit_dict[self.conf.unit]
38+
39+
chann_dict = {"chann1": 0x01, "chann2": 0x02}
40+
self.chann = chann_dict[self.conf.out]
41+
42+
data = pack("HHHHHHH", 0x0001, self.chann, self.unit, 0x0000, 0x7530, 0, 0)
43+
print(data)
44+
45+
self.dev.write_with_data(0x07da, 14, data)
46+
47+
def get_reading(self) -> float:
48+
buffer = self.dev.read_data(0x07dd, 12)
49+
50+
read = unpack("HHHHhH", buffer)[4]
51+
52+
return read
53+
54+
def get_max_travel(self) -> float:
55+
buffer = self.dev.read_data(0x0650, 10)
56+
57+
read = unpack("HHHHH", buffer)[4]
58+
59+
return read
60+
61+
def zeroing(self) -> None:
62+
self.dev.write(0x0658, 0, 0)
3163

3264
def identify(self) -> bool:
3365
"""MGMSG_MOD_IDENTIFY"""

apt_interface/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from typing import Literal
22

3+
__version__ = "1.0.0"
34
VALID_BAUDRATES = Literal[110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000]

apt_interface/device.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ def __enter__(self) -> Device:
3333
self.begin_connection()
3434
return self
3535

36-
def read_data(self, func: bytes, size: int) -> str:
37-
self.write(func, 0x00, 0x00)
36+
def read_data(self, func: bytes, size: int) -> bytes:
37+
self.write(func, 0x00, 0x00) # request value
3838

39-
sleep(.005*size/90) # if you encounter reception problem, please increase the ratio
40-
return bytes(self.ftdi.read_data_bytes(size, attempt=2))
39+
sleep(.01) # if you encounter reception problem, please increase the duration
40+
return bytes(self.ftdi.read_data_bytes(size, attempt=3)) # get value
4141

4242
def write(self, func: bytes, param1: bytes, param2: bytes) -> bool:
4343
bytes_array = pack("<HBBBB", func, param1, param2, self.dest, self.src)

config_KPZ.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
name: X_axis_controller
33
serial_nm: "29501986"
44
baudrate: 115200
5-
mode: open_loop
5+
mode: closed_loop
6+
feedback_in: chann2
67
voltage_limit: 75

config_KSG.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
name: X_axis_gauge
33
serial_nm: "59000407"
44
baudrate: 115200
5-
out: chann2
5+
out: chann2
6+
unit: pos

identify_devices.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
print("should make the KPZ screen blink")
99
print(dev.write(0x0223, 2, 0x00))
1010

11-
sleep(8)
11+
# sleep(8)
1212

1313
# KSG101
1414
with Device("59000407", 115200) as dev:
15-
print("Wrinting")
15+
print("Writing")
1616
print("should make the KSG screen blink")
1717
print(dev.write(0x0223, 2, 0x00))
1818

kpz101_test.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
11
from apt_interface.KPZ101 import KPZ101, KPZ101Config
22
from time import sleep
33
import json
4+
from math import sin, pi
45

56
#print(json.dumps(KPZ101Config.model_json_schema()))
67

8+
def voltage_prompt(kpz):
9+
while True:
10+
p = int(input("desired voltage 0..32767: "))
11+
kpz.set_output_voltage(p)
12+
13+
def sinus_voltage(kpz):
14+
i = 0
15+
while True:
16+
# v = int(32767/2+(32767/5)*sin(i*4*pi/100))
17+
v = int(32767/2+(32767/2)*sin(i*4*pi/100))
18+
kpz.set_output_voltage(v)
19+
i+=1
20+
sleep(.1)
21+
22+
723
with KPZ101(config_file="config_KPZ.yaml") as kpz:
824
print(kpz.conf)
925

1026
print(kpz.get_info())
1127

12-
kpz.identify()
13-
sleep(8)
1428

1529
kpz.enable_output()
30+
"""
1631
voltages = [0, 1, 5, 10, 20, 30, 40, 50]
1732
for v in voltages:
1833
kpz.set_output_voltage(v)
1934
sleep(3)
35+
"""
2036

21-
sleep(100)
37+
# voltage_prompt(kpz)
38+
sinus_voltage(kpz)

ksg101_test.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,10 @@
77
with KSG101(config_file="config_KSG.yaml") as ksg:
88
print(ksg.conf)
99

10-
ksg.identify()
10+
ksg.identify()
11+
12+
print(ksg.get_max_travel())
13+
14+
while True:
15+
print(ksg.get_reading())
16+
sleep(1)

test.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
from apt_interface.KSG101 import KSG101
3+
from apt_interface.KPZ101 import KPZ101
4+
from time import sleep
5+
6+
with KSG101() as ksg, KPZ101() as kpz:
7+
print(ksg.conf)
8+
print(kpz.conf)
9+
10+
kpz.enable_output()
11+
ksg.zeroing()
12+
13+
"""
14+
positions = range(1000)
15+
for p in positions:
16+
kpz.set_position(p)
17+
sleep(.3)
18+
print(65534 - p, ksg.get_reading())
19+
"""
20+
21+
while True:
22+
p = int(input("desired position -32768..32767: "))
23+
kpz.set_position(p)
24+
sleep(2)
25+
print("reading -32768..32767: ", ksg.get_reading())

0 commit comments

Comments
 (0)