Dynamixel  2.9.5
RoadNarrows Robotics Dynamixel Package
Dynamixel.h
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Package: Dynamixel
4 //
5 // Library: librnr_dynamixel
6 //
7 // File: Dynamixel.h
8 //
9 /*! \file
10  *
11  * $LastChangedDate: 2015-01-12 10:56:06 -0700 (Mon, 12 Jan 2015) $
12  * $Rev: 3845 $
13  *
14  * \ingroup dyna_lib_hdrs
15  *
16  * \brief RoadNarrows Dynamixel Top-Level Package Header File.
17  *
18  * Defines the unifying concepts of the RoadNarrows implementation of the
19  * Robotis Dynamixel servos including:
20  * \li error codes
21  * \li common parameter values
22  * \li generic base dynamixel descriptions
23  *
24  * \author Robin Knight (robin.knight@roadnarrows.com)
25  *
26  * \copyright
27  * \h_copy 2011-2017. RoadNarrows LLC.\n
28  * http://www.roadnarrows.com\n
29  * All Rights Reserved
30  */
31 /*
32  * @EulaBegin@
33  *
34  * Unless otherwise stated explicitly, all materials contained are copyrighted
35  * and may not be used without RoadNarrows LLC's written consent,
36  * except as provided in these terms and conditions or in the copyright
37  * notice (documents and software) or other proprietary notice provided with
38  * the relevant materials.
39  *
40  * IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY
41  * MEMBERS/EMPLOYEES/CONTRACTORS OF ROADNARROWS OR DISTRIBUTORS OF THIS SOFTWARE
42  * BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
43  * CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
44  * DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN
45  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46  *
47  * THE AUTHORS AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
48  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
49  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
50  * "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
51  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
52  *
53  * @EulaEnd@
54  */
55 ////////////////////////////////////////////////////////////////////////////////
56 
57 #ifndef _DYNAMIXEL_H
58 #define _DYNAMIXEL_H
59 
60 #include "rnr/rnrconfig.h"
61 #include "rnr/units.h"
62 #include "rnr/log.h"
63 
64 #ifndef SWIG
65 C_DECLS_BEGIN
66 #endif // SWIG
67 
68 // ---------------------------------------------------------------------------
69 // Dynamixel Package Error Codes
70 // ---------------------------------------------------------------------------
71 
72 /*!
73  * \addtogroup dyna_ecodes
74  *
75  * RoadNarrows Dynamixel package-wide error codes.
76  * \{
77  */
78 #define DYNA_OK 0 ///< not an error, success
79 
80 #define DYNA_ECODE_GEN 1 ///< general, unspecified error
81 #define DYNA_ECODE_SYS 2 ///< system (errno) error
82 #define DYNA_ECODE_INTERNAL 3 ///< internal error (bug)
83 #define DYNA_ECODE_BADEC 4 ///< bad error code
84 #define DYNA_ECODE_BAD_UNITS 5 ///< unsupported or bad units
85 #define DYNA_ECODE_BAD_VAL 6 ///< bad value
86 #define DYNA_ECODE_NO_SERVO 7 ///< no servo found
87 #define DYNA_ECODE_BAD_DEV 8 ///< no or bad serial device
88 #define DYNA_ECODE_BADF 9 ///< no comm object or not open
89 #define DYNA_ECODE_ECOMM 10 ///< dynamixel communication error
90 #define DYNA_ECODE_TX_FAIL 11 ///< dynamixel transmit packet failure
91 #define DYNA_ECODE_RX_FAIL 12 ///< dynamixel receive packet failure
92 #define DYNA_ECODE_TX_ERROR 13 ///< dynamixel transmit packet error
93 #define DYNA_ECODE_RX_TIMEOUT 14 ///< dynamixel receive packet time out
94 #define DYNA_ECODE_RX_BAD_PKT 15 ///< dynamixel receive bad packet
95 #define DYNA_ECODE_ESERVO 16 ///< dynamixel servo in error condition
96 #define DYNA_ECODE_RSRC 17 ///< no resource
97 #define DYNA_ECODE_NOT_SUPP 18 ///< feature/function not supported
98 #define DYNA_ECODE_LINKED 19 ///< linked servos error
99 #define DYNA_ECODE_SLAVE 20 ///< invalid slave operation
100 #define DYNA_ECODE_BOTSENSE 21 ///< BotSense proxy error
101 #define DYNA_ECODE_PARSE 22 ///< Shell parse error.
102 #define DYNA_ECODE_RUNTIME 23 ///< Shell run-time error.
103 #define DYNA_ECODE_NOEXEC 24 ///< Shell parse error.
104 
105 #define DYNA_ECODE_NUMOF 25 ///< number of error codes
106 /*! \} */
107 
108 
109 // ---------------------------------------------------------------------------
110 // Dynamixel Base Parameters
111 // ---------------------------------------------------------------------------
112 
113 /*!
114  * \ingroup dyna_servo
115  * \defgroup dyna_servo_model_num Supported Dynamixel Models
116  *
117  * \{
118  */
119 #define DYNA_MODEL_NUM_GENERIC 0x0000 ///< generic, base model
120 /*! \} */
121 
122 /*!
123  * \ingroup dyna_common
124  * \defgroup dyna_common_base Base Parameters
125  *
126  * \{
127  */
128 /*! \} */
129 
130 /*!
131  * \ingroup dyna_common_base
132  * \defgroup dyna_servo_fwver Special Firmware Version
133  *
134  * \{
135  */
136 #define DYNA_FWVER_NA 0x00 ///< firmware version not available
137 /*! \} */
138 
139 /*!
140  * \ingroup dyna_common_base
141  * \defgroup dyna_servo_id Dynamixel Identifiers
142  *
143  * \{
144  */
145 #define DYNA_ID_NONE -1 ///< no servo id
146 #define DYNA_ID_MIN 0 ///< minimum servo id
147 #define DYNA_ID_MAX 253 ///< maximum servo id
148 #define DYNA_ID_NUMOF 254 ///< number of unique servo id's
149 #define DYNA_ID_BROADCAST 254 ///< broadcast id
150 #define DYNA_ID_RESERVED 255 ///< reserved id
151 #define DYNA_ID_MASK 0xff ///< id mask
152 /*! \} */
153 
154 /*!
155  * \ingroup dyna_common_base
156  * \defgroup dyna_servo_mode Dynamixel Operational Modes
157  *
158  * In servo mode, the servo has limited rotation (e.g. 300\h_deg). The servo,
159  * however, can move to a new goal position without host asssitance using the
160  * servo control method, and moves at the current goal speed.
161  *
162  * In continuous (wheel) mode, the goal position is not applicable. The servo
163  * is moved by setting the goal speed and direction (cw/ccw). Position data
164  * is invalid within the servo position limits and so cannot be trusted. On
165  * newer servos, 360\h_deg position data is availble and the host may then
166  * provide positioning control.
167  *
168  * \{
169  */
170 #define DYNA_MODE_SERVO 0x01 ///< servo mode with limited rotation
171 #define DYNA_MODE_CONTINUOUS 0x02 ///< continuous mode with/without position
172 /*! \} */
173 
174 /*!
175  * \ingroup dyna_common_base
176  * \defgroup dyna_servo_link_type Dynamixel Servo Link Types
177  *
178  * \{
179  */
180 #define DYNA_LINK_NONE 0 ///< servo is not linked to another servo
181 #define DYNA_LINK_MASTER 1 ///< servo is linked, serving as the master
182 #define DYNA_LINK_SLAVE 2 ///< servo is linked, serving as the slave
183 /*! \} */
184 
185 /*!
186  * \ingroup dyna_common_base
187  * \defgroup dyna_servo_dir Dynamixel Direction Common Values
188  *
189  * \{
190  */
191 #define DYNA_DIR_CW (-1) ///< clockwise direction
192 #define DYNA_DIR_NONE 0 ///< no direction
193 #define DYNA_DIR_CCW 1 ///< counterclockwise direction
194 
195 /*!
196  * \brief Get the direction component, given the rotational scalar.
197  *
198  * \param scalar Signed rotational scaler such as speed or load.
199  */
200 #define DYNA_GET_DIR(scalar) ((scalar)<0? DYNA_DIR_CW: DYNA_DIR_CCW)
201 /*! \} */
202 
203 /*!
204  * \ingroup dyna_common_base
205  * \defgroup dyna_ctl_method Dynamixel Internal Position Control Methods
206  *
207  * The compliance control method specifies a simple torque (speed) ramp down
208  * and margin to achieve the goal position.
209  *
210  * The PID control method, that replaced the above method in newer servos,
211  * defines the set of constants used by the servo to achieve the goal
212  * position.
213  * \{
214  */
215 #define DYNA_CTL_METHOD_NONE 0 ///< no control method
216 #define DYNA_CTL_METHOD_COMPLIANCE 1 ///< compliance control method
217 #define DYNA_CTL_METHOD_PID 2 ///< pid control method
218 /*! \} */
219 
220 
221 // ---------------------------------------------------------------------------
222 // Generic Dynamixel
223 // ---------------------------------------------------------------------------
224 
225 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
226 // Generic Servo Common Parameters
227 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
228 
229 /*!
230  * \ingroup dyna_common
231  * \defgroup dyna_common_gen Generic Servo Parameters
232  *
233  * \{
234  */
235 /*! \} */
236 
237 /*!
238  * \ingroup dyna_common_gen
239  * \defgroup dyna_servo_pos Dynamixel Position Common Values
240  *
241  * \{
242  */
243 #define DYNA_POS_MASK 0x03ff ///< valid data mask
244 #define DYNA_POS_MIN_RAW 0 ///< minimum raw angular position
245 #define DYNA_POS_MAX_RAW 1023 ///< maximum raw angular position
246 #define DYNA_POS_MODULO (DYNA_POS_MAX_RAW+1)
247  ///< servo position modulo [0-max]
248 #define DYNA_POS_MIN_DEG 0 ///< minimum angular position
249 #define DYNA_POS_MAX_DEG 300 ///< maximum angular position
250 #define DYNA_POS_RES_DEG ((double)DYNA_POS_MAX_DEG/(double)DYNA_POS_MAX_RAW)
251  ///< 0.29\h_deg (servo mode) resolution
252 /*! \} */
253 
254 /*!
255  * \ingroup dyna_common_gen
256  * \defgroup dyna_servo_speed Dynamixel Angular Speed Common Values
257  *
258  * \{
259  */
260 #define DYNA_SPEED_MASK 0x03ff ///< valid data mask
261 #define DYNA_SPEED_CONT_STOP 0 ///< continuous mode: stop
262 #define DYNA_SPEED_MAX_NO_CTL 0 ///< servo mode: max speed with no control
263 #define DYNA_SPEED_MIN_CTL 1 ///< mininum raw speed with control
264 #define DYNA_SPEED_MAX_CTL 1023 ///< maxinum raw speed with control
265 #define DYNA_SPEED_MIN_RAW 0 ///< minimum raw value
266 #define DYNA_SPEED_MAX_RAW 1023 ///< maximum raw value
267 #define DYNA_SPEED_RES_RPM 0.111 ///< rpm (servo mode) resolution
268 #define DYNA_SPEED_RES_PCT (100.0/DYNA_SPEED_MAX_RAW)
269  ///< percent (servo mode) resolution
270 #define DYNA_SPEED_RES_PMIL (1000.0/DYNA_SPEED_MAX_RAW)
271  ///< permil (servo mode) resolution
272 /*! \} */
273 
274 /*!
275  * \ingroup dyna_common_gen
276  * \defgroup dyna_servo_torque Dynamixel Torque Common Values
277  *
278  * \{
279  */
280 #define DYNA_TORQUE_MASK 0x03ff ///< valid data mask
281 #define DYNA_TORQUE_MIN_RAW 0 ///< minimum raw torque
282 #define DYNA_TORQUE_MAX_RAW 1023 ///< maximum raw torque
283 #define DYNA_TORQUE_RES_PCT (100.0/DYNA_TORQUE_MAX_RAW)
284  ///< percent of maximum resolution
285 #define DYNA_TORQUE_RES_PMIL (1000.0/DYNA_TORQUE_MAX_RAW)
286  ///< permil of maximum resolution
287 /*! \} */
288 
289 /*!
290  * \ingroup dyna_common_gen
291  * \defgroup dyna_servo_temp Dynamixel Temperature Common Values
292  *
293  * \{
294  */
295 #define DYNA_TEMP_MIN_RAW 10 ///< minimum raw temperature
296 #define DYNA_TEMP_MAX_RAW 99 ///< maximum raw temperature
297 #define DYNA_TEMP_MIN_C DYNA_TEMP_MIN_RAW ///< 10C temperature minimum
298 #define DYNA_TEMP_MAX_C DYNA_TEMP_MAX_RAW ///< 99C temperature maximum
299 #define DYNA_TEMP_RES_C 1 ///< 1\h_deg Celsius resolution
300 /*! \} */
301 
302 /*!
303  * \ingroup dyna_common_gen
304  * \defgroup dyna_servo_volt Dynamixel Voltage Common Values
305  *
306  * \{
307  */
308 #define DYNA_VOLT_MIN_RAW 50 ///< minimum raw temperature
309 #define DYNA_VOLT_MAX_RAW 250 ///< maximum raw temperature
310 #define DYNA_VOLT_RES_V 0.1 ///< 0.1V resolution
311 /*! \} */
312 
313 
314 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
315 // Generic Servo Control Table
316 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
317 
318 /*!
319  * \ingroup dyna_memmap
320  * \defgroup dyna_memmap_gen Generic Control Table Memory Map
321  *
322  * Default servo EEPROM and RAM memory map. Specific servos may extend, remove,
323  * or override.
324  * \{
325  */
326 /*! \} */
327 
328 /*!
329  * \ingroup dyna_memmap_gen
330  * \defgroup dyna_memmap_gen_layout Address Layout
331  * \{
332  */
333 #define DYNA_EEPROM_MIN_ADDR 0 ///< minimum EEPROM adderss
334 #define DYNA_EEPROM_MAX_ADDR 18 ///< maximum EEPROM adderss
335 #define DYNA_RAM_MIN_ADDR 24 ///< minimum RAM adderss
336 #define DYNA_RAM_MAX_ADDR 49 ///< maximum RAM adderss
337 #define DYNA_MEM_MAX_SIZ 50 ///< maximum control memory size (bytes)
338 /*! \} */
339 
340 
341 // . . . . . . . . . . . . . . . . . . .
342 // EEPROM. All values are read/write (RW) unless otherwise noted.
343 // . . . . . . . . . . . . . . . . . . .
344 
345 /*!
346  * \ingroup dyna_memmap_gen
347  * \defgroup dyna_memmap_gen_model_num EEPROM Model Number
348  *
349  * \par Mode: R
350  *
351  * \{
352  */
353 #define DYNA_ADDR_MODEL_NUM_LSB 0 ///< model number lsb (R)
354 #define DYNA_ADDR_MODEL_NUM_MSB 1 ///< model number msb (R)
355 
356 #define DYNA_ADDR_MODEL_NUM_MASK 0xffff ///< valid data mask
357 /*! \} */
358 
359 /*!
360  * \ingroup dyna_memmap_gen
361  * \defgroup dyna_memmap_gen_fwver EEPROM Firmware Version
362  *
363  * \par Mode: R
364  *
365  * \{
366  */
367 #define DYNA_ADDR_FWVER 2 ///< firmware version (R)
368 
369 #define DYNA_ADDR_FWVER_MASK 0xff ///< valid data mask
370 /*! \} */
371 
372 /*!
373  * \ingroup dyna_memmap_gen
374  * \defgroup dyna_memmap_gen_id EEPROM Servo Identifier
375  *
376  * \par Mode: RW
377  *
378  * \{
379  */
380 #define DYNA_ADDR_ID 3 ///< dynamixel id (RW)
381 
382 #define DYNA_ADDR_ID_MASK 0xff ///< valid data mask
383 /*! \} */
384 
385 /*!
386  * \ingroup dyna_memmap_gen
387  * \defgroup dyna_memmap_gen_baud_rate EEPROM Baud Rate
388  *
389  * The Dynamixel servos specify the baud rate through a baud number enumeration.
390  * The extended baud number (rates) are not supported by all Dynamixel servos.
391  *
392  * \par Mode: RW
393  *
394  * \{
395  */
396 #define DYNA_ADDR_BAUD_RATE 4 ///< baud rate enumeration (RW)
397 
398 #define DYNA_ADDR_BAUD_RATE_MASK 0xff ///< valid data mask
399 
400 // raw baud number enumeration
401 #define DYNA_BAUDNUM_1000000 1 ///< 1,000,000 bps at 0.0% tolerance
402 #define DYNA_BAUDNUM_500000 3 ///< 500,000 bps at 0.0% tolerance
403 #define DYNA_BAUDNUM_400000 4 ///< 500,000 bps at 0.0% tolerance
404 #define DYNA_BAUDNUM_250000 7 ///< 250,000 bps at 0.0% tolerance
405 #define DYNA_BAUDNUM_200000 9 ///< 200,000 bps at 0.0% tolerance
406 #define DYNA_BAUDNUM_115200 16 ///< 115,200 bps at -2.124% tolerance
407 #define DYNA_BAUDNUM_57600 34 ///< 57,600 bps at 0.794 % tolerance
408 #define DYNA_BAUDNUM_19200 103 ///< 19,200 bps at -0.160% tolerance
409 #define DYNA_BAUDNUM_9600 207 ///< 9,600 bps at -0.160% tolerance
410 
411 // extended baud rate numbers
412 #define DYNA_BAUDNUM_EXT_2250000 250 ///< 2,250,000 bps at 0.0% tolerance
413 #define DYNA_BAUDNUM_EXT_2500000 251 ///< 2,500,000 bps at 0.0% tolerance
414 #define DYNA_BAUDNUM_EXT_3000000 252 ///< 3,000,000 bps at 0.0% tolerance
415 
416 #define DYNA_BAUDNUM_NUMOF 12 ///< number of supported bit rates
417 
418 #define DYNA_BAUDNUM_DFT 34 ///< default baud number
419 #define DYNA_BAUDRATE_DFT 57600 ///< default baud rate
420 
421 /*! \} */
422 
423 /*!
424  * \ingroup dyna_memmap_gen
425  * \defgroup dyna_memmap_gen_t_ret_delay EEPROM Return Delay Time
426  *
427  * The delay time between the transmission of Instruction Packet until the
428  * return of the Status Packet.
429  *
430  * \par Mode: RW
431  *
432  * \{
433  */
434 #define DYNA_ADDR_T_RET_DELAY 5 ///< return delay time (RW)
435 
436 #define DYNA_ADDR_T_RET_DELAY_MASK 0xff ///< valid data mask
437 
438 #define DYNA_T_RET_DELAY_MIN_RAW 0x00 ///< raw minimum delay
439 #define DYNA_T_RET_DELAY_MAX_RAW 0xff ///< raw maximum delay
440 #define DYNA_T_RET_DELAY_DFT_RAW 0x00 ///< raw default
441 #define DYNA_T_RET_DELAY_RES_USEC 2 ///< 2\h_usec resolution
442 #define DYNA_T_RET_DELAY_MIN_USEC \
443  (DYNA_T_RET_DELAY_MIN_RAW * DYNA_T_RET_DELAY_RES_USEC)
444  ///< \h_usec minimum
445 #define DYNA_T_RET_DELAY_MAX_USEC \
446  (DYNA_T_RET_DELAY_MAX_RAW * DYNA_T_RET_DELAY_RES_USEC)
447  ///< \h_usec maximum
448 #define DYNA_T_RET_DELAY_DFT_USEC \
449  (DYNA_T_RET_DELAY_DFT_RAW * DYNA_T_RET_DELAY_RES_USEC)
450  ///< \h_usec default
451 /*! \} */
452 
453 /*!
454  * \ingroup dyna_memmap_gen
455  * \defgroup dyna_memmap_gen_lim_cw EEPROM Clockwise Angle Limit
456  *
457  * Minimum angle (goal position) limit.
458  *
459  * \sa \ref dyna_servo_pos for valid values.
460  *
461  * \par Mode: RW
462  * \{
463  */
464 #define DYNA_ADDR_LIM_CW_LSB 6 ///< clockwise angle limit lsb (RW)
465 #define DYNA_ADDR_LIM_CW_MSB 7 ///< clockwise angle limit msb (RW)
466 
467 #define DYNA_ADDR_LIM_CW_MASK 0x03ff ///< valid data mask
468 
469 #define DYNA_CW_POS_CONT_MODE 0 ///< continuous mode (with ccw limit)
470 /*! \} */
471 
472 /*!
473  * \ingroup dyna_memmap_gen
474  * \defgroup dyna_memmap_gen_lim_ccw EEPROM Counterclockwise Angle Limit
475  *
476  * Maximum angle (goal position) limit.
477  *
478  * \sa \ref dyna_servo_pos for valid values.
479  *
480  * \par Mode: RW
481  * \{
482  */
483 #define DYNA_ADDR_LIM_CCW_LSB 8 ///< counterclockwise angle limit lsb (RW)
484 #define DYNA_ADDR_LIM_CCW_MSB 9 ///< counterclockwise angle limit msb (RW)
485 
486 #define DYNA_ADDR_LIM_CCW_MASK 0x03ff ///< valid data mask
487 
488 #define DYNA_CCW_POS_CONT_MODE 0 ///< continuous mode (with cw limit)
489 /*! \} */
490 
491 #define DYNA_ADDR_RESERVED_1 10 ///< reserved
492 
493 /*!
494  * \ingroup dyna_memmap_gen
495  * \defgroup dyna_memmap_gen_lim_temp_max EEPROM Temperature Limit
496  *
497  * Maximum operating temperature limit.
498  *
499  * \par Mode: RW
500  *
501  * \{
502  */
503 #define DYNA_ADDR_LIM_TEMP_MAX 11 ///< maximum temperature limit (RW)
504 
505 #define DYNA_ADDR_LIM_TEMP_MASK 0x3f ///< valid data mask
506 
507 #define DYNA_LIM_TEMP_MIN_C DYNA_TEMP_MIN_C ///< minimum maximum limit
508 #define DYNA_LIM_TEMP_MAX_C DYNA_TEMP_MAX_C ///< maximum maximum limit
509 #define DYNA_LIM_TEMP_DFT_C 80 ///< 80C default maximum limit
510 #define DYNA_LIM_TEMP_RES_C DYNA_TEMP_RES_C
511  ///< 1\h_deg Celsius resolution
512 /*! \} */
513 
514 /*!
515  * \ingroup dyna_memmap_gen
516  * \defgroup dyna_memmap_gen_lim_volt_min EEPROM Minimum Voltage Limit
517  *
518  * Minimum operating voltage limit.
519  *
520  * \par Mode: RW
521  *
522  * \{
523  */
524 #define DYNA_ADDR_LIM_VOLT_MIN 12 ///< lowest voltage limit (RW)
525 
526 #define DYNA_ADDR_LIM_VOLT_MIN_MASK 0xff ///< valid data mask
527 
528 #define DYNA_LIM_VOLT_MIN_MIN_RAW DYNA_VOLT_MIN_RAW
529  ///< minimum minimum raw limit
530 #define DYNA_LIM_VOLT_MIN_MAX_RAW DYNA_VOLT_MAX_RAW
531  ///< maximum minimum raw limit
532 #define DYNA_LIM_VOLT_MIN_DFT_RAW 60 ///< default minimum raw limit
533 #define DYNA_LIM_VOLT_MIN_RES_V DYNA_VOLT_RES_V ///< 0.1V resolution
534 #define DYNA_LIM_VOLT_MIN_MIN_V \
535  (DYNA_LIM_VOLT_MIN_MIN_RAW * DYNA_LIM_VOLT_MIN_RES_V)
536  ///< min minimum volts limit
537 #define DYNA_LIM_VOLT_MIN_MAX_V \
538  (DYNA_LIM_VOLT_MIN_MAX_V * DYNA_LIM_VOLT_MIN_RES_V)
539  ///< max minimum volts limit
540 #define DYNA_LIM_VOLT_MIN_DFT_V \
541  (DYNA_LIM_VOLT_MIN_DFT_V * DYNA_LIM_VOLT_MIN_RES_V)
542  ///< default minimum volts limit
543 /*! \} */
544 
545 /*!
546  * \ingroup dyna_memmap_gen
547  * \defgroup dyna_memmap_gen_lim_volt_max EEPROM Maximum Voltage Limit
548  *
549  * Maximum operating voltage limit.
550  *
551  * \par Mode: RW
552  *
553  * \{
554  */
555 #define DYNA_ADDR_LIM_VOLT_MAX 13 ///< highest voltage limit (RW)
556 
557 #define DYNA_ADDR_LIM_VOLT_MAX_MASK 0xff ///< valid data mask
558 
559 #define DYNA_LIM_VOLT_MAX_MIN_RAW DYNA_VOLT_MIN_RAW
560  ///< minimum maximum raw limit
561 #define DYNA_LIM_VOLT_MAX_MAX_RAW DYNA_VOLT_MAX_RAW
562  ///< maximum maximum raw limit
563 #define DYNA_LIM_VOLT_MAX_DFT_RAW 190 ///< default maximum raw limit
564 #define DYNA_LIM_VOLT_MAX_RES_V DYNA_VOLT_RES_V ///< 0.1V resolution
565 #define DYNA_LIM_VOLT_MAX_MIN_V \
566  (DYNA_LIM_VOLT_MAX_MIN_RAW * DYNA_LIM_VOLT_MAX_RES_V)
567  ///< min maximum volts limit
568 #define DYNA_LIM_VOLT_MAX_MAX_V \
569  (DYNA_LIM_VOLT_MAX_MAX_V * DYNA_LIM_VOLT_MAX_RES_V)
570  ///< max maximum volts limit
571 #define DYNA_LIM_VOLT_MAX_DFT_V \
572  (DYNA_LIM_VOLT_MAX_DFT_V * DYNA_LIM_VOLT_MAX_RES_V)
573  ///< default maximum volts limit
574 /*! \} */
575 
576 /*!
577  * \ingroup dyna_memmap_gen
578  * \defgroup dyna_memmap_gen_lim_torque_max_on \
579  * EEPROM On Power-Up Maximum Torque Limit
580  *
581  * Maximum torque in units of is about 0.1%.
582  *
583  * \sa \ref dyna_servo_torque for valid values.
584  *
585  * \par Mode: RW
586  *
587  * \{
588  */
589 #define DYNA_ADDR_LIM_TORQUE_MAX_ON_LSB 14 ///< maximum torque lsb (RW)
590 #define DYNA_ADDR_LIM_TORQUE_MAX_ON_MSB 15 ///< maximum torque msb (RW)
591 
592 #define DYNA_ADDR_LIM_TORQUE_MAX_ON_MASK 0x03ff ///< valid data mask
593 
594 #define DYNA_LIM_TORQUE_MAX_ON_DFT_RAW DYNA_TORQUE_MAX_RAW
595  ///< default maximum raw torque
596 /*! \} */
597 
598 /*!
599  * \ingroup dyna_memmap_gen
600  * \defgroup dyna_memmap_gen_srl EEPROM Status Return Level
601  *
602  * \par Mode: RW
603  *
604  * \{
605  */
606 #define DYNA_ADDR_SRL 16 ///< status return level (RW)
607 
608 #define DYNA_ADDR_SRL_MASK 0xff ///< valid data mask
609 
610 #define DYNA_SRL_RET_NONE 0 ///< no return packet (except for PING)
611 #define DYNA_SRL_RET_READ 1 ///< only READ return status packet
612 #define DYNA_SRL_RET_ALL 2 ///< return status packet for all
613 #define DYNA_SRL_RET_DFT DYNA_SRL_RET_ALL
614  ///< return status packet default
615 /*! \} */
616 
617 /*!
618  * \ingroup dyna_memmap_gen
619  * \defgroup dyna_memmap_gen_alarm_led EEPROM Alarm LED
620  *
621  * LED on alarms mask.
622  *
623  * \par Mode: RW
624  *
625  * \{
626  */
627 #define DYNA_ADDR_ALARM_LED 17 ///< alarm LED (RW)
628 
629 #define DYNA_ADDR_ALARM_LED_MASK 0xff ///< valid data mask
630 
631 #define DYNA_ALARM_LED_DFT DYNA_ALARM_DFT ///< alarm LED default mask
632 /*! \} */
633 
634 /*!
635  * \ingroup dyna_memmap_gen
636  * \defgroup dyna_memmap_gen_alarm_shutdown EEPROM Alarm Shutdown
637  *
638  * \par Mode: RW
639  *
640  * \{
641  */
642 #define DYNA_ADDR_ALARM_SHUTDOWN 18 ///< alarm shutdown (RW)
643 
644 #define DYNA_ADDR_ALARM_SHUTDOWN_MASK 0xff ///< valid data mask
645 
646 #define DYNA_ALARM_NONE 0x00 ///< no alarms
647 #define DYNA_ALARM_VOLTAGE 0x01 ///< operating voltage out of range
648 #define DYNA_ALARM_ANGLE 0x02 ///< goal position limit out of range
649 #define DYNA_ALARM_TEMP 0x04 ///< operating temperature out of range
650 #define DYNA_ALARM_CMD_RANGE 0x08 ///< command out of range
651 #define DYNA_ALARM_CHECKSUM 0x10 ///< checksum error
652 #define DYNA_ALARM_LOAD 0x20 ///< operating load (torque) out of rnge
653 #define DYNA_ALARM_INSTRUCTION 0x40 ///< bad instruction
654 
655 #define DYNA_ALARM_DFT (DYNA_ALARM_LOAD | DYNA_ALARM_TEMP)
656  ///< alarm shutdown default
657 /*! \} */
658 
659 
660 // . . . . . . . . . . . . . . . . . . .
661 // RAM. All values are read/write (RW) unless otherwise noted.
662 // . . . . . . . . . . . . . . . . . . .
663 
664 /*!
665  * \ingroup dyna_memmap_gen
666  * \defgroup dyna_memmap_gen_torque_en RAM Torque Enable
667  *
668  * \par Mode: RW
669  *
670  * \{
671  */
672 #define DYNA_ADDR_TORQUE_EN 24 ///< torque enable (RW)
673 
674 #define DYNA_ADDR_TORQUE_EN_MASK 0xff ///< valid data mask
675 
676 #define DYNA_TORQUE_EN_OFF 0 ///< disable power drive to the motor
677 #define DYNA_TORQUE_EN_ON 1 ///< enable power drive to the motor
678 #define DYNA_TORQUE_EN_DFT DYNA_TORQUE_EN_OFF // default torque enable
679 /*! \} */
680 
681 /*!
682  * \ingroup dyna_memmap_gen
683  * \defgroup dyna_memmap_gen_led RAM LED On/Off
684  *
685  * \par Mode: RW
686  *
687  * \{
688  */
689 #define DYNA_ADDR_LED 25 ///< LED on/off (RW)
690 
691 #define DYNA_ADDR_LED_MASK 0xff ///< valid data mask
692 
693 #define DYNA_LED_OFF 0 ///< LED off
694 #define DYNA_LED_ON 1 ///< LED on
695 /*! \} */
696 
697 /*!
698  * \ingroup dyna_memmap_gen
699  * \defgroup dyna_memmap_gen_ctl_method RAM Position Control Method
700  *
701  * RAM addresses 26(0x1a) - 29(0x1d) are overlaid with two different position
702  * control methods. Which method used is dependent on the servo model.
703  *
704  * The compliance control method specifies a simple torque (speed) ramp down
705  * and margin to achieve the goal position. It is used by many of the existing
706  * models.
707  *
708  * The PID control method, that replaced the above method in newer servos,
709  * defines the set of constants used by the servo to achieve the goal
710  * position via a classic Proportional-Integral-Derivative controller.
711  * \{
712  */
713 /*! \} */
714 
715 /*!
716  * \ingroup dyna_memmap_gen_ctl_method
717  * \defgroup dyna_memmap_gen_compliance RAM Compliance Position Control Method
718  * \{
719  */
720 /*! \} */
721 
722 /*!
723  * \ingroup dyna_memmap_gen_compliance
724  * \defgroup dyna_memmap_gen_cw_comp_margin RAM Clockwise Compliance Margin
725  *
726  * Sets the allowed clockwise compliance margin between goal position and
727  * current position.
728  *
729  * \par Mode: RW
730  *
731  * \{
732  */
733 #define DYNA_ADDR_CW_COMP_MARGIN 26 ///< clockwise compliance margin (RW)
734 
735 #define DYNA_ADDR_CW_COMP_MASK 0xff ///< valid data mask
736 
737 #define DYNA_COMP_MARGIN_MIN_RAW 0 ///< min position difference (tightest)
738 #define DYNA_COMP_MARGIN_MAX_RAW 255 ///< max position difference (loosest)
739 #define DYNA_COMP_MARGIN_DFT_RAW 1 ///< default raw position difference
740 #define DYNA_COMP_MARGIN_RES_DEG DYNA_POS_RES_DEG
741  ///< margin resolution
742 #define DYNA_COMP_MARGIN_MIN_DEG \
743  (DYNA_COMP_MARGIN_MIN_RAW * DYNA_COMP_MARGIN_RES_DEG)
744  ///< minimum margin in degress
745 #define DYNA_COMP_MARGIN_MAX_DEG \
746  (DYNA_COMP_MARGIN_MAX_RAW * DYNA_COMP_MARGIN_RES_DEG)
747  ///< maximum margin in degress
748 #define DYNA_COMP_MARGIN_DFT_DEG \
749  (DYNA_COMP_MARGIN_DFT_RAW * DYNA_COMP_MARGIN_RES_DEG)
750  ///< default margin in degress
751 /*! \} */
752 
753 /*!
754  * \ingroup dyna_memmap_gen_compliance
755  * \defgroup dyna_memmap_gen_ccw_comp_margin \
756  * RAM Counterclockwise Compliance Margin
757  *
758  * Sets the allowed counterclockwise compliance margin between goal position and
759  * current position.
760  *
761  * \sa \ref dyna_memmap_gen_cw_comp_margin for valid values.
762  *
763  * \par Mode: RW
764  * \{
765  */
766 #define DYNA_ADDR_CCW_COMP_MARGIN 27 ///< counterclockwise compliance margin
767 
768 #define DYNA_ADDR_CCW_COMP_MASK 0xff ///< valid data mask
769 /*! \} */
770 
771 /*!
772  * \ingroup dyna_memmap_gen_compliance
773  * \defgroup dyna_memmap_gen_cw_comp_slope RAM Clockwise Compliance Slope
774  *
775  * Sets the level of clockwise torque near the goal position. Higher values
776  * have more variance for stopping at goal postition.
777  *
778  * \par Mode: RW
779  * \{
780  */
781 #define DYNA_ADDR_CW_COMP_SLOPE 28 ///< clockwise compliance slope
782 
783 #define DYNA_ADDR_CW_COMP_SLOPE_MASK 0xff ///< valid data mask
784 
785 #define DYNA_COMP_SLOPE_TORQUE_1 0x02 ///< compliance torque level 1
786 #define DYNA_COMP_SLOPE_TORQUE_2 0x04 ///< compliance torque level 2
787 #define DYNA_COMP_SLOPE_TORQUE_3 0x08 ///< compliance torque level 3
788 #define DYNA_COMP_SLOPE_TORQUE_4 0x10 ///< compliance torque level 4
789 #define DYNA_COMP_SLOPE_TORQUE_5 0x20 ///< compliance torque level 5
790 #define DYNA_COMP_SLOPE_TORQUE_6 0x40 ///< compliance torque level 6
791 #define DYNA_COMP_SLOPE_TORQUE_7 0x80 ///< compliance torque level 7
792 
793 #define DYNA_COMP_SLOPE_TORQUE_DFT DYNA_COMP_SLOPE_TORQUE_5
794  ///< default compliance torque level
795 /*! \} */
796 
797 /*!
798  * \ingroup dyna_memmap_gen_compliance
799  * \defgroup dyna_memmap_gen_ccw_comp_slope \
800  * RAM Counterclockwise Compliance Slope
801  *
802  * Sets the level of counterclockwise torque near the goal position. Higher
803  * values have more variance for stopping at goal postition.
804  *
805  * \sa \ref dyna_memmap_gen_cw_comp_slope for valid values.
806  *
807  * \par Mode: RW
808  * \{
809  */
810 #define DYNA_ADDR_CCW_COMP_SLOPE 29 ///< counterclockwise compliance slope
811 
812 #define DYNA_ADDR_CCW_COMP_SLOPE_MASK 0xff ///< valid data mask
813 /*! \} */
814 
815 /*!
816  * \ingroup dyna_memmap_gen_ctl_method
817  * \defgroup dyna_memmap_gen_pid RAM PID Position Control Method
818  * \{
819  */
820 /*! \} */
821 
822 /*!
823  * \ingroup dyna_memmap_gen_pid
824  * \defgroup dyna_memmap_gen_p_gain RAM PID P Gain
825  *
826  * K<sub>p</sub> = P<sub>gain</sub> / 8
827  *
828  * PID proportional term.
829  *
830  * The new MX series Dynamixels use a PID control method.
831  *
832  * \par Mode: RW
833  * \{
834  */
835 #define DYNA_ADDR_P_GAIN 26 ///< P<sub>gain</sub> (RW)
836 
837 #define DYNA_ADDR_P_GAIN_MASK 0xff ///< valid data mask
838 
839 #define DYNA_P_GAIN_MIN_RAW 0 ///< minimum value
840 #define DYNA_P_GAIN_MAX_RAW 254 ///< maximum value
841 #define DYNA_P_GAIN_DFT 32 ///< default value
842 /*! \} */
843 
844 /*!
845  * \ingroup dyna_memmap_gen_pid
846  * \defgroup dyna_memmap_gen_i_gain RAM PID I Gain
847  *
848  * K<sub>i</sub> = I<sub>gain</sub> * 1000 / 2048
849  *
850  * PID integral term.
851  *
852  * The new MX series Dynamixels use a PID control method.
853  *
854  * \par Mode: RW
855  * \{
856  */
857 #define DYNA_ADDR_I_GAIN 27 ///< I<sub>gain</sub> (RW)
858 
859 #define DYNA_ADDR_I_GAIN_MASK 0xff ///< valid data mask
860 
861 #define DYNA_I_GAIN_MIN_RAW 0 ///< minimum value
862 #define DYNA_I_GAIN_MAX_RAW 254 ///< maximum value
863 #define DYNA_I_GAIN_DFT 0 ///< default value
864 /*! \} */
865 
866 /*!
867  * \ingroup dyna_memmap_gen_pid
868  * \defgroup dyna_memmap_gen_d_gain RAM PID D Gain
869  *
870  * K<sub>d</sub> = D<sub>gain</sub> * 4 / 1000
871  *
872  * PID derivative term.
873  *
874  * The new MX series Dynamixels use a PID control method.
875  *
876  * \par Mode: RW
877  * \{
878  */
879 #define DYNA_ADDR_D_GAIN 28 ///< D<sub>gain</sub> (RW)
880 
881 #define DYNA_ADDR_D_GAIN_MASK 0xff ///< valid data mask
882 
883 #define DYNA_D_GAIN_MIN_RAW 0 ///< minimum value
884 #define DYNA_D_GAIN_MAX_RAW 254 ///< maximum value
885 #define DYNA_D_GAIN_DFT 0 ///< default value
886 /*! \} */
887 
888 /*!
889  * \ingroup dyna_memmap_gen_pid
890  * \defgroup dyna_memmap_gen_reserved RAM Reserved
891  * \{
892  */
893 #define DYNA_ADDR_PID_RESERVED 29 ///< reserved
894 /*! \} */
895 
896 /*!
897  * \ingroup dyna_memmap_gen
898  * \defgroup dyna_memmap_gen_goal_pos RAM Goal Position
899  *
900  * Move to new goal position. The servo will move at the current goal speed
901  * under the current torque limit. These fields are ignored in continuous mode.
902  *
903  * \sa \ref dyna_servo_pos for valid values.
904  *
905  * \par Mode: RW
906  *
907  * \{
908  */
909 #define DYNA_ADDR_GOAL_POS_LSB 30 ///< goal position lsb (RW)
910 #define DYNA_ADDR_GOAL_POS_MSB 31 ///< goal position msb (RW)
911 
912 #define DYNA_ADDR_GOAL_POS_MASK 0x03ff ///< valid data mask
913 /*! \} */
914 
915 /*!
916  * \ingroup dyna_memmap_gen
917  * \defgroup dyna_memmap_gen_goal_speed RAM Goal Speed and Direction
918  *
919  * In servo mode, move to new goal position at the given speed. In continuous
920  * mode
921  * under the current torque limit. These field are ignored in continuous mode.
922  *
923  * \par Servo Mode Fields:
924  * \termblock
925  * \term speed \termdata 10-bit raw speed. \endterm
926  * \endtermblock
927 
928  * \par Continuous Mode Fields:
929  * \termblock
930  * \term speed \termdata 10-bit raw speed. \endterm
931  * \term dir \termdata clockwise or countclockwise direction \endterm
932  * \endtermblock
933  *
934  * \sa \ref dyna_servo_speed and \ref dyna_servo_dir for valid values.
935 
936  * \par Mode: RW
937  *
938  * \{
939  */
940 #define DYNA_ADDR_GOAL_SPEED_LSB 32 ///< goal speed lsb (RW)
941 #define DYNA_ADDR_GOAL_SPEED_MSB 33 ///< goal speed msb (RW)
942 
943 #define DYNA_ADDR_GOAL_SPEED_MASK 0x07ff ///< valid data mask
944 
945 #define DYNA_GOAL_SPEED_MAG_MASK 0x03ff ///< speed magnitude field mask
946 #define DYNA_GOAL_SPEED_MAG_SHIFT 0 ///< speed magnitude field shift
947 
948 #define DYNA_GOAL_SPEED_DIR_MASK 0x0400 ///< speed direction field mask
949 #define DYNA_GOAL_SPEED_DIR_SHIFT 10 ///< speed direction field shift
950 #define DYNA_GOAL_SPEED_DIR_CCW 0x00 ///< counterclockwise direction
951 #define DYNA_GOAL_SPEED_DIR_CW (0x01 << DYNA_CUR_SPEED_DIR_SHIFT)
952  ///< clockwise direction
953 /*! \} */
954 
955 /*!
956  * \ingroup dyna_memmap_gen
957  * \defgroup dyna_memmap_gen_lim_torque_max RAM Maximum Torque Limit
958  *
959  * \sa \ref dyna_servo_torque for valid values.
960  *
961  * \par Mode: RW
962  *
963  * \{
964  */
965 #define DYNA_ADDR_LIM_TORQUE_MAX_LSB 34 ///< current torque limit lsb (RW)
966 #define DYNA_ADDR_LIM_TORQUE_MAX_MSB 35 ///< current torque limit msb (RW)
967 
968 #define DYNA_ADDR_LIM_TORQUE_MAX_MASK 0x03ff ///< valid data mask
969 
970 #define DYNA_LIM_TORQUE_MAX_ALARMED 0 ///< torque value on alarm shutdown
971 /*! \} */
972 
973 /*!
974  * \ingroup dyna_memmap_gen
975  * \defgroup dyna_memmap_gen_cur_pos RAM Current Position
976  *
977  * Current servo position. These fields are invalid in continuous mode.
978  *
979  * \sa \ref dyna_servo_pos for valid values.
980  *
981  * \par Mode: R
982  *
983  * \{
984  */
985 #define DYNA_ADDR_CUR_POS_LSB 36 ///< current position lsb (R)
986 #define DYNA_ADDR_CUR_POS_MSB 37 ///< current position msb (R)
987 
988 #define DYNA_ADDR_CUR_POS_MASK 0x03ff ///< valid data mask
989 /*! \} */
990 
991 /*!
992  * \ingroup dyna_memmap_gen
993  * \defgroup dyna_memmap_gen_cur_speed RAM Current Speed and Direction
994  *
995  * Get the current servo speed and direction.
996  *
997  * \par Fields:
998  * \termblock
999  * \term speed \termdata 10-bit raw speed. \endterm
1000  * \term dir \termdata clockwise or countclockwise direction \endterm
1001  * \endtermblock
1002  *
1003  * \sa \ref dyna_servo_pos and \ref dyna_servo_dir for valid values.
1004 
1005  * \par Mode: R
1006  *
1007  * \{
1008  */
1009 #define DYNA_ADDR_CUR_SPEED_LSB 38 ///< current speed lsb (R)
1010 #define DYNA_ADDR_CUR_SPEED_MSB 39 ///< current speed msb (R)
1011 
1012 #define DYNA_ADDR_CUR_SPEED_MASK 0x07ff ///< valid data mask
1013 
1014 #define DYNA_CUR_SPEED_MAG_MASK 0x03ff ///< speed magnitude field mask
1015 #define DYNA_CUR_SPEED_MAG_SHIFT 0 ///< speed magnitude field shift
1016 
1017 #define DYNA_CUR_SPEED_DIR_MASK 0x0400 ///< speed direction field mask
1018 #define DYNA_CUR_SPEED_DIR_SHIFT 10 ///< speed direction field shift
1019 #define DYNA_CUR_SPEED_DIR_CCW 0x00 ///< counterclockwise direction
1020 #define DYNA_CUR_SPEED_DIR_CW (0x01 << DYNA_CUR_SPEED_DIR_SHIFT)
1021  ///< clockwise direction
1022 /*! \} */
1023 
1024 /*!
1025  * \ingroup dyna_memmap_gen
1026  * \defgroup dyna_memmap_gen_cur_load RAM Current Load
1027  *
1028  * \par Mode: R
1029  *
1030  * \{
1031  */
1032 #define DYNA_ADDR_CUR_LOAD_LSB 40 ///< current load lsb (R)
1033 #define DYNA_ADDR_CUR_LOAD_MSB 41 ///< current load msb (R)
1034 
1035 #define DYNA_ADDR_CUR_LOAD_MASK 0x07ff ///< valid data mask
1036 
1037 #define DYNA_CUR_LOAD_MAG_MASK 0x03ff ///< load magnitude field mask
1038 #define DYNA_CUR_LOAD_MAG_SHIFT 0 ///< load magnitude field shift
1039 #define DYNA_CUR_LOAD_MAG_MIN 0 ///< minimum load
1040 #define DYNA_CUR_LOAD_MAG_MAX 1023 ///< maximum load
1041 
1042 #define DYNA_CUR_LOAD_DIR_MASK 0x0400 ///< load direction field mask
1043 #define DYNA_CUR_LOAD_DIR_SHIFT 10 ///< load direction field shift
1044 #define DYNA_CUR_LOAD_DIR_CCW 0x00 ///< counterclockwise direction
1045 #define DYNA_CUR_LOAD_DIR_CW (0x01 << DYNA_CUR_LOAD_DIR_SHIFT)
1046  ///< clockwise direction
1047 #define DYNA_CUR_LOAD_RES_PCT (100.0/DYNA_CUR_LOAD_MAG_MAX)
1048  ///< percent of maximum resolution
1049 #define DYNA_CUR_LOAD_RES_PMIL (1000.0/DYNA_CUR_LOAD_MAG_MAX)
1050  ///< permil of maximum resolution
1051 /*! \} */
1052 
1053 /*!
1054  * \ingroup dyna_memmap_gen
1055  * \defgroup dyna_memmap_gen_cur_volt RAM Current Voltage
1056  *
1057  * \par Mode: R
1058  *
1059  * \{
1060  */
1061 #define DYNA_ADDR_CUR_VOLT 42 ///< current voltage (R)
1062 
1063 #define DYNA_ADDR_CUR_VOLT_MASK 0xff ///< valid data mask
1064 
1065 #define DYNA_CUR_VOLT_RES_V DYNA_VOLT_RES_V ///< 0.1V precesion
1066 /*! \} */
1067 
1068 /*!
1069  * \ingroup dyna_memmap_gen
1070  * \defgroup dyna_memmap_gen_cur_temp RAM Current Temperature
1071  *
1072  * \par Mode: R
1073  *
1074  * \{
1075  */
1076 #define DYNA_ADDR_CUR_TEMP_C 43 ///< current temperature C (R)
1077 
1078 #define DYNA_ADDR_CUR_TEMP_MASK 0xff ///< valid data mask
1079 
1080 #define DYNA_CUR_TEMP_RES_C DYNA_TEMP_RES_C
1081  ///< 1\h_deg Celsius resolution
1082 /*! \} */
1083 
1084 /*!
1085  * \ingroup dyna_memmap_gen
1086  * \defgroup dyna_memmap_gen_reg_instr RAM Register Instruction
1087  *
1088  * \par Mode: RW
1089  *
1090  * \{
1091  */
1092 #define DYNA_ADDR_REG_INSTR 44 ///< registered instruction (RW)
1093 
1094 #define DYNA_ADDR_REG_INSTR_MASK 0xff ///< valid data mask
1095 
1096 #define DYBA_REG_INSTR_NO_WRITE 0 ///< no (pending?) REG_WRITE commands
1097 #define DYBA_REG_INSTR_HAS_WRITE 1 ///< has (pending?) REG_WRITE commands
1098 /*! \} */
1099 
1100 #define DYNA_ADDR_RESERVED_2 45 ///< reserved
1101 
1102 /*!
1103  * \ingroup dyna_memmap_gen
1104  * \defgroup dyna_memmap_gen_is_moving RAM Servo Is Moving
1105  *
1106  * \par Mode: R
1107  *
1108  * \{
1109  */
1110 #define DYNA_ADDR_IS_MOVING 46 ///< is [not] moving (to goal position)
1111 
1112 #define DYNA_ADDR_IS_MOVING_MASK 0xff ///< valid data mask
1113 
1114 #define DYNA_IS_NOT_MOVING 0 ///< not moving
1115 #define DYNA_IS_MOVING 1 ///< is moving
1116 /*! \} */
1117 
1118 /*!
1119  * \ingroup dyna_memmap_gen
1120  * \defgroup dyna_memmap_gen_lock RAM Lock EEPROM
1121  *
1122  * Requires a power reset to force the bit from 1 back to 0.
1123  *
1124  * \par Mode: RW
1125  *
1126  * \{
1127  */
1128 #define DYNA_ADDR_EEPROM_LOCK 47 ///< lock the EEPROM (RW)
1129 
1130 #define DYNA_ADDR_EEPROM_LOCK_MASK 0xff ///< valid data mask
1131 
1132 #define DYNA_EEPROM_UNLOCKED 0 ///< eeprom is unlocked
1133 #define DYNA_EEPROM_LOCKED 1 ///< eeprom is locked
1134 #define DYNA_EEPROM_LOCK_DFT 0 ///< eeprom lock default
1135 /*! \} */
1136 
1137 /*!
1138  * \ingroup dyna_memmap_gen
1139  * \defgroup dyna_memmap_gen_punch RAM Punch
1140  *
1141  * Not used.
1142  *
1143  * \par Mode: RW
1144  *
1145  * \{
1146  */
1147 #define DYNA_ADDR_PUNCH_LSB 48 ///< punch lsb (not used)
1148 #define DYNA_ADDR_PUNCH_MSB 49 ///< punch msb (not used)
1149 /*! \} */
1150 
1151 
1152 #ifndef SWIG
1153 C_DECLS_END
1154 #endif // SWIG
1155 
1156 
1157 #endif // _DYNAMIXEL_H