Click to Visit           

Monday, December 15, 2014

Project NOMOON - A Parametric Spherical Speaker Generator

NOMOON is a parametric spherical 3d-printed speaker generator created in OpenSCAD.


Click here to access NOMOON on thingiverse.

NOMOON is loosely based on my previous OpenScad speaker generator - Speakergen

NOMOON can create spherical speaker enclosures of any volume.  You can configure things like wall thickness, bass port dimensions, number of screw holes, etc.

NOMOON also includes a speaker stand.  If your speakers tend to rotate forward in the stands - strategic application of a rubber band can solve this.

Driver Selection

You can use a tool like this to determine optimal enclosure / port-size for a given driver:

I've created a handful of NOMOON speakers using different drivers.  The trick is finding small-ish full-range drivers that have circular mounts.  Many speakers you see in devices that appear to have round mounts are actually rear-mounted.

So far the speakers I made using these drivers are my favorite:

In a 1.1 liter ported enclosure tuned to 100hz - they provide a calculated F3 of 101hz.

This setup sounds really nice!  The bass is full (especially for 2" drivers) - and treble / midrange sound good.

They work great as little desktop speakers.  These are pretty capable drivers - and should work well in a bigger system with a subwoofer.

If you want to skip playing with OpenSCAD - and just print yourself a speaker - I've provided the STL for the above setup (it's about a 10 hour print using about 0.5lbs of filament).

The provided STL includes 3.25mm mount holes - which work well with #6 machine screws (socket button cap look nicest!).  The mount holes on the Vifa ne65w will need to be drilled out very slightly to fit these screws.

If you're able to do a larger / longer print - Vifa, Dayton and Fountek all make 2.5"-3.5" full-range drivers with circular mounts that should provide deeper bass response.

Other drivers I've used:
Mounted as press fit.  Calculated response down to about 200hz in ported enclosure.  Nice treble / mid - no bass.  Low power handling - and really requires subwoofer crossed no lower than 200hz (but sounds nice in that setup).
Needed to cut "ears" off to fit using shears - then mounted with silicon seal.  Speaker terminals require tweak to hole (see below).  Response down to about 150hz in ported enclosure.  Passable sound (lacks bass) on it's own - but decent as satellite speakers. 

Design Tips

I've found holes on 3d prints tend to come out a little smaller than intended - and some speakers need holes a bit larger than their spec sheets indicate.  My advice is to make the speaker mounting hole as large as practical - as opposed to as small as practical.

Some speakers have terminals that get in the way of fitting in a round hole.  A "makeTerminalNotch" option / associated parameters are provided in the script to account for this.  Other option is to break out the file / Dremel.

By default - two separate wire holes are generated - one on top (for hanging) and another at the rear of the sphere (if using the  stand).  You will likely need to drill out the hole a bit to make your speaker wire fit.  I don't think the second small hole impacts acoustic quality that much (just set its diameter to zero to not render it).

Note - if you're using a heavier speaker driver and want to hang it - the weight of the driver will cause the entire speaker to tip forward.  Adding some kind of counter balance inside the speaker can address this.  Other option is to try moving the wire hole a bit towards the "front" to compensate (you can do this in the script).


Use a raft when printing this model!

It might seem counter-intuitive that you can print a sphere without supports.  The trick is to include a small flat area on the bottom - which the bass port conveniently provides.  If you're not using a bass port - NOMOON will automatically include a flat disk on the bottom of the sphere to make it printable.

The lower parts of the sphere do show some effects from "curling" - and looks a little gnarly on close inspection.  Fortunately - this is the least visible part of the model.  An enclosed / heated build chamber would probably help with this.

I've been printing my speakers using 3 shells at 10% infill at 200 micron layer height (using silver PLA).  They sound good to me - but audiophiles might want to increase thickness / infill.

Final tip - stuff your speaker with polyfill (from the fabric store) to improve sound quality.

Have fun!

Sunday, October 19, 2014

3d Printed SRAM TT500 Friction Mod

Download this design at Thingiverse here:

So - about a year ago I bought a touring bike - a Novara Randonee.

I had just assumed the included SRAM TT500 bar end shifters had a friction mode. Having the option to friction shift is one of the big reasons touring bikes tend to have bar end shifters.

