SkillAgentSearch skills...

DARM

dynamic Arm for Robitc Mischief

Install / Use

/learn @JesseDarr/DARM
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

dARM (dynamic Arm for Robotic Mischief)

dARM is a 3d printed 6 DOF robotic arm. Initially, I wanted to build a 3d printed arm as a test of my new Bambu X1C. I found most existing projects used stepper motors. I wanted a better power density.

https://github.com/user-attachments/assets/527a8380-1c22-4416-9524-2030928b34a5

So the dARM journey began. The goal was to design a cheap, powerful, robust, modular, and easily maintained arm from scratch using ODrive S1 BLDC controllers. It stands .975 meters tall and can easily hold 5 lbs in the horizontal position.

https://github.com/user-attachments/assets/cb6a208b-52ac-4bd4-9993-00c22c082488

After iterating through various designs, modularity and maintenance became top priorities. If any individual component fails, its modular section can be removed from the larger arm for easy replacement.

Table of Contents

  1. Versions
  2. Inspirations
  3. Control
  4. Power
  5. Mechanical
  6. Assembly
  7. Links

Versions

Version numbers are determined purely by emotion. Don't ask what SDE stands for.

| Version | Date | Notes | |--- | --- | --- | | 0.35 SDE | 12/28/2024 | 6 axis, 7 motor design | | 0.45 SDE | 1/17/2025 | Gripper v2 added | | 0.55 SDE | 1/28/2025 | Power box added | | 0.56 SDE | 3/15/2025 | New gripper motor magnet holder | | 0.59 SDE | 3/24/2025 | Dock and finger v4 added | | 0.60 SDE | 4/5/2025 | Gripper gear/magenet holder integration |
| 0.62 SDE | 5/2/2025 | ROS2 pkg: published in submodule |
| 0.70 SDE | 6/22/2025 | ROS2 pkg: teleop node and refined URDF |

Inspirations

Without the below projects and youtube channels the dARM project wouldn't exist. I can't thank them enough for the inspiration and advice they've provided.

James Burton

What can I say about James. I've been watching his channel for years. Initially, because he did interesting things with 3d printed parts, but shortly after that because the things he did were so consistently interesting. James introduced me to ODrives as a control mechansim for BLDC motors.

Skyentific

Another great youtuber. He focuses on robotic arms, mostly 3d printed robotic arms. He covers specifics of design, assembly, and control for several different robot arms. He also covers ODrives in great detail, including a video that uses a custom modified firmware to increase communication speed for specific queries over CAN.

OpenQDD

The basis for the primary actuators are the OpenQDD by Aaed Musa. Aaed also has an excellent youtube channel. We use the same basic layout of an 8308 motor, an ODrive S1, and a planetary gearbox. Our actuators have been redesigned from scatch to increase strength and rigidity, tighten tolerances, print easier, and to have more robust mounting capabilities.

SSG48 Gripper

The basis for the gripper is the SSG48 project. We use a different motor, controller, and mounting dimensions, but we keep the basic motor housing layout, MGN7C rail/carriers, and a rack and pinion to move the fingers.

Gary McLendon

Gary is an excellent electrical engineer, former owner of GCM Computers, and my former boss. I want to thank Gary for the learning environment he provided me for nearly a decade under his employee. I also want to thank him for the advice on the power system for the dARM.

Control

The dARM is controlled with a Raspberry Pi 4b communicating to eight ODrive S1s via CAN bus. This is achieved with the help of an RS485 CAN Hat on the Pi. The ODrives are using the built in encoder with encoder magnets attached to each motor.

In a CAN network, the controller does not require a node ID, but each device on the network must have one. From this point forward, assume that the term "node" refers specifically to an ODrive and that node IDs are zero-indexed.

Pi

The Pi is currently running Ubuntu 22.04 Server, but everything should still work with newer versions. Instructions for installing Ubuntu on a Pi can be found here. Set the hostname to pidarm and the username to darm. It is also recommened to set a static IP address so it can be easily accessed via SSH.

Enable CAN Communication

The CAN Hat communicates to our ODrives, but it must also communicate to the Pi. This is done through a Serial Peripheral Interface (SPI). To enable the interface edit /boot/firmware/config.txt and add the following at the bottom of the file:

