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
Communicationserial (RS232)
ProtocolPI ASCII command set
Axesdepends on controller model
Accuracysub-nanometre
Typical applications include fine focusing of high-NA objectives, automatic fibre coupling alignment, interferometer beam path adjustment and control of the beam waist position of optical dipole traps.
Driver module: GenericPIController

Initialization

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

MethodDescription
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
Communicationserial (FTDI)
ProtocolAPT (binary)
Applicable devicesDC servo motors, stepper motors, filter wheels, shutters
A unified wrapper for Thorlabs APT protocol devices.
Driver module: BasicKinesisDevice
from 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
Communicationserial (9600 baud)
Traveldepends on slider
Accuracyµm level
Compact piezoelectric resonant motors, suited to space-constrained optical mounts.
Driver module: ElliptecMotor
from 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
FunctionDescription
HomingAutomatically seek the limit switch
Absolute moveMove to the specified position (mm)
Relative moveMove relative to the current position
Position readoutRead the current position in real time

Attocube ANC300 / ANC350 nanopositioning

ANC300 Attocube
CommunicationTCP/IP (port 7230)
Axesup to 7
Travelmm range
Accuracynm range
Suitable forcryogenic / vacuum
A modular nanopositioning controller, remotely controlled over TCP/IP. It is widely used for precise positioning of objectives and samples inside cryostats.
Driver module: ANC300
from 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)
CommunicationUSB HID (PyUSB)
Axesup to 3
Controldirect USB connection
USB variant, suited to desktop applications.
Driver module: ANC350
from 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
CommunicationUSB (PyUSB) or TCP/IP Telnet (port 23)
Axes4
Step size< 30 nm
Vacuum compatibleoptional
A piezoelectric inertial motor controller supporting direct USB or network control. Vacuum-compatible models can be used directly for adjusting optical elements inside a vacuum chamber.
Driver module: Picomotor8742
from 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
Communicationnative MCS2 SDK
Axesup to 18
Accuracynm range
Speedup to 20 mm/s
Vacuum/cryogenicoptional modules
A modular high-precision positioning system supporting coordinated multi-axis motion and complex trajectories.
Driver module: MCS2
from 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
CommunicationSCU3DControl SDK
Axes3
An integrated 3-axis controller for confined spaces.
Driver module: SCU3D
from 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
Communicationserial (115200 baud)
Axes1–4
Step resolutiondepends on motor/lead screw
Applicationlong-travel translation stages, rotation stages
An economical stepper motor controller, suited to long-travel coarse positioning on optical tables.
Driver module: Standa8SMC
from 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
CommunicationUSB (DLL) or RS485 serial
Axesup to 4
Featuresacceleration/deceleration profiles, limit detection
A high-performance stepper motor controller providing smooth S-curve acceleration and deceleration.
Driver module: GenericPerformaxStage
from 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
Communicationserial (9600 baud, TMCL protocol)
FeaturesStallGuard stall detection, CoolStep energy saving
An integrated stepper motor module with a built-in controller and driver. Suited to simple rotation/translation tasks and beam path shutters.
Driver module: TMCM1110
from 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)},
}