PIErography

Homepage

PIErography

PIErography is a 3-axis GRBL-controlled CNC pyrography machine that burns vector designs into wood using a heated tip

Project Summary

In two months our goal was to design and build a CNC wood burning machine that can accurately burn custom designs onto wood surfaces. The system will use Grbl firmware to control X, Y, and Z-axes via stepper motors.

CAD of Project

Final CAD Image

Final Product Image

Final Product Image

Machine in Action

What It Does

Specs at a Glance

How It Works

  1. Design is imported (SVG / DXF).
  2. CAM generates g-code (Fusion / Inkscape / other).
  3. GRBL executes motion while the heated tip burns the path.

Team

PIErography team with CNC wood burning machine

Team Members

Alana Palmer

Alana Palmer

Mechanical Design

Annika Baldwin

Annika Baldwin

Mechanical Design

Lea Voytovych

Lea Voytovych

Electrical & Software

Zarin Sikder

Zarin Sikder

Mechanical Design & Project Website


Data and Energy Flow

Data and Energy Flow Diagram

Data and Energy Flow Diagram

Power Distribution

Most of the power in the system is distributed through the proto board. The power supply provides 24 V, and the 3 motor drivers connect to it via the proto board. During use, we usually saw around 0.54 A being drawn, giving us around 13 W total supplied from the power source to the stepper motor drivers.

The drivers then regulate up to around 2 A per motor phase with that higher supply, resulting in a lower effective coil voltage (around 3 to 5 V) and an average power draw of around 4–10 W per motor, depending on load and motion. 10 W is more of an upper limit; during typical use, it is closer to 4–5 W each.

The computer powers the Arduino separately via USB connection, sending roughly 1–2 W (5 V × 0.1–0.25 A). The wood-burning tool also has its own supply, providing 27 W of power.

Control and Data Flow

The computer also sends and receives commands and data to/from the Arduino through the same USB cable. The Arduino then connects to most other components, since it is the controller of the system. It sends commands to all 3 stepper motor drivers, telling them which direction to move, how quickly, and how far. The drivers convert those commands into regulated coil currents and send them to the stepper motors.

The 3 limit switches send data back to the Arduino; when a switch is triggered, it trips an alarm in the code.


Software

GRBL and UGS Control

Our system runs on GRBL, controlled by UGS. The first thing we had to do was download GRBL’s open-source git repository, and flash it onto an Arduino Uno. We learned that it was designed for more basic models, like the Uno, after originally trying to use an R4 and proving unsuccessful.

For our interface, we used Universal G-code Sender, another free open-source software. UGS allowed us to send commands to the Arduino to do a few different things. We could write G-code to control the motor movements, or send commands to check and edit certain settings.

UGS also has some other quality-of-life features, such as a simple ‘jogging’ control that allows for easy, controlled movements in one direction at a time, which was great for testing, debugging, and calibration.

Motor Calibration and Tuning

To calibrate our motors to our program, we moved the motors a certain distance, then measured the physical distance travelled. We compared how far it had actually moved to how far it believed it had moved (the number shown on-screen).

We then divided that actual by the expected and multiplied it by the previous setting for ‘steps per mm’. We sent a command reassigning that value, and tested again to make sure it was calibrated well.

We also tried setting various speeds and accelerations, to see what would be efficient without compromising functionality and accuracy. These were all set through UGS’s command terminal, with fairly simple commands like $100=79.8 (setting the steps per mm of the x-axis motor to 79.8).

Generating G-code from Images

There are a few different ways to generate g-code from images. The way we first tried wasn’t very efficient and a bit difficult to use. First, we’d vectorize an image in a program like Adobe Illustrator, tweaking settings to try and get the cleanest, most accurate lineart we could.

Then, we’d save that .svg file and open it in another program that could convert vectors to g-code, such as Inkscape (I do not recommend using Inkscape, it was difficult and frustrating). We’d change some settings, such as “tool shape” and “penetration depth”, as if it were a mill. Then, we could create our g-code, save it, and open it in UGS. We then pivoted to using Fusion. In Fusion, the image can be imported directly and used to generate an engraver toolpath within the manufacturing workspace, eliminating the need for an external vector to g-code software. By selecting an engraving operation and defining parameters such as tool geometry, cutting depth, and feed rate, Fusion automatically generates a clean, efficient toolpath. The resulting g-code can then be exported and opened directly in UGS.

Software Tests

Final Code Design Elements


Project Repository: GitHub Link


Circuit Design

The power supply’s positive and negative terminals connect to the proto board, in order to power the TB6600 stepper motor drivers. Wires run from the GND terminal of each of the motors to connect to the power supply negative. For the positive, they connect to VCC. Then, the stepper motors each connect to their respective drivers with the A+, A-, B+, and B- terminals, passing along commands via regulated coil currents.

The ‘Signal’ group of terminals on the motor driver is where connections to the Arduino are made. There is a positive and a negative PUL terminal, the positive connecting to the ‘step pulse’ pins on the Arduino (2-4, defined in GRBL) and the negative to the Arduino ground. There is also a positive and negative DIR terminal, the positive connecting to the ‘direction’ pins on the Arduino (5-7, also from GRBL), and the negative going to the Arduino ground as well. Because all the things that connect to the Arduino also need to connect to the Arduino ground, it is connected to a row on the proto board that many things can fit onto. All of these connections allow the motors to be controlled by the computer software / user, using G-code in UGS.

The micro switches are also connected to both Arduino pins and ground. They’re wired as NC for safety and to reduce risk of electrical interference or other errors. The COM terminals connect to the Arduino ground row, and the NC terminals connect to the ‘limit switch’ pins on the Arduino (9, 10, and 12, also from GRBL).

Circuit Diagram

Mechanical Aspects

Exploded view of mechanical assembly

The mechanical design prioritizes rigidity, repeatability, and ease of assembly. All CAD was developed in Onshape, which allowed the team to iterate quickly. The frame provides a stable reference plane for consistent burns, while belt-driven X and Y axes enable fast planar motion. A lead-screw Z axis was used to control burn depth and maintain consistent tool contact with the workpiece. Components were intentionally designed to be modular to support iteration, including swapping motors, re-tensioning belts, and adjusting the tool mount. Parts were fabricated using a combination of 3D printing and laser cutting, with structural elements cut using band saws and horizontal band saws to achieve accurate lengths and clean edges.

Frame

Design Concepts:

We built the frame out of 80/20 aluminum extrusion because it was lightweight, strong enough for what we needed, and honestly because we already had a lot of it available as scrap in the Olin shop. Using extrusion also made the build way more modular, since you can slide T-nuts around and reposition parts without having to remake everything. It also helped a lot with iteration because whenever something didn’t line up, we could loosen a few brackets and adjust instead of starting over.

Another big reason we liked the extrusion is that it’s super easy to cut to length on the band saw, so resizing the frame or replacing a piece didn’t feel like a huge commitment. For assembly, we mostly used corner brackets and T-nuts to connect the extrusion pieces. At first, we thought the bracketed joints would be rigid enough, but once the machine started moving (especially faster moves), we realized the structure still had some wobble/racking that was hurting repeatability. To fix that, we laser cut extra corner gussets/brackets and added them at key joints to triangulate the frame and add stiffness. That made a noticeable difference in how “solid” the machine felt.

Extrusion also helped a lot with wire management. Since it has built-in channels, we could route wires through the slots instead of having them dangling everywhere, which made things cleaner and also reduced the chance of wires snagging while the gantry was moving. We also used T-nuts to mount the linear rail directly onto the extrusion, which made mounting really flexible and helped us get alignment without drilling a bunch of holes. For the X-axis idler pulley mount, we were able to integrate an aluminum extrusion rail into the design, which gave us a stronger mounting reference and helped keep that end from bending.

