Skip to main content

psj-lib

PyPI version Python Version Docs

A comprehensive Python library for controlling piezoelectric amplifiers and control devices manufactured by piezosystem jena GmbH.

✨ Features

  • Asynchronous Architecture - Built on Python's asyncio for efficient, non-blocking device communication
  • Multi-Device Support - Extensible framework supporting multiple device families (currently d-Drive and 30DV50/300)
  • Comprehensive Capabilities - Full access to position control, PID tuning, waveform generation, data recording, and filtering
  • Multiple Transport Protocols - Connect via Serial (USB) or Telnet (Ethernet)
  • Type-Safe API - Complete type hints for excellent IDE autocomplete and type checking
  • Extensive Documentation - Comprehensive docstrings, examples, and developer guides

🔧 Supported Devices

d-Drive Modular Amplifier

The d-Drive series represents piezosystem jena's modular piezo amplifier family:

  • High Resolution: 20-bit DAC/ADC for precision control
  • Fast Sampling: 50 kHz (20 µs period) for responsive control
  • Modular Design: 1-6 channel configurations in compact enclosure
  • Advanced Control: Integrated PID controller with configurable filters
  • Waveform Generation: Built-in function generator with scan modes
  • Data Acquisition: 2-channel recorder with 500,000 samples per channel
  • Hardware Triggers: Precise timing and synchronization

Note: For NV200 please use the nv200-python-lib.

PSJ 30DV50/300 (Standalone Amplifier)

The PSJ 30DV50/300 is a single-channel, d-Drive-compatible amplifier:

  • Single Channel: Standalone unit with one channel (ID 0)
  • d-Drive Compatible: Uses the same command set and capabilities
  • Full Feature Set: PID control, waveform generation, data recorder, filters

📦 Installation

pip install psj-lib

Requirements

  • Python 3.12 or higher
  • Windows 10/11, Linux, or macOS 10.15+

🚀 Quick Start

Basic Position Control

import asyncio
from psj_lib import DDriveDevice, TransportType

async def main():
    # Connect to device
    device = DDriveDevice(TransportType.SERIAL, "COM3")
    
    async with device:
        # Get first channel
        channel = device.channels[0]
        
        # Enable closed-loop control
        await channel.closed_loop_controller.set(True)
        
        # Move to target position
        await channel.setpoint.set(50.0)
        
        # Read actual position
        position = await channel.position.get()
        print(f"Position: {position:.2f} µm")

if __name__ == "__main__":
    asyncio.run(main())

Device Discovery

from psj_lib import PiezoDevice, DiscoverFlags

# Discover all devices on Serial and Telnet
devices = await PiezoDevice.discover_devices(
    flags=DiscoverFlags.ALL_INTERFACES
)

for device in devices:
    info = device.device_info
    print(f"Found: {info.device_id} on {info.transport_info.identifier}")

PID Control Configuration

# Configure PID parameters for closed-loop control
await channel.pid_controller.set(
    p=10.0,      # Proportional gain
    i=5.0,       # Integral gain
    d=0.5,       # Derivative gain
    diff_filter=100.0  # Derivative filter
)

# Enable notch filter to suppress resonance
await channel.notch.set(
    enabled=True,
    frequency=500.0,
    bandwidth=50.0
)

Waveform Generation

from psj_lib import DDriveWaveformType

# Generate 10 Hz sine wave for scanning
await channel.waveform_generator.sine.set(
    amplitude=20.0,
    offset=50.0,
    frequency=10.0
)
await channel.waveform_generator.set_waveform_type(DDriveWaveformType.SINE)

Data Recording

from psj_lib import DDriveDataRecorderChannel

# Configure data recorder for 1 second capture at 50 kHz
await channel.data_recorder.set(
    memory_length=50000,  # 50k samples
    stride=1              # No decimation
)

# Start recording
await channel.data_recorder.start()

# ... perform motion ...

# Retrieve data
position_data = await channel.data_recorder.get_all_data(
    DDriveDataRecorderChannel.POSITION
)
voltage_data = await channel.data_recorder.get_all_data(
    DDriveDataRecorderChannel.VOLTAGE
)

📖 Documentation

Full documentation is available here:

  • Getting Started - Tutorials and basic usage
  • API Reference - Complete API documentation
  • Device Documentation - Device-specific guides (d-Drive)
  • Base Capabilities - Common capabilities across all devices
  • Examples - Practical usage examples
  • Developer Guide - Extending the library

💡 Examples

Check out the examples directory for more practical examples:

  1. Device Discovery and Connection
  2. Simple Position Control
  3. PID Configuration
  4. Data Recorder Capture
  5. Waveform Generation Basics
  6. Filter Configuration
  7. Backup and Restore Configuration

🏗️ Architecture

psj-lib uses a three-layer hierarchical architecture:

PiezoDevice (e.g., DDriveDevice)
  ├─ Transport protocol (Serial/Telnet) with command caching
  └─ PiezoChannels (e.g., DDriveChannel)
      └─ Capabilities (Position, PID, WaveformGenerator, etc.)

Key Design Patterns

  • Capability-Based Architecture: Features are modular PiezoCapability subclasses
  • Async/Await: All I/O operations use Python's asyncio
  • Command Caching: Reduces latency for frequently read values
  • Type Safety: Full type hints for IDE support and type checking

🤝 Contributing

Contributions are welcome! Please visit the GitHub repository for more information.

💬 Support

📄 License

See LICENSE file in the GitHub repository.


Made with ❤️ by piezosystem jena GmbH

Metadata

Release files for psj-lib 1.2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for psj-lib 1.2.2
File Size Uploaded
psj_lib-1.2.2.tar.gz 114.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for psj-lib 1.2.2
File Interpreter ABI Platform
psj_lib-1.2.2-py3-none-any.whl Python 3 none any Details

Total release size: 262.8 kB

Release files / psj_lib-1.2.2.tar.gz

Download URL psj_lib-1.2.2.tar.gz
Size 114.1 kB
Tags Source
SHA-256 checksum
How to use checksums
1fb532dea3f39b9173702bf17dd440efd1f3590e4475831915355808c6b479a3
BLAKE2b-256 checksum
How to use checksums
6d1a9af330b4ef99f14c64e5c33af1b9833ec97c1f6bbb895b4a3354a7ae48bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.2 CPython/3.12.12 Linux/6.14.0-1017-azure

Release files / psj_lib-1.2.2-py3-none-any.whl

Download URL psj_lib-1.2.2-py3-none-any.whl
Size 148.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bb8d920c630b7c1ef9de78954b6f9dee572ad551e8a010330fd8033dc585ccc1
BLAKE2b-256 checksum
How to use checksums
05873a756957ae23336f5add35eedf449ca53e01c109ab3a7596c635db390ade
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.2 CPython/3.12.12 Linux/6.14.0-1017-azure

Release history Release notifications | RSS feed

This release

1.2.2 This release

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page