The Main board serves a core purpose in the Eros Architecture.

It performs isolation of the internal actuators and performs all voltage, signal and protocol conversion between the internal and external bus.

The modular firmware is designed in a way that enables that completely isolates each section in a class (internal actuators and external bus) which communicate with each other using an abstract interface. This way, EROS is able to support any combination of internal and external protocols and versions.

The functions of the main board are:

  • Real time current measurement on all motors, differential position management and control on the series elastic joints (if installed)
  • Voltage regulation converting the external voltage to the voltage needed by the internal actuators
  • Signal level conversion between the external bus the the internal actuators
  • Communication speed conversion, protocol conversion (if appropriate) and communication optimization between the external bus and the internal actuators bus.
  • Control of additional peripherals such as the cooling fan, status LED, etc.

For this reason the Control table for the Main board is specifically tailored for it and does not really resemble any Dynamixel motor.


The EROS firmware is designed to power all our models. Some functions detailed below may not be available in specific models such as, for example, a fan or differential position sensors that exist in the RH7D but aren't present in the RH4D.

In line with our goal of one single architecture, the control table will either report 0 for these entries or accept the requests without an error.
The goal is to enable the creation of universal libraries that can be used across all our models.

There are specific memory positions where you can query the presence of features such as Capacitive Touch sensors, Bluetooth module, etc. to clearly understand which features are present for a given unit.

All memory positions are typically readable.

READing from a memory position will return the state of that variable at the time of processing the READ request.
Here are a few examples of READING the control table:

  • If you have set Torque Enable (position 24) to Off (0), you can query the Present Position (memory position 36) while you move the joint with your hand. You will see the values being updated in real time. This technique can be used to capture key frames for example.
  • If you have set a Target Position (memory position 30), you can read memory positions 36 (Present position), 38 (Present speed) and 46 (Moving) to check if the trajectory is being followed. This is especially useful for detecting the arrival at the target or detecting anomalies such as stalling, normally due to external physical blockage

WRITing to a memory position will usually either configure a parameter or trigger an action.

As an example:

  • To make the servo move to a specific position, WRITE your target to the memory position 30 (Target Position). If Torque is not enabled, it will be automatically enabled and servo will seek the Target position.
  • If you wish to control the moving speed, you may WRITE to the memory position 32 (Target Speed) prior to setting your target position.

For more information on how to READ and WRITE to the control table see the protocol documentation: you can do it using the Dynamixel Protocol or the STP Protocol.

The control table entries are either of WORD type (2 bytes) or BYTE type (1 byte) depending on the range of values they handle.

A BYTE value is written directly to the memory position.

A WORD value however is written in Little Endian style, that is, you must break the WORD in two BYTEs. The Low order byte is Stored first, to the memory address shown in the control table, followed by the high byte at the next memory position:

In pseudo code, it would be:

# PSEUDO CODE. Writing a WORD value 
word OUT_VALUE = 2048
w = new write_command(OUT_VALUE & 0xFF, (OUT_VALUE >> 8) & 0xFF)

It is important to note that WORD values should be written in one single WRITE command.
Splitting the WRITE of a WORD value in two individual commands, and sending them separately as individual Bytes, is unsupported and will yield incorrect results: the first command with the LOW byte is discarded; the next command with the HIGH byte is processed and assumes a low byte of 0 since the low byte was not included in the second command.
Therefore writing WORD values should be done in one single command that will include both the LOW and HIGH bytes simultaneously.

For more information on how to WRITE to the control table see the protocol documentation: you can do it using the Dynamixel Protocol or the STP Protocol.