Finally, we tapped the bottom of the extrusion so we could screw in rubber feet. That helped with leveling, reduced vibration, and made the machine sit more securely on the table.

CAD of Frame Frame photo 2 Frame photo 1

Base Board

Design Concepts:

For the base of the machine, we laser cut a pegboard sheet to act as the work surface. We chose pegboard because it already has a consistent hole pattern, which makes it easy to mount accessories and gives a built-in grid for clamping anywhere on the board. To make the board actually usable for fastening, we installed wood T-nuts on the underside. That gave us strong threaded mounting points without needing to access the bottom during every setup.

To hold down workpieces, we laser cut clamping bars that span across the T-nut locations. Each bar extends just onto the top face of the wood, so it presses down near the edge of the part instead of covering the design area. We added long slots in the bars rather than fixed holes, which made the clamp positions adjustable. That way we could rotate the bars, slide them closer or farther from the workpiece, and clamp in different orientations depending on the part geometry.

A big design goal was keeping the clamping system low-profile. Since our tool moves close to the surface, tall clamps would risk collisions or reduce the usable area. By using thin laser-cut bars and keeping the hardware compact, we reduced the chance of the Z-axis or pen mount hitting the clamps during a burn. This also made it easier to burn pieces that were close to the edges of the board.

Another benefit of this setup was flexibility for weird shapes. Flat rectangles are easy to clamp, but irregular pieces can shift or vibrate during long burns if they’re only held in one spot. With the pegboard + T-nut grid, we could add multiple clamps at once and place them wherever we needed, which helped prevent rotation, sliding, or lifting. If a workpiece had a slight warp, we could clamp at multiple corners to force it flat against the board, which improved consistency in burn depth.

In practice, this was one of the parts that made the machine feel “usable” instead of just “functional.” It made setup faster, it let us swap parts without redoing the entire layout, and it gave repeatable positioning because we could reference the hole grid each time. If we had more time, we would likely add reference features (like a printed/etched coordinate system or a physical fence) so that aligning a piece to a known origin was even quicker and more repeatable.

CAD of Base Board Base board photo 1 Base board photo 2 Base board photo 3

X-Axis

Design Concepts:

For our x-axis, we started out with the basic idea of having an idler pulley on one side and a stepper motor driving the pulley on the other side. We wanted to attach the pen holder to the belt so that it would move along the x-axis as the motor moved the belt. To make sure that it would be secure, we added the mounts for the rail.

We were originally planning on having each side supported by the same linear slide, but we found that each rail introduced a lot of friction into our y-axis movements, so we changed to a slider that mounted onto the extrusion. This made it so that we had to change the base of the mount so that it would be able to fit on the new slider.

We extended the slots for the motor to allow it to slide back and forth. This would allow us to tension the belt. We also added a wall on the side with a screw hole in it which would allow space for a press plate that could be screwed in or loosened to apply more or less pressure to the side of the motor, for tensioning.

When we tested the early versions of the x-axis, we had the motor and the idler pulley much lower down and they were at the edge of the mount. To make the spacing work better with the z-axis, we had to move the pulleys higher and further in. As a result, we found that we needed much more support in a lot of key areas when testing our design.

The tension from the belt was causing the idler pulley support to bend inwards and we were worried that the axle it was on would snap. We also noticed that when we would push on one side, the other side would lag behind slightly, resulting in a noticeable gap when the side we were pushing on would reach the end of the y-axis.

We figured that this was a result of the shallow supports for the rail as well as the pliability of the 3D prints. We also noticed that moving the motor in made supporting the face it was mounted to much more difficult since there was a screw hole right next to the motor’s side. Since the other side of the motor hung out over the edge of our machine, the best side to support the face on to prevent bending was the one that was over the screw hole.

After our initial testing, we made a bunch of adjustments to improve the stability. First, we changed the depth of the rail supports from 5 mm to 10 mm and added support holes that we would be able to run a metal axle through to provide more stiffness without losing more workspace to the rail being pushed further into the mounts.

We also added a second side for the idler pulley mount and changed it so that the axle would no longer be 3D printed and would instead be a metal axle that we would put in after the print. Lastly, we added an I-beam under the motor so that it would no longer be hanging off the back of the mount, and we added a roof to the motor mount which would connect it to a wall that was perpendicular to the mount, allowing for better support.

As a part of some final adjustments after more testing, we added a slot on top of the rail mount for the limit switch to go in and a slot on the side of the mount to allow for wire management. We also added holes into the top of the motor mounts so that we would be able to see if the rails were fully pressed into the mounts.

Finally, we extended the rail mount holder further back. After the initial testing, we also added the belt mount on the side of the motor mount, which would allow it to be mounted to the y-axis belt so that it could be moved back and forth.

After doing more testing, we found that the 3D print tolerancing was causing issues where the distance between the two sides of the mount was slightly less than that of the rail length, so the rail would be pushing the two sides apart, causing issues with movement and leveling. We also extended the back part of the rail mount holders back to allow for better support for the rail holder. This also allowed us to support the pulley walls on the idler pulley side, so they would be less likely to bend.

X-Axis CAD X-axis photo 1 X-axis photo 2 X-axis photo 3 X-axis photo 4

Y-Axis

Design Concepts:

The Y-axis mounts were designed to clamp onto the aluminum extrusions while also allowing belt tensioning. We added slots into the design so we could adjust tension by shifting parts slightly rather than being locked into a single position. That ended up being important because belt tension made a huge difference in how smoothly the axis moved and how much backlash we got.

To attach the mounts to the extrusion, we added press-fit style protrusions that line up with the extrusion profile. The goal was to make it easier to assemble and keep everything square without needing a bunch of extra hardware. We also learned pretty quickly that if the Y-axis isn’t level, the whole machine feels “off” and the motion gets inconsistent, so the base of the 3D print had to be thick enough to keep the axis aligned and stiff. Since that thickness adds weight and extra 3D print time we added light-weighting cutouts to remove material where it wasn’t doing much structurally, so the part stayed strong but didn’t feel unnecessarily bulky.

For the limit switch placement, we mounted it on the motor side because it was closer to the motor box, which reduced wiring complexity and kept the switch wiring shorter. That also made it easier to route everything through the extrusion slots instead of running wires across open space.

Looking back, one improvement would be adding more fillets—especially in the direction the belt pulls. The belt applies a lot of force in a pretty specific direction, and some of our sharper corners / thin features were definitely stress concentrators. More fillets would make those areas less likely to crack or snap over time, especially since 3D printed parts are more sensitive to stress concentrations.

Y-Axis CAD Y-axis photo 2 Y-axis photo 3

Z-Axis

Design Concepts:

The Z-axis assembly moves the wood burner up and down and is the part that is connected to and moves on the x axis.

Design needs

First, we determined the design needs for the Z-axis mount. It had to attach to the linear slide on the x axis, clamp the ends of the pulley, hold the wood burning pen, and be able to move the pen up and down. We wanted the Z-axis mount to be small and lightweight so the other axes had less mass to move. When testing the woodburner, we found that the depth of the wood burning tip into the wood had a large impact on the line produced. We knew we needed precise control of the pen, and it had to be sturdy and easily adjustable. We determined a lead screw would be best for this.

Fundamental design

The fundamental design for the Z-axis mount is a woodburning pen clamped into a slider that rides on support rails and is moved by a lead screw. A motor is attached to the lead screw with a coupler. A mounting piece holds the rails and the motor in place. The back of the mount has holes to attach to the X-axis linear slide and a clamp for the belt.

Manufacturing

We considered using a mill to make the mount and slider so that the holes could be precisely positioned, reducing friction and instability. This would have been very time consuming and difficult to iterate on, so we looked at 3D printing instead. The rods and 3D prints would have some give to them and we designed the slide to be tall enough to not be able to rotate and jam on the rods, so it is not crucial to have exact precision. We decided to go with 3D printing the mount and slide.

