Archive for the ‘ projects ’ Category

New CNC Cut : Anchorage To Talkeetna

When I was at our family’s cabin in the Talkeetna (Alaska) area last, my father gave me some birch from our property he’d felled, milled, and planed.  I brought that back to CA, and for the longest time have been thinking what to cut on it.

Realized it would make a great Christmas gift to give it back to them with some art.

As a test piece, since I’d never used this wood before, I turned some clouds from the SW corner of Jupiter’s Great Red Spot into a height map, and cut that.  It took 9 hours with rough + finish, mainly because of all the height variation and the 1/8″ tapered ballnose I used for the finish:


Armed with that test success, I moved onto my next piece.

Using terrain2stl, I captured the terrain between my hometown (Anchorage) and the region our cabin is at (Talkeetna).  I cleaned this up in Autodesk Maya, added the text, and send this to MeshCAM where I generated the toolpath for my X-Carve CNC:

anch2talkeet_beauty_web anch2talkeet_angle_web

After a combined 6 hours for the rough, finish (both with a 3-flute upcut .25″ ballnose endmill), and pencil cleanup (on the text, with 1/8″ tapered 2-flute upcut ballnose) passes I did some sanding, stained it, then applied the paint for Cook Inlet, and the major rivers in the area.  Measure over a foot wide, and around 30″ tall.

Turned out beautiful, and I look forward to seeing it at our cabin next time I’m up there.

New 3D Printer: Tevo Little Monster + Duet Conversion

For some time I’ve been considering the purchase of a delta 3d printer.  After much research, I settled on a Tevo Little Monster (TLM below).  It was a bittersweet purchase, since I had to sell my first printer (after 5+ years of ownership), my Makerbot Replicator (original), to both make capital, and make some room for it.

Tevo Little Monster and the C-Bot: New best friends.

Tevo Little Monster and the C-Bot: New best friends.

This blog post is mainly written as a resource to myself to track info, troubleshoot problems, and list upgrades.

TLM Links:

TLM Pros:

  • Price:  I picked it up for $750 and free shipping.
  • Print Volume:  The machine is a beast: 45″ tall (without the spool holder, which makes it even higher), with a diameter of around 23″. It has a print volume of roughly:
    • 500mm tall (I was able to squeeze out 510mm)
    • 350mm diameter.
  • One of the main reasons I bought this printer was is ‘beautiful in simplicity’ construction: Despite the size listed above, the frame is only made up of 5 parts:  The 3 OpenBuilds C-Beam style extruded arms that connect to the top/bottom plates.  Everything was cut to the same length, and it was square immediately after bolting it together with no adjustments.
  • Integrated BLTouch in the delta effector.  Docs here.
  • 120v AC bed with SSR: ‘Nuff said.
  • Elegant electronics boxes and power cabling.
  • A ‘hanging bowden’ style extruder:  Keeps the mass directly off the delta effector, and decreases the bowden tube length significantly.  Based on experience, I dislike bowden’s and the blobs they produce.

TLM Cons:

  • MKS SBase V1.3 : While it runs Smoothieware and comes with a small touchscreen, I’ve heard quite a few problems from people running this knockoff Smoothieboard.  It also uses integrated DRV8825 steppers, which historically aren’t the best choice for 3D printers (needing separate ‘TL Smoothers’ to help remove artifacting).
  • Knock-off hotend and extruder:  While these are based on the E3D-v6 hotend and Titan extruder, they’re complete knockoffs.  And they gave me more grief than anything else stock on the bot:
    • The knockoff Titan extruder started squeaking in the first month.
    • The PTF fitting in the knockoff heatbreak disintegrated, dropping metal chunks into my filament path.  I didn’t realize this until taking the whole thing apart and shinging a light in there, and seeing stuff reflect back.
    • I didn’t realize it at the time, but it appears that the heatbreak isn’t all metal (like a standard E3D) : It had some sort of plastic liner.  Later, that liner failed, and completely jammed it.
    • I’m not sure the ‘.4mm nozzle’ was really .4mm at all.  After swapping to a legit .4mm volcano nozzle, I noticed an improvemnt in print quality.
    • Basically, ditch that entire hotend for the real thing and save yourself a bunch of pain.
  • The bed isn’t removable. However, you have plenty of access to it, so I don’t feel removing prints from it should be an issue.  And since it’s mounted directly to the base of the machine, I don’t see any calibration issues if I have to really pull on the print to get it off.


