From 741906aee56f194f4eb84e1bb2274b125daae0b3 Mon Sep 17 00:00:00 2001 From: Claegtun Date: Wed, 8 May 2024 15:14:59 +1000 Subject: [PATCH 01/16] Wrote the bulk of the electrical theory. --- .../03-hardware/04-dynamixel-protocol.mdx | 144 ++++++++++++ .../dynamixel_protocol/.$ttl.drawio.bkp | 123 ++++++++++ .../dynamixel_protocol/.$ttl.drawio.dtmp | 143 ++++++++++++ .../dynamixel_protocol/asymmetric.drawio | 76 +++++++ .../dynamixel_protocol/asymmetric.drawio.png | Bin 0 -> 39426 bytes .../dynamixel_protocol/differential.drawio | 211 ++++++++++++++++++ .../differential.drawio.png | Bin 0 -> 83162 bytes .../dynamixel_protocol/full_duplexity.drawio | 34 +++ .../full_duplexity.drawio.png | Bin 0 -> 15551 bytes .../dynamixel_protocol/half_duplexity.drawio | 70 ++++++ .../half_duplexity.drawio.png | Bin 0 -> 26270 bytes .../dynamixel_protocol/pure_uart.drawio | 34 +++ .../dynamixel_protocol/pure_uart.drawio.png | Bin 0 -> 17894 bytes .../images/dynamixel_protocol/rs485.drawio | 145 ++++++++++++ .../dynamixel_protocol/rs485.drawio.png | Bin 0 -> 56977 bytes .../dynamixel_protocol/simplexity.drawio | 24 ++ .../dynamixel_protocol/simplexity.drawio.png | Bin 0 -> 6648 bytes .../images/dynamixel_protocol/ttl.drawio | 143 ++++++++++++ .../images/dynamixel_protocol/ttl.drawio.png | Bin 0 -> 48428 bytes .../dynamixel_protocol/uart_frame.drawio | 161 +++++++++++++ .../dynamixel_protocol/uart_frame.drawio.png | Bin 0 -> 40644 bytes 21 files changed, 1308 insertions(+) create mode 100644 src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio.png create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio create mode 100644 src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio.png diff --git a/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx b/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx new file mode 100644 index 000000000..ff0d9c142 --- /dev/null +++ b/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx @@ -0,0 +1,144 @@ +--- +section: Guides +chapter: Hardware +title: Dynamixel Protocol +description: Learn about the systems of the Dynamixel protocol +slug: /guides/hardware/dynamixel-protocol +authors: + - Clayton Carlon (@Claegtun) +--- + +## Introduction + +Dynamixel is the name that Robotis gives to its [system](https://www.robotis.us/dynamixel/) of off-the-shelf servos that have integrated control. These are such that the servos are controlled by commands over a digital interface. There are broadly three protocols for such an interface, namely ModbusRTU, Dynamixel v1, and Dynamixel v2. We will only look into the last of the three which will be simply called the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. + +The goal of this guide is to give an overview of the Dynamixel communication. It is not meant to be an exhaustive list of what is already on the Robotis [manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) but to give further insight into things left out of said manual, mostly the low-level electrical side, as well as any idiosyncracities. Said manual should be read after the reader has read this guide. + +The target-audience is somewhat broad and can be anywhere between +- a team-member who is experienced with the Dynamixel system but wants to cross-reference something, +- a new electrical, computer, or mechatronics engineering student who has had some experience with some of these concepts such as UART in ELEC2720 but may want to refresh some of the basics and needs to learn some new things such as RS485 and the Dynamixel protocol, +- and a computer-science student who has some experience with telecommunications such as Ethernet but may have no experience at all with UART and RS485. + + + +Assumed knowledge is a basic understanding of electrical concepts like voltage and maybe some HSC physics such as magnetic fields as well as a basic intuition for electronic devices in daily life. + + + +## Universal Asynchronous Receiver-Transmitter + +A universal asynchronous receiver-transmitter (UART) is an electrical device that sends data at an agreed upon bitrate or baudrate. Unlike SPI and I2C where there is one extra signal for the clock, often just called the serial clock, both devices on either end have to know the common baudrate beforehand. Thus, it is common to have to set a baudrate at the very beginning externally either by rewriting firmware or configuring a peripheral. + + + +There is also a universal synchronous and asynchronous receiver-transmitter (USART) which is a device that can handle both synchronous and asynchronous communication. Many microcontrollers would have both USARTs and UARTs, the former of which can more of less be used as the latter. However, we will only talk about the asynchronous side in which a UART henceforth can easily be applied for a USART as well. + + + +A UART has two pins, an input called RX, and an output called TX. + +![Two abstract UARTs](./images/dynamixel_protocol/pure_uart.drawio.png 'Two abstract UARTs have their RX-pins and TX-pins connected each way.') + +The term UART can also refer to the way how data is framed. If one will, it can almost be informally thought of as a very low-level and very basic protocol. Here, UART can refer to the special bits that are needed to frame data, all of which need to be agreed upon between both devices on either end. + +![An 8N1 frame has one start-bit as always, eight bits of data, no parity-bit, and one stop-bit.](./images/dynamixel_protocol/uart_frame.drawio.png 'An 8N1 frame has one start-bit as always, eight bits of data, no parity-bit, and one stop-bit.') + +| Line | Logic-level | Description | Optional | +|-------------|-------------|-----------------------------------------------------------------------------|-----------| +| Idle | 1 | is where there is no data. | no | +| Start-bit | 0 | is the beginning of the data. | no | +| Data-bits | ? | are the bits of data from the least significant to the most significant. | no | +| Parity-bits | ? | tell whether there has been any corruption of the data during transmission. | yes | +| Stop-bit | 1 | is the end of the data. | yes | + +The receiver looks for the start-bit's falling edge. When it has found the edge, it begins to time and to sample each bit thereforth based on the agreed upon bitrate. Most setups are written by three symbols, e.g. 8N1 means that there are eight data-bits, no parity bits, and one stop-bit. Both Dynamixel protocols and many other serial ones are 8N1. Henceforth in this guide, this is the assumed framing. + + + +Two UARTs must agree on the baudrate, framing (e.g. 8N1), and the signal-levels in order to communicate. + + + +However, pure UART often only refers to abstract bits or logic levels, not voltages. Signalling techniques such as RS485, RS232, and TTL are what are further needed for a complete system to define the electrical behaviour as well as maybe flow-control (e.g. RS232). + +## Duplexity + +Firstly, one must understand the concept of duplexity since the half duplexity of the Dynamixel protocol is not always intuitive for beginners. There are three kinds of digital communication, namely simplex, full duplex, and half duplex. + +Simplexity is when data goes in only one direction, from Device-A to Device-B, where only the former transmits and only the latter receives. There is only one channel, and there may often be only one electrical signal. An analogy would be Alice giving instructions to Bob through a loud-speaker very far away. + +![In simplexity, data always flows in only one direction.](./images/dynamixel_protocol/simplexity.drawio.png 'In simplexity, data always flows in only one direction.') + +Full duplexity is when data can go in both directions at the same time, between Device-A and Device-B. There are two channels, one for each direction such that one could think of each channel as simplex. There is no clash when both Device-A and Device-B send data at the same time since the two channels are separate. An analogy would be Alice and Bob writing letters or texting. + +![In full duplexity, data can flow in both directions at the same time.](./images/dynamixel_protocol/full_duplexity.drawio.png 'In full duplexity, data can flow in both directions at the same time.') + +A pure UART will have two signals, RX and TX, and if it were connected to another UART such that TX->RX both ways, then this would be an example of full duplexity. + +Half duplexity is when data can go in both directions but not at the same time. There seem to be two channels but are really combined into one. An analogy would be Alice and Bob talking to each other by walkie-talkies. + +![In half duplexity, data can flow in both directions but not at the same time.](./images/dynamixel_protocol/half_duplexity.drawio.png 'In half duplexity, data can flow in both directions but not at the same time.') + + + +The Dynamixel protocol is half duplex; therefore, it is important to understand half duplexity and the needed flow-control and logic behind it. + + + +We will see soon that the reason why the protocol is half duplex is the fewer number of wires - especially for RS485 - and the fact that servos only respond to instructions. + +Often, a Dynamixel device's microcontroller has a UART to communicate on the bus. This UART as said before has two pins, RX and TX. Therefore, in theory, it could be used for full duplexity. However, RX and TX get switched between by a transceiver which is often another chip on the board. This transceiver as the name suggests can switch between receiving and transmitting on the same bus-line. Therefore, this transceiver has another input pin to set the direction, sometimes called the TX-enable, the direction, etc. + +## Transistor-Transistor-Logic + +Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. + + + +Some Dynamixel servos use TTL, seen by their three-pinned headers. Such servos are still used on the Darwins in NUbots. Therefore, TTL is included in this guide. + + + +![A TTL transceiver switches the bus-line between directions based on the TX-enable.](./images/dynamixel_protocol/ttl.drawio.png 'A TTL transceiver switches the bus-line between directions based on the TX-enable.') + +The [NC7WZ241](https://www.onsemi.com/pdf/datasheet/nc7wz241-d.pdf) chip is an example of a TTL transceiver that is used on the [OpenCR](https://emanual.robotis.com/docs/en/parts/controller/opencr10/). + +## RS485 + +### Transceiver + +RS485 is an electrical standard that defines the signal-levels for many serial devices; it does not define a protocol but is instead used for many protocols. Unlike TTL, this has two wires for the data, here called positive and negative, but sometimes under different names such as either plus and minus or A and B. These two wires make up a differential signal. + +![An RS485 transceiver has both a difference-amplifier and a differential driver and switches between the two based on TX-enable.](./images/dynamixel_protocol/rs485.drawio.png 'An RS485 transceiver has both a difference-amplifier and a differential driver and switches between the two based on TX-enable.') + +The [THVD1550](https://www.ti.com/lit/ds/symlink/thvd1551.pdf?ts=1714816845862&ref_url=https%253A%252F%252Fwww.google.com%252F) chip is an example of an RS485 transceiver that is used on NUSense. + +### Differential Signal + +In order to appreciate the power of such a differential signal, one must understand the challenges of noise and interference. For very long cables, the wires often behave like antennae and can thus pick up nearby interference from other electrical devices, especially from servos which tend to emit switching noise. As such, a big enough interference can flip a bit and lead to an error. + +However, RS485 and other such techniques have an answer for this. Given a message $m(t)$, the transmitter sends a positive copy $p(t) = m(t)$ and a negative copy $n(t) = -m(t)$ together as a pair. As long as the two physical wires are close together, any interference $w(t)$ is both added where the received positive signal is $p'(t) = m(t) + w(t)$, and the received negative signal is $n'(t) = -m(t) + w(t)$. The receiver then subtracts the two, often with a difference amplifier, such that the interference is cancelled out, and the received message is $m'(t) = p'(t) - n'(t) = m(t) + w(t) - ( -m(t) + w(t) ) = 2 m(t)$. + +![A differential signal has a positive signal and a negative signal such that when they are subtracted, any common-mode interference is cancelled out.](./images/dynamixel_protocol/differential.drawio.png 'A differential signal has a positive signal and a negative signal such that when they are subtracted, any common-mode interference is cancelled out.') + +Indeed, this is a simple example as there is some more complexity in the way how the RS485 transceiver drives the signals, but this should give you the broad idea of how it works and to understand its advantage. Furthermore, this kind of interference is known as common-mode noise. As an aside, a differential pair cannot handle differential mode noise, which is however less common in our case. The reader can learn more about the two [here](https://www.allaboutcircuits.com/industry-white-papers/emc-basics-common-mode-vs-differential-noise/). + + + +It is important to understand the fact that there are two signals that make up a differential pair when probing the bus with either an oscilloscope or a digital-signal analyser such as a Saleae. Often in such times, only one probed signal - ideally positive - is enough to see the data. + + + + + +RS485 was historically used for communicating to automated machines on very long factory-floors with a lot of electromagnetic noise from machinery. Therefore, RS485 can deal with very long lengths up to a kilometre depending on the bandwidth. Therefore, one may think that RS485 is overkill for such a small robot, but one should remember that servos can make a lot of electromagnetic noise because of their nature. + + + +### Twisted Pair + +The robustness to interference is better when the two wires are twisted. This method is very common not only for RS485 but throughout telecommunications. When a pair of wires is untwisted, the area between the wires, although very small and thin, may make up a big enough loop that can pick up magnetic fields going through it. Since interference is mostly picked up as electromagnetic waves, half of which are made up of a magnetic field, then any loop of wire can pick up interference. However, if the pair is twisted, then the big loop is now split up into smaller loops which are alternating in polarity such that the current induced across one small loop is cancelled out by that across the next small loop. Even if there are an odd number of loops, the last unpaired loop is much smaller than the big loop that was before for the untwisted pair. Furthermore, a twisted pair is easier to manage and keeps the two wires close at all times. + +### Terminating Resistors + +Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. A signal is a travelling wave like one on a rope. As such, if one end of the bus is not terminated properly, reflections can come back and interfere with the signal. RS485 can only have two terminating resistors, best at either end of a bus. RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). \ No newline at end of file diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp b/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp new file mode 100644 index 000000000..2fd53a7e3 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp b/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp new file mode 100644 index 000000000..c023e6bfc --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio new file mode 100644 index 000000000..cf5d94c2e --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..3eba7c6c63acf55f74496aae406d2506eb958ed8 GIT binary patch literal 39426 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∋zjfS3PNrAPV*t= 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..487cd13f0612e6558911aed8e666853a0b8c5661 GIT binary patch literal 83162 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