Friction shifting is nice because:
- It's less prone to have issues with adjustment
- It's tolerant of minor mechanical issues like worn cable housings, stretched shift cables and event bent derailers.
- If needed - you can even swap out whatever cassette you can find in the middle-of-no-place - and still shift it. 7-speeds? 10-speeds? Friction shifter don't care.

So - I was disappointed to find out the SRAM TT500 does not support friction shifting. In fact - it's really intended for go-fast "time trial" (TT) bikes. To boot - it seems to not be totally-rock-solid. I've broken a "spring" - and have read multiple reports of others doing so online.

It's almost like Novara chose the TT500 shifters so they could sport the touring look. Thanks Novara.

Enough complaining - how can I fix this?

I figured since I previously 3d-printed a pretty-good friction shifter from scratch - it should be possible to modify an existing index shifter for friction mode.

Several OpenSCAD fugue-states and a few 3d-prints on my Replicator 2 later - and I had a working design.

Download this design at Thingiverse here:

I've put about 200 miles on this mod with no adjustments. I suspect it's probably good for a couple-thousand miles with periodic adjustment. Certainly good enough for use as a backup option.

The TT500 is a 10-speed shifter - and it might not be intuitive that a friction-shifted 10-speed would work well. In my testing - I had few problems with it. I landed between gears about as often as I did friction shifting 7-speeds - and correcting was easy. When things are working well - I prefer indexed shifting for 10-speeds - but really like knowing I have friction as a backup.

I printed my design out of Taulman Bridge Nylon. Taulman Bridge is a great filament that's nylon-tough - but much easier to print with than other nylon filament. Specifically - it seems to have fewer issues with platform adhesion / warping - and is more resistant to moisture problems.

There are two parts to the design - I suggest printing them separately as nylon tends to "string" a bit.

I also did a test print out of PLA - which worked fine. Suspect the nylon version will last longer - but you can always print a couple if you're concerned about durability.

I'm back to indexed-shifting for now - but I store the friction shifter mod parts in my headset - so I always have it if needed.

Saturday, September 13, 2014

SpeakerGen - Parametric 3d Printed Speaker Enclosures

3d print your own speaker enclosures!

This OpenSCAD / Thingiverse Customizer script lets you:
- Generate a box of any desired volume / ratio / wall thickness
- Determine optimal sealed box size for any driver using Thiele / Small parameters (Qts, Vas and Fs)
- Include cutouts for speaker / terminal (and screw holes)
- Include a bass port of any dimensions

Click Here to use SpeakerGen online or download the OpenSCAD script.

With a wide variety of inexpensive full-range drivers - you can easily 3d print a set of speakers that sound great.

SpeakerGen provides a built-in tool that can automatically create an optimized sealed box for your driver's parameters. Speaker drivers' acoustic properties are described using "Thiele/Small" parameters (Qts, Fs and Vas). You can use these parameters to help determine what kind of box will work well for your speakers.

While printing speaker boxes is slow - and only really an option for smaller enclosures - it has several advantages. Assembly is almost instant - and printed enclosures intrinsically don't have issues with panel fit. They are almost certain to be air-tight. If your speaker doesn't seem solid enough - just reprint with a higher infill percent!

So far I've only printed in enclosures in PLA. I can only speculate how boxes made with materials like rubber, wood, nylon or bronze would perform.

Notes on loudspeaker design / printing

Sealed Boxes

Sealed boxes are the simplest to design with primarily one variable: size. They are also very flexible. A speaker driver that sounds good in a 1.0 liter sealed box probably sounds pretty decent in a 1.25 liter sealed box.

A sealed box / driver system is acoustically described using a number of parameters - an important one being "Q." A box's Q describes behavior around its resonance frequency - and hence helps dictate F3 value (bass frequency with a 3db drop in response). Sealed box speakers commonly have Q values in the 0.7 to 1.4 range. The Q of a sealed enclosure system will always be larger than its driver's Qts. The Q of a box decreases as its size goes up - and vice versa.

A Q of 0.7 provides the lowest possible F3 value - and by that argument is the optimal value for sealed speaker design. That said - accepting a larger Q value (say 0.9) allows of a significantly smaller box - with only some loss in bass response. Larger Q values still (say 1.4) result in a further loss in low-end response - but also introduce an upper-bass response peak - which can result in a boomy sound.

SpeakerGen uses some simple math to estimate what box size a given driver needs to obtain a certain Q value - and what F3 frequency that will result in. It works similarly to other online closed box calculators - such as this one:

Ported Boxes