First thing, the knock-0ff Smoothieboard had to go.  My C-Bot has been running RepRap Firmware on a RADDS setup for some time, so for this bot, it was time to get the real deal:  A Duet Ethernet with touchscreen.



  • Remaining parts of a real E3D-v6 Volcano Hotend (hotblock, heater cartridge, and thermistor)

Duet Pros

I can’t say enough good things about the Duet ecosystem.

  • 32 bit processor, no delta computation speed issues.
  • Live tuning of nearly every value:  Via the Duet Web Interface (or any connected gcode sender) you can live tune nearly ever firmware setting.
  • Updating firmware is as easy as uploading a single file.  No pre-compile (or Arduino IDE) necessary.
  • Integrated steppers + 1/256 silence : The integrated TMC2660 drivers, when driven at 1/16 microstepping uses their ‘microPlyer’ tech to interpolate to 1/256 : The loudest thing on the machine is the PSU’s fan.  Creepy quiet.  you can check out their pdf datasheet here for more techy-info, or this forum post.
  • RepRap Firmware : Having used Marlin, Repetier, and Sailfish firmwares in the past, RRF is hands down my favorite.  Super easy to edit, and create custom macros.
  • Duet Web Control (DWC) : Comes with its own web-server, similar to Octoprint, but specifically for the Duet hardware.
  • Actively developed, active community/forum.

Duet Links

RepRap Firmware Links

Assembly Notes

The assembly of the TLM took a little under three hours with the help of a friend, following the printer instructions that came with it.  Nothing was missing, nothing went wrong.  The only think that took a chunk of time was rewiring the electronics to plug into the Duet.

  • For setting up the TLM with the Duet, this is the assembly guide I used: : This was a lifesaver!  Used all their firmware configurations by default.  There’s also a forum post here that discusses this conversion.
  • Had to rewire the endstops:  The order of the wires that plug into the Duet are a very different order from the wires that plugged into the MKS SBase, and are an even different order than how they plug into the endstops themselves.  Tracking this order is (obviously) really importing when rewiring them!
  • All the other connectors that plugged into the MKS SBase plugged directly into the Duet, except I had to cut off the side-clips so they could slide into the Dupont conectors correctly.  A combo of side-cutters and exacto-knive
  • BLTouch :
    • Had two sets of wires:  One needed entirely rewired to plug into the Duet expansion pin, while the other needed trimmed & rewired to a single plug, since the other wires weren’t needed.
    • Had to cut the trace on the board (after removing from the delta effector) to switch it from 12 to 24v.
  • I needed to switch the PSU from 220v to 110v, based on where I live.
  • As it turns out, the thermistor for the heated bed was bad: I kept getting 9000 deg reading from the firmware.  However, and somewhat coincidentally, they shipped with an extra thermistor;  I taped it to the bottom of the silicon heater, and it was up and running.
  • The top of each of the tower carriages has a small set-screw that is what trips the optical endstops.  I hadn’t done any adjustments to these:  They ‘looked’ ok.  A few weeks of printing later I checked them with my calipers, and they were up to 1.5mm off from each other, and felt loose in their threads:  I removed them all, applied blue threadlocker, and  screwed them in so a consistent amount was sticking out the top (6mm seemed like a good number).

Slicer Configuration

I use Simplify3D as my primary slicer :  It actually has a built-in preset for the TLM : Help -> Configuration Assistant -> Select Printer -> Tevo Little Monster.

