77
88from dynamixel import utils
99from dynamixel .protocol import Protocol2 , Response
10- from dynamixel .servo import ControlTableItem , Servo , controlTable , paramUnit
10+ from dynamixel .servo import ControlTableItem , Servo , controlTable , units
1111
1212
1313class operatingMode :
@@ -21,42 +21,43 @@ class ControlTable(controlTable):
2121 MODEL_NUMBER = ControlTableItem (0 , 2 , False )
2222 MODEL_INFORMATION = ControlTableItem (2 , 4 , False )
2323 FIRMWARE_VERSION = ControlTableItem (6 , 1 , False )
24- ID = ControlTableItem (7 , 1 , True )
25- BAUD = ControlTableItem (8 , 1 , True )
26- RETURN_DELAY_TIME = ControlTableItem (9 , 1 , True )
27- DRIVE_MODE = ControlTableItem (10 , 1 , True )
28- OPERATING_MODE = ControlTableItem (11 , 1 , True )
29- SECONDARY_SHADOW_ID = ControlTableItem (12 , 1 , True )
30- PROTOCOL_TYPE = ControlTableItem (13 , 1 , True )
31- HOMING_OFFSET = ControlTableItem (20 , 4 , True )
32- MOVING_THRESHOLD = ControlTableItem (24 , 4 , True )
33- TEMPERATURE_LIMIT = ControlTableItem (31 , 1 , True )
34- MAX_VOLTAGE_LIMIT = ControlTableItem (32 , 2 , True )
35- MIN_VOLTAGE_LIMIT = ControlTableItem (34 , 2 , True )
36- PWM_LIMIT = ControlTableItem (36 , 2 , True )
37- VELOCITY_LIMIT = ControlTableItem (44 , 4 , True )
38- MAX_POSITION_LIMIT = ControlTableItem (48 , 4 , True )
39- MIN_POSITION_LIMIT = ControlTableItem (52 , 4 , True )
24+ ID = ControlTableItem (7 , 1 , True , ( 0 , 252 ) )
25+ BAUD = ControlTableItem (8 , 1 , True , ( 0 , 7 ), units . BAUD )
26+ RETURN_DELAY_TIME = ControlTableItem (9 , 1 , True , ( 0 , 254 ) )
27+ DRIVE_MODE = ControlTableItem (10 , 1 , True , ( 0 , 13 ) )
28+ OPERATING_MODE = ControlTableItem (11 , 1 , True , [ 1 , 3 , 4 , 16 ] )
29+ SECONDARY_SHADOW_ID = ControlTableItem (12 , 1 , True , ( 0 , 255 ) )
30+ PROTOCOL_TYPE = ControlTableItem (13 , 1 , True , [ 1 , 2 ] )
31+ HOMING_OFFSET = ControlTableItem (20 , 4 , True , ( - 1044479 , 1044479 ) )
32+ MOVING_THRESHOLD = ControlTableItem (24 , 4 , True , ( 0 , 1023 ) )
33+ TEMPERATURE_LIMIT = ControlTableItem (31 , 1 , True , ( 0 , 100 ) )
34+ MAX_VOLTAGE_LIMIT = ControlTableItem (32 , 2 , True , ( 65 , 140 ), units . VOLTAGE )
35+ MIN_VOLTAGE_LIMIT = ControlTableItem (34 , 2 , True , ( 65 , 140 ), units . VOLTAGE )
36+ PWM_LIMIT = ControlTableItem (36 , 2 , True , ( 0 , 885 ) )
37+ VELOCITY_LIMIT = ControlTableItem (44 , 4 , True , ( 0 , 1024 ), units . RPM )
38+ MAX_POSITION_LIMIT = ControlTableItem (48 , 4 , True , ( 0 , 4095 ) )
39+ MIN_POSITION_LIMIT = ControlTableItem (52 , 4 , True , ( 0 , 4095 ) )
4040 STARTUP_CONFIGURATION = ControlTableItem (60 , 1 , True )
4141 SHUTDOWN = ControlTableItem (63 , 1 , True )
42- TORQUE_ENABLE = ControlTableItem (64 , 1 , True )
43- LED = ControlTableItem (65 , 1 , True )
44- STATUS_RETURN_LEVEL = ControlTableItem (68 , 1 , True )
45- REGISTERED_INSTRUCTION = ControlTableItem (69 , 1 , False )
42+
43+ TORQUE_ENABLE = ControlTableItem (64 , 1 , True , [0 , 1 ])
44+ LED = ControlTableItem (65 , 1 , True , [0 , 1 ])
45+ STATUS_RETURN_LEVEL = ControlTableItem (68 , 1 , True , [0 , 1 , 2 ])
46+ REGISTERED_INSTRUCTION = ControlTableItem (69 , 1 , False , [0 , 1 ])
4647 HARDWARE_ERROR_STATUS = ControlTableItem (70 , 1 , False )
47- VELOCITY_I_GAIN = ControlTableItem (76 , 2 , True )
48- VELOCITY_P_GAIN = ControlTableItem (78 , 2 , True )
49- POSITION_D_GAIN = ControlTableItem (80 , 2 , True )
50- POSITION_I_GAIN = ControlTableItem (82 , 2 , True )
51- POSITION_P_GAIN = ControlTableItem (84 , 2 , True )
52- FEEDFORWARD_2ND_GAIN = ControlTableItem (88 , 2 , True )
53- FEEDFORWARD_1ST_GAIN = ControlTableItem (90 , 2 , True )
54- BUS_WATCHDOG = ControlTableItem (98 , 1 , True )
55- GOAL_PWM = ControlTableItem (100 , 2 , True )
56- GOAL_VELOCITY = ControlTableItem (104 , 4 , True )
57- PROFILE_ACCELERATION = ControlTableItem (108 , 4 , True )
58- PROFILE_VELOCITY = ControlTableItem (112 , 4 , True )
59- GOAL_POSITION = ControlTableItem (116 , 4 , True )
48+ VELOCITY_I_GAIN = ControlTableItem (76 , 2 , True , ( 0 , 16383 ) )
49+ VELOCITY_P_GAIN = ControlTableItem (78 , 2 , True , ( 0 , 16383 ) )
50+ POSITION_D_GAIN = ControlTableItem (80 , 2 , True , ( 0 , 16383 ) )
51+ POSITION_I_GAIN = ControlTableItem (82 , 2 , True , ( 0 , 16383 ) )
52+ POSITION_P_GAIN = ControlTableItem (84 , 2 , True , ( 0 , 16383 ) )
53+ FEEDFORWARD_2ND_GAIN = ControlTableItem (88 , 2 , True , ( 0 , 16383 ) )
54+ FEEDFORWARD_1ST_GAIN = ControlTableItem (90 , 2 , True , ( 0 , 16383 ) )
55+ BUS_WATCHDOG = ControlTableItem (98 , 1 , True , ( 0 , 127 ) )
56+ GOAL_PWM = ControlTableItem (100 , 2 , True , ( - 885 , 885 ) )
57+ GOAL_VELOCITY = ControlTableItem (104 , 4 , True , ( - 1024 , 1024 ) )
58+ PROFILE_ACCELERATION = ControlTableItem (108 , 4 , True , ( 0 , 32767 ) )
59+ PROFILE_VELOCITY = ControlTableItem (112 , 4 , True , ( 0 , 32767 ) )
60+ GOAL_POSITION = ControlTableItem (116 , 4 , True , ( - 1048575 , 1048575 ), units . DEGREE )
6061 REALTIME_TICK = ControlTableItem (120 , 2 , False )
6162 MOVING = ControlTableItem (122 , 1 , False )
6263 MOVING_STATUS = ControlTableItem (123 , 1 , False )
@@ -71,30 +72,29 @@ class ControlTable(controlTable):
7172 BACKUP_READY = ControlTableItem (147 , 1 , False )
7273
7374
74- def convertToNegative (value , length ):
75- if value < 0 :
76- maxInt = int .from_bytes (bytes ([0xFF ] * length ), "little" )
77- maxInt += value
78- return list (maxInt .to_bytes (length , "little" ))
79-
80-
81- def convertFromNegative (value , length ):
82- return utils .twosComplement (value , length )
83-
84-
8575class XL430_W250_T (Servo ):
8676 CONTROL_TABLE = ControlTable
87- PARAM_UNIT = paramUnit
8877 OPERATING_MODE = operatingMode
8978
90- def __init__ (self , * args , unit = PARAM_UNIT . UNIT_DEGREE , ** kwargs ):
79+ def __init__ (self , * args , unit = None , ** kwargs ):
9180 super ().__init__ (* args , ** kwargs )
9281 self .unit = unit
9382 self .protocol = Protocol2 (** kwargs )
9483 self .resolution = 4096
9584 self .torqueEnabled = False
9685 self .moving = False
9786 self .presentPosition = 0
87+ self ._rpm = 0.229
88+ self .bauds = {
89+ 7 : 4500000 ,
90+ 6 : 4000000 ,
91+ 5 : 3000000 ,
92+ 4 : 2000000 ,
93+ 3 : 1000000 ,
94+ 2 : 115200 ,
95+ 1 : 57600 ,
96+ 0 : 9600 ,
97+ }
9898
9999 async def run (self ):
100100 while True :
@@ -113,3 +113,14 @@ def clear(self, position: bool = False, error: bool = False):
113113 if not isinstance (self .protocol , Protocol2 ):
114114 return
115115 self .protocol .clear (self .id , position = position , error = error )
116+
117+ @classmethod
118+ def convertToNegative (cls , value , length ):
119+ if value < 0 :
120+ maxInt = int .from_bytes (bytes ([0xFF ] * length ), "little" )
121+ maxInt += value
122+ return list (maxInt .to_bytes (length , "little" ))
123+
124+ @classmethod
125+ def convertFromNegative (cls , value , length ):
126+ return utils .twosComplement (value , length )
0 commit comments