An open-source automated airbrush station for 3D-printed parts.
You printed it. Now paint it — automatically.
- What is Open3Dpainter?
- Why does this exist?
- System Overview
- Control Architecture
- Airbrush Toolhead
- Enclosure Options
- Axis Layout
- Repository Structure
- Bill of Materials
- Roadmap
- Performance Targets
- Integration Ecosystem
- Open-Source Licensing
- Contributing
- Safety
- Project Status
- Acknowledgements
Open3Dpainter is a compact, open-source desktop robot that automatically base-coats and finishes 3D-printed parts using an airbrush.
It combines:
- An overhead robotic arm mounted on linear gantry rails — so it can reach every side of your print without the arm getting in the way.
- A motorized rotary turntable that continuously presents all faces of the part to the nozzle.
- An airbrush toolhead with electronically controlled trigger and air supply.
- An enclosed, fume-managed workspace — initially a standard grow tent, later a rigid desktop enclosure.
- A modern dual-brain controller (Arduino UNO Q): Linux for planning and AI, STM32 for real-time motion and IO.
The whole system is fully open-source: CAD files, firmware, software, and documentation.
Every serious 3D-printer owner eventually wants to paint their prints. Today that means:
- Masking, priming, and painting by hand — slow, inconsistent, skill-dependent.
- Inconsistent finish quality across identical parts.
- No repeatable workflow.
Open3Dpainter automates this step. You place your part, select a preset, and the robot applies a controlled, repeatable coating while you do something else.
It is the logical "next module" in the desktop fabrication stack — the same way a laser engraver or pick-and-place machine extends what a 3D printer can do.
┌─────────────────────────────────────────────────────┐
│ GROW TENT / ENCLOSURE │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ OVERHEAD GANTRY (X / Y rails) │ │
│ │ │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ Slim robotic arm (Z) │ │ │
│ │ │ ┌───────────┐ │ │ │
│ │ │ │ Airbrush │◄ mist │ │ │
│ │ │ │ toolhead │ │ │ │
│ │ └──────────┬──────┘ │ │ │
│ └───────────────────┼──────────────┘ │ │
│ ▼ │ │
│ ┌──────────────────┐ │ │
│ │ Rotary table │ │ │
│ │ 3D-printed part │ │ │
│ └──────────────────┘ │ │
│ │
└─────────────────────────────────────────────────────┘
Key design choices:
- Overhead arm → zero desk footprint, full 360° reach around the part.
- Rotary table → eliminates need for complex arm IK for most spray passes.
- Grow tent first → existing ports for exhaust, air, and power; cheap; replaceable.
- MQTT-native → integrates with your existing home automation stack out of the box.
Open3Dpainter uses a Klipper-style split on the Arduino UNO Q:
┌─────────────────────────────────────────────────────┐
│ Arduino UNO Q │
│ │
│ ┌──────────────────────┐ RPC ┌───────────────┐ │
│ │ Linux MPU │◄────►│ STM32 MCU │ │
│ │ Qualcomm QRB2210 │ │ STM32U585 │ │
│ │ Debian Linux │ │ │ │
│ │ │ │ • Step/dir │ │
│ │ • Path planning │ │ • Endstops │ │
│ │ • Kinematics │ │ • Pump PWM │ │
│ │ • RL/ML control │ │ • Air valve │ │
│ │ • Web UI │ │ • Servo ctrl │ │
│ │ • MQTT / HA / │ │ • E-stop │ │
│ │ Node-RED │ │ • Safety IO │ │
│ │ • Job manager │ │ │ │
│ └──────────────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────┘
│ │
▼ ▼
Web UI / MQTT Stepper drivers
Home Assistant Servo / solenoid
Node-RED flows Pump controller
| Side | Chip | Responsibility |
|---|---|---|
| Linux MPU | Qualcomm QRB2210 | Planning, ML, UI, MQTT, integrations |
| Real-time MCU | STM32U585 | Step/dir, IO, safety, RPC at 50–200 Hz |
The Linux side never touches hardware directly. The MCU side never makes planning decisions. This clean split makes each side independently testable and replaceable.
The toolhead is designed as a self-contained, parametric module that mounts to the arm via a defined interface plane.
| Component | Spec / Example | Purpose |
|---|---|---|
| Gravity-feed airbrush | Iwata HP-C Plus, 0.3 mm nozzle, 7 ml cup | Primary spray tool |
| Servo trigger cam | Metal-gear, ≥ 3–5 kg·cm digital servo | Controls needle / paint volume |
| Air solenoid valve | 12–24 V DC, 1/8" port, 15–25 psi rated | Hard on/off of airflow |
| Quick-disconnect | 1/8" BSP airbrush QD with shutoff | Fast toolhead swap |
| Flexible air hose | 1/8" braided, 1–2 m | Air supply routing |
| Paint pump (opt.) | 5–12 V peristaltic, 5–20 ml/min | Remote reservoir feed |
| Toolhead clamp | Parametric 3D-printed (OpenSCAD) | Arm interface mount |
| Servo cam bracket | 3D-printed, servo-specific | Trigger actuation |
| Hose strain reliefs | Printed clips, 2–3 per arm | Cable/hose management |
Linux side sets: "spray 40% flow, 20 psi, 80 mm/s pass"
│
RPC to MCU
│
MCU controls: servo PWM → needle position (paint volume)
solenoid → air on/off (hard gate)
pump PWM → paint feed rate (optional)
Servo position controls paint; solenoid provides a reliable hard shutoff. Both are independently controllable so the system can feather paint, do dry air passes, or emergency-stop the spray instantly.
Open3Dpainter is designed to support three enclosure configurations:
Standard off-the-shelf grow tent used as the primary enclosure.
Why:
- Inexpensive (€30–€80 for a suitable size).
- Large working volume — plenty of room for the gantry and arm.
- Built-in duct ports for exhaust, compressed air, and power.
- Mylar interior reflects light and is easy to wipe clean.
- Available worldwide, no custom fabrication needed.
How it works:
The mechanical gantry frame and rotary table base sit on a rigid
freestanding base plate inside the tent. The tent is just a shell —
swap it out if it wears or if you want a bigger workspace.
Grow tent size recommendation:
60×60×120 cm minimum for the first prototype.
80×80×160 cm for larger parts or multiple turntable fixtures.
Custom aluminum-extrusion frame with polycarbonate clear panels — as shown in the concept patent drawings.
- Better rigidity and dimensional consistency.
- More professional appearance.
- Easier to seal and certify.
- Higher build cost and effort.
- Planned for
v1.0after the motion and paint process is validated.
Bare motion system, no enclosure.
- For dry-run motion testing and firmware development only.
- Not safe for real paint — no fume containment.
- Clearly marked as a non-production configuration in the docs.
| Axis | Description | Actuator | Notes |
|---|---|---|---|
| X | Gantry horizontal | NEMA 17 stepper | Overhead rail |
| Y | Gantry depth | NEMA 17 stepper | Optional for larger volume |
| Z | Arm vertical | NEMA 17 stepper | Height above part |
| A | Rotary table (part) | NEMA 17 stepper | Primary rotation axis |
| J1–J4 | Arm joints | Servo or stepper | Optional articulation |
For most paint jobs, X + Z + A is sufficient. Y and arm joints add reach for complex geometries.
open3dpainter/
│
├── README.md ← you are here
├── AGENT.md ← context for AI agents and tools
├── CONTRIBUTING.md
├── RELEASE_NOTES.md
├── LICENSE-HW ← CERN-OHL-W-2.0
├── LICENSE-SW ← MIT / GPLv3
├── LICENSE-DOCS ← CC BY(-SA)
│
├── .github/
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ └── ci.yml
│
├── hardware/
│ ├── mechanical/
│ │ ├── gantry/ ← overhead rail system
│ │ ├── arm/ ← robotic arm (3–4 DOF)
│ │ ├── fixtures/ ← part holders, jigs
│ │ ├── enclosure_desktop/ ← rigid box reference design
│ │ ├── enclosure_grow_tent_adapter/ ← tent mounting frame
│ │ └── BOM_mechanical.md
│ └── electronics/
│ ├── controller_pcb/
│ ├── power_distribution/
│ ├── schematics/
│ └── BOM_electronics.md
│
├── firmware/
│ ├── motion_firmware/ ← STM32 MCU: step/dir, IO, RPC
│ └── hardware_tests/ ← per-axis and IO test sketches
│
├── software/
│ ├── planner/ ← path planning, kinematics
│ ├── rpc_bridge/ ← UNO Q Linux↔MCU communication
│ ├── ui_web/ ← job control web UI
│ └── integration/
│ ├── home_assistant/
│ └── node_red/
│
├── docs/
│ ├── overview/
│ ├── assembly/
│ ├── calibration/
│ ├── safety/
│ ├── developer/
│ └── images/
│
├── examples/
│ ├── jobs/ ← example spray job configs
│ └── parts/ ← demo STLs
│
└── planning/
├── automated_airbrush_station_planning_v3.xlsx
└── Open3Dpainter_Project_Brief.pdf
| Item | Spec | Qty |
|---|---|---|
| Aluminum extrusion 20×20 | Frame and gantry | ~8 m |
| Precision linear rails + carriages | X/Y overhead gantry | 2 sets |
| Rotary indexing table | Motorized, NEMA 17 driven | 1 |
| Polycarbonate / acrylic panels | Clear enclosure walls | 6 pcs |
| Custom bracket plates | CNC-milled aluminum | 1 set |
| T-slot nuts, M3/M5 screws | Frame hardware | 1 set |
| Item | Spec | Qty |
|---|---|---|
| Articulated arm (3–4 DOF) | Carbon fiber tubes + machined joints | 1 |
| NEMA 17 stepper motors | Gantry and rotary axes | 4 |
| Iwata HP-C Plus (or equiv.) | 0.3 mm nozzle, gravity feed | 1 |
| Metal-gear servo | ≥ 3–5 kg·cm for trigger cam | 1 |
| Air solenoid valve | 12–24 V DC, 1/8" BSP | 1 |
| Flexible air hose | 1/8" braided, 1–2 m | 1 |
| Mini peristaltic pump | 5–20 ml/min (optional) | 0–1 |
| 3D-printed clamp + cam | OpenSCAD parametric | 1 set |
| Item | Spec | Qty |
|---|---|---|
| Arduino UNO Q | QRB2210 MPU + STM32U585 MCU | 1 |
| Stepper drivers | TMC2209 or similar | 4–6 |
| Custom carrier PCB | Drivers, IO, power distribution | 1 |
| 24 V DC power supply | ~500 W | 1 |
| Cabling harness | Color-coded, drag-chain rated | 1 set |
| E-stop + safety interlocks | Enclosure door + emergency stop | 1 set |
Full sourcing BOM with part numbers and cost estimates:
planning/automated_airbrush_station_planning_v3.xlsx
| Milestone | Goal | Status |
|---|---|---|
| v0 — Docs & repo | Publish repo, README, AGENT.md, planning docs | 🟡 In progress |
| v0.1 — Open-frame rig | Gantry + rotary + UNO Q firmware + minimal planner | 🔲 Planned |
| v0.2 — Grow-tent prototype | Full enclosure, airbrush toolhead, safety interlocks | 🔲 Planned |
| v0.3 — First community release | Reproducible BOM, assembly docs, basic web UI | 🔲 Planned |
| v1.0 — Stable release | Rigid enclosure reference, refined arm, full docs | 🔲 Planned |
See RELEASE_NOTES.md for detailed per-version changelogs.
| Target | Value (MVP) |
|---|---|
| Part envelope | 200–250 mm diameter, ~200 mm height |
| Positional repeatability | < 0.3 mm at nozzle tip |
| Coating repeatability | ± 10–15% film thickness |
| Setup time | < 15 minutes |
| Daily calibration | < 10 minutes |
| Maintenance interval | Every 1–2 hours of spray time |
| Working pressure | 15–25 psi |
| Default nozzle size | 0.3 mm |
Open3Dpainter is designed to live inside a modern maker automation stack:
| Tool | Integration |
|---|---|
| Home Assistant | MQTT topics for job status, control, and monitoring |
| Node-RED | Flow-based job triggers and paint automation logic |
| MQTT (Mosquitto) | Primary message bus for all device communication |
| Docker / Portainer | All Linux-side services run containerized |
| Arduino IDE | MCU firmware development and flashing |
| OpenSCAD (OHRBIT Suite) | All 3D-printed parts are parametric generators |
All state and control is accessible as MQTT topics. If it can subscribe to MQTT, it can drive or monitor Open3Dpainter.
Open3Dpainter uses a split licensing model:
| Layer | License | Covers |
|---|---|---|
| Hardware | CERN-OHL-W-2.0 | Mechanical CAD, PCBs, fixtures |
| Firmware & software | MIT (or GPLv3 if required) | MCU code, Linux planner, UI, tools |
| Documentation & media | CC BY 4.0 | Guides, renders, photos, PDFs |
In plain language:
- Modify the hardware designs → share your modifications under the same open license.
- Use or modify the software → no restriction, but credit the project.
- Share or remix the docs → credit the project.
- Build it commercially → you can. Just keep hardware changes open.
Contributions are welcome across all layers: hardware design, firmware, software, documentation, and examples.
Please open an issue first for any significant change so we can discuss direction and interfaces before implementation.
See CONTRIBUTING.md for full guidelines on:
- How to structure hardware contributions (OpenSCAD, STEP, KiCad).
- Firmware conventions (keep MCU thin, push logic to Linux).
- Software conventions (Python 3.10+, PEP 8, YAML config, MQTT-native).
- Commit message format and PR process.
This project involves:
- Moving machinery — overhead gantry and rotating arm.
- Compressed air — up to 25 psi.
- Atomized paint and solvents — ensure adequate ventilation.
- Mains-powered equipment — 24 V DC from AC mains.
Do not run with real paint without:
- Adequate ventilation or active fume extraction.
- Safety interlocks and E-stop wired and tested.
- Personal protective equipment (gloves, eye protection, mask).
- Compliance with local regulations for spray painting.
The grow-tent prototype configuration relies on the tent's existing duct ports for fume management. You are responsible for ensuring your installation meets local safety standards.
[██████████░░░░░░░░░░░░░░] Planning & early design — v0 in progress
- ✅ Concept defined, patent-style drawings completed
- ✅ Control architecture finalized (Arduino UNO Q)
- ✅ Toolhead BOM researched
- ✅ Open-source license structure defined
- ✅ Repository structure, README, AGENT.md, CONTRIBUTING.md live
- ✅ Project brief and outreach letters drafted
- 🟡 GitHub repository going live
- 🔲 First hardware prototypes
- 🔲 First firmware release
- 🔲 Community builds
Open3Dpainter builds on the shoulders of many open projects and communities:
- Marlin, Klipper, RepRapFirmware — for proving that open motion control is possible and reliable.
- Arduino — especially the UNO Q dual-brain platform that makes this architecture clean and accessible.
- PAROL6, LowiekVDS 6-axis arm, BCN3D arm — open robot arm projects that prove 3D-printed arms can be precise enough.
- FRIDA (CMU), Third-Hand-Research Spraycan-Actuator — for prior art in robotic spray painting.
- The 3D printing and maker community — Printables, Hackaday, Reddit r/3Dprinting, and everyone who builds in public.
- Early collaborators contributing robot arm designs and reinforcement-learning controllers.
Open3Dpainter — made in Hagen, Germany 🇩🇪
Open hardware · Open software · Open to contributors

