Paint CNC

I have always loved art, but I am not that good at creating it. The other day I was in the Guggenheim and saw some of Georges Seurat pointillist art. Knowing I do not have the patience to put tons of dots on a canvas, nor the perfect hand eye coordination, I set out on a journey to create a machine to do it for me. This project was my way of combining my love of engineering with a visual artistic outcome.

Hardware

CNC Frame

CNC Frame

The frame of the CNC is quite large — 40x40 inches — which honestly happened because I messed up converting millimeters to inches. The structure is made from 4020 extruded aluminum, giving it decent rigidity and a good mounting surface.

Side Gantry

Side Gantry

It uses a CoreXY motion system, which allows both X and Y axes to be controlled by two stationary stepper motors. This design is elegant and keeps things lightweight on the moving gantry, but as I found out, it doesn’t scale super well to large dimensions like this. Originally with a frame of about 24 inches it would have been a rigid enough motion system. The belts overlap somewhat near the side gantry which every once in a while causes friction. If I were to redo the frame I would keep it to a simple Cartesian motion system.

The side gantry is built from off-the-shelf rollers that ride in the groove of the aluminum extrusions. These were mounted to 3D printed parts that made it easy to get the exact shape I needed.

After finalizing the frame and motion system, I moved on to designing the tool head and electronics.

Tool Head

Tool Head

The tool head includes a basic Z-axis drive with a rack and pinion system to press a syringe down for paint application. It’s a simple setup and requires manual loading/unloading of paint. I originally wanted the ability to switch out tool heads for different projects, which is why the shape is larger than is needed for the syringe holder.

Electronics Box

Electronics Box

The electronics were fairly simple: three limit switches (one for each axis), an emergency stop button, and a control system where a Raspberry Pi sends commands to an Arduino running GRBL. The motors are standard NEMA17. I went with the cheapest motors I could find, which I think resulted in a very limited torque. This limited torque led to some persisting motion control issue.

Final Build

Final CNC Build

Here's a look at the completed build:

Now that the hardware was done, it was time to figure out the software side — and how to translate digital designs into physical dot art.

Software

The Arduino runs GRBL, configured for my CoreXY setup. On the Raspberry Pi, I wrote a few key Python programs: jog.py to manually move the machine and get it into position, syringe_stepper.py to control the syringe stepper motor for paint, and gcode_sender.py to send G-code to GRBL.

I initially wanted to convert full images into a pixelated version for painting, but due to the large paint dot size, the resolution was too low for meaningful detail. That program is still available and can be accessed on my website:

I pivoted to building a simple GUI where I could manually place paint dots and then convert them into G-code. The G-code generator is rudimentary — it processes row by row, which isn't optimal if colors are scattered. But since there are only around 2,000 possible dots, the inefficiency isn't a huge problem. You can read more about the implementation and code on my GitHub:

Once the software was working, I ran a few test prints and started seeing real results. I plan on continuing with the image process using outline features to turn images into pixelated art that my machine can print. You can view all the programs and any updates on my GitHub.

Outcome

It works! After a lot of debugging and tweaks, the Paint CNC finally started creating real, physical dot-matrix art.

Live Demo — CNC Painting

Here are a couple before/after shots of the GUI design vs the actual painting:

One major issue I ran into is the amount of motion in the gantry while painting — I think this is due to the belt design and how oversized the machine ended up being. CoreXY at this scale might not be the best choice.

Overall, the machine proved that it could work — and pointed out a lot of areas where I could improve.

Reflections

This was a really rewarding project. It combined mechanical design, electronics, and programming. I'm still using the CNC to make more complex paintings and continue refining the software, especially trying to improve image-to-dot-matrix conversion.

In hindsight, a smaller machine would have been better suited to CoreXY mechanics. I'd also love to remake some of the parts out of metal or more rigid materials to reduce wobble and increase precision.

One big hardware limitation is the Z-axis — it moves on rollers without true linear guidance, which introduces play and reduces accuracy. Fixing this with proper linear rails would help a lot.

I loved working on this project. It’s a great mix of hardware and software, and I’m excited to see what I can make with it next.