Qr0?wlCYk>2=$sgK-ig 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 E0Kq=YH~;_u literal 0 HcmV?d00001 diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio new file mode 100644 index 000000000..095a8c044 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..95c079796236ea411fa72699ab86dc5edd5eb047 GIT binary patch literal 15551 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 literal 0 HcmV?d00001 diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio new file mode 100644 index 000000000..f55477168 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..fb23673e475b9735aad3b0d0db7656e430b6f141 GIT binary patch literal 26270 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 Gy#E)9ac5-! literal 0 HcmV?d00001 diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio new file mode 100644 index 000000000..4c6c67657 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..0a489b4e44dea9c89d7637fd61230f638a2d2680 GIT binary patch literal 17894 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 qK|K%C0#HQ*n&kZGywtChlRqy7(elH+jz literal 0 HcmV?d00001 diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio new file mode 100644 index 000000000..76ca67668 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..687a601ce2c89b52c6dbd2679306459143690af7 GIT binary patch literal 56977 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 F{|_$hB&`4d literal 0 HcmV?d00001 diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio new file mode 100644 index 000000000..5eb1337c3 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..360ad8fb957dbcc74ea41a8ed202a0a93df5f752 GIT binary patch literal 6648 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 NaC7o-EVd6#`x}O?heZGY literal 0 HcmV?d00001 diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio new file mode 100644 index 000000000..0658fba17 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..e55199eb068a7792ce69dbde436b37f443656fed GIT binary patch literal 48428 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 literal 0 HcmV?d00001 diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio b/src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio new file mode 100644 index 000000000..f24ea0b82 --- /dev/null +++ b/src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio.png b/src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..0e980c5f045319f0e145785e0c0cf214d470ab3f GIT binary patch literal 40644 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'w-HEn`)mP>o0QflgX{fy)2L7gX~xRSadl> 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 literal 0 HcmV?d00001 From 916303c44a6c05d7ffa87ca6dbbdfefa98a95385 Mon Sep 17 00:00:00 2001 From: Claegtun Date: Wed, 8 May 2024 15:39:03 +1000 Subject: [PATCH 02/16] Fixed formatting. --- .../03-hardware/04-dynamixel-protocol.mdx | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx b/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx index ff0d9c142..2826549e4 100644 --- a/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx +++ b/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx @@ -14,8 +14,9 @@ Dynamixel is the name that Robotis gives to its [system](https://www.robotis.us/ The goal of this guide is to give an overview of the Dynamixel communication. It is not meant to be an exhaustive list of what is already on the Robotis [manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) but to give further insight into things left out of said manual, mostly the low-level electrical side, as well as any idiosyncracities. Said manual should be read after the reader has read this guide. -The target-audience is somewhat broad and can be anywhere between -- a team-member who is experienced with the Dynamixel system but wants to cross-reference something, +The target-audience is somewhat broad and can be anywhere between + +- a team-member who is experienced with the Dynamixel system but wants to cross-reference something, - a new electrical, computer, or mechatronics engineering student who has had some experience with some of these concepts such as UART in ELEC2720 but may want to refresh some of the basics and needs to learn some new things such as RS485 and the Dynamixel protocol, - and a computer-science student who has some experience with telecommunications such as Ethernet but may have no experience at all with UART and RS485. @@ -27,7 +28,7 @@ Assumed knowledge is a basic understanding of electrical concepts like voltage a ## Universal Asynchronous Receiver-Transmitter -A universal asynchronous receiver-transmitter (UART) is an electrical device that sends data at an agreed upon bitrate or baudrate. Unlike SPI and I2C where there is one extra signal for the clock, often just called the serial clock, both devices on either end have to know the common baudrate beforehand. Thus, it is common to have to set a baudrate at the very beginning externally either by rewriting firmware or configuring a peripheral. +A universal asynchronous receiver-transmitter (UART) is an electrical device that sends data at an agreed upon bitrate or baudrate. Unlike SPI and I2C where there is one extra signal for the clock, often just called the serial clock, both devices on either end have to know the common baudrate beforehand. Thus, it is common to have to set a baudrate at the very beginning externally either by rewriting firmware or configuring a peripheral. @@ -43,13 +44,13 @@ The term UART can also refer to the way how data is framed. If one will, it can ![An 8N1 frame has one start-bit as always, eight bits of data, no parity-bit, and one stop-bit.](./images/dynamixel_protocol/uart_frame.drawio.png 'An 8N1 frame has one start-bit as always, eight bits of data, no parity-bit, and one stop-bit.') -| Line | Logic-level | Description | Optional | -|-------------|-------------|-----------------------------------------------------------------------------|-----------| -| Idle | 1 | is where there is no data. | no | -| Start-bit | 0 | is the beginning of the data. | no | -| Data-bits | ? | are the bits of data from the least significant to the most significant. | no | -| Parity-bits | ? | tell whether there has been any corruption of the data during transmission. | yes | -| Stop-bit | 1 | is the end of the data. | yes | +| Line | Logic-level | Description | Optional | +| ----------- | ----------- | --------------------------------------------------------------------------- | -------- | +| Idle | 1 | is where there is no data. | no | +| Start-bit | 0 | is the beginning of the data. | no | +| Data-bits | ? | are the bits of data from the least significant to the most significant. | no | +| Parity-bits | ? | tell whether there has been any corruption of the data during transmission. | yes | +| Stop-bit | 1 | is the end of the data. | yes | The receiver looks for the start-bit's falling edge. When it has found the edge, it begins to time and to sample each bit thereforth based on the agreed upon bitrate. Most setups are written by three symbols, e.g. 8N1 means that there are eight data-bits, no parity bits, and one stop-bit. Both Dynamixel protocols and many other serial ones are 8N1. Henceforth in this guide, this is the assumed framing. @@ -91,7 +92,7 @@ Often, a Dynamixel device's microcontroller has a UART to communicate on the bus ## Transistor-Transistor-Logic -Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. +Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. @@ -115,9 +116,9 @@ The [THVD1550](https://www.ti.com/lit/ds/symlink/thvd1551.pdf?ts=1714816845862&r ### Differential Signal -In order to appreciate the power of such a differential signal, one must understand the challenges of noise and interference. For very long cables, the wires often behave like antennae and can thus pick up nearby interference from other electrical devices, especially from servos which tend to emit switching noise. As such, a big enough interference can flip a bit and lead to an error. +In order to appreciate the power of such a differential signal, one must understand the challenges of noise and interference. For very long cables, the wires often behave like antennae and can thus pick up nearby interference from other electrical devices, especially from servos which tend to emit switching noise. As such, a big enough interference can flip a bit and lead to an error. -However, RS485 and other such techniques have an answer for this. Given a message $m(t)$, the transmitter sends a positive copy $p(t) = m(t)$ and a negative copy $n(t) = -m(t)$ together as a pair. As long as the two physical wires are close together, any interference $w(t)$ is both added where the received positive signal is $p'(t) = m(t) + w(t)$, and the received negative signal is $n'(t) = -m(t) + w(t)$. The receiver then subtracts the two, often with a difference amplifier, such that the interference is cancelled out, and the received message is $m'(t) = p'(t) - n'(t) = m(t) + w(t) - ( -m(t) + w(t) ) = 2 m(t)$. +However, RS485 and other such techniques have an answer for this. Given a message $m(t)$, the transmitter sends a positive copy $p(t) = m(t)$ and a negative copy $n(t) = -m(t)$ together as a pair. As long as the two physical wires are close together, any interference $w(t)$ is both added where the received positive signal is $p'(t) = m(t) + w(t)$, and the received negative signal is $n'(t) = -m(t) + w(t)$. The receiver then subtracts the two, often with a difference amplifier, such that the interference is cancelled out, and the received message is $m'(t) = p'(t) - n'(t) = m(t) + w(t) - ( -m(t) + w(t) ) = 2 m(t)$. ![A differential signal has a positive signal and a negative signal such that when they are subtracted, any common-mode interference is cancelled out.](./images/dynamixel_protocol/differential.drawio.png 'A differential signal has a positive signal and a negative signal such that when they are subtracted, any common-mode interference is cancelled out.') @@ -137,8 +138,8 @@ RS485 was historically used for communicating to automated machines on very long ### Twisted Pair -The robustness to interference is better when the two wires are twisted. This method is very common not only for RS485 but throughout telecommunications. When a pair of wires is untwisted, the area between the wires, although very small and thin, may make up a big enough loop that can pick up magnetic fields going through it. Since interference is mostly picked up as electromagnetic waves, half of which are made up of a magnetic field, then any loop of wire can pick up interference. However, if the pair is twisted, then the big loop is now split up into smaller loops which are alternating in polarity such that the current induced across one small loop is cancelled out by that across the next small loop. Even if there are an odd number of loops, the last unpaired loop is much smaller than the big loop that was before for the untwisted pair. Furthermore, a twisted pair is easier to manage and keeps the two wires close at all times. +The robustness to interference is better when the two wires are twisted. This method is very common not only for RS485 but throughout telecommunications. When a pair of wires is untwisted, the area between the wires, although very small and thin, may make up a big enough loop that can pick up magnetic fields going through it. Since interference is mostly picked up as electromagnetic waves, half of which are made up of a magnetic field, then any loop of wire can pick up interference. However, if the pair is twisted, then the big loop is now split up into smaller loops which are alternating in polarity such that the current induced across one small loop is cancelled out by that across the next small loop. Even if there are an odd number of loops, the last unpaired loop is much smaller than the big loop that was before for the untwisted pair. Furthermore, a twisted pair is easier to manage and keeps the two wires close at all times. ### Terminating Resistors -Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. A signal is a travelling wave like one on a rope. As such, if one end of the bus is not terminated properly, reflections can come back and interfere with the signal. RS485 can only have two terminating resistors, best at either end of a bus. RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). \ No newline at end of file +Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. A signal is a travelling wave like one on a rope. As such, if one end of the bus is not terminated properly, reflections can come back and interfere with the signal. RS485 can only have two terminating resistors, best at either end of a bus. RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). From 645baaced5305d01f49f1968a49b2c518b6db68d Mon Sep 17 00:00:00 2001 From: Claegtun Date: Sat, 11 May 2024 09:39:51 +1000 Subject: [PATCH 03/16] Moved to be under system; reorganised a few other things. --- .../04-hardware}/04-dynamixel-protocol.mdx | 32 ++++++++---------- .../dynamixel_protocol/.$ttl.drawio.bkp | 0 .../dynamixel_protocol/.$ttl.drawio.dtmp | 0 .../dynamixel_protocol/asymmetric.drawio | 0 .../dynamixel_protocol/asymmetric.drawio.png | Bin .../dynamixel_protocol/differential.drawio | 0 .../differential.drawio.png | Bin .../dynamixel_protocol/full_duplexity.drawio | 0 .../full_duplexity.drawio.png | Bin .../dynamixel_protocol/half_duplexity.drawio | 0 .../half_duplexity.drawio.png | Bin .../dynamixel_protocol/pure_uart.drawio | 0 .../dynamixel_protocol/pure_uart.drawio.png | Bin .../images/dynamixel_protocol/rs485.drawio | 0 .../dynamixel_protocol/rs485.drawio.png | Bin .../dynamixel_protocol/simplexity.drawio | 0 .../dynamixel_protocol/simplexity.drawio.png | Bin .../images/dynamixel_protocol/ttl.drawio | 0 .../images/dynamixel_protocol/ttl.drawio.png | Bin .../dynamixel_protocol/uart_frame.drawio | 0 .../dynamixel_protocol/uart_frame.drawio.png | Bin .../images/{ => overview}/nugus.png | Bin .../{ => overview}/servo-tranzorb-1.png | Bin .../{ => overview}/servo-tranzorb-2.png | Bin 24 files changed, 15 insertions(+), 17 deletions(-) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/04-dynamixel-protocol.mdx (84%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/.$ttl.drawio.bkp (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/.$ttl.drawio.dtmp (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/asymmetric.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/asymmetric.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/differential.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/differential.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/full_duplexity.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/full_duplexity.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/half_duplexity.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/half_duplexity.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/pure_uart.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/pure_uart.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/rs485.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/rs485.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/simplexity.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/simplexity.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/ttl.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/ttl.drawio.png (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/uart_frame.drawio (100%) rename src/book/{03-guides/03-hardware => 02-system/04-hardware}/images/dynamixel_protocol/uart_frame.drawio.png (100%) rename src/book/02-system/04-hardware/images/{ => overview}/nugus.png (100%) rename src/book/02-system/04-hardware/images/{ => overview}/servo-tranzorb-1.png (100%) rename src/book/02-system/04-hardware/images/{ => overview}/servo-tranzorb-2.png (100%) diff --git a/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx similarity index 84% rename from src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx rename to src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index 2826549e4..dc4d9f185 100644 --- a/src/book/03-guides/03-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -1,16 +1,16 @@ --- -section: Guides +section: System chapter: Hardware title: Dynamixel Protocol description: Learn about the systems of the Dynamixel protocol -slug: /guides/hardware/dynamixel-protocol +slug: /system/hardware/dynamixel-protocol authors: - Clayton Carlon (@Claegtun) --- ## Introduction -Dynamixel is the name that Robotis gives to its [system](https://www.robotis.us/dynamixel/) of off-the-shelf servos that have integrated control. These are such that the servos are controlled by commands over a digital interface. There are broadly three protocols for such an interface, namely ModbusRTU, Dynamixel v1, and Dynamixel v2. We will only look into the last of the three which will be simply called the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. +Dynamixel is the name that Robotis gives to its [system](https://www.robotis.us/dynamixel/) off-the-shelf servos that have integrated control. These are such that the servos are controlled by commands over a digital interface. There are broadly three protocols for such an interface, namely ModbusRTU, Dynamixel v1, and Dynamixel v2. We will only look into the last of the three which will be simply called the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. The goal of this guide is to give an overview of the Dynamixel communication. It is not meant to be an exhaustive list of what is already on the Robotis [manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) but to give further insight into things left out of said manual, mostly the low-level electrical side, as well as any idiosyncracities. Said manual should be read after the reader has read this guide. @@ -90,9 +90,11 @@ We will see soon that the reason why the protocol is half duplex is the fewer nu Often, a Dynamixel device's microcontroller has a UART to communicate on the bus. This UART as said before has two pins, RX and TX. Therefore, in theory, it could be used for full duplexity. However, RX and TX get switched between by a transceiver which is often another chip on the board. This transceiver as the name suggests can switch between receiving and transmitting on the same bus-line. Therefore, this transceiver has another input pin to set the direction, sometimes called the TX-enable, the direction, etc. -## Transistor-Transistor-Logic +## Signal-levels -Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. +### Transistor-Transistor-Logic + +Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. The [NC7WZ241](https://www.onsemi.com/pdf/datasheet/nc7wz241-d.pdf) chip is an example of a TTL transceiver that is found the [OpenCR](https://emanual.robotis.com/docs/en/parts/controller/opencr10/). @@ -102,19 +104,15 @@ Some Dynamixel servos use TTL, seen by their three-pinned headers. Such servos a ![A TTL transceiver switches the bus-line between directions based on the TX-enable.](./images/dynamixel_protocol/ttl.drawio.png 'A TTL transceiver switches the bus-line between directions based on the TX-enable.') -The [NC7WZ241](https://www.onsemi.com/pdf/datasheet/nc7wz241-d.pdf) chip is an example of a TTL transceiver that is used on the [OpenCR](https://emanual.robotis.com/docs/en/parts/controller/opencr10/). - -## RS485 +### RS485 -### Transceiver +#### Transceiver -RS485 is an electrical standard that defines the signal-levels for many serial devices; it does not define a protocol but is instead used for many protocols. Unlike TTL, this has two wires for the data, here called positive and negative, but sometimes under different names such as either plus and minus or A and B. These two wires make up a differential signal. +RS485 is an electrical standard that defines the signal-levels for many serial devices; it does not define a protocol but is instead used for many protocols. Unlike TTL, this has two wires for the data, here called positive and negative, but sometimes under different names such as either plus and minus or A and B. These two wires make up a differential signal. The [THVD1550](https://www.ti.com/lit/ds/symlink/thvd1551.pdf?ts=1714816845862&ref_url=https%253A%252F%252Fwww.google.com%252F) chip is an example of an RS485 transceiver that is found on NUSense. ![An RS485 transceiver has both a difference-amplifier and a differential driver and switches between the two based on TX-enable.](./images/dynamixel_protocol/rs485.drawio.png 'An RS485 transceiver has both a difference-amplifier and a differential driver and switches between the two based on TX-enable.') -The [THVD1550](https://www.ti.com/lit/ds/symlink/thvd1551.pdf?ts=1714816845862&ref_url=https%253A%252F%252Fwww.google.com%252F) chip is an example of an RS485 transceiver that is used on NUSense. - -### Differential Signal +#### Differential Signal In order to appreciate the power of such a differential signal, one must understand the challenges of noise and interference. For very long cables, the wires often behave like antennae and can thus pick up nearby interference from other electrical devices, especially from servos which tend to emit switching noise. As such, a big enough interference can flip a bit and lead to an error. @@ -136,10 +134,10 @@ RS485 was historically used for communicating to automated machines on very long -### Twisted Pair +#### Twisted Pair -The robustness to interference is better when the two wires are twisted. This method is very common not only for RS485 but throughout telecommunications. When a pair of wires is untwisted, the area between the wires, although very small and thin, may make up a big enough loop that can pick up magnetic fields going through it. Since interference is mostly picked up as electromagnetic waves, half of which are made up of a magnetic field, then any loop of wire can pick up interference. However, if the pair is twisted, then the big loop is now split up into smaller loops which are alternating in polarity such that the current induced across one small loop is cancelled out by that across the next small loop. Even if there are an odd number of loops, the last unpaired loop is much smaller than the big loop that was before for the untwisted pair. Furthermore, a twisted pair is easier to manage and keeps the two wires close at all times. +The robustness to interference is better when the two wires are twisted. This method is very common not only for RS485 but throughout telecommunications. When a pair of wires is untwisted, the area between the wires, although very small and thin, may make up a big enough loop that can pick up magnetic fields going through it. However, if the pair is twisted, then the big loop is now split up into smaller loops which are alternating in polarity such that the current induced across one small loop is cancelled out by that across the next small loop. Furthermore, a twisted pair is easier to manage and keeps the two wires close at all times. -### Terminating Resistors +#### Terminating Resistors -Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. A signal is a travelling wave like one on a rope. As such, if one end of the bus is not terminated properly, reflections can come back and interfere with the signal. RS485 can only have two terminating resistors, best at either end of a bus. RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). +Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. RS485 can only have two terminating resistors, best at either end of a bus. However, RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). \ No newline at end of file diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp b/src/book/02-system/04-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp rename to src/book/02-system/04-hardware/images/dynamixel_protocol/.$ttl.drawio.bkp diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp b/src/book/02-system/04-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp rename to src/book/02-system/04-hardware/images/dynamixel_protocol/.$ttl.drawio.dtmp diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/asymmetric.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/asymmetric.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/asymmetric.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/asymmetric.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/asymmetric.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/differential.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/differential.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/differential.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/differential.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/differential.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/full_duplexity.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/full_duplexity.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/full_duplexity.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/full_duplexity.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/full_duplexity.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/half_duplexity.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/half_duplexity.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/half_duplexity.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/half_duplexity.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/half_duplexity.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/pure_uart.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/pure_uart.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/pure_uart.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/pure_uart.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/pure_uart.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/rs485.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/rs485.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/rs485.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/rs485.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/rs485.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/simplexity.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/simplexity.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/simplexity.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/simplexity.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/simplexity.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/ttl.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/ttl.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/ttl.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/ttl.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/ttl.drawio.png diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio b/src/book/02-system/04-hardware/images/dynamixel_protocol/uart_frame.drawio similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio rename to src/book/02-system/04-hardware/images/dynamixel_protocol/uart_frame.drawio diff --git a/src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio.png b/src/book/02-system/04-hardware/images/dynamixel_protocol/uart_frame.drawio.png similarity index 100% rename from src/book/03-guides/03-hardware/images/dynamixel_protocol/uart_frame.drawio.png rename to src/book/02-system/04-hardware/images/dynamixel_protocol/uart_frame.drawio.png diff --git a/src/book/02-system/04-hardware/images/nugus.png b/src/book/02-system/04-hardware/images/overview/nugus.png similarity index 100% rename from src/book/02-system/04-hardware/images/nugus.png rename to src/book/02-system/04-hardware/images/overview/nugus.png diff --git a/src/book/02-system/04-hardware/images/servo-tranzorb-1.png b/src/book/02-system/04-hardware/images/overview/servo-tranzorb-1.png similarity index 100% rename from src/book/02-system/04-hardware/images/servo-tranzorb-1.png rename to src/book/02-system/04-hardware/images/overview/servo-tranzorb-1.png diff --git a/src/book/02-system/04-hardware/images/servo-tranzorb-2.png b/src/book/02-system/04-hardware/images/overview/servo-tranzorb-2.png similarity index 100% rename from src/book/02-system/04-hardware/images/servo-tranzorb-2.png rename to src/book/02-system/04-hardware/images/overview/servo-tranzorb-2.png From 79b3130117860e64f59b3440216d16f783cd7812 Mon Sep 17 00:00:00 2001 From: Claegtun Date: Sun, 12 May 2024 10:13:45 +1000 Subject: [PATCH 04/16] Added more on the protocol itself. --- .../04-hardware/04-dynamixel-protocol.mdx | 247 +++++++++++++++++- 1 file changed, 246 insertions(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index dc4d9f185..c0708d395 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -140,4 +140,249 @@ The robustness to interference is better when the two wires are twisted. This me #### Terminating Resistors -Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. RS485 can only have two terminating resistors, best at either end of a bus. However, RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). \ No newline at end of file +Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. RS485 can only have two terminating resistors, best at either end of a bus. However, RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). + +## v2 Protocol + +### Asymmetry + +The Dynamixel v2 protocol is a basic serial protocol much like Modbus. The most important thing to understand is that the Dynamixel protocol is fundamentally asymmetric and works with two classes, a controller and a device, analoguous to SPI, I2C, and Modbus for example, or a server and a client. The controller only sends an instruction or a request, only to which a device responds with a status or a response. Robotis specifically use the terminology of instruction and status. Only the controller can iniate an instruction-status exchange. There can be many devices - at most 253 -, but to avoid collisions, there can only be one controller on a bus at a time. One must remember this when connecting the Dynamixel wizard externally to a robot while it is running. + +![The Dynamixel protocol has instructions only in one direction and statuses only in the other direction.](./images/dynamixel_protocol/asymmetric.drawio.png 'The Dynamixel protocol has instructions only in one direction and statuses only in the other direction.') + +### Packets + +An instruction-packet is made up such: + +| Field | Length | Bytes | Brief | +|---------------|-----------|---------------|-------------------------------------------------------------------------------| +| Header | 4 | 0x00FDFFFF | The start of the packet. | +| ID | 1 | ? | The ID of the receiving device | +| Length | 2 | ? | The length of the packet starting from the instruction, i.e. length = N + 3. | +| Instruction | 1 | ? | The kind of instruction | +| Payload | N | ? | The parameters relating to the instruction if any. | +| CRC | 2 | ? | The error-checking for the receiving device. | + +A status-packet is made up such: + +| Field | Length | Bytes | Brief | +|---------------|-----------|---------------|-------------------------------------------------------------------------------| +| Header | 4 | 0x00FDFFFF | The start of the packet. | +| ID | 1 | ? | The ID of the responding device | +| Length | 2 | ? | The length of the packet starting from the instruction, i.e. length = N + 4. | +| Instruction | 1 | 0x55 | The sign of a status. | +| Error | 1 | ? | The error if any. | +| Payload | N | ? | The returned data relating to the instruction if any. | +| CRC | 2 | ? | The error-checking for the receiving controller. | + + + +The data is in little-endian format. + + + +### Cyclic Redundancy Check + +The Cyclic Redundancy Check (CRC) is value that is appended at the end which helps tell whether there has been any corruption in the received packet. Firstly, the sender computes the CRC of the whole packet soon to be sent - excluding the CRC of course - and appends it on the end. The receiver computes its own version of the CRC of the packet that it has just received and compares it to the appended CRC. If the two CRCs are different, then there has been an error. One can learn more about how the CRC works mathematically [here](https://en.wikipedia.org/wiki/Cyclic_redundancy_check). + +There are different ways to calculate the CRC depending on the polynomial. The Dynamixel protocol uses CRC-16-IBM which has $x^{16} + x^{15} + x^{2} + 1$ as the polynomial, otherwise wrtten as 0x8005. An algorithm for the specific CRC that the Dynamixel protocol uses as well as a look-up-table can be found [here](https://emanual.robotis.com/docs/en/dxl/crc/). + +### Error + +One difference between an isntruction-packet and a status-packet is the extra error-field in the latter as well as the fixed instruction-field of 0x55. Firstly, if the most significant bit of the error-field is 1, then there has been a hardware problem; reading the hardware-error-status in the device can give more details. The rest of the bits can tell the following. + +| Value | Error | Brief | +|-------|-------------------|-------------------------------------------------------------------------------| +| 0x01 | Result Fail | Failed to process the received instruction-packet. | +| 0x02 | Instruction Error | Either an undefined instruction has been received or an action has been received without a reg-write. | +| 0x03 | CRC Error | The computed CRC does not match the received one. Likely, the instruction-packet has been corrupted or the original CRC is incorrect. | +| 0x04 | Data Range Error | Data to be written is outside the allowed range. | +| 0x05 | Data Length Error | Data to be written is shorter than the addressed field. For example, only two bytes are written to a four-byte field. | +| 0x06 | Data Limit Error | Data to be written is outside the limit that is set in the ROM. | +| 0x07 | Access Error | Attempted to write to an either read-only or an undefined address; attempted to read from an either write-only or undefined address; attempted to write to the ROM whilst the torque is enabled.| + +### Control-Table + +Before we go further, some context may be needed for the protocol and how it is used as a means to an end. The Dynamixel servos have their own integrated control with a closed-loop, feedforward gains, etc. Therefore, one controls the servo by giving a target, often the angular position of the shaft. Such data can be written to and read from a unified control-table which is a block of memory that is accessable by the Dynamixel protocol. For example, the two most common registers to access are the goal-position and the present position; the former is written as a target for the servo; the latter is read as the actual position. One can look at [the control-table for the XH540-W270](https://emanual.robotis.com/docs/en/dxl/x/xh540-w270/#control-table-of-eeprom-area) as an example. + +### Instructions + +The controller can send a variety of instructions to either write to and read from these registers as well as to control the servo as a whole. The Dynamixel v2 [manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) has a full overview of the different instructions. However here, we will only look at the most common ones that are used at NUbots. + +
    + + Ping, 0x01 + +Pings either a device with the given ID or all devices if the ID is 0xFE which is the broadcast ID. The instruction-packet has no payload; so, the length is always 3. The status-packet has a payload of three bytes, namely a half word for the model-number and a byte for the firmware-version. If the broadcast ID is set, then all devices on the bus send status-packets in order of their IDs. + +The instruction-packet: + +| Field | Length | Bytes | +|---------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x03 | +| Instruction | 1 | 0x01 | +| CRC | 2 | ? | + +The status-packet: + +| Field | Length | Bytes | +|-------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x07 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| Model-number | 2 | ? | +| Firmware-version | 1 | ? | +| CRC | 2 | ? | + +
    + +
    + + Read, 0x02 + +Reads data from the device's control-table. The instruction's payload is the starting address in the table to read from which and the length of data, both as half words. The status' payload is the requested data from the servo's control-table; therefore, the packet-length is variable. + +The instruction-packet: + +| Field | Length | Bytes | +|-------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x07 | +| Instruction | 1 | 0x02 | +| Starting Address | 2 | ? | +| Data-length | 2 | X | +| CRC | 2 | ? | + +The status-packet: + +| Field | Length | Bytes | +|-------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | X + 4 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| Payload | X | ? | +| CRC | 2 | ? | + + + +The status-packet's length is variable given how much data is requested in the original instruction. Therefore, the controller's firmware has to infer the length from how much data it had just requested. + + + +
    + +
    + + Write, 0x03 + +Writes data to the device's control-table. The instruction's payload is at first the starting address in the table to write to which as a half word. Then, the rest is the stream of data to write. The status has no payload. + +The instruction-packet: + +| Field | Length | Bytes | +|-------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | X + 5 | +| Instruction | 1 | 0x03 | +| Starting Address | 2 | ? | +| Data | X | ? | +| CRC | 2 | ? | + +The status-packet: + +| Field | Length | Bytes | +|-------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x04 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| CRC | 2 | ? | + + + +The instruction-packet's length is variable given how much data is written in the original instruction. However, unlike that for the read-instruction, the device's firmware cannot expect what the length is and can only infer it from the length-field in the packet. Therefore, when one writes firmware for a device, one must consider how to parse a write-instruction of unknown length. + + + +
    + +
    + + SyncRead, 0x82 + +Reads data from multiple devices' control-tables. The instruction's payload is at first the starting address in the table to read from which and the length of data, both as half words. Then, the rest are a list of IDs of the servos to read from which. + +In response, all devices requested send their status-packets in order of ID. Each status' payload like before with a read-instruction is the requested data from the device's control-table. + +The instruction-packet: + +| Field | Length | Bytes | +|-------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | N + 7 | +| Instruction | 1 | 0x82 | +| Starting Address | 2 | ? | +| Data-length | 2 | X | +| List of IDs | N | ? | +| CRC | 2 | ? | + +The status-packet: + +| Field | Length | Bytes | +|-------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | X + 4 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| Payload | X | ? | +| CRC | 2 | ? | + + + +Both the instruction's packet-length and the statuses' packet-lengths are variable. Not only that, but a device has to wait for other devices with lesser IDs to send their status-packets before it. Therefore, when one writes firmware for a device, one must consider the timing of other requested devices. + + + +
    + +
    + + SyncWrite, 0x83 + +Writes data to multiple devices' control-tables. The instruction's payload is at first the starting address in the table to write to which and the length of data, both as half words. Then, the rest are blocks where each block begins with an ID and the data to be written. + + + +The written devices do not send statuses, even if their status-return-levels are set to all. + + + +The instruction-packet: + +| Field | Length | Bytes | +|-----------------------|-----------|---------------| +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 7 + N(X+1) | +| Instruction | 1 | 0x83 | +| Starting Address | 2 | ? | +| Data-length | 2 | X | +| ID, first device | 1 | ? | +| Payload, first device | X | ? | +| ... | | | +| ID, N-th device | 1 | ? | +| Payload, N-th device | X | ? | +| CRC | 2 | ? | + +
    \ No newline at end of file From 877f2b4fc3e4f001338d11591f6c015891c3dd15 Mon Sep 17 00:00:00 2001 From: Claegtun Date: Sun, 12 May 2024 10:16:06 +1000 Subject: [PATCH 05/16] Fixed formatting. --- .../04-hardware/04-dynamixel-protocol.mdx | 230 +++++++++--------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index c0708d395..af13ce30a 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -154,26 +154,26 @@ The Dynamixel v2 protocol is a basic serial protocol much like Modbus. The most An instruction-packet is made up such: -| Field | Length | Bytes | Brief | -|---------------|-----------|---------------|-------------------------------------------------------------------------------| -| Header | 4 | 0x00FDFFFF | The start of the packet. | -| ID | 1 | ? | The ID of the receiving device | -| Length | 2 | ? | The length of the packet starting from the instruction, i.e. length = N + 3. | -| Instruction | 1 | ? | The kind of instruction | -| Payload | N | ? | The parameters relating to the instruction if any. | -| CRC | 2 | ? | The error-checking for the receiving device. | +| Field | Length | Bytes | Brief | +| ----------- | ------ | ---------- | ---------------------------------------------------------------------------- | +| Header | 4 | 0x00FDFFFF | The start of the packet. | +| ID | 1 | ? | The ID of the receiving device | +| Length | 2 | ? | The length of the packet starting from the instruction, i.e. length = N + 3. | +| Instruction | 1 | ? | The kind of instruction | +| Payload | N | ? | The parameters relating to the instruction if any. | +| CRC | 2 | ? | The error-checking for the receiving device. | A status-packet is made up such: -| Field | Length | Bytes | Brief | -|---------------|-----------|---------------|-------------------------------------------------------------------------------| -| Header | 4 | 0x00FDFFFF | The start of the packet. | -| ID | 1 | ? | The ID of the responding device | -| Length | 2 | ? | The length of the packet starting from the instruction, i.e. length = N + 4. | -| Instruction | 1 | 0x55 | The sign of a status. | -| Error | 1 | ? | The error if any. | -| Payload | N | ? | The returned data relating to the instruction if any. | -| CRC | 2 | ? | The error-checking for the receiving controller. | +| Field | Length | Bytes | Brief | +| ----------- | ------ | ---------- | ---------------------------------------------------------------------------- | +| Header | 4 | 0x00FDFFFF | The start of the packet. | +| ID | 1 | ? | The ID of the responding device | +| Length | 2 | ? | The length of the packet starting from the instruction, i.e. length = N + 4. | +| Instruction | 1 | 0x55 | The sign of a status. | +| Error | 1 | ? | The error if any. | +| Payload | N | ? | The returned data relating to the instruction if any. | +| CRC | 2 | ? | The error-checking for the receiving controller. | @@ -191,15 +191,15 @@ There are different ways to calculate the CRC depending on the polynomial. The D One difference between an isntruction-packet and a status-packet is the extra error-field in the latter as well as the fixed instruction-field of 0x55. Firstly, if the most significant bit of the error-field is 1, then there has been a hardware problem; reading the hardware-error-status in the device can give more details. The rest of the bits can tell the following. -| Value | Error | Brief | -|-------|-------------------|-------------------------------------------------------------------------------| -| 0x01 | Result Fail | Failed to process the received instruction-packet. | -| 0x02 | Instruction Error | Either an undefined instruction has been received or an action has been received without a reg-write. | -| 0x03 | CRC Error | The computed CRC does not match the received one. Likely, the instruction-packet has been corrupted or the original CRC is incorrect. | -| 0x04 | Data Range Error | Data to be written is outside the allowed range. | -| 0x05 | Data Length Error | Data to be written is shorter than the addressed field. For example, only two bytes are written to a four-byte field. | -| 0x06 | Data Limit Error | Data to be written is outside the limit that is set in the ROM. | -| 0x07 | Access Error | Attempted to write to an either read-only or an undefined address; attempted to read from an either write-only or undefined address; attempted to write to the ROM whilst the torque is enabled.| +| Value | Error | Brief | +| ----- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 0x01 | Result Fail | Failed to process the received instruction-packet. | +| 0x02 | Instruction Error | Either an undefined instruction has been received or an action has been received without a reg-write. | +| 0x03 | CRC Error | The computed CRC does not match the received one. Likely, the instruction-packet has been corrupted or the original CRC is incorrect. | +| 0x04 | Data Range Error | Data to be written is outside the allowed range. | +| 0x05 | Data Length Error | Data to be written is shorter than the addressed field. For example, only two bytes are written to a four-byte field. | +| 0x06 | Data Limit Error | Data to be written is outside the limit that is set in the ROM. | +| 0x07 | Access Error | Attempted to write to an either read-only or an undefined address; attempted to read from an either write-only or undefined address; attempted to write to the ROM whilst the torque is enabled. | ### Control-Table @@ -217,26 +217,26 @@ Pings either a device with the given ID or all devices if the ID is 0xFE which i The instruction-packet: -| Field | Length | Bytes | -|---------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | 0x03 | -| Instruction | 1 | 0x01 | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ----------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x03 | +| Instruction | 1 | 0x01 | +| CRC | 2 | ? | The status-packet: -| Field | Length | Bytes | -|-------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | 0x07 | -| Instruction | 1 | 0x55 | -| Error | 1 | ? | -| Model-number | 2 | ? | -| Firmware-version | 1 | ? | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ---------------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x07 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| Model-number | 2 | ? | +| Firmware-version | 1 | ? | +| CRC | 2 | ? | @@ -248,27 +248,27 @@ Reads data from the device's control-table. The instruction's payload is the sta The instruction-packet: -| Field | Length | Bytes | -|-------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | 0x07 | -| Instruction | 1 | 0x02 | -| Starting Address | 2 | ? | -| Data-length | 2 | X | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ---------------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x07 | +| Instruction | 1 | 0x02 | +| Starting Address | 2 | ? | +| Data-length | 2 | X | +| CRC | 2 | ? | The status-packet: -| Field | Length | Bytes | -|-------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | X + 4 | -| Instruction | 1 | 0x55 | -| Error | 1 | ? | -| Payload | X | ? | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ----------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | X + 4 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| Payload | X | ? | +| CRC | 2 | ? | @@ -286,26 +286,26 @@ Writes data to the device's control-table. The instruction's payload is at first The instruction-packet: -| Field | Length | Bytes | -|-------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | X + 5 | -| Instruction | 1 | 0x03 | -| Starting Address | 2 | ? | -| Data | X | ? | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ---------------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | X + 5 | +| Instruction | 1 | 0x03 | +| Starting Address | 2 | ? | +| Data | X | ? | +| CRC | 2 | ? | The status-packet: -| Field | Length | Bytes | -|-------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | 0x04 | -| Instruction | 1 | 0x55 | -| Error | 1 | ? | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ----------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 0x04 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| CRC | 2 | ? | @@ -319,34 +319,34 @@ The instruction-packet's length is variable given how much data is written in th SyncRead, 0x82 -Reads data from multiple devices' control-tables. The instruction's payload is at first the starting address in the table to read from which and the length of data, both as half words. Then, the rest are a list of IDs of the servos to read from which. +Reads data from multiple devices' control-tables. The instruction's payload is at first the starting address in the table to read from which and the length of data, both as half words. Then, the rest are a list of IDs of the servos to read from which. In response, all devices requested send their status-packets in order of ID. Each status' payload like before with a read-instruction is the requested data from the device's control-table. The instruction-packet: -| Field | Length | Bytes | -|-------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | N + 7 | -| Instruction | 1 | 0x82 | -| Starting Address | 2 | ? | -| Data-length | 2 | X | -| List of IDs | N | ? | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ---------------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | N + 7 | +| Instruction | 1 | 0x82 | +| Starting Address | 2 | ? | +| Data-length | 2 | X | +| List of IDs | N | ? | +| CRC | 2 | ? | The status-packet: -| Field | Length | Bytes | -|-------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | X + 4 | -| Instruction | 1 | 0x55 | -| Error | 1 | ? | -| Payload | X | ? | -| CRC | 2 | ? | +| Field | Length | Bytes | +| ----------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | X + 4 | +| Instruction | 1 | 0x55 | +| Error | 1 | ? | +| Payload | X | ? | +| CRC | 2 | ? | @@ -360,7 +360,7 @@ Both the instruction's packet-length and the statuses' packet-lengths are variab SyncWrite, 0x83 -Writes data to multiple devices' control-tables. The instruction's payload is at first the starting address in the table to write to which and the length of data, both as half words. Then, the rest are blocks where each block begins with an ID and the data to be written. +Writes data to multiple devices' control-tables. The instruction's payload is at first the starting address in the table to write to which and the length of data, both as half words. Then, the rest are blocks where each block begins with an ID and the data to be written. @@ -370,19 +370,19 @@ The written devices do not send statuses, even if their status-return-levels are The instruction-packet: -| Field | Length | Bytes | -|-----------------------|-----------|---------------| -| Header | 4 | 0x00FDFFFF | -| ID | 1 | ? | -| Length | 2 | 7 + N(X+1) | -| Instruction | 1 | 0x83 | -| Starting Address | 2 | ? | -| Data-length | 2 | X | -| ID, first device | 1 | ? | -| Payload, first device | X | ? | -| ... | | | -| ID, N-th device | 1 | ? | -| Payload, N-th device | X | ? | -| CRC | 2 | ? | - - \ No newline at end of file +| Field | Length | Bytes | +| --------------------- | ------ | ---------- | +| Header | 4 | 0x00FDFFFF | +| ID | 1 | ? | +| Length | 2 | 7 + N(X+1) | +| Instruction | 1 | 0x83 | +| Starting Address | 2 | ? | +| Data-length | 2 | X | +| ID, first device | 1 | ? | +| Payload, first device | X | ? | +| ... | | | +| ID, N-th device | 1 | ? | +| Payload, N-th device | X | ? | +| CRC | 2 | ? | + + From 41e51b489bc1b7fabf091904f74d9e1dabc5fafa Mon Sep 17 00:00:00 2001 From: Claegtun Date: Sun, 12 May 2024 10:19:47 +1000 Subject: [PATCH 06/16] Moved the images for the overview back. --- .../04-hardware/images/{overview => }/nugus.png | Bin .../images/{overview => }/servo-tranzorb-1.png | Bin .../images/{overview => }/servo-tranzorb-2.png | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename src/book/02-system/04-hardware/images/{overview => }/nugus.png (100%) rename src/book/02-system/04-hardware/images/{overview => }/servo-tranzorb-1.png (100%) rename src/book/02-system/04-hardware/images/{overview => }/servo-tranzorb-2.png (100%) diff --git a/src/book/02-system/04-hardware/images/overview/nugus.png b/src/book/02-system/04-hardware/images/nugus.png similarity index 100% rename from src/book/02-system/04-hardware/images/overview/nugus.png rename to src/book/02-system/04-hardware/images/nugus.png diff --git a/src/book/02-system/04-hardware/images/overview/servo-tranzorb-1.png b/src/book/02-system/04-hardware/images/servo-tranzorb-1.png similarity index 100% rename from src/book/02-system/04-hardware/images/overview/servo-tranzorb-1.png rename to src/book/02-system/04-hardware/images/servo-tranzorb-1.png diff --git a/src/book/02-system/04-hardware/images/overview/servo-tranzorb-2.png b/src/book/02-system/04-hardware/images/servo-tranzorb-2.png similarity index 100% rename from src/book/02-system/04-hardware/images/overview/servo-tranzorb-2.png rename to src/book/02-system/04-hardware/images/servo-tranzorb-2.png From 45cd4867fb98286e2ebeee6c1d10d172bc2d404b Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:39:53 +1000 Subject: [PATCH 07/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index af13ce30a..fc88a59e3 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -10,7 +10,7 @@ authors: ## Introduction -Dynamixel is the name that Robotis gives to its [system](https://www.robotis.us/dynamixel/) off-the-shelf servos that have integrated control. These are such that the servos are controlled by commands over a digital interface. There are broadly three protocols for such an interface, namely ModbusRTU, Dynamixel v1, and Dynamixel v2. We will only look into the last of the three which will be simply called the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. +[Dynamixel](https://www.robotis.us/dynamixel/) is an off-the-shelf servo with integrated control. The servos are controlled by commands over a digital interface. There are three protocols for such an interface: Modbus RTU, Dynamixel v1, and Dynamixel v2. We will only consider Dynamixel v2, which will be referred to as the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. The goal of this guide is to give an overview of the Dynamixel communication. It is not meant to be an exhaustive list of what is already on the Robotis [manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) but to give further insight into things left out of said manual, mostly the low-level electrical side, as well as any idiosyncracities. Said manual should be read after the reader has read this guide. From c359805d793dae20581757c986c4107faa2bfdf7 Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:40:29 +1000 Subject: [PATCH 08/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index fc88a59e3..38a59f71a 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -12,7 +12,7 @@ authors: [Dynamixel](https://www.robotis.us/dynamixel/) is an off-the-shelf servo with integrated control. The servos are controlled by commands over a digital interface. There are three protocols for such an interface: Modbus RTU, Dynamixel v1, and Dynamixel v2. We will only consider Dynamixel v2, which will be referred to as the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. -The goal of this guide is to give an overview of the Dynamixel communication. It is not meant to be an exhaustive list of what is already on the Robotis [manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) but to give further insight into things left out of said manual, mostly the low-level electrical side, as well as any idiosyncracities. Said manual should be read after the reader has read this guide. +This page provides an overview of the Dynamixel communication. It is not an exhaustive list of what is already in the [Robotis manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) but gives further insight into things left out of the manual, such as the low-level electrical side and some peculiarities. The Robotis manual should be read after the reader has read this page. The target-audience is somewhat broad and can be anywhere between From b9bdf47f580282f0d83ea1f516c89b3a4b2f0f97 Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:41:08 +1000 Subject: [PATCH 09/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index 38a59f71a..f1c4d6414 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -22,7 +22,7 @@ The target-audience is somewhat broad and can be anywhere between -Assumed knowledge is a basic understanding of electrical concepts like voltage and maybe some HSC physics such as magnetic fields as well as a basic intuition for electronic devices in daily life. +Assumed knowledge includes a basic understanding of electrical concepts (i.e. voltage), HSC physics (i.e. magnetic fields), and basic intuition for electronic devices in daily life. From b8ef6323a0d7d767015c7b6829918f0c090b9771 Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:41:37 +1000 Subject: [PATCH 10/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index f1c4d6414..4fec8ed0f 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -28,7 +28,7 @@ Assumed knowledge includes a basic understanding of electrical concepts (i.e. vo ## Universal Asynchronous Receiver-Transmitter -A universal asynchronous receiver-transmitter (UART) is an electrical device that sends data at an agreed upon bitrate or baudrate. Unlike SPI and I2C where there is one extra signal for the clock, often just called the serial clock, both devices on either end have to know the common baudrate beforehand. Thus, it is common to have to set a baudrate at the very beginning externally either by rewriting firmware or configuring a peripheral. +A universal asynchronous receiver-transmitter (UART) is an electrical device that sends data at an agreed upon bitrate or baudrate. Unlike [Serial Peripheral Interface (SPI)](https://en.wikipedia.org/wiki/Serial_Peripheral_Interface) and [Inter-Integrated Circuit (I2C)](https://en.wikipedia.org/wiki/I%C2%B2C) where there is one extra signal for the clock, often just called the serial clock, both devices on either end have to know the common baudrate beforehand. It is common with UART to have to set a baudrate at the very beginning externally either by rewriting firmware or configuring a peripheral. From 338c51d1c17bc666bf3be777fa074c2d85816345 Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:41:56 +1000 Subject: [PATCH 11/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index 4fec8ed0f..5ff4db97d 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -70,7 +70,7 @@ Simplexity is when data goes in only one direction, from Device-A to Device-B, w ![In simplexity, data always flows in only one direction.](./images/dynamixel_protocol/simplexity.drawio.png 'In simplexity, data always flows in only one direction.') -Full duplexity is when data can go in both directions at the same time, between Device-A and Device-B. There are two channels, one for each direction such that one could think of each channel as simplex. There is no clash when both Device-A and Device-B send data at the same time since the two channels are separate. An analogy would be Alice and Bob writing letters or texting. +Full duplexity is when data can go in both directions at the same time, between Device-A and Device-B. There are two channels, one for each direction. This is like having two simplex channels. There is no clash when both Device-A and Device-B send data at the same time since the two channels are separate. An analogy would be Alice and Bob writing letters or texting. ![In full duplexity, data can flow in both directions at the same time.](./images/dynamixel_protocol/full_duplexity.drawio.png 'In full duplexity, data can flow in both directions at the same time.') From eb2c980e2a63a8a4a3de26c07b6e189757ca6472 Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:42:50 +1000 Subject: [PATCH 12/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index 5ff4db97d..d8dad15ef 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -74,7 +74,7 @@ Full duplexity is when data can go in both directions at the same time, between ![In full duplexity, data can flow in both directions at the same time.](./images/dynamixel_protocol/full_duplexity.drawio.png 'In full duplexity, data can flow in both directions at the same time.') -A pure UART will have two signals, RX and TX, and if it were connected to another UART such that TX->RX both ways, then this would be an example of full duplexity. +A pure UART will have two signals, RX and TX. RX is used for receiving signals and TX is used for transmitting signals. If two UART devices are connected, they will have two-way communication (TX->RX). This is an example of full duplexity. Half duplexity is when data can go in both directions but not at the same time. There seem to be two channels but are really combined into one. An analogy would be Alice and Bob talking to each other by walkie-talkies. From 676f0a605b1517df2bc79baf655331856b852b43 Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:43:06 +1000 Subject: [PATCH 13/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index d8dad15ef..35c4311b7 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -76,7 +76,7 @@ Full duplexity is when data can go in both directions at the same time, between A pure UART will have two signals, RX and TX. RX is used for receiving signals and TX is used for transmitting signals. If two UART devices are connected, they will have two-way communication (TX->RX). This is an example of full duplexity. -Half duplexity is when data can go in both directions but not at the same time. There seem to be two channels but are really combined into one. An analogy would be Alice and Bob talking to each other by walkie-talkies. +Half duplexity is when data can go in both directions, but not at the same time. There seem to be two channels but they are really combined into one. An analogy would be Alice and Bob talking to each other by walkie-talkies. ![In half duplexity, data can flow in both directions but not at the same time.](./images/dynamixel_protocol/half_duplexity.drawio.png 'In half duplexity, data can flow in both directions but not at the same time.') From 0de18be4385f1540e321f11d44486aace86df25c Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:44:16 +1000 Subject: [PATCH 14/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index 35c4311b7..3204c614b 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -88,7 +88,7 @@ The Dynamixel protocol is half duplex; therefore, it is important to understand We will see soon that the reason why the protocol is half duplex is the fewer number of wires - especially for RS485 - and the fact that servos only respond to instructions. -Often, a Dynamixel device's microcontroller has a UART to communicate on the bus. This UART as said before has two pins, RX and TX. Therefore, in theory, it could be used for full duplexity. However, RX and TX get switched between by a transceiver which is often another chip on the board. This transceiver as the name suggests can switch between receiving and transmitting on the same bus-line. Therefore, this transceiver has another input pin to set the direction, sometimes called the TX-enable, the direction, etc. +Often, a Dynamixel device's microcontroller has a UART to communicate on the bus. This UART has two pins, RX and TX. Therefore, in theory, it could be used for full duplexity. However, RX and TX get switched between by a transceiver, which is often another chip on the board. The transceiver can switch between receiving and transmitting on the same bus-line. This transceiver has another input pin to set the direction, sometimes called the TX-enable, the direction, etc. ## Signal-levels From e1e532f0e02cd5de6c69e5f58b3d6b42c93d637e Mon Sep 17 00:00:00 2001 From: Clayton <47998944+Claegtun@users.noreply.github.com> Date: Mon, 27 May 2024 08:44:34 +1000 Subject: [PATCH 15/16] Update src/book/02-system/04-hardware/04-dynamixel-protocol.mdx Co-authored-by: Ysobel Sims <35280100+ysims@users.noreply.github.com> --- src/book/02-system/04-hardware/04-dynamixel-protocol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index 3204c614b..e5b7789b8 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -94,7 +94,7 @@ Often, a Dynamixel device's microcontroller has a UART to communicate on the bus ### Transistor-Transistor-Logic -Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. The [NC7WZ241](https://www.onsemi.com/pdf/datasheet/nc7wz241-d.pdf) chip is an example of a TTL transceiver that is found the [OpenCR](https://emanual.robotis.com/docs/en/parts/controller/opencr10/). +Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. The [NC7WZ241](https://www.onsemi.com/pdf/datasheet/nc7wz241-d.pdf) chip is an example of a TTL transceiver that is found in the [OpenCR](https://emanual.robotis.com/docs/en/parts/controller/opencr10/). From a5afb5b1a3619b365ee95f05c6c6319e5be82481 Mon Sep 17 00:00:00 2001 From: Claegtun Date: Mon, 27 May 2024 09:13:44 +1000 Subject: [PATCH 16/16] Fixed and tidied a few things. Is still a work in progress. --- .../04-hardware/04-dynamixel-protocol.mdx | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx index e5b7789b8..299bf1349 100644 --- a/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx +++ b/src/book/02-system/04-hardware/04-dynamixel-protocol.mdx @@ -10,7 +10,7 @@ authors: ## Introduction -[Dynamixel](https://www.robotis.us/dynamixel/) is an off-the-shelf servo with integrated control. The servos are controlled by commands over a digital interface. There are three protocols for such an interface: Modbus RTU, Dynamixel v1, and Dynamixel v2. We will only consider Dynamixel v2, which will be referred to as the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. +A [Dynamixel](https://www.robotis.us/dynamixel/) is an off-the-shelf servo with integrated control that are controlled by commands over a digital interface. There are three protocols for such an interface: Modbus RTU, Dynamixel v1, and Dynamixel v2. We will only consider Dynamixel v2, which will be simply referred to as the Dynamixel protocol. However, before we do so, we must look at the lower-level electrical system. This page provides an overview of the Dynamixel communication. It is not an exhaustive list of what is already in the [Robotis manual](https://emanual.robotis.com/docs/en/dxl/protocol2/) but gives further insight into things left out of the manual, such as the low-level electrical side and some peculiarities. The Robotis manual should be read after the reader has read this page. @@ -20,19 +20,13 @@ The target-audience is somewhat broad and can be anywhere between - a new electrical, computer, or mechatronics engineering student who has had some experience with some of these concepts such as UART in ELEC2720 but may want to refresh some of the basics and needs to learn some new things such as RS485 and the Dynamixel protocol, - and a computer-science student who has some experience with telecommunications such as Ethernet but may have no experience at all with UART and RS485. - - -Assumed knowledge includes a basic understanding of electrical concepts (i.e. voltage), HSC physics (i.e. magnetic fields), and basic intuition for electronic devices in daily life. - - - ## Universal Asynchronous Receiver-Transmitter -A universal asynchronous receiver-transmitter (UART) is an electrical device that sends data at an agreed upon bitrate or baudrate. Unlike [Serial Peripheral Interface (SPI)](https://en.wikipedia.org/wiki/Serial_Peripheral_Interface) and [Inter-Integrated Circuit (I2C)](https://en.wikipedia.org/wiki/I%C2%B2C) where there is one extra signal for the clock, often just called the serial clock, both devices on either end have to know the common baudrate beforehand. It is common with UART to have to set a baudrate at the very beginning externally either by rewriting firmware or configuring a peripheral. +A universal asynchronous receiver-transmitter (UART) is an electrical device that sends data at an agreed upon bitrate or baudrate. Unlike [Serial Peripheral Interface (SPI)](https://en.wikipedia.org/wiki/Serial_Peripheral_Interface) and [Inter-Integrated Circuit (I2C)](https://en.wikipedia.org/wiki/I%C2%B2C), there is no signal for the clock, and both devices on either end have to know the common baudrate beforehand. It is common with UART to have to set a baudrate at the very beginning externally either by rewriting firmware or configuring a peripheral. -There is also a universal synchronous and asynchronous receiver-transmitter (USART) which is a device that can handle both synchronous and asynchronous communication. Many microcontrollers would have both USARTs and UARTs, the former of which can more of less be used as the latter. However, we will only talk about the asynchronous side in which a UART henceforth can easily be applied for a USART as well. +There is also a universal synchronous and asynchronous receiver-transmitter (USART) which is a device that can handle both synchronous and asynchronous communication and can more or less be used as a UART. @@ -74,7 +68,7 @@ Full duplexity is when data can go in both directions at the same time, between ![In full duplexity, data can flow in both directions at the same time.](./images/dynamixel_protocol/full_duplexity.drawio.png 'In full duplexity, data can flow in both directions at the same time.') -A pure UART will have two signals, RX and TX. RX is used for receiving signals and TX is used for transmitting signals. If two UART devices are connected, they will have two-way communication (TX->RX). This is an example of full duplexity. +A pure UART will have two signals, RX and TX. RX is used for receiving signals and TX is used for transmitting signals. This is an example of full duplexity. Half duplexity is when data can go in both directions, but not at the same time. There seem to be two channels but they are really combined into one. An analogy would be Alice and Bob talking to each other by walkie-talkies. @@ -86,15 +80,15 @@ The Dynamixel protocol is half duplex; therefore, it is important to understand -We will see soon that the reason why the protocol is half duplex is the fewer number of wires - especially for RS485 - and the fact that servos only respond to instructions. +The reader will soon see that the reason why the protocol is half duplex is the fewer number of wires - especially for RS485 - and the fact that servos only respond to instructions. -Often, a Dynamixel device's microcontroller has a UART to communicate on the bus. This UART has two pins, RX and TX. Therefore, in theory, it could be used for full duplexity. However, RX and TX get switched between by a transceiver, which is often another chip on the board. The transceiver can switch between receiving and transmitting on the same bus-line. This transceiver has another input pin to set the direction, sometimes called the TX-enable, the direction, etc. +Often, a Dynamixel device's microcontroller has a UART to communicate on the bus. This UART has two pins, RX and TX. Therefore, in theory, it could be used for full duplexity. However, RX and TX get switched between by a transceiver, which is another chip on the board. The transceiver can switch between receiving and transmitting on the same bus-line. This transceiver has another input pin to set the direction, sometimes called the TX-enable or the direction. ## Signal-levels ### Transistor-Transistor-Logic -Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. The [NC7WZ241](https://www.onsemi.com/pdf/datasheet/nc7wz241-d.pdf) chip is an example of a TTL transceiver that is found in the [OpenCR](https://emanual.robotis.com/docs/en/parts/controller/opencr10/). +Transistor-Transistor-Logic (TTL) is a family of logical interfaces mainly for logical circuits. Its name refers to the transistors inside the chip used to control the voltage-level. It also refers to signal-levels for many UARTs and protocols. There are only three wires for a TTL setup for a servo, namely ground, power, and data. The [NC7WZ241](https://www.onsemi.com/pdf/datasheet/nc7wz241-d.pdf) chip is an example of a TTL transceiver that is found on the [OpenCR](https://emanual.robotis.com/docs/en/parts/controller/opencr10/). @@ -116,21 +110,21 @@ RS485 is an electrical standard that defines the signal-levels for many serial d In order to appreciate the power of such a differential signal, one must understand the challenges of noise and interference. For very long cables, the wires often behave like antennae and can thus pick up nearby interference from other electrical devices, especially from servos which tend to emit switching noise. As such, a big enough interference can flip a bit and lead to an error. -However, RS485 and other such techniques have an answer for this. Given a message $m(t)$, the transmitter sends a positive copy $p(t) = m(t)$ and a negative copy $n(t) = -m(t)$ together as a pair. As long as the two physical wires are close together, any interference $w(t)$ is both added where the received positive signal is $p'(t) = m(t) + w(t)$, and the received negative signal is $n'(t) = -m(t) + w(t)$. The receiver then subtracts the two, often with a difference amplifier, such that the interference is cancelled out, and the received message is $m'(t) = p'(t) - n'(t) = m(t) + w(t) - ( -m(t) + w(t) ) = 2 m(t)$. +However, RS485 and other such techniques have an answer for this. Given a message $m(t)$, the transmitter sends a positive copy $p(t) = m(t)$ and a negative copy $n(t) = -m(t)$ together as a pair. As long as the two physical wires are close together, any interference $w(t)$ is both added such that the received positive signal is $p'(t) = m(t) + w(t)$, and the received negative signal is $n'(t) = -m(t) + w(t)$. The receiver then subtracts the two, often with a difference amplifier, such that the interference is cancelled out, and the received message is $m'(t) = p'(t) - n'(t) = m(t) + w(t) - ( -m(t) + w(t) ) = 2 m(t)$. ![A differential signal has a positive signal and a negative signal such that when they are subtracted, any common-mode interference is cancelled out.](./images/dynamixel_protocol/differential.drawio.png 'A differential signal has a positive signal and a negative signal such that when they are subtracted, any common-mode interference is cancelled out.') -Indeed, this is a simple example as there is some more complexity in the way how the RS485 transceiver drives the signals, but this should give you the broad idea of how it works and to understand its advantage. Furthermore, this kind of interference is known as common-mode noise. As an aside, a differential pair cannot handle differential mode noise, which is however less common in our case. The reader can learn more about the two [here](https://www.allaboutcircuits.com/industry-white-papers/emc-basics-common-mode-vs-differential-noise/). +Indeed, this is a simple example as there is some more complexity in the way how the RS485 transceiver drives the signals, but this should give the reader the broad idea of how it works and to understand its advantage. Furthermore, this kind of interference is known as common-mode noise. As an aside, a differential pair cannot handle differential mode noise, which is however less common in our case. The reader can learn more about the two [here](https://www.allaboutcircuits.com/industry-white-papers/emc-basics-common-mode-vs-differential-noise/). -It is important to understand the fact that there are two signals that make up a differential pair when probing the bus with either an oscilloscope or a digital-signal analyser such as a Saleae. Often in such times, only one probed signal - ideally positive - is enough to see the data. +It is important to understand the fact that there are two signals that make up a differential pair when probing the bus with either an oscilloscope or a digital-signal analyser - such as a Saleae. Often in such times, only one probed signal - ideally positive - is enough to see the data. -RS485 was historically used for communicating to automated machines on very long factory-floors with a lot of electromagnetic noise from machinery. Therefore, RS485 can deal with very long lengths up to a kilometre depending on the bandwidth. Therefore, one may think that RS485 is overkill for such a small robot, but one should remember that servos can make a lot of electromagnetic noise because of their nature. +RS485 was historically used for communicating to automated machines on very long factory-floors with a lot of electromagnetic noise from machinery. Therefore, RS485 can deal with very long lengths up to a kilometre depending on the bandwidth. One may think that RS485 is overkill for such a small robot, but one should remember that servos can make a lot of electromagnetic noise because of their nature. @@ -140,13 +134,13 @@ The robustness to interference is better when the two wires are twisted. This me #### Terminating Resistors -Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. RS485 can only have two terminating resistors, best at either end of a bus. However, RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. You can read more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). +Further to RS485 are terminating resistors which are often important to minimise reflections and to maximise the received power. RS485 can only have two terminating resistors, best at either end of a bus. However, RS485 doesn't always need two terminating resistors in order to work, but it is best to have them for the best performance. Nearly always, the terminating resistor is 120 Ω. The reader can learn more [here](https://www.ti.com/document-viewer/lit/html/SSZTB23). ## v2 Protocol ### Asymmetry -The Dynamixel v2 protocol is a basic serial protocol much like Modbus. The most important thing to understand is that the Dynamixel protocol is fundamentally asymmetric and works with two classes, a controller and a device, analoguous to SPI, I2C, and Modbus for example, or a server and a client. The controller only sends an instruction or a request, only to which a device responds with a status or a response. Robotis specifically use the terminology of instruction and status. Only the controller can iniate an instruction-status exchange. There can be many devices - at most 253 -, but to avoid collisions, there can only be one controller on a bus at a time. One must remember this when connecting the Dynamixel wizard externally to a robot while it is running. +The Dynamixel v2 protocol is a basic serial protocol much like Modbus. The most important thing to understand is that the Dynamixel protocol is fundamentally asymmetric and works with two classes, a controller and a device, analoguous to SPI, I2C, and Modbus for example. The controller only sends an instruction or a request, only to which a device responds with a status or a response. Robotis specifically use the terminology of 'instruction' and 'status' in their documentation, but the reader may also see 'request' and 'response' in other places. Only the controller can iniate an instruction-status exchange. There can be many devices - at most 253 -, but to avoid collisions, there can only be one controller on a bus at a time. One must remember this when connecting the Dynamixel wizard externally to a robot while it is running. ![The Dynamixel protocol has instructions only in one direction and statuses only in the other direction.](./images/dynamixel_protocol/asymmetric.drawio.png 'The Dynamixel protocol has instructions only in one direction and statuses only in the other direction.') @@ -183,13 +177,13 @@ The data is in little-endian format. ### Cyclic Redundancy Check -The Cyclic Redundancy Check (CRC) is value that is appended at the end which helps tell whether there has been any corruption in the received packet. Firstly, the sender computes the CRC of the whole packet soon to be sent - excluding the CRC of course - and appends it on the end. The receiver computes its own version of the CRC of the packet that it has just received and compares it to the appended CRC. If the two CRCs are different, then there has been an error. One can learn more about how the CRC works mathematically [here](https://en.wikipedia.org/wiki/Cyclic_redundancy_check). +The cyclic redundancy check (CRC) is a value that is appended at the end which helps tell whether there has been any corruption in the received packet. Firstly, the sender computes the CRC of the whole packet soon to be sent - excluding the CRC of course - and appends it on the end. When the receiver has received this packet, it computes its own version of the CRC and compares it to the appended CRC. If the two CRCs are different, then there has been an error. One can learn more [here](https://en.wikipedia.org/wiki/Cyclic_redundancy_check) about how the CRC works mathematically. There are different ways to calculate the CRC depending on the polynomial. The Dynamixel protocol uses CRC-16-IBM which has $x^{16} + x^{15} + x^{2} + 1$ as the polynomial, otherwise wrtten as 0x8005. An algorithm for the specific CRC that the Dynamixel protocol uses as well as a look-up-table can be found [here](https://emanual.robotis.com/docs/en/dxl/crc/). ### Error -One difference between an isntruction-packet and a status-packet is the extra error-field in the latter as well as the fixed instruction-field of 0x55. Firstly, if the most significant bit of the error-field is 1, then there has been a hardware problem; reading the hardware-error-status in the device can give more details. The rest of the bits can tell the following. +One difference between an instruction-packet and a status-packet is the extra error-field in the latter as well as the fixed instruction-field of 0x55. Firstly, if the most significant bit of the error-field is 1, then there has been a hardware problem; reading the hardware-error-status in the device can give more details. The rest of the bits can tell the following. | Value | Error | Brief | | ----- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -321,7 +315,7 @@ The instruction-packet's length is variable given how much data is written in th Reads data from multiple devices' control-tables. The instruction's payload is at first the starting address in the table to read from which and the length of data, both as half words. Then, the rest are a list of IDs of the servos to read from which. -In response, all devices requested send their status-packets in order of ID. Each status' payload like before with a read-instruction is the requested data from the device's control-table. +In response, all devices requested send their status-packets in order of ID. Like before with a read-instruction, each status' payload is the requested data from the device's control-table. The instruction-packet: