[Edit: This thread has evolved beyond this initial problem into a discussion of general Dynamixel bus read performance and strategies.]
Hi everyone,
I'm seeing some strange behavior, wanted to see if this is something that others have encountered before as well. I'm seeing extra data bytes in the params when I read the whole table at once. I don't have any problems reading one or two bytes at a time.
Here is some output of reading an AX-12+ table one address at a time:
Code:
12 [address=0,name=Model Number(L),initialValue=12,area=EEPROM,access=R,size=Word,index=0]
0 [address=1,name=Model Number(H),initialValue=0,area=EEPROM,access=R,size=Word,index=1]
24 [address=2,name=Version of Firmware,initialValue=-1,area=EEPROM,access=R,size=Byte,index=2]
3 [address=3,name=ID,initialValue=1,area=EEPROM,access=RW,size=Byte,index=3]
1 [address=4,name=Baud Rate,initialValue=1,area=EEPROM,access=RW,size=Byte,index=4]
0 [address=5,name=Return Delay Time,initialValue=250,area=EEPROM,access=RW,size=Byte,index=5]
200 [address=6,name=CW Angle Limit(L),initialValue=0,area=EEPROM,access=RW,size=Word,index=6]
0 [address=7,name=CW Angle Limit(H),initialValue=0,area=EEPROM,access=RW,size=Word,index=7]
55 [address=8,name=CCW Angle Limit(L),initialValue=255,area=EEPROM,access=RW,size=Word,index=8]
3 [address=9,name=CCW Angle Limit(H),initialValue=3,area=EEPROM,access=RW,size=Word,index=9]
70 [address=11,name=Highest Limit Temperature,initialValue=70,area=EEPROM,access=RW,size=Byte,index=10]
60 [address=12,name=Lowest Limit Voltage,initialValue=60,area=EEPROM,access=RW,size=Byte,index=11]
140 [address=13,name=Highest Limit Voltage,initialValue=140,area=EEPROM,access=RW,size=Byte,index=12]
255 [address=14,name=Max Torque(L),initialValue=255,area=EEPROM,access=RW,size=Word,index=13]
3 [address=15,name=Max Torque(H),initialValue=3,area=EEPROM,access=RW,size=Word,index=14]
2 [address=16,name=Status Return Level,initialValue=2,area=EEPROM,access=RW,size=Byte,index=15]
36 [address=17,name=Alarm LED,initialValue=36,area=EEPROM,access=RW,size=Byte,index=16]
36 [address=18,name=Alarm Shutdown,initialValue=36,area=EEPROM,access=RW,size=Byte,index=17]
0 [address=24,name=Torque Enable,initialValue=0,area=RAM,access=RW,size=Byte,index=18]
0 [address=25,name=LED,initialValue=0,area=RAM,access=RW,size=Byte,index=19]
1 [address=26,name=CW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=20]
1 [address=27,name=CCW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=21]
32 [address=28,name=CW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=22]
32 [address=29,name=CCW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=23]
248 [address=30,name=Goal Position(L),initialValue=-1,area=RAM,access=RW,size=Word,index=24]
1 [address=31,name=Goal Position(H),initialValue=-1,area=RAM,access=RW,size=Word,index=25]
0 [address=32,name=Moving Speed(L),initialValue=-1,area=RAM,access=RW,size=Word,index=26]
0 [address=33,name=Moving Speed(H),initialValue=-1,area=RAM,access=RW,size=Word,index=27]
255 [address=34,name=Torque Limit(L),initialValue=255,area=RAM,access=RW,size=Word,index=28]
3 [address=35,name=Torque Limit(H),initialValue=3,area=RAM,access=RW,size=Word,index=29]
248 [address=36,name=Present Position(L),initialValue=-1,area=RAM,access=R,size=Word,index=30]
1 [address=37,name=Present Position(H),initialValue=-1,area=RAM,access=R,size=Word,index=31]
0 [address=38,name=Present Speed(L),initialValue=-1,area=RAM,access=R,size=Word,index=32]
0 [address=39,name=Present Speed(H),initialValue=-1,area=RAM,access=R,size=Word,index=33]
0 [address=40,name=Present Load(L),initialValue=-1,area=RAM,access=R,size=Word,index=34]
0 [address=41,name=Present Load(H),initialValue=-1,area=RAM,access=R,size=Word,index=35]
123 [address=42,name=Present Voltage,initialValue=-1,area=RAM,access=R,size=Byte,index=36]
28 [address=43,name=Present Temperature,initialValue=-1,area=RAM,access=R,size=Byte,index=37]
0 [address=44,name=Registered,initialValue=0,area=RAM,access=R,size=Byte,index=38]
0 [address=46,name=Moving,initialValue=0,area=RAM,access=R,size=Byte,index=39]
0 [address=47,name=Lock,initialValue=0,area=RAM,access=RW,size=Byte,index=40]
32 [address=48,name=Punch(L),initialValue=32,area=RAM,access=RW,size=Word,index=41]
0 [address=49,name=Punch(H),initialValue=0,area=RAM,access=RW,size=Word,index=42]
Here is some output of reading all 43 addresses of an AX-12+ table at one time (comments below):
Code:
12 [address=0,name=Model Number(L),initialValue=12,area=EEPROM,access=R,size=Word,index=0]
0 [address=1,name=Model Number(H),initialValue=0,area=EEPROM,access=R,size=Word,index=1]
24 [address=2,name=Version of Firmware,initialValue=-1,area=EEPROM,access=R,size=Byte,index=2]
3 [address=3,name=ID,initialValue=1,area=EEPROM,access=RW,size=Byte,index=3]
1 [address=4,name=Baud Rate,initialValue=1,area=EEPROM,access=RW,size=Byte,index=4]
0 [address=5,name=Return Delay Time,initialValue=250,area=EEPROM,access=RW,size=Byte,index=5]
200 [address=6,name=CW Angle Limit(L),initialValue=0,area=EEPROM,access=RW,size=Word,index=6]
0 [address=7,name=CW Angle Limit(H),initialValue=0,area=EEPROM,access=RW,size=Word,index=7]
55 [address=8,name=CCW Angle Limit(L),initialValue=255,area=EEPROM,access=RW,size=Word,index=8]
3 [address=9,name=CCW Angle Limit(H),initialValue=3,area=EEPROM,access=RW,size=Word,index=9]
131 [address=11,name=Highest Limit Temperature,initialValue=70,area=EEPROM,access=RW,size=Byte,index=10]
70 [address=12,name=Lowest Limit Voltage,initialValue=60,area=EEPROM,access=RW,size=Byte,index=11]
60 [address=13,name=Highest Limit Voltage,initialValue=140,area=EEPROM,access=RW,size=Byte,index=12]
140 [address=14,name=Max Torque(L),initialValue=255,area=EEPROM,access=RW,size=Word,index=13]
255 [address=15,name=Max Torque(H),initialValue=3,area=EEPROM,access=RW,size=Word,index=14]
3 [address=16,name=Status Return Level,initialValue=2,area=EEPROM,access=RW,size=Byte,index=15]
2 [address=17,name=Alarm LED,initialValue=36,area=EEPROM,access=RW,size=Byte,index=16]
36 [address=18,name=Alarm Shutdown,initialValue=36,area=EEPROM,access=RW,size=Byte,index=17]
36 [address=24,name=Torque Enable,initialValue=0,area=RAM,access=RW,size=Byte,index=18]
0 [address=25,name=LED,initialValue=0,area=RAM,access=RW,size=Byte,index=19]
44 [address=26,name=CW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=20]
0 [address=27,name=CCW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=21]
206 [address=28,name=CW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=22]
3 [address=29,name=CCW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=23]
0 [address=30,name=Goal Position(L),initialValue=-1,area=RAM,access=RW,size=Word,index=24]
0 [address=31,name=Goal Position(H),initialValue=-1,area=RAM,access=RW,size=Word,index=25]
1 [address=32,name=Moving Speed(L),initialValue=-1,area=RAM,access=RW,size=Word,index=26]
1 [address=33,name=Moving Speed(H),initialValue=-1,area=RAM,access=RW,size=Word,index=27]
32 [address=34,name=Torque Limit(L),initialValue=255,area=RAM,access=RW,size=Word,index=28]
32 [address=35,name=Torque Limit(H),initialValue=3,area=RAM,access=RW,size=Word,index=29]
248 [address=36,name=Present Position(L),initialValue=-1,area=RAM,access=R,size=Word,index=30]
1 [address=37,name=Present Position(H),initialValue=-1,area=RAM,access=R,size=Word,index=31]
0 [address=38,name=Present Speed(L),initialValue=-1,area=RAM,access=R,size=Word,index=32]
0 [address=39,name=Present Speed(H),initialValue=-1,area=RAM,access=R,size=Word,index=33]
255 [address=40,name=Present Load(L),initialValue=-1,area=RAM,access=R,size=Word,index=34]
3 [address=41,name=Present Load(H),initialValue=-1,area=RAM,access=R,size=Word,index=35]
248 [address=42,name=Present Voltage,initialValue=-1,area=RAM,access=R,size=Byte,index=36]
1 [address=43,name=Present Temperature,initialValue=-1,area=RAM,access=R,size=Byte,index=37]
0 [address=44,name=Registered,initialValue=0,area=RAM,access=R,size=Byte,index=38]
0 [address=46,name=Moving,initialValue=0,area=RAM,access=R,size=Byte,index=39]
0 [address=47,name=Lock,initialValue=0,area=RAM,access=RW,size=Byte,index=40]
0 [address=48,name=Punch(L),initialValue=32,area=RAM,access=RW,size=Word,index=41]
123 [address=49,name=Punch(H),initialValue=0,area=RAM,access=RW,size=Word,index=42]
You can see that the first nine values are the same, then there is a 131 thrown in there. Another nine values match (but shifted down), and then there is this sequence inserted:
Code:
44 [address=26,name=CW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=20]
0 [address=27,name=CCW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=21]
206 [address=28,name=CW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=22]
3 [address=29,name=CCW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=23]
0 [address=30,name=Goal Position(L),initialValue=-1,area=RAM,access=RW,size=Word,index=24]
Then it matches again, but of course everything is shifted, and while I get 43 bytes, the last byte I get is address 42, not 49.
It's not that the data is getting randomly garbled either, because I get this byte sequence every time, even after power/port cycling. If I try a different AX-12+, I get the bytes in the same positions but different values. It's interesting that it's so consistent. I don't see anything in the documentation about this.
FYI, here is some data where I get a single address if it's a byte and two addresses if it's a word (only low address is printed but with combined word value):
Code:
12 [address=0,name=Model Number(L),initialValue=12,area=EEPROM,access=R,size=Word,index=0]
24 [address=2,name=Version of Firmware,initialValue=-1,area=EEPROM,access=R,size=Byte,index=2]
3 [address=3,name=ID,initialValue=1,area=EEPROM,access=RW,size=Byte,index=3]
1 [address=4,name=Baud Rate,initialValue=1,area=EEPROM,access=RW,size=Byte,index=4]
0 [address=5,name=Return Delay Time,initialValue=250,area=EEPROM,access=RW,size=Byte,index=5]
200 [address=6,name=CW Angle Limit(L),initialValue=0,area=EEPROM,access=RW,size=Word,index=6]
823 [address=8,name=CCW Angle Limit(L),initialValue=255,area=EEPROM,access=RW,size=Word,index=8]
70 [address=11,name=Highest Limit Temperature,initialValue=70,area=EEPROM,access=RW,size=Byte,index=10]
60 [address=12,name=Lowest Limit Voltage,initialValue=60,area=EEPROM,access=RW,size=Byte,index=11]
140 [address=13,name=Highest Limit Voltage,initialValue=140,area=EEPROM,access=RW,size=Byte,index=12]
1023 [address=14,name=Max Torque(L),initialValue=255,area=EEPROM,access=RW,size=Word,index=13]
2 [address=16,name=Status Return Level,initialValue=2,area=EEPROM,access=RW,size=Byte,index=15]
36 [address=17,name=Alarm LED,initialValue=36,area=EEPROM,access=RW,size=Byte,index=16]
36 [address=18,name=Alarm Shutdown,initialValue=36,area=EEPROM,access=RW,size=Byte,index=17]
0 [address=24,name=Torque Enable,initialValue=0,area=RAM,access=RW,size=Byte,index=18]
0 [address=25,name=LED,initialValue=0,area=RAM,access=RW,size=Byte,index=19]
1 [address=26,name=CW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=20]
1 [address=27,name=CCW Compliance Margin,initialValue=1,area=RAM,access=RW,size=Byte,index=21]
32 [address=28,name=CW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=22]
32 [address=29,name=CCW Compliance Slope,initialValue=32,area=RAM,access=RW,size=Byte,index=23]
504 [address=30,name=Goal Position(L),initialValue=-1,area=RAM,access=RW,size=Word,index=24]
0 [address=32,name=Moving Speed(L),initialValue=-1,area=RAM,access=RW,size=Word,index=26]
1023 [address=34,name=Torque Limit(L),initialValue=255,area=RAM,access=RW,size=Word,index=28]
504 [address=36,name=Present Position(L),initialValue=-1,area=RAM,access=R,size=Word,index=30]
0 [address=38,name=Present Speed(L),initialValue=-1,area=RAM,access=R,size=Word,index=32]
0 [address=40,name=Present Load(L),initialValue=-1,area=RAM,access=R,size=Word,index=34]
123 [address=42,name=Present Voltage,initialValue=-1,area=RAM,access=R,size=Byte,index=36]
31 [address=43,name=Present Temperature,initialValue=-1,area=RAM,access=R,size=Byte,index=37]
0 [address=44,name=Registered,initialValue=0,area=RAM,access=R,size=Byte,index=38]
0 [address=46,name=Moving,initialValue=0,area=RAM,access=R,size=Byte,index=39]
0 [address=47,name=Lock,initialValue=0,area=RAM,access=RW,size=Byte,index=40]
32 [address=48,name=Punch(L),initialValue=32,area=RAM,access=RW,size=Word,index=41]
Any thoughts?
Bookmarks