I only had to modify a few things to start:

  • In RRF’s config.g, you need to set ‘M555 P2’ : This ‘sets compatibility’ to look like Marlin, which appears only to matter when trying to communicate with host software like Simplify3D, Octoprint, etc.  Up until then I had it set to P0 (RepRap Firmware), and I couldn’t get S3D to connect.  What’s interesting is that the baud rate seems to not matter:  I’ve had a number of different values and it connects fine.  RADDS, on the other hand, needs 115200.
  • Created a new ‘Tools -> Firmware Configuration’ setup for all the appropriate RepRap Firmware G & M codes.  It’s also important in the ‘Communication’ tab to set ‘Flow Control’ to ‘Hardware Flow Control’.
  • The above Duet assembly guide Thingiverse link comes with all the needed configuration .g files to get things working properly.  To support them, here’s my start/end scripts.  Obviously, you need to ‘Run Mesh Grid Compensation’ (G32) to store out the heightmap.csv that the G29 reads before print.  But you really only need to do this once in a great while.
; starting script
G32 ; Run the bed.g macro which homes and auto-calibrates the machine - also loads the last mesh grid
G92 E0 ; zero extruder
M98 PpurgeBeforePrint.g ; Purge the extruder along the front of the printer
; ending script
G1 E-10 F900 ; Retract 10mm at 15 mm/sec of filament to clean the nozzle.
M106 P1 S0 ; turn off filament cooler fan
M104 S0 ; turn off extruder
M140 S0 ; turn off bed
G28 ; Home all
M98 PplaySong.g ; play song when print ends
  • The purgeBeforePrint.g has the below code.  I found that printing small items, even with multiple skirts, didn’t always purge enough based on all the ‘pre-drool’ that came out of the head.  This lays down a fat line across the front.  A lot like my old Makerbot used to do.
G1 X-60 Y-150 Z.4 F3600
G1 X60 Y-150 Z.4 F1200 E30
  • In the G-Code tab, make sure to:
    • Set “Relative Extrusion Distances”.
    • Set the “Firmware Configuration Type” to the custom firmware I made above.
  • In the Temperatures tab, I always uncheck “Wait for  temperature controller to stabilize before beginning build”, since RRF will become non-responsive until that temp is hit.  I manage my own temps manually.

Getting started with Adafruit’s Circuit Playground Express


I’ve had a dream of authoring Python code directly on a microcontroller board for a long time.  That became a reality with MicroPython and the pyboard, but I didn’t jump in until my Circuit Playground Express (CPE, below) board from Adafruit showed up recently.

cpe <- CPE in bootloader mode!

This blog post is written as notes for my future-self, when I forget things.  But feel free to follow along reader…

I wrote this guide because despite the fact Adafruit has lot of data out there, it took me hours to sort through it all and figure out what applied, and what didn’t.


Circuit Playground Express Links

Required Hardware

Adafruit Setup Docs

It should be noted that I myself did all of these steps in the below order.  Which makes me wonder, for example, if the drivers & utils I installed during the Arduino section benefited later steps.  Each of these docs is broken out into more detail below The Bootloader section.

  • Circuit Playground Lesson #0 : Arduino Setup
    • This is authored for the “Circuit Playground” (the precursor to the CPE, it is a different thing), but docs still appears to apply.  Probably the best first place to start, but focused on Arduino.
  • MakeCode
    • If you want to try your hand at MakeCode programming on the CPE (Visual blocks, or JavaScript), start here.
  • CircuitPython Setup
    • This is actually a sub-doc for another tutorial, but explains how to setup CircuitPython on the CPE.
    • CircuitPyhon is based on MicroPython, with some differences.

The Bootloader

This CPE bootloader info applies to Arduino, MakeCode, and CircuitPython, so it’s worth calling out here.