"Ported" boxes utilize a tuned port to enhance bass response (aka bass reflex, vented, etc.). These boxes are more finicky to design - and aren't too hard to get "wrong" (thin bass, boomy bass, etc.). Diameter and length of the port need to be calculated with a moderate degree of precision - otherwise things can go very badly (don't guess).

Ported boxes tend to be larger (and hence take longer to print). However - they can significantly extend the bass range of smaller full-range drivers - which can make them a good choice for a 3d printed single-driver system.

SpeakerGen can easily produce a speaker box including a bass port of any specification you can print. However - since the math is a bit trickier - I'm leaving it up to other people who know better. To determine the correct dimensions for your vented box and bass port - check out these resources:

Print Tips / Pictured Speaker

The pictured speaker uses an AuraSound NS3-193-8A in a 1.7 liter enclosure with a bass port tuned to 70hz. This provides a calculated F3 frequency of 66hz - not bad for a 3" driver! It sounds great - but falls off a bit over 12khz - so treble adjustment is recommended. The speaker box weighs about 1lbs - and took about 17 hours to print.

For my first attempt - I printed a box at 10% infill with only 2 shells. The speaker sounded OK - but subjectively seemed a bit flimsy. For my second print (the one pictured) - I used 20% infill and 3 shells. This produced a solid feeling speaker cabinet. I think these are reasonable settings for smaller speakers (maybe under 1.75 liter). Larger speakers may do better with more infill / thicker walls.

Both prints were at 300 micron with 7mm walls. The inside top of the first print came out a little flimsy feeling (I believe due to having to "bridge" such a large area). For the second print I increased the floor and ceiling thicknesses from the default 0.8mm to 1.5mm - this seemed to address the issue. My gut is this might not be needed for a 200 micron print.


Cabinet assembly is pretty easy! Jut use wood screws to mount the speaker. Be careful not to over-tighten to avoid cracking. If the screws seem difficult to screw-in - try chasing out the holes with a drill bit.

Stuffing your cabinet with "polyfill" is highly recommended as it can reduce resonances - and slightly increase the effective size of your enclosure.

Driver Selection

There are lots of great full-range speakers available on in the $10-30 range. A few good candidates:

Have fun!

Monday, July 7, 2014

Introducing BlinkyBird (for Google Glass)

UPDATE: BlinkyBird has inexplicably been updated to work with Glass XE22 (11/17/2014)!

I've been intending to write some kind of Google Glass app for the last several months - but was having trouble getting inspired.

Then it hit me - how about a Flappy Bird clone that uses Glass's eye sensor for blink-to-flap awesomeness? Done.

BlinkyBird is based on Cocos2d-x - and borrows code from Early Bird.

BlinkyBird uses Glass's eye sensor - just double-blink to flap!