dtparam=spi=on 
dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25 
dtoverlay=spi0-hw-cs

Reboot and run dmesg | grep MCP2515 to verify the CAN Hat is now recognized.

Next we need to bring up the CAN interface with the following:

sudo ip link set can0 up type can bitrate 1000000

Then run ip a to veryify the interface is up.

Finally, install some handy CAN troubleshooting tools:

sudo apt-get install can-utils  <---- includes candump which can be used to see heartbeats from ODrives
sudo apt install python3-can    <---- includes CAN viewer script which can view all CAN traffic

CAN Service

A systemd service can be used to bring up the CAN interface on boot. Create file /etc/systemd/system/can0-setup.service with the following contents:

[Unit]
Description=Set up CAN0 interface
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/ip link set can0 up type can bitrate 1000000

[Install]
WantedBy=multi-user.target

Then run the following commands:

sudo systemctl enable can0-setup.service
sudo systemctl start can0-setup.service
sudo systemctl status can0-setup.service
sudo reboot

Finally, run ip a to verify the CAN interface started on boot.

Clone git repo

cd to an appropriate directory and run git clone https://github.com/JesseDarr/dARM.git to clone the repo. You will find the test scripts in the odrive_tools folder.

:bulb: Note: This folder is actually a git sub module that links to this repo: https://github.com/JesseDarr/dARM_odrive_tools.git

Game Controllers

If you want to buy a cheap bluetooth dongle you can use an XBox One, XBox Series X, PS4 or PS5 controller with the gamecontroller.py script to control the dARM. You will need to install the appropriate drives and use the bluetoothctl command to pair/connect the controller. Run ls /dev/input and check for js0 to ensure the controller is ready to work with the script.

Bluetooth on Linux is sketchy...bluetooth is sketchy...to combat this reset_interfaces.sh will reset the CAN and Bluetooth interfaces. It can save a few reboots from time to time.

If using a Playstation Controller you also want to ensure the Sony module loads on boot. Edit /etc/modules and add hid-sony to the bottom line.

CAN Wiring

CAN wiring starts from the CAN Hat on the Pi. A single twisted pair cable connects it to ODrive 0, which is then connected to ODrive 1, and so on with each ODrive daisy chained from the last like this:

graph LR
    subgraph "Raspberry Pi 4b"
        CAN_Hat[CAN Hat]
    end
    CAN_Hat <--> ODrive0[ODrive 0]
    ODrive0 <--> ODrive1[ODrive 1]
    ODrive1 <--> ODrive27[ODrive 2-7]

It's not well documented, but the ODrive S1 includes two 4-pin JST-GH ports. Each ODrive has 1 cable connected to the previous node and 1 cable connected to the next node. It does not matter which port is used for which cable. This allows some freedom when building custom length CAN cables.

<img src="https://github.com/JesseDarr/dARM/blob/main/pictures/odrive_s1_jst_gh.jpg" width="500">

Be sure to enabled the 120ohm resistor on ODrive 7 by flipping the DIP Switch to 120R. All other ODrives should have this DIP Switch set to No R.

<img src="https://github.com/JesseDarr/dARM/blob/main/pictures/odrive_s1_dip_switch.jpg" width="500">

The BOM lists sacrifical 4pin JST-GH wires. You will need to cut them in half and solder them into twisted pair. You need to wire the twisted pair in a roll over fashion such that PIN 2 is wired to PIN 2, and PIN 3 is wired to PIN 3. It is recommend to solder 1 end connector onto the tiwsted pair, attach it to an ODrive, and then measure the required length of that cable.

The cable that connects the PI to ODrive 0 is a special case: it must also include PIN 4 for ground. It should be wired into the CAN Hat like this:

<img src="https://github.com/JesseDarr/dARM/blob/main/pictures/rs485_can_hat.jpg" width="800">

Power

Power is provided by a 1200W 48V switching power supply. While this voltage exceeds the motors’ nominal ratings, each motor typically draws only 2–3 amps and operates intermittently rather than un

View on GitHub
GitHub Stars117
CategoryDevelopment
Updated7d ago
Forks11

Security Score

95/100

Audited on Mar 30, 2026

No findings