Check the Bootloader:

  • Nice (MakeCode) overview here: “Downloading and Flashing“.  It should be noted that Arduino uploads via its own IDE, but you still need a bootloader to receive the data.  More info under “UF2 Bootloader Details“.
  • The first time you plug the CPE in over USB (before any other configuration / software installs), see if the bootloader works.  Press the reset button twice:  All the ring-LEDs should turn green, and D13 should be slowly pulsing.  The image a the top of this post shows this.
  • The issue I had is, the image in the linked docs don’t show the green LEDs:  Since mine were green, and the image of the docs were not, I thought I had a problem.  I did not.
  • IMPORTANT: Once the software is configured correctly (this started happening for me once I configured Arduino), entering bootloader mode should pop open a (Windows) Explorer.  However, the CPE has two different “Windows Explorer modes”:
    • “Bootloader Mode” : Again, all the LEDs should be red, and you should see a few files on it:
      • INDEX.HTM <- web link to the CPE
      • INFO_UF2.TXT  <- tells you about the bootloader
      • CURRENT.UF2  <- the current firware
    • “Program Mode” (I made that term up) : This is the the mode where you can drag & drop your programs onto the board.  This shows up on first time plug-in (usually takes 30 seconds or so for the Explorer window to pop open), or when you press the reset button once.  For example, with CircuitPython installed, I see these files:
      • /lib <- imported bundle libraries
      • <- Main code to execute
      • boot_out.txt
  • Here’s a short video showing how the bootloader works:

Initial Arduino Setup

Based on Circuit Playground Lesson #0 : The links below are entirely from this tutorial, I’m just calling out some of the major points & gotchas.

I got the CPE with the goal of authoring Python code for it.  But based on all the initial documentation I could find, it seemed like Arduino was where one should start.


  • From the docs for your OS: (Windows links below)
  • Add Circuit Playground to Arduino
    • (Obviously) follow all the steps here adding drivers and external packages.
    • This part really confused me for a bit (and Adafruit tech support to the rescue):  Be sure to choose the right board from Tools -> Board Menu.
      • The right board will be under the “Arduino SAMD (…) Boards” section, called “Arduino Circuit Playground Express”.  Any other board with a similar name (like, say, “Circuit Playground”) is wrong.  You’ll know it’s wrong because it won’t upload your sketch correctly.
      • See verbose errors and whatnot from my forum post here.
    • Once you’ve selected the correct COM port, you can then access:
      • Files -> Examples -> Adafruit CircuitPlayground  -> And choose a sketch therein for upload & test.
  • Other Notes:
    • During this process, I couldn’t get Arduino to connect.  After rebooting my machine and restarting the Arduino IDE, it asked me to install additional drivers, which I did.  Around that time things started working correctly.


  • The Arduino “Adafruit Circuit Playground Library Reference” can be found here.

Initial MakeCode Setup

Based on Adafruit’s MakeCode docs:  MakeCode provide a visual programming environment, JavaScript, all programmed in-browser.


There really isn’t an “Install” per-say:  Just browse to : to open the editor.

You can now code in either the “visual blocks”, or JavaScript.

Presuming you can enter “bootloader” mode (discussed in the Arduino section above), once you save a .uf2 file from the MakeCode app, if you drag & drop it onto that open Explorer window, the window should close, and the app immediately run on your CPE.  Pretty slick!

I presume though, that some of those Arduino install steps were required, since my PC wouldn’t recognize the CPE as a USB device properly until then, which would have prevented me from dragging & dropping the .uf2 files onto it.


Initial CircuitPython Setup

From the Adafruit “Circuit Python Setup” docs (for the Metro M0 Express board, not that it matters so much).

This is the whole reason I got this hardware, so far, not disappointed!


  • The above docs do a great job of covering it, but be sure you choose “Circuit Playground Express” options, since the tutorial was written for another board.
  • I flashed the CPE by just drag&dropping the downloaded ‘adafruit-circuitpython-circuitplayground_express-1.0.0.uf2’ (for CircuitPython 1.0, not 2.0, which at the time of this writing just came out and is in beta) file onto the CPE while in bootloader mode.  Note, it did take ‘a while’ for it to update, at one point I thought maybe it had broken.  But then it started working again.
  • I used the CircuitPython Blinky example to upload my first Python module, and it worked!
  • It appears that my current version of CircuitPython is running Python version 3.4.0.

