
Pi485
bvarner/pi485
An open-source TTL UART <-> RS485 converter, intended for a Raspberry Pi or Arduino

RS485 encoder interface board for accurate joint position feedback on UMD Mars Rover Team's autonomous arm. Supports a multi-drop RS485 encoder bus with CAN integration to an STM32-based control system.
ArmPCB is an open-source printed circuit board by AaravD356, from the AaravD356/RS485-Encoder-PCB repository on GitHub. It is a 2-layer board of 58 × 47.5 mm with 28 parts on 51 nets, routed with 147 tracks and 15 vias.
It is built around the MAX485ED. Its parts include 10 connectors, 8 capacitors, 6 resistors and 2 ICs. It belongs with the interfaces and adapters and robots and motor control boards of this library.
RS485 encoder interface board for accurate joint position feedback on the UMD Mars Rover Team's autonomous arm. The board polls a multi-drop bus of RS485 absolute encoders and relays live position and velocity data over CAN to the rest of the rover's control system, with an STM32 handling the protocol translation.
Each joint on the autonomous arm is fitted with an RS485 absolute encoder (AMT21x / AMT212 series). This board's STM32 firmware manages a bus of these encoders, round-robin polling each one, validating the returned data, and tracking position/velocity per node. That data is exposed over CAN so the arm's main controller can request live feedback for any specific joint on demand.
Each encoder on the bus is assigned a unique node ID, sent directly as the command byte for a standard position read:
Up to a configurable max number of encoders can be registered at once, each tracked independently with its own node ID, resolution, poll period, last-known position, and online/offline status. Four encoders are loaded by default at startup, but encoders can be added or cleared at runtime, with duplicate node IDs rejected.
The system round-robins through registered encoders rather than polling all of them every cycle, respecting each encoder's individual poll period. Each controller cycle:
Encoders that fail to respond or fail checksum validation are marked offline, with failed/successful read counters tracked per node — this lets the system distinguish a genuinely disconnected encoder from an occasional dropped packet.
Direction control (TX/RX switching) is handled either automatically by the UART hardware or manually via a GPIO-driven DE pin, depending on configuration. Before every transmission, the receive buffer is flushed to avoid stale data corrupting the next read. Transmit completion is polled with a timeout rather than assumed, so a bus fault or non-responding node can't hang the polling loop indefinitely.
The board exposes encoder data over CAN request/response:
Requests are matched to a registered encoder by node ID; if the encoder isn't found or isn't currently online, no meaningful data is returned. This request/response model means the main controller can poll specific joints on demand rather than needing to parse a continuous broadcast stream.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | 10u | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C2, C3, C5, C6, C7, C8 |
| 3 | 10k | Resistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolder | R5, R7, R8 |
| 3 | Conn_01x03_Pin | Connector_JST:JST_XH_S3B-XH-A_1x03_P2.50mm_Horizontal | J6, J7, J8 |
| 2 | 20k | Resistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolder | R1, R4 |
| 2 | Conn_01x04_Pin | Connector_JST:JST_PH_S4B-PH-K_1x04_P2.00mm_Horizontal | J9, J10 |
| 2 | Conn_02x08_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_Vertical | J2, J3 |
| 2 | MountingHole | MountingHole:MountingHole_3.2mm_M3_DIN965 | H1, H2 |
| 1 | 0.1u | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C1 |
| 1 | 100n | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C4 |
| 1 | 120 | Resistor_SMD:R_0402_1005Metric_Pad0.72x0.64mm_HandSolder | R3 |
| 1 | AP2127N-2.8 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U2 |
| 1 | Conn_01x02_Pin | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | J5 |
| 1 | Conn_01x04_Pin | Connector_JST:JST_XH_S4B-XH-A_1x04_P2.50mm_Horizontal | J4 |
| 1 | Conn_02x07_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x07_P2.54mm_Vertical | J1 |
| 1 | MAX485E | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U1 |
It measures 58 × 47.5 mm and has 2 copper layers, 1.6 mm thick.
28 parts, built around the MAX485ED. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the AaravD356/RS485-Encoder-PCB repository on GitHub, at the commit this page was made from: the board is ArmPCB.kicad_pcb and its schematic ArmPCB.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask AaravD356 before reusing the design.

bvarner/pi485
An open-source TTL UART <-> RS485 converter, intended for a Raspberry Pi or Arduino



GrappleRobotics/JMS
Another alternative field management system for the FIRST Robotics Competition.

StefanKrupop/XyloShield
Shield for Arduino that hosts a RFM26W radio module and allows DMX-512 connectivity

SylvainVanIniitu/Piccolo-4C-Black
Piccolo MIDI stochastic sequencer

ChaseDurand/Pool-Pi
Hardware+software solution for controlling a Goldline/Hayward Aqualogic pool control board over WiFi via a Raspberry Pi.

flxkrmr/eec-iv-reader-arduino
Arduino based diagnostics-tool for Fords EEC IV ECUs