Day 178 – Servo Servicing II

As I talked about in a previous post, half of our servos weren’t working. Of course, I was going to try to fix them before we spend anymore money on new ones, so that’s what I did today.

Some of them were broken for certain, they either didn’t show up at all when connected or gave a permanent overheating or voltage error/. However, some of them would function fine except they wouldn’t move.

So here’s how I got some of them working again. Using the pyax12 library.

1

2

3

4

from pyax12.connection import Connection

sc=Connection(port="/dev/ttyS4",baudrate=1000000)

id=3

The pretty_print_control_table() function is excellent for debugging. It shows every value that the servo stores in its EEPROM.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

model_number.................Unknown(300)

firmware_version.............28

id...........................3

baud_rate....................1000000.0bps

return_delay_time............500µs

cw_angle_limit...............-150.0°(0)

ccw_angle_limit..............-150.0°(0)

max_temperature..............80°C

min_voltage..................6.0V

max_voltage..................14.0V

max_torque...................1023

status_return_level..........2(respond toall instructions)

input_voltage_alarm_led......off

angle_limit_alarm_led........off

overheating_alarm_led........on

range_alarm_led..............off

checksum_alarm_led...........off

overload_alarm_led...........on

instruction_alarm_led........off

input_voltage_alarm_shutdown.off

angle_limit_alarm_shutdown...off

overheating_alarm_shutdown...on

range_alarm_shutdown.........off

checksum_alarm_shutdown......off

overload_alarm_shutdown......on

instruction_alarm_shutdown...off

down_calibration.............42

up_calibration...............971

torque_enabled...............no

led..........................off

cw_compliance_margin.........1.2°(4)

ccw_compliance_margin........1.2°(4)

cw_compliance_slope..........18.8°(64)

ccw_compliance_slope.........18.8°(64)

goal_position................-149.7°(1)

moving_speed.................0

torque_limit.................1023

present_position.............-150.0°(0)

present_speed................0

present_load.................0

present_voltage..............12.1V

present_temperature..........27°C

registred_instruction........no

moving.......................no

locked.......................no

punch........................32

Some of the motors had their torque turned off, I believe this happens automatically after overheating. Also some of them had their rotation locked, which is useful for if you have an arm for example, with a limited range of movement, but less so if you’re testing them by making them continuously spin.

1

2

3

4

5

// enable torque

sc.write_data(id,24,0)

// enable wheel mode (allows full rotation)

sc.set_cw_angle_limit(id,0,degrees=False)

sc.set_ccw_angle_limit(id,0,degrees=False)

One of the stranger issues was one of our servos only moved at an excruciatingly slow speed. We assumed this was the gears, but looking at the control table revealed that:

1

max_torque...................80

How that happened, I have no idea. For this particular setting, the value for max_torque is stored in two bytes, the lowest byte in 0x0E and highest in 0x0F. Setting the two bytes individually, (to their default values of 0xFF and 0x03 respectively) didn’t work. I had to set them as followed:

1

sc.write_data(id,0x0E,[0xFF,0x03])

The servo then needs to be powered off and on again to set the runtime torque limit to the value we just set.

I managed to fix three, maybe four of the servos which was great. This leaves five broken servos, which we’ll have to sort out later.

Haha, we may have left some of the 12s in joint mode when we switched to the AX-18As on the S.A.R.T. Mk II – the original did have an arm. I’m glad some those servos were an easy fix, hope you have success with the rest too!