Python interface library for Undalogic miniSMU devices
Project description
miniSMU Python Library
A comprehensive Python library for controlling the miniSMU MS01 Source Measure Unit (SMU) from Undalogic. This library provides both USB and WiFi connectivity options with support for advanced features including onboard I-V sweeps, protection settings, and high-precision measurements.
Features
- Dual Connectivity: USB (CDC) and WiFi (TCP) connections
- Complete SMU Control: Voltage/current sourcing, measurement, and channel management
- Advanced Measurement Features: Configurable oversampling ratio (OSR) for precision control
- Safety Protection: Current and voltage protection limits
- Onboard I-V Sweeps: Hardware-accelerated sweeps with progress monitoring (firmware v1.3.4+)
- WiFi Management: Network configuration, scanning, and auto-connect settings
- Data Streaming: Real-time continuous measurements
- Robust Communication: Handles chunked USB data and corruption gracefully
Installation
From Source
git clone https://github.com/Undalogic/minismu_py.git
cd minismu_py
pip install -e .
Dependencies
pyserial- For USB communicationtqdm- For progress bars (optional, used in examples)matplotlib- For plotting (optional, used in plotting examples)
Quick Start
Basic Usage (USB Connection)
from minismu_py import SMU, ConnectionType
# Connect to miniSMU via USB
with SMU(ConnectionType.USB, port="COM3") as smu: # Adjust port for your system
print(f"Connected to: {smu.get_identity()}")
# Configure channel 1 for voltage sourcing
smu.set_mode(1, "FVMI") # Force Voltage, Measure Current
smu.set_voltage(1, 1.2) # Set 1.2V output
smu.enable_channel(1)
# Take measurements
voltage, current = smu.measure_voltage_and_current(1)
print(f"Measured: {voltage:.3f}V, {current*1000:.3f}mA")
smu.disable_channel(1)
Basic Usage (WiFi Connection)
from minismu_py import SMU, ConnectionType
# Connect to miniSMU via WiFi
with SMU(ConnectionType.NETWORK, host="192.168.1.106") as smu:
# Same usage as USB connection
print(f"Connected to: {smu.get_identity()}")
Core Functionality
Connection Management
USB Connection
# Windows
smu = SMU(ConnectionType.USB, port="COM3")
# Linux/macOS
smu = SMU(ConnectionType.USB, port="/dev/ttyACM0")
Network Connection
smu = SMU(ConnectionType.NETWORK, host="192.168.1.106", tcp_port=3333)
Channel Configuration
Operating Modes
smu.set_mode(1, "FVMI") # Force Voltage, Measure Current
smu.set_mode(1, "FIMV") # Force Current, Measure Voltage
Output Control
smu.set_voltage(1, 3.3) # Set 3.3V on channel 1
smu.set_current(1, 0.01) # Set 10mA on channel 1
smu.enable_channel(1) # Enable output
smu.disable_channel(1) # Disable output
Protection Limits
smu.set_current_protection(1, 0.1) # 100mA current limit in FVMI mode
smu.set_voltage_protection(1, 5.0) # 5V voltage limit in FIMV
Measurements
Single Measurements
voltage = smu.measure_voltage(1)
current = smu.measure_current(1)
voltage, current = smu.measure_voltage_and_current(1)
Precision Control
# Set oversampling ratio (0-15, represents approx. 2^OSR samples)
smu.set_oversampling_ratio(1, 12)
Data Streaming
smu.set_sample_rate(1, 1000) # 1000 Hz sampling
smu.start_streaming(1)
# Read streaming data
for _ in range(100):
channel, timestamp, voltage, current = smu.read_streaming_data()
print(f"CH{channel}: {voltage:.3f}V, {current*1000:.3f}mA @ {timestamp}")
smu.stop_streaming(1)
Advanced Features
Onboard I-V Sweeps (Firmware v1.3.4+)
The miniSMU can perform I-V sweeps directly on the device, reducing communication overhead and providing more consistent timing.
Simple I-V Sweep
# Perform complete I-V sweep with progress monitoring
result = smu.run_iv_sweep(
channel=1,
start_voltage=-1.0,
end_voltage=1.0,
points=21,
dwell_ms=100,
monitor_progress=True
)
# Access results
for point in result.data:
print(f"{point.voltage:.3f}V -> {point.current*1e6:.1f}µA")
Advanced Sweep Configuration
# Configure sweep parameters individually
smu.set_sweep_start_voltage(1, -0.5)
smu.set_sweep_end_voltage(1, 1.5)
smu.set_sweep_points(1, 100)
smu.set_sweep_dwell_time(1, 50) # 50ms between points
smu.enable_sweep_auto_output(1) # Auto enable/disable channel
smu.set_sweep_output_format(1, "JSON") # CSV or JSON format
# Execute and monitor
smu.execute_sweep(1)
while True:
status = smu.get_sweep_status(1)
if status.status == "COMPLETED":
break
print(f"Progress: {status.current_point}/{status.total_points}")
time.sleep(1)
# Get results
data = smu.get_sweep_data_json(1) # Returns SweepResult object
Sweep Data Formats
JSON Format (includes metadata):
result = smu.get_sweep_data_json(1)
print(f"Config: {result.config.start_voltage}V to {result.config.end_voltage}V")
for point in result.data:
print(f"{point.voltage:.3f}V, {point.current*1e6:.1f}µA")
CSV Format (simple data points):
data_points = smu.get_sweep_data_csv(1)
for point in data_points:
print(f"{point.voltage:.3f}V, {point.current*1e6:.1f}µA")
WiFi Management
Network Configuration
# Scan for networks
networks = smu.wifi_scan()
for network in networks:
print(f"SSID: {network['ssid']}, Signal: {network['rssi']} dBm")
# Configure credentials
smu.set_wifi_credentials("MyNetwork", "MyPassword")
smu.enable_wifi()
# Auto-connect settings
smu.enable_wifi_autoconnect()
auto_enabled = smu.get_wifi_autoconnect_status()
WiFi Status
status = smu.get_wifi_status()
print(f"Connected: {status.connected}")
if status.connected:
print(f"SSID: {status.ssid}")
print(f"IP: {status.ip_address}")
print(f"Signal: {status.rssi} dBm")
System Information
# Device identification
print(smu.get_identity())
# Temperature monitoring
adc_temp, ch1_temp, ch2_temp = smu.get_temperatures()
print(f"Temperatures: ADC={adc_temp}°C, CH1={ch1_temp}°C, CH2={ch2_temp}°C")
# Time synchronization
import time
smu.set_time(int(time.time() * 1000)) # Unix timestamp in milliseconds
Examples
The examples/ directory contains comprehensive examples demonstrating various features:
Basic Examples
basic_usage.py- Simple voltage setting and measurementstreaming_example.py- Real-time data streamingcurrent_sweep.py- Manual current sweep implementation
I-V Sweep Examples
usb_iv_sweep.py- Manual I-V sweep over USB with progress barswifi_iv_sweep.py- Manual I-V sweep over WiFionboard_iv_sweep.py- Hardware-accelerated onboard I-V sweeps- Simple sweep with progress monitoring
- Advanced configuration examples
- Data format comparison (CSV vs JSON)
- Sweep abort demonstration
- I-V curve plotting with matplotlib
Advanced Examples
advanced_features.py- Comprehensive feature demonstration- OSR (oversampling) configuration
- Protection limit settings
- WiFi management
- Complete measurement workflows
Running Examples
-
Adjust connection parameters in the example files:
miniSMU_PORT = "COM3" # Change to your USB port # or miniSMU_IP = "192.168.1.106" # Change to your device IP
-
Run examples:
python examples/basic_usage.py python examples/onboard_iv_sweep.py python examples/advanced_features.py
Data Classes
The library provides structured data classes for complex operations:
Sweep Operations
from minismu_py import SweepStatus, SweepConfig, SweepDataPoint, SweepResult
# Sweep status monitoring
status = smu.get_sweep_status(1)
print(f"Status: {status.status}")
print(f"Progress: {status.current_point}/{status.total_points}")
print(f"Elapsed: {status.elapsed_ms}ms")
# Sweep results
result = smu.get_sweep_data_json(1)
print(f"Configuration: {result.config}")
print(f"Data points: {len(result.data)}")
WiFi Status
from minismu_py import WifiStatus
status = smu.get_wifi_status()
print(f"Connected: {status.connected}")
print(f"Network: {status.ssid}")
print(f"IP: {status.ip_address}")
print(f"Signal: {status.rssi} dBm")
Error Handling
The library includes comprehensive error handling:
from minismu_py import SMUException
try:
with SMU(ConnectionType.USB, port="COM3") as smu:
# Your code here
pass
except SMUException as e:
print(f"SMU Error: {e}")
except Exception as e:
print(f"General Error: {e}")
Common Issues and Solutions
Connection Issues
- USB: Verify the correct COM port/device path
- WiFi: Ensure device is on the same network and reachable
- Permissions: On Linux, you may need to add your user to the
dialoutgroup
Firmware Compatibility
- Onboard I-V Sweeps: Requires firmware v1.3.4 or later
- Feature Support: Older firmware may not support all features
Communication Issues
The library automatically handles:
- Chunked USB data transmission
- UTF-8 encoding errors
- JSON corruption in responses
- Network timeouts and reconnection
API Reference
Core Classes
SMU
The main interface class for miniSMU control.
Constructor:
SMU(connection_type, port="/dev/ttyACM0", host="192.168.1.1", tcp_port=3333)
Key Methods:
get_identity()- Device identificationset_mode(channel, mode)- Configure channel modeset_voltage(channel, voltage)- Set output voltageset_current(channel, current)- Set output currentmeasure_voltage_and_current(channel)- Take measurementsenable_channel(channel)/disable_channel(channel)- Output control
Protection and Precision
set_current_protection(channel, limit)- Current protection limitset_voltage_protection(channel, limit)- Voltage protection limitset_oversampling_ratio(channel, osr)- Measurement precision (0-15)
I-V Sweep Methods
run_iv_sweep()- Complete sweep operationconfigure_iv_sweep()- Setup sweep parametersexecute_sweep(channel)- Start sweep executionget_sweep_status(channel)- Monitor progressget_sweep_data_json(channel)- Get structured resultsabort_sweep(channel)- Stop running sweep
WiFi Methods
wifi_scan()- Scan for networksset_wifi_credentials(ssid, password)- Configure networkget_wifi_status()- Connection statusenable_wifi_autoconnect()- Auto-connect control
Contributing
Contributions are welcome! Please feel free to submit issues, feature requests, or pull requests.
Development Setup
git clone https://github.com/Undalogic/minismu_py.git
cd minismu_py
pip install -e .[dev] # Install with development dependencies
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
- Documentation: This README and inline code documentation
- Examples: Comprehensive examples in the
examples/directory - Issues: Report bugs and request features via GitHub Issues
- Website: www.undalogic.com
Changelog
v0.2.0
- Added onboard I-V sweep functionality (firmware v1.3.4+)
- Implemented OSR (oversampling ratio) control for precision measurements
- Added current and voltage protection settings
- Enhanced WiFi management with auto-connect features
- Improved USB communication with chunked data and corruption handling
- Added comprehensive examples and documentation
v0.1.0
- Initial release with basic SMU control
- USB and WiFi connectivity
- Basic measurement and sourcing functions
- Data streaming support
- WiFi configuration
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file minismu_py-0.2.0.tar.gz.
File metadata
- Download URL: minismu_py-0.2.0.tar.gz
- Upload date:
- Size: 17.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4ea1d1b299bb8245b05f7821442a82770db0ea9f50a203e8f3a5afb5e099d76
|
|
| MD5 |
7f8905ed93a7c70fe3b7647fc18ef9bf
|
|
| BLAKE2b-256 |
ed4be968cbf695d01486537e9087109929823ba87d942428efe1502e0b5b6fba
|
File details
Details for the file minismu_py-0.2.0-py3-none-any.whl.
File metadata
- Download URL: minismu_py-0.2.0-py3-none-any.whl
- Upload date:
- Size: 13.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b47475c424bb1d2e249c8d1122200bd4e24cf91d75f32c3d30374155a2f773cc
|
|
| MD5 |
09ed1588c798ba8c03545586985f1d11
|
|
| BLAKE2b-256 |
297f0cc56f2ad43da9d4ffcddbf196a92a39b6fbc63015095e7be582221fdbc9
|