Address Description Size (nr of bytes) Access Mode (R/W) Location
0 (0x0) Model Number 2 R EEPROM
2 (0x2) Version of Firmware 1 R EEPROM
3 (0x3) ID 1 RW EEPROM
4 (0x4) Baud Rate 1 RW EEPROM
5 (0x5) Return Delay Time 1 RW -
16 (0x10) Status Return Level 1 RW EEPROM
20 (0x14) 12bit ADC Mode Enabled 1 RW EEPROM
23 (0x17) Fan speed setting 1 RW RAM
42 (0x2A) Present Voltage 1 R RAM
43 (0x2B) Present Temperature 1 R RAM
44 (0x2C) Registered Instruction 1 R RAM
60 (0x3C) Main Board Model Nr 2 R -
62 (0x3E) Main Board HW Configuration 2 R -
64 (0x40) Main Board SN (1) 1 R -
65 (0x41) Main Board SN (2) 1 R -
66 (0x42) Main Board SN (3) 1 R -
67 (0x43) Internal PSU RESET 1 RW -
68 (0x44) Hand LED RGB [LOW] 1 RW RAM
69 (0x45) Hand LED RGB [HIGH] 1 RW RAM
71 (0x47) UART1 (Ext. Bus) Use Transmit Enable Pin 1 R RAM
72 (0x48) UART1 (Ext.Bus) Selected Protocol 1 R RAM
74 (0x4A) UART1 Buffer Overflow Count 1 R RAM
76 (0x4C) UART2 (Internal Bus) Baud Rate 1 R RAM
77 (0x4D) UART2 (Internal Bus) Selected Protocol 1 R RAM
79 (0x4F) UART2 Buffer Overflow Count 1 R RAM
81 (0x51) UART3 Baud Rate 1 R RAM
82 (0x52) UART3 Selected Protocol 1 R RAM
84 (0x54) UART3 Buffer Overflow Count 1 R RAM
86 (0x56) USB Interface Selected Protocol 1 R RAM
88 (0x58) BT module installed 1 R -
89 (0x59) BT module enabled 1 RW RAM
90 (0x5A) BT Pairing Code 2 RW RAM
93 (0x5D) Palm IR Sensor installed 1 R -
94 (0x5E) Palm IR Sensor 2 R RAM
97 (0x61) Capacitive Sensors installed 1 R -
98 (0x62) Capacitive Sensor 1 Reading 2 R RAM
100 (0x64) Capacitive Sensor 2 Reading 2 R RAM
103 (0x67) External Position Sensor (Wrist Adduction) Reading 2 R RAM
105 (0x69) External Position Sensor (Wrist Flexion) Reading 2 R RAM
108 (0x6C) Port 1 Current Reading 2 R RAM
110 (0x6E) Port 2 Current Reading 2 R RAM
112 (0x70) Port 3 Current Reading 2 R RAM
114 (0x72) Port 4 Current Reading 2 R RAM
116 (0x74) Port 5 Current Reading 2 R RAM
118 (0x76) Port 6 Current Reading 2 R RAM
120 (0x78) Port 7 Current Reading 2 R RAM
122 (0x7A) Port 8 Current Reading 2 R RAM
124 (0x7C) Port 9 Current Reading 2 R RAM
126 (0x7E) Port 10 Current Reading 2 R RAM
128 (0x80) Re-scan Attached Servo IDs 1 R RAM
129 (0x81) Port 1 Attached Servo ID 1 R RAM
130 (0x82) Port 2 Attached Servo ID 1 R RAM
131 (0x83) Port 3 Attached Servo ID 1 R RAM
132 (0x84) Port 4 Attached Servo ID 1 R RAM
133 (0x85) Port 5 Attached Servo ID 1 R RAM
134 (0x86) Port 6 Attached Servo ID 1 R RAM
135 (0x87) Port 7 Attached Servo ID 1 R RAM
136 (0x88) Port 8 Attached Servo ID 1 R RAM
137 (0x89) Port 9 Attached Servo ID 1 R RAM
138 (0x8A) Port 10 Attached Servo ID 1 R RAM
174 (0xAE) RW Shared Memory Byte 0 1 RW RAM
176 (0xB0) RW Shared Memory Byte 1 1 RW RAM
178 (0xB2) RW Shared Memory Byte 2 1 RW RAM
180 (0xB4) RW Shared Memory Byte 3 1 RW RAM
182 (0xB6) RW Shared Memory Byte 4 1 RW RAM
184 (0xB8) RW Shared Memory Byte 5 1 RW RAM

The “Size” column indicates if the value is a single Byte (1) or a Word (2 byte value).

A single byte value is written directly to its memory position.

A WORD value is written as two bytes: The lowest value of the memory position is where you should write the LOW byte followed by the HIGH byte.

EXAMPLE: Writing the Bluetooth Pairing code 1234

The Pairing code is a two byte value, that begins at position 90 (0x5A):