Sizing

We debated a lot about the travel length of the Z-axis. We wanted a enough movement to allow for different thicknesses of wood to be used in the machine, but not make the assembly too tall and unstable. The shortest lead screw available was 100mm, which was close to the length of the axis we wanted, so we designed the mount around it.

Rod mounts

We were able to get free metal rods that were about 95mm and thought it would be easy to use them. The first problem we ran into was the coupler and motor shaft adding length at the top of the lead screw such that our rods couldn’t span the whole distance. Our first design had a large block that offset the motor and shaft collar to counter this.

We were not able to find bolts that exactly matched this size so we couldn’t attach the motor. It also would have been very difficult to get the bolts in with this configuration. We tried another design where the motor mount was thinner and there were parts extending out for the rods.

Ultimately, we decided this was not necessary and got longer rods that we could cut to length to match the motor mount.

Hole tolerancing

Another problem we ran into was tolerancing the holes for the rails. The mount needed to have a tight press fit to keep the rod in place and the slider needed to be just loose enough to slide easily without wobbling. We tried printing the pieces then drilling out the holes to exact size, but this melted them and made the holes worse. We printed a test piece with different holes to see which would be the best fit for each.

We somehow read test piece upside and backwards, and made the holes way too big on the next print. With a little more brainpower, we got a perfect fit.

If we had more time we would add something to secure the rods in place other than a press fit. The press fit was good at first, but wore out over time, allowing the slide to move the rod and fall out of place.

Slide and wood burner clamp

Our teaching team raised a concern about the tip of the wood burner getting caught when it hit different grains in the wood and recommended adding some compliance to it. We thought about using springs or elastics, but figured it would be difficult to make it stable enough. We decided to mount the pen in a sponge. Unfortunately, the two sponges we tried shrunk and hardened when they were dry. The sponge had to be clamped extra tightly, but it still came loose over time. If we had more time we would have tried different kinds of foam. The sponge also may not have been needed at all, because there was enough play in the rest of the machine.

3D printing

When designing the parts, we kept in mind how they would be 3D printed. We decided to print the mount on its side so the filament layers were strongest across the height of the piece and supported the top and bottom. We printed the slide flat so that the holes were as smooth and consistent as possible. The areas that needed precision could not be printed with supports.

Belt clamp

On the back of the Z-axis mount there is a small channel that the two ends of the belt rest in. Two other pieces have grooves in them that match the teeth of the belt. They are bolted to the mount, clamping the belt in place.

Limit Switch

We added a limit switch at the bottom of the axis to make zeroing to the lowest point easier and stop the tip of the wood burning pen from hitting something and breaking. At the end of the project, we learned that it would have been better to mount it to the top since the pen should not have to go all the way down to zero. While testing, there were a few times where the slide was raised too high and hit shaft coupler, binding it and getting stuck. We had to use pliers to get it loose. A limit switch on the top would help prevent this. Ironically, a previous design with the rod standoffs would have had a better hard stop that also prevented binding.

Z-Axis CAD Z-axis photo 1 Z-axis photo 2 Z-axis photo 3 Z-axis photo 3

Electronics House

Design Concepts:

We made the electronics house to keep all of the electronics in one organized place: the TB6600 drivers, the proto board, and the Arduino. Early on, our wiring was kind of chaotic, and troubleshooting was taking forever because we couldn’t easily track what was connected where. Having a dedicated enclosure made it way easier to wire everything cleanly, label things, and quickly access components when something wasn’t working.

Inside, we laid it out so the motor drivers each have their own “shelf” row, because each driver needed similar wiring and it helped us keep the wiring grouped by axis. Then we mounted the Arduino and proto board up top like a service section, since those were the things we were constantly touching while debugging GRBL, changing pin connections, or checking ground routing.

We laser cut the motor house out of MDF because it was fast, easy to iterate, and stiff enough for an enclosure. MDF also worked well because we could cut precise slots/holes for wires and mounting points without needing complicated manufacturing.

