Skip to main content

A Python library for controlling the Mini-Arm 6-DOF robotic arm

Project description

Mini-Arm

License: MIT Python GitHub Repo stars GitHub forks Documentation GitHub last commit

๐Ÿ“– Documentation | ๐Ÿš€ Quick Start | ๐Ÿ”ง Hardware Guide

The Mini Arm is a miniature version of the Desktop-Arm project, a portable 6DOF 3D-printed open-source robot arm. Plug in a USB cable and immediately enjoy these features:

  • Runs on Raspberry Pico 2 microcontroller using CircuitPython
  • Internal IK solver to handle joint state calculations on the microcontroller!
  • 95% 3D printable components (aside from nuts & bolts)
  • Total parts cost <= $100
  • Weighs less than 1lb (~0.3kg)

These install instructions were tailored using a Windows 10 OS. There are also setup instructions for Ubuntu and the Raspberry Pi too.

Contents

Repository Structure

This repository contains everything needed to build, program, and control the Mini-Arm robot:

Mini-Arm/
โ”œโ”€โ”€ ros2/                  # ROS2 packages (also contains Python client)
โ”‚   โ”œโ”€โ”€ miniarm_core/          # Python client library (pip installable)
โ”‚   โ”‚   โ””โ”€โ”€ miniarm_core/
โ”‚   โ”‚       โ”œโ”€โ”€ client.py      # MiniArmClient class
โ”‚   โ”‚       โ””โ”€โ”€ __main__.py    # CLI entry point
โ”‚   โ”œโ”€โ”€ miniarm_description/   # URDF & meshes
โ”‚   โ”œโ”€โ”€ miniarm_moveit_config/ # MoveIt2 configuration
โ”‚   โ””โ”€โ”€ miniarm_servo/         # Real-time servo control
โ”œโ”€โ”€ firmware/              # Embedded firmware
โ”‚   โ””โ”€โ”€ circuitpython/     # CircuitPython for Raspberry Pi Pico
โ”‚       โ”œโ”€โ”€ code.py        # Main firmware
โ”‚       โ”œโ”€โ”€ lib/           # CircuitPython libraries
โ”‚       โ””โ”€โ”€ *.uf2          # Pre-built firmware images
โ”œโ”€โ”€ hardware/              # Physical build resources
โ”‚   โ”œโ”€โ”€ cad/solidworks/    # SolidWorks CAD files (.SLDPRT, .SLDASM)
โ”‚   โ”œโ”€โ”€ stl/               # 3D printable STL files
โ”‚   โ””โ”€โ”€ bom/               # Bill of Materials
โ”œโ”€โ”€ examples/              # Usage examples and demos
โ”œโ”€โ”€ tests/                 # Test scripts
โ”œโ”€โ”€ docs/                  # Documentation (Sphinx)
โ””โ”€โ”€ pyproject.toml         # Python package configuration

Key components:

  • ros2/miniarm_core/ - Pip-installable Python package for controlling the robot
  • firmware/circuitpython/ - CircuitPython firmware for the Raspberry Pi Pico
  • hardware/ - CAD files, STL meshes, and bill of materials
  • ros2/ - ROS2 packages for visualization and advanced control

Installation

Python Package

Install the Mini-Arm Python package directly from GitHub:

# Install from GitHub
pip install git+https://github.com/Jshulgach/Mini-Arm.git

# Or clone and install in development mode
git clone https://github.com/Jshulgach/Mini-Arm.git
cd Mini-Arm
pip install -e .

ROS2 Installation (All Packages)

For ROS2 users, all packages can be built together:

# Create workspace
mkdir -p ~/miniarm_ws/src
cd ~/miniarm_ws/src