Getting Bundles

  • CircuitPython ‘bundles’ Python libraries together for use on the CPE. Since the space on the CPE is so limited, sometimes you can only include specific compiled libraries with your module.
  • You can access the bundles here @ github: adafruit/adafruit_CircuitPython_Bundle
    • Don’t make the mistake I did:  Just grab (for example) the “” file in the downloads section, not one of the individual libraries above:  They don’t have the ‘lib’ folder you need for transfer to the CPE.

Setting up a Serial REPL Editor

This is a great feature, that allows you to have a live Python interpreter running on the CPE.  This lets you query the board directly in a live coding session, awesome feature.  What is REPL you ask:  Answer here!

An overview of how to set this process can be found here: “Serial REPL“.

Other Info:

  • I used PuTTY for this connection.
  • It looks like the COM port for my CPE changes pretty often, so I have to access the Windows Device Manager every time I want to run this feature.  Mine shows up as “Teensy USB Serial”, and tends to bounce around COM9->11
  • You can’t connect when you’re in bootloader mode:  Get a program running first.
  • Note, on first time connect, you can’t connect in via REPL until the Windows Explorer (auto) opens:  That signifies that the machine is ready.
  • If, when the terminal screen comes up its black/no info, hit ctrl+c to break out of the running program and access the terminal: >>>
  • type help() to see a list of built-in functions.
  • You can use this same connection (before the ctrl+c) to see the output of any module currently running.


Really look forward to seeing what this little board can do!

Building the C-Bot 3d Printer : Part 38 : PID Autotune on RepRap Firmware, fix z-artifacts

Jump to C-Bot blog index to see all the posts.

In my last post on the subject, I described how I completely rebuilt my C-Bot printer.  The main goal was to get better print quality based on some odd z-artifacting I’d been experiencing for some time.  But, the z-artifacing still persisted.

This post is to talk about both the solution to the artifact issue, and how to PID Autotune your hotend and heated bed with RepRap Firmware.

Solving the Z-artifacting

After the rebuild, the z-artifact was still there.  Was so frustrating to have a machine that printed so well, yet on the Z-axis, I’d get this:

z-ringing <- Click on it to make bigger, and look on the inside of the print.

The real oddity was that the artifact didn’t match the pitch of my leadscrew, which seemed like the obvious culprit, and the period of the artifact could vary based on what you were printing.  For example, a 20mm calibration cube showed off the issue much more than the above cylinder.  And it was more of a square-wave, not an s-curve.

3D printer people to the rescue:  I posted my issues to the ‘3D Printer Tip, Tricks and Reviews‘ Google Group, and through a lot of back and forth discussion (thanks JetGuy + several others), the users figured it was either one of two things:

  • Thermal expansion of the bed during the bang/bang heat cycle was causing these anomalies.
  • The hit the heated bed was making on my power supply:  When I built my machine 2 years ago I was recommended a fancy PC power supply (Corsair CTX 500), but as it turns out, this may not have been the right choice for a 3D printer.

Check Thermal Expansion

To troubleshoot the thermal expansion, user Joseph Chiu suggested a great idea:  Shine a laser off a mirror on the bed during the heat cycle, and track the dot on the wall.  If the dot moves during the bang/bang cycle, then it’s thermal expansion.  So, I gave it a shot:  Heated up the bed, waited for the temp to start banging back and fort, and then stared a dot on the wall…

frikkin_lasers The ol’ Replicator1 served as a based for the vice holding the laser.

That laser was bright, so I moved the mirror so it hit a “splotch” on it, and gave a nice diffusion pattern on the wall.  This was much easier to look at, and track the specks to see if the changed / moved : The did not.  This is not a thermal expansion issue.

Check Power Supply

The easiest way to check if this is a power supply issue?  Just ‘not print with the heated bed on’:  I normally always do, at 60c:  Not required, but sometimes helps large PLA prints stick better over time.

So, I did the same cylinder print with no heated bed and: The z-artifacting was gone!  Can’t believe I’ve been having this issue for a year-ish, and never realized it was the amp-draw the heated bed puts on the PSU, even though the PSU is rated for it, based on numbers.

Compare PID Tuning vs no heatbed