Looking back, even though having exposed wires was nice for troubleshooting, the final design would be better if the box was bigger and more enclosed. A door or cover would make the machine look way cleaner and also protect the wiring from getting snagged or bumped. Ideally it would still be easy to open when we need to debug, but closed during actual operation so everything is protected and hidden.

Motor House CAD Motor house photo 2

Prototype

It all eventually came together!

Prototype Gallery


Budget Breakdown

Overview

Estimated spending is what we would have spent if we purchased every item (including items that were found/borrowed). Total spending is what we actually paid out-of-pocket.

Budget Summary

Budget Item Amount ($)
Project Budget $250.00
Estimated Spending (if purchased all parts) $598.83
Total Spending (actual) $225.78
Amount Left $24.22

Bill of Materials (BOM)

Part Name Qty Unit Cost ($) Total Cost ($) Estimated Cost If Purchased ($) Vendor/Source Link Notes
80/20 Aluminum Extrusion 1 $47.35 $0.00 $47.35 Shop Link found
Limit Switches 3 $2.99 $0.00 $8.97 PIE Bins Link found
GT2 idler pulley 2 $8.99 $0.00 $17.98 Mech Proto Link found
GT2 pulley with set screws 2 $3.75 $0.00 $7.50 Mech Proto Link found
1/4" Peg Board 1 $25.88 $0.00 $25.88 Shop Link found (8" x 12")
1/8" MDF 1 $1.25 $0.00 $1.25 Foundry Link found (8" x 12")
Heat Set Inserts 1 $18.63 $0.00 $18.63 Mech Proto Link found
M4 Nut 1 $13.24 $0.00 $13.24 Shop Link found
M3 Nuts 1 $11.58 $0.00 $11.58 Shop Link found
Wood T Nuts 1 $11.59 $0.00 $11.59 Mech Proto Link found
HGW15CC linear slider with 350 mm rail 1 $8.87 $0.00 $8.87 Prof Jesse Link found
HGW20CCZAC linear slide with 340 mm rail 1 $91.75 $0.00 $91.75 Jesse Link found
10 Series 3 Slot Mount - Double Flange Short Standard Linear Bearing with Brake Holes 1 $64.10 $0.00 $64.10 Shop Link found
1/4" steel rod 1 $5.42 $0.00 $5.42 Shop Link found
Screw-in rubber feet 1 $7.08 $0.00 $7.08 Shop Link found
Black PLA 1 $22.99 $0.00 $22.99 Foundry Link found
Tight-tolerance aluminum rod 1 $8.87 $0.00 $8.87 Mech Proto Link found
Nema 17 Stepper Motor 2 Phase 1.8° 0.6Nm 3 $17.09 $51.27 $0.00 Amazon Link ordered
3 PCS of TB6600 Stepper Motor Driver 1 $24.99 $24.99 $0.00 Amazon Link ordered
Arduino UNO R4 WiFi 1 $27.50 $27.50 $0.00 Amazon Link ordered
GT2 Timing Belt Pulley 20 Teeth, 5mm Bore, for 6mm Width Belt 1 $6.99 $6.99 $0.00 Amazon Link ordered
Wood Burning Tool 1 $39.99 $39.99 $0.00 Amazon Link ordered
20 Sets Silver 2020 Corner Bracket Kit 1 $14.64 $14.64 $0.00 Amazon Link ordered
2PCS Shaft Coupling 5mm to 8mm Aluminum Alloy Joint 1 $8.54 $8.54 $0.00 Amazon Link ordered
100mm Length T8 8mm Dia Lead Screw Rod 1 $9.99 $9.99 $0.00 Amazon Link ordered
NICE-POWER DC Power Supply 1 $30.39 $30.39 $0.00 Amazon Link ordered
Cable Sleeve 1 $8.99 $8.99 $0.00 Amazon Link ordered
Sponge 1 $2.49 $2.49 $0.00 Roche Bros Link ordered