Ender 3 v2 Pen Plotter

Last year I purchased myself an Ender 3 V2 3D Printer. It was a logical purchase, to compliment my home automation hobby, allowing me to design and print custom enclosures for miscellaneous ESPHome and Zigbee nodes.

It turns out having a CoreXY 3D printer allows you to do more than just 3D printing if you’re willing to get creative. For example, adding on a laser engraver.

In my case, I was tasked with automating the process of drawing an embroidery pattern onto fabric using a heat/friction erasable pen for my partner, Kate.

Unsurprisingly, there are services available which can do this, albeit using machine washable dye rather than heat reactive dye in most cases. However, in almost every case these are cost prohibitive for hobby embroidery projects and also happen to incur a long turn around time from order to delivery.

So as with most projects I undertake, rather than re-designing from scratch, I opted to start searching for existing projects. Surely someone had done this before! I managed to find a handful of models (e.g. Ender 3 v2 Pen Plotter addon ), however most of these either required you to fully remove the hotend assembly or did not accomodate mounting a BL-Touch levelling probe.

Fortunately I managed to find this model which both accommodated both of my requirements. It supported mounting of the BL-Touch probe without needing to remove the hotend assembly. I printed it and mounted it to the printer… job done… right? Unfortunately not. Due to the way it mounted it now meant that the hot-end carriage could no longer hit the x-axis limit switch. Not good!

From here, the only logical solution was to design my own, which accommodated for my specific requirements. I’ve been getting more and more familiar with Fusion 360 since buying the printer, so was confident to get straight to prototyping a design.

I started off by importing dimensionally accurate models of both the Ender 3 v2 print head assembly/x-carriage and the BL-Touch:

By doing so, I would be able to project the precise positions of mounting holes onto the sketches for component of my attachment, rather than measuring by hand with some amount of inaccuracies.

Another requirement I came to realise was that it would be useful would be the ability to remove the plotter attachment when it is not in use. As such I arrived at my first design iteration:

The design was relatively simple. Two main parts; a mounting arm to hold the BL-Touch probe to the hotend assembly, and a three-piece arm to hold the pen, which is mounted to the mounting arm using the same screws from the BL-Touch probe. The three-piece arm was designed to allow a pen to be mounted with some spring tension, however in actual fact once it was printed there was too much friction to provide any reasonable amount of travel. Back to the drawing board.

On to the next iteration, I re-thought the design. I reused the same mounting arm to the hotend assembly, but changed the mounting angle of the pen attachment. Instead, it would side-mount to the mounting arm using M3 bolts into heat-set inserts. I thought I would give this a try, without any tension mechanism, as an automatically leveled bed should suffice.

One printed, I came to realise that the side mounting again caused some interference with the x-axis limit switch, so I found that in order to solve this problem I needed to move the rear bolt closer to the front, and additionally provide a countersunk for the bolt head to sit inside.

After a handful more prints and some more tweaks to the height of mounting arm and hole sizes, I had a final design:

Now, with the mounting bracket complete, it was time to move onto the software aspect of the project. Fortunately for me, this is a solved problem. Uri Shaked has written an excellent post about using Inkscape with the Gcodetools extension to produce plotting toolpats from SVG files. Inkscape isn’t the nicest software to run on MacOS, so the experience is a little clunky (and crashy), but it does the job. However, I plan on exploring other tools, like Inkcut, JScut, juicy-gcode, SVG-toGcode and hp2xx in due time.

Gcodetools allows you to specify a custom header and footer for produced gcode files. I used this to provide a more ergonomic printing experience by ensuring the printer was homed, bed levelling mesh is enabled, and the print timer is initiated to allow for on-the-fly tweaking of the z-height.


M420 S1 ; Enable Jyers Mesh
M75 ; Start print timer
G28 ; home all axis


G1 Z20.00 F600 ; Move print head up
G1 X5 Y180 F9000 ; present print
M84 X Y E ; disable motors
M77 ; Stop print timer

Now, with some G-code produced, it was time for a test. As a software engineer, there’s no better way to test the output capability of something than to print("hello world"), and so that is exactly what I did:

Great success! From here, I did some further tests on fabric and found it worked just fine, albeit a little faint since more pen pressure resulted in snagging the fabric, so for fabric prints 2 or 3 passes is generally necessary. Beyond just plotting SVGs I’ve started to explore generative art using mathematical functions (like a spirograph). Here are a few pictures from testing and a video:

You can find the model for my Ender 3 V2 BL Touch Mount and Pen Plotter on Thingiverse and Thangs

100 Warm Tunas 2018 Prediction Analysis

Over the space of 6 weeks, 100 Warm Tunas collected a large sum of data and chugged away at it to make some predictions about what the Hottest 100 of 2018 would look like.

In summary,

  • We collected 6,234 entries (13.6% decrease since 2017 🔻).
  • We tallied 58,463 votes across these entries (12.9% decrease since 2017 🔻).
  • 3.00% of votes were collected via Instagram direct message.
  • Triple J counted 2,758,584 votes.
  • Therefore, we collected a sample of 2.12%.
  • We successfully predicted #1
  • We predicted 7 out of the top 10 songs.
  • We predicted 15 out of the top 20 songs.
  • We predicted 83 out of the 100 songs played in the countdown.
  • Throughout December and January, 100warmtunas.com was loaded over 105,000 times by over 28,000 users.

You can read the full technical prediction analysis over at the 100 Warm Tunas news site.

100 Warm Tunas has a new home!

