3D Printing, Akismet, Programming

Meet Akisbot


Akisbot is the Akismet mascot; he was originally designed by Dan Hauk, but this 3D version was modeled and printed by yours truly.

Here’s Dan’s design that I used as a reference during fabrication:


I designed the entire thing in OpenSCAD, and I’ve published all of the source files on GitHub, so you can print your very own Akisbot. The bot in these pictures was printed at 40% scale and is eight inches tall.


I wanted all of the joints in the robot to be movable, and in order to test that my design would work, I started by printing the arms, which should have been the quickest and easiest joint to print and test. (All of Akisbot’s parts were printed on an Orion Delta 3D with ABS plastic.)


Their small size actually caused them to take a very long time to print, since they would sometimes break loose from the print bed, and I had to slow the printer down so that each layer of plastic had the right amount of time to cool.


This forearm printed ok though. Notice the joint on the far end that fits with the joint on the end of the upper arm in the next picture.


Here’s a pair of upper arms. One of these things is not like the other.

The top of this piece fits inside of the joint in the upper arm, allowing it to bend as shown in the next picture.


I eventually got two full arms printed. It’s a shame that I later decided to modify the elbow joint and had to reprint all four of the pieces.


I printed the eye rings and eyeballs separately from the face and welded them in place with acetone later. In this photo, they were just set in place to check that they were the right size. I did re-print the inner eye parts so that they would fit more snugly.


Another dry fit to get a feel for how big the finished robot would be.


This is the base that connects the body to the wheels and treads. The “A” is the Akismet logo — I initially had printed a solid cube, but I thought this would be more fun.


These braces attach to the sides of the base to hold the wheels and treads in place. If I printed them again, I’d make them thicker; they’re a little flimsy.


This is the joint/skeleton system for Akisbot. All of the joints are movable and have freedom to move in all directions, but the base joint was made thicker to give it more support and not allow for as much vertical movement, since robots don’t usually bend over at the knees.

It was difficult to get exactly the right fit between the joint pieces so that they’d be loose enough that the arms and neck could move but would still stay in place from the pressure between the front and back of the robot alone. When the print finished, the joint was a little bit loose, so I added coats of clear nail polish to the inner joints until it was just the right tightness.


This was the first time I was able to put all of Akisbot’s parts together. He’s only held together with scotch tape, but it proved that welding his front and back parts together should work fine and confirmed that the joint sizing was correct.


The meter hand and the buttons were all painted with nail polish that my wife Christina already had on hand (no pun intended).

I still need to attach or print his monogrammed “A,” but I haven’t decided yet whether I’m going to print a stamp, paint it freehand, or stencil it in.


This was my desk shortly before finishing the project. It’s a graveyard of surplus plastic and deformed robot parts.

The tread was created using a pretty neat technique taken from MakerBot user emmett. You print just the perimeter of an object with a curlicued edge, and ABS is flexible enough that it creates a tread that can be routed around wheels. The modeled object is on the left, the printed perimeter on the right.


These antennas were tough to get printed without the ball snapping off; I gradually increased the radius of the rod until I got two successful prints and called it a day.


This is Akisbot during the final acetone glue-up and clamp-up. The ABS plastic I used is soluble in acetone, so to permanently connect two pieces of ABS, you can just dab some acetone on one and clamp them together. They’ll become bonded as if they were one piece of plastic.


3D printing isn’t foolproof. This is the bag of just the green broken parts and extra plastic generated during the build process.


Akisbot’s total print time, not including assembly or design or re-prints, was about nineteen hours.

3D Printing, Programming

OpenSCAD is Awesome

I’ve been getting into 3D printing, and until recently, I was using SketchUp to create all of the models for my 3D prints. However, whenever I needed to do anything even mildly involved, like align the center of a sphere with the center of the top of a cylinder (or even create a sphere in the first place), I found the limitations of visual modeling frustrating. I thought to myself, “Why can’t I just write a program or use something like SVG to describe the model I want?”