One thing I’d never done since upgrading the bot to RepRap Firmware, was PID autotune the hotend, or bed:  The defaults seemed fine, and the temp curves as shown in my slicer seemed “good enough” : I could easily see the bed overshoot based on the bang/bang setup, and a slight wobble on the hotend.  But I figured this would be a good time to PID autotune both the hotend and bed (discussed in more detail in the next section):  Would this help any of the z-artifacting?

Why, in fact it does.  Here’s a comparison shot:


‘Bed off’ and ‘Bed with PID Autotune’ are nearly the same:  The artifacing caused by the bang/bang is completely removed, and only a very slight, larger-period artifact remains (which I’m happy enough with at this point).

I should also note that my temp curves, for both hotend and bed, are now dead flat.  PID tuning completely makes a difference.

However, I noticed that while the pid-tuned bed works, the LED strips on my bot flicker with the same frequency as the SSR controlling the bed:  The same power-hit that caused the bang/bang artifact is still there, it’s just happening at such a high rate, the artifact is being averaged out of existence.

For future improvement, I need to choose one of these:

  • Get a separate power supply for just the 12v bed.
  • Switch to an entirely separate 120v AC heated bed.  This is the option I’m currently investigating.
  • Switch all my electronics out to 24v (ugh).

But in the meantime, at least the stupid z-artifact is gone.

PID Autotune your hotend and heated bed in RepRap Firmware

These are the steps I went through to PID autotune my hotend and heated bed in RepRap Firmare:  None of it hard, just took a good amount of digging online to figure out what exactly needed to be done.

In RRF gcode, ‘H’ Is the heater number: H0 is the bed, H1 is the first hot end, H2 the second etc.

PID Autotune the hotend

To PID autotune the hotend, these were the steps I took:

  • Position nozzle over bed
  • Turn on cooling fan 50% to simulate real printing environment.
  • Start with a cold hotend.
  • Enter this gcode, + the result returned as it’s ran:
    • I chose 230c as the target temp, since I print a lot of filament at that temp.
    • If you get an temp overshoot error during the tune, you may need to add / adjust your M143 in config.g:  The default value for hotends is 262c.

M303 H1 S230
READ: Auto tuning heater 1 using target temperature 230.0C and PWM 1.00 – do not leave printer unattended
READ: Auto tune phase 2, heater off
READ: Auto tune phase 3, peak temperature was 234.6
READ: Auto tune heater 1 completed in 228 sec
READ: Use M307 H1 to see the result, or M500 to save the result in config-override.g

  • Then entered this gcode, the result returned as it’s ran:
M307 H1
READ: Heater 1 model: gain 325.3, time constant 117.3, dead time 5.0, max PWM 1.00, mode: PID
READ: Computed PID parameters for setpoint change: P12.9, I0.110, D45.0
READ: Computed PID parameters for load change: P12.9, I1.026, D45.0
  • Finally entered this gcode to save the results out to config-override.g
  • Which in turn, added this info (actually more, but this is what’s important to this operation) to config-override.g
M307 H1 A325.3 C117.3 D5.0 S1.00 B0 
  • Note, the B0 = PID tuned.  B1 = bang/bang.

PID Autotune the heated bed

To PID autotune the heated bed, these were the steps I took.  Note, it’s very similar to the hotend above.

  • Start with a cold heated bed.
  • Enter this gcode, + the result returned as it’s ran.
    • I chose 60c as the target temp, since I print a lot of filament at that temp.
    • If you get an temp overshoot error during the tune, you may need to add / adjust your M143 in config.g:  The default value for heated beds is 125c.
M303 H0 S60
READ: Auto tuning heater 0 using target temperature 60.0C and PWM 1.00 - do not leave printer unattended
READ: Auto tune phase 2, heater off
READ: Auto tune phase 3, peak temperature was 61.2
READ: Auto tune heater 0 completed in 1105 sec
READ: Use M307 H0 to see the result, or M500 to save the result in config-override.g
  • Note, it took forever for this to finish, since it wants the bed to cool down before it completes.  I had to point a fan at it to help it along after ‘phase 3’.
  • Then entered this gcode, the result returned as it’s ran:
