A driver for the CyberGear micromotor
Project description
Python CyberGear Motor Driver
A python driver for the CyberGear motor.
To see this API connected to a GUI, checkout the CyberGear Dashboard.
Getting started
Install the package from pip:
pip install CyberGearDriver
CAN Interface
Since there are so many CAN interfaces available, this library doesn't have a built-in CAN driver but provides a simple method to connect it to your CAN library of choice.
For example, using a Serial CAN USB adapter with python-can would look something like this:
import can
from CyberGearDriver import CyberGearMotor, RunMode, CyberMotorMessage
# Connect to the bus with python-can
# @see https://python-can.readthedocs.io/en/stable/installation.html
bus = can.interface.Bus(
interface='slcan',
channel='/dev/cu.usbmodem101',
bitrate=1000000,
)
# Create function to pass the messages from CyberGear to the CAN bus
def send_message(message: CyberMotorMessage):
bus.send(
can.Message(
arbitration_id=message.arbitration_id,
data=message.data,
is_extended_id=message.is_extended_id,
)
)
# Create the motor controller
motor = CyberGearMotor(motor_id=127, send_message=send_message)
# Send the CyberGear driver messages received from the CAN bus
notifier = can.Notifier(bus, [motor.message_received])
Moving the motor
The motor has 4 different drive modes:
- Operation control mode (sometimes call MIT control mode)
- Position mode
- Velocity mode
- Torque mode (or current mode)
Operation Control Mode
This is sometimes called MIT mode and combines position, speed, and torque to move the motor in a single function:
motor.enable()
motor.mode(RunMode.OPERATION_CONTROL)
# Move the motor to position 6 (in radians from the zero position)
motor.control(position=6, velocity=0, torque=0, kp=0.1, kd=0.1)
Position control mode
In this mode the motor will move to the loc_ref parameter value (see section 4.1.12 for a list of parameters).
motor.enable()
motor.mode(RunMode.POSITION)
# Limit the top speed
motor.set_parameter("limit_spd", 10)
# Move to position 8 rad
motor.set_parameter("loc_ref", 8)
Velocity mode
This mode continuously spins the motor at a particular speed, controlled by the spd_ref, spd_kp, spd_ki, and limit_cur parameter values. (see section 4.1.12 for a full list of parameters).
motor.enable()
motor.mode(RunMode.VELOCITY)
# Turn at 5 rad/s
motor.set_parameter("spd_ref", 5)
Torque mode (i.e. Current Mode)
This controls how much current is applied to the motor with the iq_ref, cur_kp, cur_ki, and cur_filt_gain parameter values. (see section 4.1.12 for a full list of parameters).
motor.enable()
motor.mode(RunMode.TORQUE)
# Apply 0.5A of maximum torque to the motor
motor.set_parameter("iq_ref", 0.5)
Get the motor state
There's a single command to request the position, torque, velocity, and temperature of the motor. The controller will listen for the response and automatically add it to the state dict.
motor.request_motor_state()
time.sleep(1)
print(motor.state.get("position"))
You can also use an event listener to be notified when the state value has been retrieved
def state_updated():
print(f"{motor.state}")
motor.on("state_changed", state_updated)
motor.request_motor_state()
Reading and writing motor config and parameters
The motor has a list of params that you can read, and some of which you can write to. These control the motors calibration and current state. For example, in position mode, to move the motor to position 2 rad, you would set the loc_ref param to 2.0.
You can see all the available parameters in the documentation -- it's spread across two tables: section 3.3.3, and 4.1.12. Some values are duplicated in each table, in these cases, the function code in the first table is used.
NOTE: String values are not yet supported.
Read a parameter values
To read a parameter, you have to request it from the motor and wait for it to come back. Then you can read it from the params dict.
motor.request_parameter("loc_ref")
time.sleep(1)
print(motor.params.get("loc_ref"))
You can also use an event listener to be notified when param value is retrieved
def param_value_received(name: str, value: str):
print(f"{name}: {value}")
motor.on("param_received", param_value_received)
motor.request_parameter("loc_ref")
Set parameter values
motor.set_parameter("loc_ref", 5)
Motor errors
It's important to know when there is a motor fault. Here's how to request the current fault state of the motor:
motor.request_motor_fault_status()
time.sleep(1)
# All the faults might be defined, but only the ones set to True are actively faulting
active_faults = [motor.fault for fault, is_active in faults.items() if is_active]
print("Active motor faults:", motor.faults)
You can also use an event listeners to be notified when faults happen or are cleared.
def has_fault():
active_faults = [motor.fault for fault, is_active in faults.items() if is_active]
print("Active motor faults:", motor.faults)
def faults_clear():
print("No more faults")
# Define event listeners
motor.on("has_fault", has_fault)
motor.on("fault_cleared", has_fault)
# Check regularly
motor.request_motor_fault_status()
Other useful things
Change the CAN bus ID
If you have multiple motors, you'll need to change their CAN bus IDs so they can all be on the same bus.
motor.change_motor_id(5)
Set zero position
Set the current motor position as the zero position. NOTE: this position is lost on power down.
motor.set_zero_position()
Project details
Release history Release notifications | RSS feed
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 cybergeardriver-0.2.0.tar.gz.
File metadata
- Download URL: cybergeardriver-0.2.0.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3dd3d8a0b45649fcf9a27728c1233e2bc593fbbbf04397b7855a2fe438485abf
|
|
| MD5 |
a479032d5aa736a78513d552e915a42c
|
|
| BLAKE2b-256 |
8d581c02c7698c50c29fff853d00799635fe4ec4844babfca7ec1f9116e360ca
|
File details
Details for the file cybergeardriver-0.2.0-py3-none-any.whl.
File metadata
- Download URL: cybergeardriver-0.2.0-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
313e47250abaad1e165d7d44fc44f941d5b506e755a267f597bca0fb2f282340
|
|
| MD5 |
4625f20a4ab707371e4ea9f1b3ceec01
|
|
| BLAKE2b-256 |
8a2c442f8d0c29a265e1e1f9e3fc41efe2807aa65e9976d9f66dac2931c57b75
|