100 Warm Tunas has found a new home this year! This year’s results, along with the past 2 years can now be found at 100warmtunas.com. The existing domain (100-warm-tunas.nickwhyte.com) will simply perform a 301 permanent redirect to the new domain, so all existing inbound links should be unaffected.

100 Warm Tunas 2017 Prediction Analysis

Over the space of 6 weeks, 100 Warm Tunas collected a large sum of data and chugged away at it to make some predictions about what the Hottest 100 of 2017 would look like. Along the way we encountered a bug in the collection process, however data was backfilled and showed that I had collected a sample size around the same as in 2016.


  • 100 Warm Tunas collected 7,216 entries (7.3% less than 2016 🔻)
  • 100 Warm Tunas tallied 67,085 votes across these entries (2.6% more than 2017 🔺). This is due to improvements in 100 Warm Tunas’ counting and recognition process.
  • Triple J counted 2,386,133 votes.
  • Therefore, 100 Warm Tunas, collected a sample of 2.8%. Not bad! (The same as in 2016).
  • Warm Tunas predicted 8 out of the top 10 songs (Same as 2016) (Ignoring order)
  • Warm Tunas predicted 16 out of the top 20 songs (3 less than in 2016, where 19 out of 20 were predicted) (Ignoring order).
  • Warm Tunas predicted 83 out of the 100 songs played in the countdown. (1 less than in 2016) (Ignoring order)

Overall, even though the sample size was reasonably consistent between 2016 and 2017, it is clear that the results collected in 2016 were more accurate.

Technical Analysis

The results this year definitely show a more accurate 1st place prediction (predicting HUMBLE. to win), as opposed to last year where the top two positions were placed out of order, however looking at the data, it looks as though all other aspects of the prediction stayed almost the same.

To start this analysis, lets take a look at the top 10 of the official countdown and match it up with their predicted places in Warm Tunas:

Artist Title ABC Rank Tunas Rank Difference
Kendrick Lamar HUMBLE. 1 1 0
Gang Of Youths Let Me Down Easy 2 3 1
Angus & Julia Stone Chateau 3 6 3
Methyl Ethel Ubu 4 4 0
Gang Of Youths The Deepest Sighs, The Frankest Shadows 5 2 3
Lorde Green Light 6 8 2
PNAU Go Bang 7 5 2
Thundamentals Sally {Ft. Mataya} 8 10 2
Vance Joy Lay It On Me 9 15 6
Gang Of Youths What Can I Do If The Fire Goes Out? 10 13 3
Peking Duk & AlunaGeorge Fake Magic 12 16 4
Khalid Young Dumb & Broke 13 24 11
Lorde Homemade Dynamite 14 30 16
Vera Blue Regular Touch 15 11 4
Jungle Giants, The Feel The Way I Do 16 32 16
Baker Boy Marryuna {Ft. Yirrmal} 17 12 5
Ball Park Music Exactly How You Are 18 14 4
Killers, The The Man 19 19 0
Peking Duk Let You Down {Ft. Icona Pop} 20 38 18

Lets pull apart this table and grab some statistics about how we did with our prediction:

Predicted Out Of Top N Percentage
8 10 80.0%
16 20 80.0%
22 30 73.3%
33 40 82.5%
42 50 84.0%
50 60 83.3%
62 70 88.6%
68 80 85.0%
78 90 86.7%
83 100 83.0%

So from the above data, it’s apparent that once again:

  • The average error for the top ten ranks was 2.2 positions (an increase from 2016’s 1.9 positions)
  • Warm Tunas predicted 8 out of the top 10 songs
  • Warm Tunas predicted 16 out of the top 20 songs
  • Warm Tunas predicted 83 out of the 100 songs played in the countdown.

That’s not a bad result at all!

The average rank prediction error, grouped into divisions of 10 is provided below. It shows that it’s difficult to predict where songs will place once you leave the top 50:

ABC Position Warm Tunas Avg Error
1-10 1.9000
11-20 8.2000
21-30 14.3000
31-40 12.5000
41-50 15.2000
51-60 24.7000
61-70 18.2000
71-80 29.9000
81-90 34.1000
91-100 29.5000

To compare Warm Tuna’s predictions vs actual rankings, a scatter plot has been provided below. We can see as we get closer to rank 1, the 100 Warm Tunas prediction gets better and converges upon the actual rankings played out on the day.

Fortunately this year around, 100 Warm Tunas was able to successfully predict the winner of the countdown. The reason this prediction was able to be made was because the sample collected clearly indicated HUMBLE. as an outlier. – an entire 5% higher than the next track, predicted to place 2nd.

Anyway, that’s a wrap. See you later this year for 100 Warm Tunas 2018 edition!

100 Warm Tunas 2017 Update 🔥💯

100 Warm Tunas has been happily chugging away for the last month or so. I’ve obtained a fair amount of media coverage too.

A couple of days back, I posted the site to the triplej subreddit. Someone replied to the post telling me my vote count was significantly less than what they had been counting by hand, which made me somewhat suspicious – was there a bug in my Instagram scraping library that I built?

Well, after a bit of debugging early this morning, I found that there was indeed a bug. Not a bug with my scraping library, but rather a bug with how I was using the library:

-    for page in ig.fetch_pages('triplej', per_page=10):
+    for page in ig.fetch_pages(hashtag, per_page=10):
         for post in page.posts:
             if post.is_video:
                 logger.info("Skipping {} because it's a video".format(post.shortcode))

For those who are programmers, you’ll probably spot the issue here. For those who aren’t, the issue is that I have been using a hardcoded string to collect Instagram votes, when I thought I was collecting a handful of hashtags.

This has now been rectified and I have kicked off a full re-scrape to back-fill the data.