# Clone and symlink
git clone https://github.com/Jshulgach/Mini-Arm.git
ln -s Mini-Arm/ros2/* .

# Build
cd ~/miniarm_ws
colcon build
source install/setup.bash

Firmware Setup

  1. Choose Pico firmware

    We have provided CircuitPython firmware for both the Pico and Pico2! Find the .uf2 files in firmware/circuitpython/, or download the latest CircuitPython firmware for the Pico or Pico 2.

  2. Flash the firmware

    • When you plug in the Pico for the first time with the BOOTSEL button held, a new drive will appear on your computer.
    • Move/drag the .uf2 file to the Pico drive. The Pico will automatically reboot.
  3. Copy the firmware files

    • Copy the contents of firmware/circuitpython/code.py and firmware/circuitpython/lib/ to the Pico drive.

Hardware Assembly

  1. Building the arm

  2. Electrical wiring


Quick Start

Command Line Interface

After installing the package, use the CLI:

# Get list of available commands
mini-arm --port COM3

# Or run as a module
python -m mini_arm --port COM3

# Send a specific command
mini-arm --port COM3 --command "get_pose"

# Interactive mode
mini-arm --port COM3 --interactive

Python API

Use the MiniArmClient class in your own scripts:

from miniarm_core import MiniArmClient

# Connect to Mini-Arm
client = MiniArmClient(port='COM3', baudrate=115200, verbose=True)

# Send commands
client.send('help')        # List available commands
client.home()              # Move to home position
client.send('get_pose')    # Get current position
client.set_pose(0.135, 0.0, 0.22)  # Move to position

# Context manager support
with MiniArmClient(port='COM3') as client:
    client.home()
    pose = client.get_pose()
    print(f"Current pose: {pose}")

### Available Commands

The Mini-Arm supports the following commands:

================================= List of commands ============================================= movemotor | MOTOR VALUE | // Moves motor A to absolute position B (deg) movemotors | VALUES | // Moves motors absolute position B (deg) assimung VALUES is a list info | | // Prints info about robot system (motors, grippers, and sensors) set_gripper | VALUE, STRING | // Gripper command to set the state (open/close) or position set_pose | VALUES | // Updates the end effector pose to an absolute cartesian coordinate pose. Pass a list of values (ex: [X,Y,Z] or [X,Y,Z,R,P,Y]) get_pose | | // Returns the current position and orientation of the robot end effector set_joints | (DISABLED) | // Updates the robot joint state. Pass a list of values (ex: [0,0,0,0,0,0]) get_joints | | // Returns the current robot joint state set_led | VALUES | // Set the RGB LED to a specific color using 0-255 values in a 3-element list set_delta | VALUES | // Updates the end effector pose with a delta movement relative to the robot's current pose. Pass a list of values (ex: [X,Y,Z] or [X,Y,Z,R,P,Y]) posture | (DISABLED) | // Updates the end effector pose with a Cartesian displacement relative to the robot's origin. Pass a list of values (ex: [X,Y,Z] or [X,Y,Z,R,P,Y]) controller | (DISABLED) | // Controller-specific message as a long ascii string with buttons and joystick data that gets converted into a delta position. Check 'xbox_utils' for message type details help | | // Display available commands play_music | STRING | // Play a music file debug | STRING | // Pass 'on' or 'off' to enable or disable the verbose output set_rate | VALUE | // Update the main loop rate (Hz) trajectory | STRING [REPEAT] | // Perform a specified trajectory (e.g. 'circle') with optional repeat argument (true/false) stop | | // Stop ongoing traetories fsr | | // Read the sensor values from the FSRs home | | // Set the robot to its home position test | | // Test command to verify output from device


---
## Examples

See the `examples/` directory for detailed usage examples:

### [Basic Control](examples/01_basic_control/)
- `basic_demo.py` - Connect and send simple commands
- `position_control.py` - Move end effector to XYZ coordinates
- `gripper_control.py` - Open/close gripper

### [Trajectory Execution](examples/02_trajectory/)
- `circle_trajectory.py` - Execute circular trajectories in 3D space

### [Xbox Controller Teleop](examples/02_xbox_teleop/)
![](assets/xboxcontroller.png)

Control the arm with an Xbox controller in real-time:

```bash
cd examples/02_xbox_teleop
python xbox-client.py --port COM3

Features:

  • Real-time end effector control via joysticks
  • Gripper control with triggers
  • LED status indicators (green = connected)

Motion Analysis

  • trajectory_command.py - Generate and execute trajectories
  • trajectory_comparison.py - Compare commanded vs actual motion
  • convert_c3d_to_csv.py - Process motion capture data
  • compute_alignment_transform.py - Align coordinate frames

Tests

Test scripts are organized by functionality in the tests/ directory:

  • hardware/ - Serial communication and servo control tests
  • kinematics/ - Inverse kinematics solver validation
  • networking/ - TCP/IP and camera streaming tests
  • visualization/ - 3D rendering and simulation tests

See tests/README.md for details on running tests.

Multimodal agentic AI Integration

TBD

AJ GUI

Robot control cana also be done through the Unity version of the "AJ" GUI v1 (Link coming soon), or an SSH terminal to the robot. FOR TCP/IP, quickest way using a python terminal:

ROS2 Robot Visualizer

The Mini Arm can be visualized in RViz2 using the included ROS2 packages in the ros2/ directory. Refer to the build instructions for more information.

Feel free to reach out to me in case of any issues.
If you find this repo useful in any way please do star โญ๏ธ it so that others can reap it's benefits as well!

Acknowledgements

This project is inspired from the work done by:

License

Copyright 2022-2023 Jonathan Shulgach

This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, you can obtain one at https://mozilla.org/MPL/2.0/.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mini_arm-0.4.0.tar.gz (20.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mini_arm-0.4.0-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file mini_arm-0.4.0.tar.gz.

File metadata

  • Download URL: mini_arm-0.4.0.tar.gz
  • Upload date:
  • Size: 20.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for mini_arm-0.4.0.tar.gz
Algorithm Hash digest
SHA256 c606f558c29a0f424006d0da24d512f528cad7432114ac46fb91259a476508ce
MD5 ad80a435f6c1361f11b48da831af1b2e
BLAKE2b-256 7c3e6ac6bfbfdc691a0cb7fb5021010750558b606199a72981b4b6eedacc4ca1

See more details on using hashes here.

File details

Details for the file mini_arm-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: mini_arm-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for mini_arm-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 35897f08a51b40b40462d7883bbd8180916984e98c8588f8b61d1c3394b7ff06
MD5 4e551268d75a710a6875a65a6b009764
BLAKE2b-256 6bfef42beab97a836887fd4d9c346b1ed2f58d53e3ae369596fc19058749e913

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page