HerkulexBus class
The HerkulexBus class manages communication with Herkulex servos over a UART
bus. In addition, it provides methods that affect all servos on the bus, such as
performing IJog and SJog commands.
HerkulexBus::HerkulexBus()
HerkulexBus::HerkulexServoBus(Stream &serial_connection);
The constructor takes exactly one argument: a Stream-like instance that
represents the UART port to communicate over. For example, this can be a
hardware serial port (e.g. Serial, Serial1, Serial2, Serial3) or an
instance of the SoftwareSerial class.
| Param | Description |
|---|---|
serial_connection |
Reference to a serial port to communicate over |
HerkulexBus::sendPacket()
void HerkulexBus::sendPacket(uint8_t id, HerkulexCommand cmd, const uint8_t* data = nullptr, uint8_t data_len = 0);
Sends a single data packet to the bus.
| Param | Description |
|---|---|
id |
The ID of the target servo |
cmd |
Which command to send, e.g. HerkulexCommand::Stat |
data |
(optional) Pointer to a byte array that holds extra packet data |
data_len |
(optional) Number of extra data bytes to transfer |
HerkulexBus::sendPacketAndReadResponse()
bool HerkulexBus::sendPacketAndReadResponse(HerkulexPacket &resp, uint8_t id, HerkulexCommand cmd, const uint8_t* data = nullptr, uint8_t data_len = 0);
Sends a data packet and attempts to read a response. The method will continue to
send out packets until it is successful or until it reaches
HERKULEX_PACKET_RETRIES attempts.
| Param | Description |
|---|---|
resp |
Reference to a HerkulexPacket variable where the response will be put |
id |
The ID of the target servo |
cmd |
Which command to send, e.g. HerkulexCommand::Stat |
data |
(optional) Pointer to a byte array that holds extra packet data |
data_len |
(optional) Number of extra data bytes to transfer |
| return | True if successful, false if the method times out |
HerkulexBus::update()
void HerkulexBus::update();
This method should be called as frequently as possible in your main loop. The method checks for incoming serial data and attempts to decode the packets.
HerkulexBus::getPacket()
bool HerkulexBus::getPacket(HerkulexPacket &packet);
This method attempts to get a HerkulexPacket from the bus and put it in the
packet variable. Returns true if successful. If no packets are available, the
packet variable remains unchanged and the method returns false.
| Param | Description |
|---|---|
packet |
Reference to a HerkulexPacket variable where the incoming packet will be put |
| return | True if successful, false if no packets are available |
HerkulexBus::resetRxStatistics()
void HerkulexBus::resetRxStatistics();
Resets the internal variables that keep track of data transfer statistics, i.e. number of successful packets, failed packets, retry attempts.
Note: This method is only available when the HERKULEX_DEBUG preprocessor
flag is enabled.
HerkulexBus::printRxStatistics()
void HerkulexBus::printRxStatistics(Stream &output);
Prints out a packet transfer statistics report, i.e. number of successful packets, failed packets, retry attempts.
Note: This method is only available when the HERKULEX_DEBUG preprocessor
flag is enabled.
| Param | Description |
|---|---|
| output | Stream to print the statistics debug message to, e.g. Serial |
HerkulexBus::prepareIndividualMove()
void HerkulexBus::prepareIndividualMove();
Prepares the bus for sending an IJog data packet. This is a single packet that
contains the goal positions and playtimes of multiple servos. All subsequent
calls to HerkulexServo::setPosition() and HerkulexServo::setSpeed will be
stored in buffer until executeMove() is called. There is a limit to the number
of moves that can be scheduled, defined by the value of
HERKULEX_MAX_SCHEDULED_SERVOS.
HerkulexBus::prepareSynchronizedMove()
void HerkulexBus::prepareSynchronizedMove(uint8_t playtime);
Prepares the bus for sending an HerkulexCommand::SJog data packet. This packet
is similar to the HerkulexCommand::IJog packet, but only a one playtime value
is specified for all servos affected by the command. All subsequent calls to
HerkulexServo::setPosition() and HerkulexServo::setSpeed will be stored in
buffer until executeMove() is called. There is a limit to the number of moves
that can be scheduled, defined by the value of HERKULEX_MAX_SCHEDULED_SERVOS.
| Param | Description |
|---|---|
| playtime | Duration of the move, multiply by 11.2 to calculate the duration in milliseconds. |
HerkulexBus::executeMove()
void HerkulexBus::executeMove();
Sends out the moves scheduled by prepareIndividualMove() or
prepareSynchronizedMove(). The class keeps track of which method was called,
and will either send out a HerkulexCommand::IJog or a HerkulexCommand::SJog
data packet.