The value 1234 is represented in HEX as 4D2, which can be broken down into two bytes:
Low Byte = D2
High Byte = 4

As mentioned, we should write the Low Byte first followed by the High byte. So in Pseudo code we would do:
WRITE BYTE TO POSITION 90 (0x5A), VALUE D2 (the low byte first)
WRITE BYTE TO POSITION 91 (0x5B), VALUE 4 (the high byte next)

or, if we wish to write in one single sequence:

WRITE BYTE, START POSITION 0x5A, VALUES: D2 (low byte) 4 (high byte)

The access mode indicates whether the position is Read Only (R) or Read/Write(RW)

Attempting to write to a Read Only position will return a Range Error.

Location defines where the value for that memory position is stored.

Values in EEPROM persist after a power cycle and will be present on next boot.
Values in RAM will only persist until the unit is powered off. Upon power up they will go back to default. Values marked as - refer to functionalities or features that pertain to the hardware or factory settings. These are always read only.

Model Number

Indicates the model number for this Logical device.
This is not actually the Model Number for the hardware itself; it is instead a model number indicating the type of Logical device, which indicates the Architecture and type of device.

An EROS main board has a model number of 405.

Version of Firmware

Version number of the firmware installed on the board.


Device bus ID.

This ID uniquely identifies the main board on the bus and should be used to send commands to the board when using bot the Dynamixel Protocol and the Seed Robotics STP Protocol.

Baud Rate

This the Baud Rate setting.

This means that this number must be converted to the actual Baud setting.

The conversion formula is:
Baudrate(BPS) = 2000000 / (Baud Setting + 1)

Common Baud Rate settings are:
(you can use any value in-between, which will be calculated according to the formula above)
1: Formula Result = 1000000.0bps; Target BPS = 1000000.0. (Error is   0.000 %)
3: Formula Result = 500000.0bps; Target BPS = 500000.0. (Error is   0.000 %)
4: Formula Result = 400000.0bps; Target BPS = 400000.0. (Error is   0.000 %)
7: Formula Result = 250000.0bps; Target BPS = 250000.0. (Error is   0.000 %)
9: Formula Result = 200000.0bps; Target BPS = 200000.0. (Error is   0.000 %)
16: Formula Result = 117647.1bps; Target BPS = 115200.0. (Error is  -2.124 %)
34: Formula Result = 57142.9bps; Target BPS = 57600.0. (Error is   0.794 %)
103: Formula Result = 19230.8bps; Target BPS = 19200.0. (Error is  -0.160 %)
207: Formula Result = 9615.4bps; Target BPS = 9600.0. (Error is  -0.160 %)

In addition, special Baud Settings enable the configuration of baud rates higher than 2Mbps: 250 = 2250000 bps
251 = 2500000 bps
252 = 3000000 bps

As general rule, UART operation can tolerate an error up to 3%.
However, small differences in the clock of the devices may amplify this error. If you use a setting that is close to the 3% error and experience communication issues, we recommend trying the settings immediately above or bellow.

By default, EROS boards are configured to operate at 1Mbps.

Return Delay Time

This setting is deprecated is the EROS architecture.

Historically, this setting was designed to introduce a virtual delay between receiving a command and initiating the reply and was meant to assist with master devices that needed some time to switch state in the half duplex bus (switch from TX back to RX).

In the EROS firmware this setting is always set at 0 (reply as fast as possible).

To maintain compatibility with Dynamixel devices and existing libraries, EROS maintains this memory position but writing to it, will yeld no effect; the setting always remains at 0, meaning reply as fast as possible.

Status Return Level

This setting selects which commands should return a reply and has the following meaning:

0 = Never return a reply (except for PING).
Please note that setting this to 0, will mean the READ command will no longer work as no reply will be sent.
1 = Return a reply for READ and PING (not for WRITE)
2 = Always return a reply. This the DEFAULT setting

12bit ADC Mode Enabled

This setting selects the ADC resolution for all the sensors exposed in the Control table.

The Main board will always, natively query the sensors at 12bits.
However if, for any reason, the user wishes to operate at 10bit, the board will right shift the lower two bits and report the values in a 10bit range.

This setting is, once again, made available, mostly for compatibility with older Dynamixel devices and older or specialized libraries.