Google doesn't expose support for the eye sensor in the SDK - but thorikawa and kaze0 came up with some tricks to get access to it.


  • Double-blink to flap (single-blink detection isn't enabled in the current version of Glass).
  • Be sure to calibrate the eye sensor in Google Glass settings. Try repositioning Glass on your face if calibration doesn't work.
  • Don't double-blink too fast - with practice - near 100% blink detection is possible.
  • If you're having trouble with "blink" mode - try "tap" mode. It works pretty much like classic Flappy Bird.
  • For now BlinkyBird is free.

    Download the BlinkyBird APK here!

    Instructions on installing an APK on Glass

    Friday, January 10, 2014

    Radioactivity and Lasers at Ada's Books

    A few weeks ago I gave a presentation at Ada's Technical Books on two of my favorite projects:

    Peltier Cooler Based Cloud Chamber
    Arduino Powered Laser Show

    Thanks to Ada's for hosting and the great write-up in their blog and awesome photos.

    If you're in the Seattle area - definitely checkout Ada's. Their new location / cafe are spectacular with great food - a huge selection of technical books, electronic projects and interactive art.

    Wednesday, November 6, 2013

    3d Printed Hook / Loop Fasteners (ElastoStraps)

    I'd been thinking about better ways to attach things like lights and pumps to my bike for a while.

    Click Here to check out ElastoStraps on!

    I recently saw some commercially available bike lights that had elastic-style fasteners built into their design - and figured there might be a way I could make my own on my 3d printer.

    Over the next several days I developed "ElastoStraps" - reusable hook / loop fasteners 3d printed in soft PLA.

    Just stretch them around two things you want to hold together - and push the mesh over the hooks (don't worry if all the hooks don't catch).

    ElastoStraps have not been tested extensively - I can make no promises about durability. However - I will say that soft PLA is surprisingly tough stuff.

    So far - I've only printed ElastoStraps in "Flex EcoPLA" brand soft PLA available from If you try other brands / filament types - please let me know how it goes!

    I created ElastoStraps in OpenSCAD. You can easily use the Customizer on Thingiverse to make ElastoStraps of any size you like without needing to know OpenSCAD.

    Click Here to check out ElastoStraps on!

    Printing in soft PLA can be a bit tricky - this presentation has some tips:

    Friday, September 20, 2013

    Introducing ProfTweak - a MakerWare profile editor

    ProfTweak 1.4 now supports Makerbot Desktop. It also fixes a bug in ProftTweak v1.2 and v1.3 that can cause bad profiles (update now!).

    I'm a big fan of MakerWare and the MakerBot slicer.

    The recent improvements in rafts, supports and general slicing quality are impressive.

    That said - the one thing it doesn't do is provide a UI to access all the juicy goodies that let you really tweak print quality and get good results with alternative filaments.

    Sometimes I need to do things like:

    - Turn the filament fan off
    - Adjust filament diameter
    - Make the infill cats
    - Change individual feedrate options (infill vs outlines)

    Further - I often want to take an existing profile - and change a single variable as an experiment. For example - I might have a profile for Nylon that works well - but I want to try boosting the temperature up to 255c (and not have to create a new profile or risk messing-up the one that already works well).

    So - I present ProfTweak:

    Source and binaries (Windows, Mac, Linux) for ProfTweak are available on GitHub.
    Tip: Look for the "Download Zip" button to quickly grab everything.

    Source and binaries (Windows, Mac, Linux) for ProfTweak are available on GitHub.
    Tip: Look for the "Download Zip" button to quickly grab everything.

    What ProfTweak Does:

    - Provides a simple GUI to access MakerWare slicer profile settings
    - Toggle between a complete list of settings (there are a lot) and a smaller "Common Settings" list
    - Add notes to your profiles
    - Option to save as "ProfTweakTemp" profile for one-off experiments
    - Windows, Mac and Linux versions (someone let me know if the Linux version actually works...)

    ProfTweak was written in Processing using the G4P GUI library (these are great resources - but next app I will probably try something not Java-based).

    ProfTweak requires Java (32-bit). If ProfTweak won't run - you may need to install it.

    ProfTweak is licensed under

    General Notes and Usage (aka documentation)

  • I've tested ProfTweak - and it seems to work for me. But there may be bugs - awful bugs! I can't say with certainty it won't do something terrible to your brand-new Replicator 2x.

  • Don't bug the nice people at MakerBot support about issues you encounter while using profiles generated by ProfTweak.

  • ProfTweak requires an existing custom profile to start with. You might want to create an unadulterated custom profile from inside MakerWare based on the "Standard" (and maybe "Low" / "High") to base future profiles on. ProfTweak won't modify the built-in MakerWare profiles.

  • When you create a new profile from within ProfTweak it copies the supporting files (end.gcode, start.gcode, profile.json) to a new folder - as well as writing out a new miracle.json file based on your modifications.

  • ProfTweak stores its settings in proftweak.json found in the DATA folder under the folder where the app is installed.

  • ProfTweak should generally find your MakerWare profile folder - but if it doesn't - you can specify it manually in proftweak.json (Linux users will probably need to do this).

  • If you're a Windows user and find you need to set your profile folder - format it like this: "C:/Users/Rich/My Things/Profiles/"

  • If you want to add / remove common items you can do so by modifying proftweak.json.

  • Mac users - if you get an error " is damaged and can't be opened" - it's likely due to your Gatekeeper settings requiring apps be signed. See here for the solution.

  • If you associate .json files with ProfTweak - MakerWare will launch it automatically when you select "Edit profile." The Windows setup package can do this for you automatically.

  • ProfTweak reformats the .json in any profile it edits. This makes it less human-readable (MakerWare seems OK with it).

  • When you modify a number - ProfTweak deals with it as a float. As a result .15 becomes 0.15000000596046448. This shouldn't make a meaningful difference when slicing - but it might make a small one.

  • Saving in ProfTweak is always a manual operation. If you close without saving - you've closed without saving!

  • Have fun!!! Don't hesitate to contact me ( about issues.