132 lines
3.6 KiB
Python
132 lines
3.6 KiB
Python
import time
|
|
import serial
|
|
import enum
|
|
|
|
class Varid(enum.Enum):
|
|
STATUS = 0,
|
|
STATUS_ERROR_OCCURED = 1,
|
|
STATUS_SERIAL_ERROR_OCCURED = 2,
|
|
STATUS_LIMIT_STATUS = 3,
|
|
STATUS_RESET_FLAGS = 127,
|
|
RC_RC1_UNLIMITED_RAW_VALUE = 4,
|
|
RC_RC1_RAW_VALUE = 5,
|
|
RC_RC1_SCALED_VALUE = 6,
|
|
RC_RC2_UNLIMITED_RAW_VALUE = 8,
|
|
RC_RC2_RAW_VALUE = 9,
|
|
RC_RC2_SCALED_VALUE = 10,
|
|
ANALOG_AN1_UNLIMITED_RAW_VALUE = 12,
|
|
ANALOG_AN1_RAW_VALUE = 13,
|
|
ANALOG_AN1_SCALED_VALUE = 14,
|
|
ANALOG_AN2_UNLIMITED_RAW_VALUE = 16,
|
|
ANALOG_AN2_RAW_VALUE = 17,
|
|
ANALOG_AN2_SCALED_VALUE = 18,
|
|
DIAGNOSTIC_TARGET_SPEED = 20,
|
|
DIAGNOSTIC_SPEED = 21,
|
|
DIAGNOSTIC_BRAKE_AMOUNT = 22,
|
|
DIAGNOSTIC_INPUT_VOLTAGE = 23,
|
|
DIAGNOSTIC_TEMPERATURE = 24,
|
|
DIAGNOSTIC_RC_PERIOD = 26,
|
|
DIAGNOSTIC_BAUDRATE_REGISTER = 27,
|
|
DIAGNOSTIC_SYSTEM_TIME_LOW = 28,
|
|
DIAGNOSTIC_SYSTEM_TIME_HIGH = 29,
|
|
MOTOR_MAX_SPEED_FORWARD = 30,
|
|
MOTOR_MAX_ACCEL_FORWARD = 31,
|
|
MOTOR_MAX_DECEL_FORWARD = 32,
|
|
MOTOR_BREAK_DURATION_FORWARD = 33,
|
|
MOTOR_MAX_SPEED_REVERSE = 36,
|
|
MOTOR_MAX_ACCEL_REVERSE = 37,
|
|
MOTOR_MAX_DECEL_REVERSE = 38,
|
|
MOTOR_BREAK_DURATION_REVERSE = 39
|
|
|
|
class Pololu1376:
|
|
def __init__(self, serial_port):
|
|
self.ser = serial_port
|
|
self.ser.set_output_flow_control(False)
|
|
try:
|
|
self.ser.open()
|
|
except serial.SerialException:
|
|
self.ser.close()
|
|
self.ser.open()
|
|
|
|
self.motor_stop()
|
|
|
|
print("F/W-Version:", self.get_firmware_version())
|
|
|
|
def send(self, data):
|
|
self.ser.write((data + '\r\n').encode())
|
|
|
|
def recv(self):
|
|
data = self.ser.readline().decode("utf-8").replace("\n", '').replace("\r", '')
|
|
return data
|
|
|
|
def cmd(self, cmd):
|
|
self.send(cmd)
|
|
rsp = self.recv()
|
|
|
|
if "." in rsp[0]:
|
|
pass
|
|
elif "!" in rsp[0]:
|
|
pass
|
|
elif "?" in rsp[0]:
|
|
raise Exception("The last command was not understood (a Serial Format Error has occurred).")
|
|
elif rsp is None:
|
|
raise Exception("Timeout.")
|
|
|
|
return rsp[1:]
|
|
|
|
def go(self):
|
|
return self.cmd("GO")
|
|
|
|
def motor_forward(self, speed_percent):
|
|
return self.cmd("F" + str(int(speed_percent)) + "%")
|
|
|
|
def motor_reverse(self, speed_percent):
|
|
return self.cmd("R" + str(int(speed_percent)) + "%")
|
|
|
|
def motor_brake(self, brake_amount_percent):
|
|
return self.cmd("B" + str(int(brake_amount_percent)) + "%")
|
|
|
|
def motor_stop(self):
|
|
return self.cmd("X")
|
|
|
|
def motor_set_limit(self, value):
|
|
self.cmd("L" + str(value))
|
|
|
|
def get_firmware_version(self):
|
|
return self.cmd("V")
|
|
|
|
def get_variable(self, var):
|
|
return self.cmd("D" + str(var))
|
|
|
|
|
|
def print_vars(drv):
|
|
print ("STATUS :", drv.get_variable(Varid.STATUS.value))
|
|
print ("STATUS_ERROR_OCCURED :", drv.get_variable(Varid.STATUS_ERROR_OCCURED.value))
|
|
print ("STATUS_LIMIT_STATUS :", drv.get_variable(Varid.STATUS_LIMIT_STATUS.value))
|
|
print ("RC_RC1_SCALED_VALUE :", drv.get_variable(Varid.RC_RC1_SCALED_VALUE.value))
|
|
print ("RC_RC2_SCALED_VALUE :", drv.get_variable(Varid.RC_RC2_SCALED_VALUE.value))
|
|
print ("ANALOG_AN1_SCALED_VALUE :", drv.get_variable(Varid.ANALOG_AN1_SCALED_VALUE.value))
|
|
print ("ANALOG_AN2_SCALED_VALUE :", drv.get_variable(Varid.ANALOG_AN2_SCALED_VALUE.value))
|
|
print ("DIAGNOSTIC_TARGET_SPEED :", drv.get_variable(Varid.DIAGNOSTIC_TARGET_SPEED.value))
|
|
print ("DIAGNOSTIC_SPEED :", drv.get_variable(Varid.DIAGNOSTIC_SPEED.value))
|
|
print ("DIAGNOSTIC_TEMPERATURE :", drv.get_variable(Varid.DIAGNOSTIC_TEMPERATURE.value))
|
|
|
|
if __name__ == '__main__':
|
|
ser = serial.Serial("/dev/ttyACM0", 115200)
|
|
|
|
drv = Pololu1376(serial_port=ser)
|
|
drv.go()
|
|
time.sleep(1)
|
|
|
|
for speed in range(60, 100, 10):
|
|
print("Speed = {}".format(speed))
|
|
drv.motor_forward(speed)
|
|
for n in range (0, 10, 1):
|
|
print_vars(drv)
|
|
time.sleep(0.5)
|
|
drv.motor_brake(50)
|
|
time.sleep(1)
|
|
|
|
print("End of program")
|
|
|