0 = 12bit mode disabled. Resolution is set to 10bit.
1 = 12bit mode enabled. Resolution is set to 12bit.

By default this is set to 1, meaning resolution is set to 12 bit.

IMPORTANT: this setting affects the values for the Main Board only and not the Actuators. If you wish to set the actuators to 10bit or 12bit resolution mode, you will need to do it the each of the actuators' control table.
This is a change from the ARES firmware, where changing this setting in the main board would propagate it to the actuators. It is no longer the case in the EROS firmware.

Fan speed setting

Adjusts the FAN speed multiplier.
The hands automatically adjust the FAN speed based on the internal average temperature. The temperature is usually proportional to load and thus a balance between acoustic comfort and thermal performance should be achieved.

The FAN multipler lets the user further tweak the fan speed setting to its needs.

By default the FAN multiplier is set to 2 (FW versions < 45) or set to 3 (fw versions >=45).

  • Lowering the Multiplier will reduce the fan speed. This may be suitable for environments where minimum fan noise is desirable
  • Setting it to 0 will effectively disable the FAN ,which is NOT recommended.
  • Setting it to a higher level will increase the multipler. A value of 5 or above typically sets the FAN to its maximum speed, regardless of the internal temperature.

(please note that not all models support adjustable fan speed; at the time of writing only the 7D and 8D do).

Present Voltage

Reading of the input voltage applied to the main connector. This reading is in units 0.1V.

If you are powering the unit via USB only, without any external power, this reading will always be 0.
Also note that, if no external power is applied, the internal actuators will not be powered and therefore will not respond.

Note: Version 3 hardware boards (typically used in the RH4D) do not have the Voltage measurement capability. Starting with firmware version 28, this memory position will return 1 or 0 depending on whether external power is applied or not (earlier versions always return 0). This behaviour is by design on this version of the boards. You can find your board version by checking memory position 60 (0x3C)

Present Temperature

The temperature in Degrees Celsius measured by the NTC sensor on the main board.
This temperature represents the ambient temperature inside the unit.

Registered Instruction

This memory position relates to the REG_WRITE and ACTION commands of the Dynamixel protocol.

Seed Robotics' technical analysis indicates these commands are better performed using the more modern SYNC_WRITE.

For this reason, the EROS firmware does not support them but fully supports SYNC_WRITE, which provides the same functionality in a more efficient manner.

This memory position is being maintained for compatibility reasons. Regardless of issuing a REG_WRITE to the unit, this position will always report 0, to inform that no REG_WRITE command has been recorded.

Main Board Model Nr

This is the Seed Robotics hardware model number of the main board.

Main Board HW Configuration

A bitmask indicating which functions are installed on the board.

Main Board SN (1)
Main Board SN (2)
Main Board SN (3)

The serial number of the main board. The serial number should be reported in HEX and is composed in this manner [SN1][SN2][SN3]

Internal PSU RESET

Writing a 1 to this memory position will reset the Internal PSU that powers the Actuators.
This will result in power cycling all of the Internal Actuators.

It is a convenient way to restart the internal servos without having the power cycle your entire robot.

This feature is especially useful to reset the Actuators when an OVERLOAD error or other anomaly occurs.
It can also be used to power cycle them after changing a setting that requires a reboot.

IMPORTANT: unless the main board is connected via USB, the Processor on the main board will also be powered by the Internal PSU. Therefore issuing a PSU restart may cause the processor to reboot as well. This will be visible on the LEDs on the hand showing the initialization sequence, and is a normal behavior.
Nevertheless the boot process is fairly fast and the unit should be responsive again within approximately 5 seconds.


This is in reality a WORD (2 bytes) that can be written at once.
Each color is indicated as 4 bits. The full RGB setting is composed of 3 sets of 4 bits.

The High Byte controls the Red, and Low Byte controls the Green and Blue.

They can be written as one WORD as follows:
High Byte: [Bits 7~4: Not used; ignored][Bits 3~0: Red]
Low byte [Bits 7~4: Green][Bits 3~0: Blue]

UART1 (Ext. Bus) Use Transmit Enable Pin

Indicates of the Transmit Enable pin is being used for communication. The TE pin is required when you unit comes configured from the factory to operate in Half Duplex mode (in either TTL or RS485).

