Motion and positioning
Drivers for precision motion and positioning: PI piezo nanopositioners, Attocube, Newport Picomotor, Thorlabs APT.
Overview
Quatm supports a wide range of motion platforms, from piezo nanopositioning to long-travel stepper motors, behind a unified IMultiaxisStage interface.
Physik Instrumente (PI) piezo nanopositioning
Overview
GenericPIController wraps serial communication with PI general-purpose controllers and controls a variety of PI piezo positioning platforms through the ASCII command set.
PI piezo controller E-xxx series
| Communication | serial (RS232) |
| Protocol | PI ASCII command set |
| Axes | depends on controller model |
| Accuracy | sub-nanometre |
Driver module:
GenericPIControllerInitialization
from quatm.drivers.PhysikInstrumente.base import GenericPIController
# serial connection
stage = GenericPIController(conn="/dev/ttyUSB0")
# home
stage.home(axis=0)
# absolute positioning (µm)
stage.move_to(axis=0, position=50.0)
# Relative move
stage.move_by(axis=1, delta=10.0)
# query current position
pos = stage.get_position(axis=0)
Key methods
| Method | Description |
|---|---|
home(axis) | Home the specified axis |
move_to(axis, position) | Absolute positioning (µm) |
move_by(axis, delta) | Relative move (µm) |
get_position(axis) | Query the current position |
stop(axis) | Emergency stop |
Device configuration
"objective_z": {
"type": "local",
"module": "drivers.PhysikInstrumente.base",
"class": "GenericPIController",
"arguments": {"conn": "/dev/ttyUSB0"},
}
Usage example
# In the Experiment class
self.pi_stage = self.get_device("pi_stage")
# Move to the target position (µm)
self.pi_stage.move_absolute(x=50.0, y=25.0, z=10.0)
# Relative move
self.pi_stage.move_relative(dx=1.0, dy=0.0, dz=0.0)
Note: piezo translation stages have a limited travel range, and exceeding it triggers hardware protection. Consult the device manual to confirm the maximum travel before use.
Thorlabs APT/Kinesis translation stages
KDC101 / K10CR1 series
KDC101 / K10CR1 / filter wheel Thorlabs APT/Kinesis
| Communication | serial (FTDI) |
| Protocol | APT (binary) |
| Applicable devices | DC servo motors, stepper motors, filter wheels, shutters |
Driver module:
BasicKinesisDevicefrom quatm.drivers.Thorlabs.kinesis import BasicKinesisDevice
stage = BasicKinesisDevice(conn="27200001")
stage.home()
stage.move_to(position=25.0) # mm
Elliptec piezoelectric resonant motors
ELLx series Thorlabs Elliptec
| Communication | serial (9600 baud) |
| Travel | depends on slider |
| Accuracy | µm level |
Driver module:
ElliptecMotorfrom quatm.drivers.Thorlabs.elliptec import ElliptecMotor
motor = ElliptecMotor(conn="/dev/ttyUSB0", addrs=[0])
motor.move_to(axis=0, position=10.0)
Motorized filter wheels FW102/FW212
from quatm.drivers.Thorlabs.serial import FW
fw = FW(conn="/dev/ttyUSB0")
fw.set_position(position=2) # switch to filter position 2
KDC101 motorized translation stage
Control Thorlabs KDC101/T-Cube series motorized translation stages through the .NET SDK.
from quatm.drivers.thorlabs.kdc101 import KDC101
stage = KDC101("26001234") # Serial number
stage.home() # Home
stage.move_absolute(10.0) # Move to 10.0 mm
pos = stage.get_position() # Read current position
| Function | Description |
|---|---|
| Homing | Automatically seek the limit switch |
| Absolute move | Move to the specified position (mm) |
| Relative move | Move relative to the current position |
| Position readout | Read the current position in real time |
Attocube ANC300 / ANC350 nanopositioning
ANC300 Attocube
| Communication | TCP/IP (port 7230) |
| Axes | up to 7 |
| Travel | mm range |
| Accuracy | nm range |
| Suitable for | cryogenic / vacuum |
Driver module:
ANC300from quatm.drivers.Attocube.anc300 import ANC300
anc = ANC300(conn=("192.168.1.30", 7230))
# home
anc.home(axis=0)
# Nanometer-level step
anc.move_by(axis=0, delta=0.1) # 100 nm
# Continuous scan mode
anc.set_continuous_mode(axis=1, enable=True)
anc.set_continuous_speed(axis=1, speed=100.0) # nm/s
ANC350 Attocube (USB)
| Communication | USB HID (PyUSB) |
| Axes | up to 3 |
| Control | direct USB connection |
Driver module:
ANC350from quatm.drivers.Attocube.anc350 import ANC350
anc = ANC350(conn=0) # First USB device
anc.move_to(axis=0, position=50.0)
Newport Picomotor 8742 4-axis controller
Picomotor 8742 Newport
| Communication | USB (PyUSB) or TCP/IP Telnet (port 23) |
| Axes | 4 |
| Step size | < 30 nm |
| Vacuum compatible | optional |
Driver module:
Picomotor8742from quatm.drivers.Newport.picomotor import Picomotor8742
# USB connection
pico = Picomotor8742(conn=0)
# Or TCP/IP
pico = Picomotor8742(conn="192.168.1.40", multiaddr=(0, 1))
pico.move_to(axis=0, position=5.0) # mm
pico.home(axis=0)
SmarAct MCS2 / SCU3D high-precision positioning
MCS2 SmarAct
| Communication | native MCS2 SDK |
| Axes | up to 18 |
| Accuracy | nm range |
| Speed | up to 20 mm/s |
| Vacuum/cryogenic | optional modules |
Driver module:
MCS2from quatm.drivers.SmarAct.MCS2 import MCS2
mcs = MCS2(locator="usb:sn:12345678")
mcs.move_to(axis=0, position=10.0) # mm
mcs.get_position(axis=0)
SCU3D SmarAct 3-axis
| Communication | SCU3DControl SDK |
| Axes | 3 |
Driver module:
SCU3Dfrom quatm.drivers.SmarAct.scu3d import SCU3D
scu = SCU3D(idx=0)
scu.move_to(axis=1, position=25.0)
Standa 8SMC stepper motor controllers
8SMC4 / 8SMC5 Standa
| Communication | serial (115200 baud) |
| Axes | 1–4 |
| Step resolution | depends on motor/lead screw |
| Application | long-travel translation stages, rotation stages |
Driver module:
Standa8SMCfrom quatm.drivers.standa.base import Standa8SMC
stage = Standa8SMC(conn="/dev/ttyUSB0")
stage.move_to(position=50.0) # mm
stage.home()
Arcus Performax multi-axis stepper control
Performax Arcus Technology
| Communication | USB (DLL) or RS485 serial |
| Axes | up to 4 |
| Features | acceleration/deceleration profiles, limit detection |
Driver module:
GenericPerformaxStagefrom quatm.drivers.arcus.performax import GenericPerformaxStage
stage = GenericPerformaxStage(idx=0, conn="USB")
stage.move_to(axis=0, position=100.0)
stage.set_acceleration(axis=0, accel=50.0) # mm/s²
Trinamic TMCM-1110 integrated stepper motor
TMCM-1110 Trinamic
| Communication | serial (9600 baud, TMCL protocol) |
| Features | StallGuard stall detection, CoolStep energy saving |
Driver module:
TMCM1110from quatm.drivers.trinamic.base import TMCM1110
motor = TMCM1110(conn="/dev/ttyUSB0")
motor.move_to(position=180.0) # Rotation (°)
motor.set_velocity(500.0) # °/s
Generic motion platform configuration
"objective_z": {
"type": "local",
"module": "drivers.Attocube.anc300",
"class": "ANC300",
"arguments": {"conn": ("192.168.1.30", 7230)},
}
Multi-axis coordination
Allio.multiaxisstage drivers support independent axis mapping. The muxaxis tool can combine physical axes into a logical coordinate system, enabling advanced features such as tilt correction and coordinate transformation.