This blog is also available on Gemini (What's Gemini?)

Got stuff that needs to be attached to other stuff? Use Attach::Stuff


I'm in the middle of a project that's going to be continaing a Raspberry Pi, the Rpi camera module, a GPS breakout board, an accelerometer breakout board, and a microphone breakout board. All that needs to be screwed into a lasercut case.

Now, the lasercutter at The Bodgery[1] takes its own special format (naturally), but can also import DXF and PLT files, among others. Both of these can be exported by Inkscape, and I've generally found the PLT export works a little better. In any case, Inkscape can take an SVG file, which I can create programmatically in Perl easily enough.

So I worked out how to do all that with the SVG[2] module. Thing is, the majority of boards are covered by these steps:

1. Draw a box *x* mm by *y* mm 2. Place a list of screw holes at designated coordinates, which all have the same radius

Which is really easy to wrap up into a single class, which gives back an SVG object with the bits above already done. If there's something slightly more complicated to do (like making a box for the Rpi camera's lens), then you can draw that in yourself with the SVG object you have in hand.

Here's an example for Adafruit's Ultimate GPS module[3]:

use v5.14; use warnings; use Attach::Stuff;

my $attach = Attach::Stuff->new({ width => 26, height => 34, screw_default_radius => 1.25, screw_holes => [ [ 3, 3 ], [ 26 - 3, 3 ], ], }); my $svg = $attach->draw; print $svg->xmlify;

All the stuff from the Raspberry Pi Foundation has schematics out there already, so that was easy. Adafruit's breakout boards, however, don't seem to have any published schematics (Sparkfun isn't any better, as far as I can tell), so I got out the callipers and started measuring. Had to do some guess work with the screw hole location and size. After a few iterations of prototypes being etched into cardboard, I got a design that looks like it will work.

Attach::Stuff v0.652389025389315 should be out to the CPAN mirrors shortly.