# coding: utf-8
from .actuator import Actuator
from .._global import OptionalModule
try:
import serial
except (ModuleNotFoundError, ImportError):
serial = OptionalModule("pyserial")
[docs]class CM_drive(Actuator):
"""Open a new default serial port for communication with a CMdrive actuator.
"""
[docs] def __init__(self, port: str = '/dev/ttyUSB0', baudrate: int = 9600) -> None:
"""Sets the instance attributes.
Args:
port (:obj:`str`, optional): Path to connect to the serial port.
baudrate (:obj:`int`, optional): Set the corresponding baud rate.
"""
Actuator.__init__(self)
self.port = port
self.baudrate = baudrate
def open(self) -> None:
self.ser = serial.Serial(self.port, self.baudrate)
[docs] def stop(self) -> None:
"""Stop the motor motion."""
# close serial connection before to avoid errors
self.ser.close()
self.ser.open()
self.ser.write('SL 0\r')
# self.ser.readline()
self.ser.close()
[docs] def reset(self) -> int:
"""Reset the serial communication, before reopening it to set displacement
to zero."""
self.ser.close()
self.ser.open() # open serial port
result = input("Reset the system ? This will erase recorded trajectories")
# send request to the user if he would reset the system
if result.lower()[0] in ['y', 'o']:
# send 'DIS' ASCII characters to disable the motor
self.ser.write('DIS\r')
# send 'SAVE' ASCII characters to SAVE servostar values
self.ser.write('SAVE\r')
# send 'COLDSTART' ASCII characters to reboot servostar
self.ser.write('COLDSTART\r')
k = 0
# print different stages of booting
while k < 24:
print(self.ser.readline())
k += 1
# self.ser.close() #close serial connection
return 1
else:
# self.ser.close() #close serial connection
return 0
[docs] def close(self) -> None:
"""Close the designated port."""
self.stop()
self.ser.close()
[docs] def clear_errors(self) -> None:
"""Reset errors."""
self.ser.write("CLRFAULT\r\n")
self.ser.write("OPMODE 0\r\n EN\r\n")
[docs] def set_speed(self, speed: float) -> None:
"""Pilot in speed mode, requires speed in `mm/min`."""
self.ser.close() # close serial connection before to avoid errors
self.ser.open() # open serial port
# velocity = input ('Velocity: \n')#request to the user about velocity
if abs(speed) < 1000000:
# send ASCII characters to the servostar to apply velocity task
self.ser.write('SL ' + str(int(speed)) + '\r')
self.ser.read(self.ser.inWaiting())
else:
print('Maximum speed exceeded')
self.ser.close() # close serial connection
[docs] def set_position(self,
position: float,
speed: float,
motion_type: str = 'relative') -> None:
"""Pilot in position mode, needs speed and final position to run
(in `mm/min` and `mm`)."""
self.ser.close() # close serial connection before to avoid errors
self.ser.open() # open serial port
if motion_type == 'relative':
# send ASCII characters to apply the selected motion task
self.ser.write('MR %i\r' % position)
if motion_type == 'absolute':
# send ASCII characters to apply the selected motion task
self.ser.write('MA %i\r' % position)
self.ser.readline()
self.ser.close() # close serial connection
[docs] def move_home(self) -> None:
"""Reset the position to zero."""
self.ser.open() # open serial port
# send 'MH' ASCII characters for requesting to the motor to return at pos 0
self.ser.write('MA 0\r')
# self.ser.readline()
self.ser.close() # close serial connection
[docs] def get_position(self) -> float:
"""Search for the physical position of the motor.
Returns:
Physical position of the motor.
"""
self.ser.close()
# ser=self.setConnection(self.myPort, self.baudrate)
# initialise serial port
self.ser.open()
# send 'PFB' ASCII characters to request the location of the motor
self.ser.write('PR P \r')
pfb = self.ser.readline() # read serial data from the buffer
pfb1 = self.ser.readline() # read serial data from the buffer
print('%s %i' % (pfb, (int(pfb1)))) # print location
print('\n')
self.ser.close() # close serial connection
return int(pfb1)