This setting is read only in the Control Table to prevent any inadvertent misconfiguration but can be changed using the Console Commands.

UART1 (Ext.Bus) Selected Protocol

Selected protocol for the External bus. (By default is set to Dynamixel 1.0)

UART1 Buffer Overflow Count

UART 1 error statistics to assist in diagnosing communication errors.

If the Buffer Overflow count consistently grows, it means the unit is not being able to keep up with information that's passing on the bus and is losing packets.
In this case, we recommend that you lower your frame rate, by either reducing the bus speed or introducing a small delay between commands (start at tenths of microseconds and grow from there).

UART2 (Internal Bus) Baud Rate

Baud rate for the Internal Bus (the Actuators bus). The meaning of this setting is the same as the “Baud Rate BPS”.

This setting is read only in the Control Table to prevent any inadvertent misconfiguration but can be changed using the Console Commands.

IMPORTANT: all communication between the Seed Robotics hand and any external peripheral is performed at the speed set in position 4 (Baud Rate), regardless of what is set here.
This is because the EROS board will perform any necessary speed conversion.

This setting is only reported here, because all internal actuators must match this setting in order to be able to communicate with the main board.

UART2 (Internal Bus) Selected Protocol

Selected protocol for the Internal bus.
This is set to match the type of internal actuators installed and has no relation to the Protocol used to communicate with external peripherals (set at memory position 72 (0x48) ).
The main board will perform any necessary protocol conversion between the external and the internal bus.

UART2 Buffer Overflow Count

UART 2 error statistics to assist in diagnosing communication errors.

UART3 Baud Rate

UART 3 is the UART connected to the Bluetooth module, if installed. This is et to match the Baud Rate configuration of the Bluetooth module.

The setting is read only in the control table to prevent any inadvertent misconfiguration. However, it can be changed through the console commands.

UART3 Selected Protocol

Selected protocol for the Bluetooth Interface (by default, the Console, including the Seed Robotics STP Protocol)

UART3 Buffer Overflow Count

UART 3 error statistics to assist in diagnosing communication errors.

USB Interface Selected Protocol

Selected protocol for the USB Interface (by default, the Console, including the Seed Robotics STP Protocol)

BT module installed

Indicates whether a Bluetooth module is installed (1) or not (0)

BT module enabled

Indicates the power status of the Bluetooth module (1=On; 0=Off).

You can also write to this position to turn the module On or Off.

At power up, the module is turned On.
When operating the unit on battery power and, if you don't need the Bluetooth functionality, you can turn the module off to save a few mA, although the module has relatively low power usage in standby mode.

We recommend keeping the module On as it will let you connect to the unit and run online diagnostics in case of need.

BT Pairing Code

The Pairing Code for the Bluetooth module.

The code is always a 4 digit code when connecting to the unit; Therefore, if the code is < 1000, it is padded by leading zeros.

Palm IR Sensor installed

Indicates if the Palm IR sensor is installed (1) or not (0)

Palm IR Sensor

Pam IR sensor reading.

The firmware attempts to subtract ambient IR light to give you a cleaner reading.
However under direct sunlight or near sources where high amount of IR are emitted, the resolution of this reading can be reduced.

Capacitive Sensors installed

Indicates if the Capacitive Sensors are installed (1) or not (0)

Capacitive Sensor 1 Reading Capacitive Sensor 2 Reading

These memory positions hold the readings for each of the sensors.

The sensors are installed on the back of the hand one over the left side and one over the right side.

The firmware makes an early calibration of the sensors “zero” upon boot. A baseline reading of a few hundreds will always show on the control table for each sensor. We recommend that you query this baseline reading, after power up, when you begin operation with the unit.

Any value that is at least 40%~50% above the this baseline reading, can be considered a “touch”.

Also note that, due to the fact that the sensors are embedded in the shell, they will have slight differences which means their baseline readings will always be different from each other.
This is normal and the expected behaviour. Please follow the advice above for taking baseline readings and establishing a “touch/no touch” threshold.

External Position Sensor (Wrist Adduction) Reading External Position Sensor (Wrist Flexion) Reading

If your unit is equipped with Series Elastic joints (which is the case with the RH7D) these positions will give the reading of the external position sensor (after the spring)

The reading of the internal position sensor (before the spring), can be read directly from the actuator that moves the joint.