M307 H0
READ: Heater 0 model: gain 111.6, time constant 814.0, dead time 20.5, max PWM 1.00, mode: PID
READ: Computed PID parameters for setpoint change: P63.5, I0.078, D911.1
READ: Computed PID parameters for load change: P63.5, I1.082, D911.1
  • Finally entered this gcode to save the results out to config-override.g
  • Which in turn, added this info (actually more, but this is what’s important to this operation) to config-override.g
M307 H0 A111.6 C814.0 D20.5 S1.00 B0
  • B0 = PID.  Previously, it was B1, bang/bang.

Configure config-override.g

The M500 command entered above does a live update to the config-override.g script living on the SD card, which is a great feature.  However, I’d never used this feature before, so my config.g had no idea to execute this script.

To do so, simply (I did mine a the bottom), enter this gcode in your config.g


This will then execute the contents of config-override.g from within your config.g, when the machine boots up.

Optionally, you could simply copy the M307 lines (as generated by M500) from config-override.g and paste them directly into config.g, and remove the M501 call.  Either will work.

PID Autotune related gcodes

  • M135 : Set PID sample interval
  • M301 : Set PID parameters
  • M303 : Run PID Tuning
  • M304 : Set PID Parameters – Bed  :  This command is identical to M301 except that the H parameter (heater number) defaults to zero.
  • M307 : Set or report heating process parameters

Jump to C-Bot blog index to see all the posts.

CNC The Bay

I bought & assembled my X-Carve cnc during Christmas, 2015.  Ever since then, I thought it would be perfect to do topo maps.  I had great success with Denali & Lake Tahoe, but always wanted to do something bigger.  In fact, a year before the X-Carve’s arrival, I’d 3d printed the (lower half) of the San Franisco Bay Area, which I felt turned out well.

Some friends and I took a trip to Firewood Farms in Half Moon Bay, where I picked up a couple slabs of redwood, without really knowing what I was going to do with them at the time.  Then the stars aligned, and I realized one was the perfect shape to do a cnc topo map of the whole bay area.  “The Bay” is the result:




More pics below.

Info on it:

  • The piece measures 17×30″, and about 1.75″ deep.
  • Rough cut was 3h, 10min.  Finish pass was 6h, 20min.   Total was 9.5h (my whole Saturday…).
  • Used a 3-flute .25″ ballnose for both passes, DeWalt router on speed 1.
  • Roughcut feed for X/Y was at 150″/min, finish pass was at 210″/min.
  • Roughcut feed for Z was 20″/min, finish pass was 40″/min : I had to modify my firmware to get these speeds.  I tried a faster z-feed, but the machine couldn’t raise the spindle that fast, and chaos ensued.
  • Very little sanding was needed, based on the 10% stepover during the finish pass.
  • Used terrain2stl to get the topo data.
  • Used Autodesk Maya for all the mesh modification, and text creation.
  • Used MeshCAM for the toolpath generation.
  • Used Universal GcodeSender to send the cam to the machine.
  • Applied a ‘natural’ Minwax stain, and “Blue Lagoon” satin paint.


  • I think the poor Arduino Uno couldn’t handle the fast feedrate during the rough terrain parts:  The whole thing would start & stop over and over (giving me an anxiety attack at first), while the buffer caught up with the operations.  Maybe it’s time to get some new electronics?  That really slowed down the finish pass.  Didn’t have any trouble during the rough.
  • I think I could speed up the rough-cut even more by not using MeshCAM’s ‘Use 3D Roughing’ option : while it makes a nice looking roughcut, who cares, it’s all getting cut out anyway.  The result was a lot of small up/down z-travels, that really slowed it down overall.

Here’s a series of photos showing the process:

A shot in Maya, while I got the text arranged:


1.15 million triangles:


The very first cuts:


Roughcut complete:


The final piece, before stain and paint:


In conclusion, I found this to be really satisfying project, and it looks great hanging on my living-room wall.