Of course, a solution already existed: OpenSCAD. OpenSCAD is a free and open-source scripted modeling program for solid CAD objects — instead of drawing the shapes you want, you write a program that describes them. Switching to it from SketchUp has been like being able to stretch my legs after a long cramped airplane flight. Consider my latest print:


It’s a replacement tray for this card shuffler I bought for $0.25 at a garage sale a decade ago:

It only required 33 lines of code. The total time I spent starting from when I created the file in OpenSCAD to when I exported it as an STL file was twenty-two minutes, and that included pausing to feed my one-year-old daughter some mashed bananas. To design the same model in SketchUp would have taken at least an hour without the bananas. (Here’s the OpenSCAD file with some additional comments and newlines.)


So if you’re a programmer that would like to create 3D models but you find visual CAD limiting or frustrating, consider OpenSCAD.

3D Printing, Life, Woodworking

Printing Construction Equipment for Fun

For Father’s Day, my wife and kids got me this “Construction-grade Backhoe Loader” kit from WOOD Magazine. The kit contains hardware and wheels; you build the rest of the backhoe yourself:


I planned on doing this project with my sons (ages 5 and 3) until I realized that the fine detail woodworking involved would bore them and I’d end up all alone in the garage. I decided to do something experimental and 3D-print the backhoe instead.

I’ve had a 3D printer for about six months, but I’ve only attempted small projects with it: printing new hardware for a dresser, fixing a pair of sunglasses, creating small hooks to hang towels on our oven’s handle… Reproducing this toy in plastic on my desktop would give me a chance to explore my printer’s capabilities and expand my 3D modeling skills.


Replicating the components in SketchUp turned out to be the easiest part of the process; most of the eighteen distinct pieces took less than 15 minutes each.

Pivot Bracket in SketchUp

With the permission of the fine people at WOOD Magazine, I’ve made the SketchUp and STL files of all of the parts I printed available on GitHub. The original plans for the Construction-grade Backhoe Loader are copyright 2014 Meredith Corporation. If you decide to try and print this project, consider buying the plans and/or the project kit.


3D printing is not a speedy process. This picture was taken about four hours into an eight hour print:


In addition to being slow, 3D printing is not foolproof either. One problem that I encountered on the taller pieces was layer separation:


I’ve determined that this was probably due to the ambient air temperature being too cold, causing the lower layers of plastic to shrink and split from the upper layers. After filling the cracks with an acetone/ABS plastic slurry and sanding, it looked ok:


(Don’t get me wrong — I’m a huge fan of 3D printing and knew about its drawbacks before I ordered my printer. I think that in 20 years, these printers will be as common in households as regular printers are today… possibly moreso. Who will need to print paper documents in 20 years?)

My printer’s print bed is only six inches in diameter, so some of the longer pieces required creative positioning in order to print seamlessly.

I split some of the larger pieces into multiple parts in order to save hours of printing time and some non-zero amount of plastic. For example: instead of printing the entire chassis as one piece, which would require a lot of infill material, I cut it in two and printed one tall hollow piece plus a solid cap that I glue on afterwards:

The total print time for all of the pieces I printed was 80 hours, 57 minutes.

Here’s the lineup of all the pieces immediately before I began assembly. On the left, the hardware and wheels from the kit; on the right, the thirty-seven separate pieces I printed.

Assembly (pre-paint)

With better planning, I would have printed all of these objects with their brackets already in place. Since I didn’t, I had to weld them in place using the aforementioned acetone/ABS slurry.



Painting was done with glossy black and sun-yellow spray paint made for plastic in a cardboard box in my garage. Très professional.


Assembly (post-paint)

At this point, all that was left was to connect the nuts and bolts.







Lessons Learned

It was fun printing an exact duplicate of the wooden model, but if I did it again, I’d go for a more realistic look that doesn’t use as much material. Woodworking plans don’t translate directly to plastic particularly well, since their dimensions are based on commonly available lumber sizes, so most of the pieces were oversized for their purpose.