Due to the nature of the mechanism, we recommend that you periodically take your readings at the edges and use them as references for calibration.
A separate document is available to detail how to calibrate and use the series elastic joints.

Port 1 Current Reading
Port 2 Current Reading
Port 3 Current Reading
Port 4 Current Reading
Port 5 Current Reading
Port 6 Current Reading
Port 7 Current Reading
Port 8 Current Reading
Port 9 Current Reading
Port 10 Current Reading

Real time current readings for the actuators connected to each port.

This reading is reported is milliamps.


Comparison with Current Reading in Dynamixel Devices
Dynamixel devices report current in a dimensionless value that needs converting to mA; in the EROS firmware the current is reported directly in mA in these memory positions.

Comparison with ARES architecture:
ARES also used a dimensionless value that needed converting; in EROS, once again, this value is reported directly in mA without the need for any conversion.

Port number vs Servo IDs
The current readings in these memory positions correspond to the servo that is physically attached to that connector on the board (all connectors are numbered on the board)

There isn't necessarily a direct relation between the Actuators ID and the Port Number: you can change the Actuator ID but the port number remains the same as it is remains physically connected to the same port.

To ease this process and to make operation more intuitive we ship each Servo ID/Joint attached to a specific port:

Wirst Rotation: ID 31/41, Port number 1
Wirst Adduction: ID 32/42, Port number 2
Wirst Flexion: ID 33/43, Port number 3
Thumb Adduction: ID 34/44, Port number 4
Thumb Flexion: ID 35/45, Port number 5
Index Flexion: ID 36/46, Port number 6
Middle fingers Flexion: ID 37/47, Port number 7

RH4D (models with EROS Architecture)
Wrist Rotation: ID 23/24, Port Number 1
Wrist Flexion: ID 25/26, Port Number 2
Thumb Flexion: ID 27/28, Port Number 3
Middle finger Flexion: ID 29/30, Port Number 4

Port 1 Attached Servo ID
Port 2 Attached Servo ID
Port 3 Attached Servo ID
Port 4 Attached Servo ID
Port 5 Attached Servo ID
Port 6 Attached Servo ID
Port 7 Attached Servo ID
Port 8 Attached Servo ID
Port 9 Attached Servo ID
Port 10 Attached Servo ID

These memory positions map the Servo ID to each physical port. It is the user's responsibility to ensure accuracy of this mapping for proper operation.

Upon boot, the firmware will auto-enumerate the Internal Actuators and assign them in sequence to these memory positions.
For example, if you have actuator numbers 41 to 47, the firmware will map ID 41 to Port 1, 42 to Port 2 and so on…

This technique will correctly identify and map all actuators as long as they have their Default IDs or as long as you maintain the IDs numbered in the same sequence (Wrist Rotation with the lowest ID and so on).
In these cases, the algorithm that runs upon boot should correctly map the Actuator IDs to Port numbers.

If your setup does not follow this order, then you should manually set the appropriate IDs for each port, after boot.

The importance of having this set correctly is mostly related to current overload protection: the board must know which ID is on each port, in order to shut down the actuator in the event of an anomaly and ensure continuous safe operation for all other actuators.
If the mapping is wrong and the board is unable to shutdown a misbehaving actuator, it will take the next safest approach which would be turning off the internal voltage regulator, shutting down all actuators.

RW Shared Memory Byte 0
RW Shared Memory Byte 1
RW Shared Memory Byte 2
RW Shared Memory Byte 3
RW Shared Memory Byte 4
RW Shared Memory Byte 5

These memory positions are in place to hold information the user wishes to save.

Because the memory table can be queried by multiple interfaces at once (External Interface, USB and Bluetooth), these positions offer a synchronized common place to exchange data between these interfaces.

IMPORTANT: To respect the Dynamixel protocol principles and ensure that an FF FF sequence never appears on the bus except for a header, the bytes are not in sequential memory positions; instead there is a one byte gap between each position. For example Shared Bytre 1 is at position 174 (0xAE) and Byte 2 is 2 positions afterwards, at position 176 (0xB0)

Copyright © 2015-2023 Seed Robotics Ltd

  • eros/mainboard_ctltable.txt
  • Last modified: 2023/03/13 18:36
  • by SeedR KB Admin