GoPro-Compatible Mount
A mount with the GoPro-style finger joint, so you can attach an action camera or any compatible accessory with an M5 thumb screw. Switch between a 2-finger (male) and 3-finger (female) joint, and between a base with a captive 1/4"-20 tripod nut inserted from the side or a flat plate for double-sided tape. The 3-finger version can include an M5 hex nut seat on the outer finger, with its hex rotated vertex-up so it prints without a bridge. The default 3-finger tripod version measures 30 x 30 x 28 mm. Print it base down with no supports; PETG or ASA is recommended for outdoor or in-car use. Finger thickness, clearance, width, hole height and hole diameter are all adjustable so you can match your own parts.
# GoPro-Compatible Finger Joint Mount - 2 or 3 prongs on a tripod-nut or adhesive base
#
# A base with two or three GoPro-style fingers (prongs). The base is either
# a block with a sideways slot for a tripod screw (1/4"-20) nut, or a flat plate for double-sided tape.
# No official drawing of the GoPro fingers is published, so the dimensions are assumed values
# based on commonly measured ones (finger thickness ~3mm, finger width ~15mm, M5 thumb screw).
#
# Axes: extrusions from the XZ plane go +Y. Fingers are lined up along Y, the bolt hole axis is Y. Base bottom is z=0 (print bed).
@param choices:[2, 3] desc:"Number of fingers (2 = male side / 3 = female side)"
prongs = 3
@param choices:["tripod", "adhesive"] desc:"Base (tripod nut / adhesive plate)"
base = "tripod"
@param 2.6..3.4..0.1 group:"Joint" desc:"Finger thickness (mm)"
finger_t = 3.0
@param 0.1..0.6..0.05 group:"Joint" desc:"Clearance to the mating finger (total) (mm)"
finger_clear = 0.3
@param 12..18..0.5 group:"Joint" desc:"Finger width = tip diameter (mm)"
finger_w = 15
@param 6..16..0.5 group:"Joint" desc:"Height from base top to bolt hole center (mm)"
hole_h = 9
@param 5.0..5.8..0.1 group:"Joint" desc:"Bolt hole diameter (mm, M5 clearance)"
hole_d = 5.4
@param desc:"Add an M5 hex nut seat outside the 3-finger joint"
nut_trap = true
# --- Derived joint dimensions ---
gap = finger_t + finger_clear # slot for the mating finger
pitch = finger_t + gap # finger center spacing 6.3mm
fr = finger_w / 2
# --- Base dimensions ---
base_w = 30 # X
base_d = 30 # Y
base_r = 4
tri_floor = 3 # floor under the nut (takes the clamping load)
nut_af = 11.11 + 0.3 # 1/4"-20 hex nut across flats 7/16" + clearance
nut_th = 5.56 + 0.3 # 1/4"-20 nut thickness 7/32" + clearance
screw_d = 6.8 # 1/4" (6.35) clearance hole
roof = 2.5
base_t = if base == "tripod" then tri_floor + nut_th + roof else 3
# --- Base ---
plate = box base_w base_d base_t | floor | edges =Z | fillet base_r
# Tripod side: clearance hole from below, nut inserted from the side (-X)
nut_slot = box (base_w / 2 + 2) nut_af nut_th | floor
| translate (-(base_w / 2 + 2) / 2) 0 tri_floor
nut_hex = polygon 6 (nut_af / sqrt(3)) | rotate 30 | extrude nut_th
| translate 0 0 tri_floor
screw = cylinder (screw_d / 2) (base_t - 1) | floor | translate 0 0 -0.5
base_body = if base == "tripod" then (plate - [nut_slot, nut_hex, screw]) else plate
# --- Fingers (profile drawn in the XZ plane, extruded along Y) ---
# Note: `$p = sketch ...` followed by `workplane XZ | place $p` flips Z,
# so this function draws the sketch directly on the workplane
def finger_solid(t) = workplane XZ | sketch [
(-fr, 0), (fr, 0), (fr, hole_h),
arc (fr, hole_h) (0, hole_h + fr) (-fr, hole_h),
(-fr, 0)
] | extrude t | translate 0 0 base_t
finger = finger_solid finger_t
ys = [(i - (prongs - 1) / 2) * pitch for i in range(prongs)]
fingers = union [finger | translate 0 (y - finger_t / 2) 0 for y in ys]
# M5 nut seat (+Y outside of the 3-finger joint). Nut 8mm across flats, 4mm thick
m5_af = 8 + 0.3
boss_t = 4.5 # thickness added to the outer finger (0.5 seat floor + 4 nut)
boss_y = (prongs - 1) / 2 * pitch + finger_t / 2
# The seat uses the same profile as a finger and reaches down to the base (a floating cylinder would overhang)
boss = finger_solid boss_t | translate 0 boss_y 0
hex = polygon 6 (m5_af / sqrt(3)) | rotate 30 | extrude (boss_t + 1) # vertex up (avoids a bridge when printed)
| rotate -90 0 0
| translate 0 (boss_y + 0.5) (base_t + hole_h)
use_nut = nut_trap and prongs == 3
joint = if use_nut then (fingers + boss - hex) else fingers
# Bolt hole (through along Y)
bolt = cylinder (hole_d / 2) (base_d + 20) | rotate 90 0 0
| translate 0 0 (base_t + hole_h)
base_body + joint - bolt