I’d also skip the painting step entirely by printing in the correct color of filament. I used white because it’s what I already had, but for my next serious project, I’ll order the colors I need.

Due to the post-print crack-filling (and filing and sanding) I had to do, the surfaces of some of the pieces look pretty gnarly even after painting:


It’s apparent in direct light but not obvious at a glance. If I did it again, I’d remake the cracked pieces and get them to print properly rather than trying to fix them in post-production, or I’d attempt an acetone vapor bath to smooth out all the surfaces.

Now that I’m more familiar with my printer, I’ll modify the print settings more aggressively. I printed with 0.2mm-thick layers since it was the default setting, but I’ve since done some testing and found that 0.1mm-thick layers create pieces with almost perfectly smooth surfaces, not the obvious stratification you can see in the pictures. It would take longer, but it would be worth it.

Even though there are plenty of problems that I can see, my kids don’t mind, and I’m sure they’ll enjoy playing with it. It’s not the beautiful wooden family heirloom it could have been, but maybe when they’re older, they’ll say “Can you believe Dad made this on an ancient 3D printer? It had to print using plastic wire instead of pulling carbon directly out of the air!”


3D Printing

I saved a pair of sunglasses with a 3D printer

My sister-in-law’s sunglasses lost an accent from one of the earpieces, leaving the left temple loose. Could I fix this?, she asked. Twenty minutes and 63 millimeters of plastic filament later, my purchase of an Orion Delta 3D printer was 100% validated.


The accent on the print bed.


The accent installed.


With the temple opened.


And the other side, with the original accent, for comparison. I later painted the printed accent gold with some nail polish, and you could hardly tell the difference between the two.

If you happen to have this same pair of sunglasses, and your pair has also lost one or more of its accents, you can download the 3D models and print a replacement yourself.

PHP, Programming

Quick and Dirty Command Line PHP

I do 99% of my programming in PHP, and when I’m on the command line, I would rather use the PHP functions I know than look up the Bash functions I don’t, so I wrote this PHP script and saved it in my $PATH as an executable file named p.

#!/usr/bin/env php

		array_slice( $argv, 2 )

This way, if I want to quickly get the length of a string, I can type:

$ p strlen paraskavedekatriaphobia

and get


instead of looking up that I could have done:

$ foo=paraskavedekatriaphobia && echo ${#foo}

(or apparently a dozen other methods of finding the length of a string in Bash).

It even works with Bash variables:

$ foo=acbdef
$ p strlen $foo

Thanks to all the time this script has saved me, I was able to write this post!

Life, Minnesota, Woodworking

My Minneapolis Table Has Found a Forever Home

Backstory: Last year, I built a table that resembles the downtown skyline of Minneapolis.

Minneapolis Table

I didn’t intend to keep it after I finished building it, so I contacted a few local organizations to see if they’d be interested in accepting it as a donation. I’m happy to announce that the Minneapolis table has found a home at the Minneapolis Institute of Arts, a fine-arts museum in Minneapolis.

Minneapolis Institute of Arts

Here I am making the furniture delivery on a Monday in June:

Donating the Minneapolis Table

The museum employees that I spoke to when I dropped it off said they planned to use it in their retail store to display work by local artists, and when I visited the museum yesterday for the first time since then, I found it after just a few minutes of browsing the gift shop:

Minneapolis Table in the Minneapolis Institute of Arts Retail Store

I imagine this is how parents feel when their child moves out and gets a job, no longer needing their support. I’ll never forget you, Minneapolis table; don’t forget to call me on Christmas and my birthday.

Life, Programming

Data Mining My Family Tree

One of my hobbies is researching my family tree; I enjoy learning about where I’ve come from as well as reading about how my relatives lived in centuries past. I was recently fortunate enough to come into possession of a 200-page family history written in the late 1970s, and after I finished reading and digitizing it, I wanted to see what data and trends I could extract from my now 2,500-person-strong family tree, so I started writing a collection of PHP scripts aimed at reading and manipulating GEDCOM files. (GEDCOM is the defacto standard for digital family tree files, and it is used by essentially all family tree software.) The scripts are open source and available via Github in my PHP GEDCOM Tools repository.

I downloaded my family tree from Ancestry.com in GEDCOM format and got started. First things first: I generated a second GEDCOM file containing only the people that are related to me by blood. This isn’t strictly necessary, but I prefer to limit the results to my genetic relatives.

./export-related.php --gedcom=Everyone.ged --person='Christopher Finke' --out=Related.ged

After I had a tree with all in-laws removed, I started with something simple: gender breakdown.

./gender-counts.php --gedcom=Related.ged

Gender breakdown chart

53/47% male/female split. Not that interesting, and possibly skewed by incomplete data. How about something more personal, like name choices?

./name-histogram.php --gedcom=Related.ged --histogram=cloud-raw

Given Name Word Cloud

(The image was generated by pasting the command output into the tool at http://timc.idv.tw/wordcloud/)

That’s kind of neat. Women are outnumbered, but they teamed up to make “Mary” the most common given name. “John” and “William” were close behind. “Melvin” brought up the rear.

Does my family line favor any of the months for giving birth?

./date-histogram.php --gedcom=Related.ged --type=BIRT --specificity=month --histogram=counts

(This and other charts were generated by pasting the command output into a Google Docs spreadsheet and using that data to create the image).

Births by month

September and July have little (baby) bumps, but births are pretty uniform across the board. The same chart for deaths is a little more interesting though.

./date-histogram.php --gedcom=Related.ged --type=DEAT --specificity=month --histogram=counts

Deaths by month

A little more variation — deaths seem to be less common in the summer months, but no month really takes more than its fair share of lives. September has the best net gain for life, since it produced lots of babies and the fewest deaths. You go, September!

How about marriage? Is June really the most popular month for weddings, as is often assumed?

./date-histogram.php --gedcom=Related.ged --type=MARR --specificity=month --histogram=counts

Marriages by month

Well, yeah.

How old are those lovebirds when they tie the knot?

./age-histogram.php --gedcom=Related.ged --type=MARR --histogram=counts

Marriages by age

Across my entire recorded family history, the most common time to get married has been between the ages of 20 and 25; the median marriage age is 23.

How many children do those married couples end up having?

./child-count-histogram.php --gedcom=Related.ged --histogram=counts

Number of children per family

There’s a steep dropoff after the fourth child, and I’m not surprised. As Jim Gaffigan said, “If you want to know what it’s like to have a fourth, just imagine you’re drowning, and then someone hands you a baby.”

Death comes to all, but when??

./death-age-stats-over-time.php --gedcom=Related.ged --timeframe=decade

Death age over time

You can see that over the last 50 years, my family’s median and average age at death has been slowly rising. That’s good news for me, right? (Early numbers are pretty jumpy due to a lower sample size and frequent stillbirths.)

How did these people die? Does any cause of death stand out?

./death-note-histogram.php --gedcom=Related.ged --histogram=cloud-raw

Most causes of deaths weren’t known or mentioned, but for those that were, cancer was at the top of the list.

Cause of death word cloud

Where were my ancestors born? Can I see my family spread across the country as sons and daughters move away and start their own families?

./place-progression.php --gedcom=Related.ged --type=BIRT --out=birth-places.gif --key=[Google API key] --icon=[URL of icon mask] --start_year=1860

Birth places

I can! You can literally see my family spread like an outbreak of measles. (Note that this GIF begins in the year 1860 when my ancestors first began arriving from Europe.)

If you want to investigate your own family tree, grab a copy of the scripts and see for yourself. If you have ideas for any other interesting stats that could be gleaned from family trees, leave them in the comments and I’ll add some more scripts to the repository.