Tripod Phone Clamp
A smartphone holder that mounts on any camera tripod with the standard 1/4-20 tripod screw. It is one printed piece: a band with a C-shaped jaw on each long edge of the phone, where one jaw rides on a zigzag flexure spring that opens a few millimetres and presses the phone in place. The tripod screw threads into a steel 1/4-20 hex nut that you push into an open slot in the solid jaw block, so no thread is printed and no print pause is needed. Overall size is 93.5 x 39.4 x 22 mm with the default settings. Print it flat as modelled, without supports; PETG gives the spring a little more life than PLA. You can change the phone width and thickness including the case, the clamp height, the spring preload, beam thickness and length, and the nut pocket clearance.
# Tripod Phone Clamp - holds a phone on a 1/4-20 tripod screw
#
# One printed piece plus one steel 1/4-20 hex nut. The clamp is a band that wraps
# across the phone's width: a C-shaped jaw on each long edge, a back bar behind the
# phone, and a zigzag flexure spring that lets one jaw open and press the phone in.
#
# Use: hold the phone in landscape. The solid jaw block goes at the bottom and sits
# on the tripod plate; the tripod's 1/4-20 screw enters its outer face and threads
# into the captive nut. Pull the spring jaw outward, drop the phone in, let go.
# Slide the clamp along the phone so it does not press a side button.
#
# Nut: push a standard 1/4-20 hex nut (7/16 in = 11.11 mm across flats) into the
# slot on the top face of the jaw block until it drops into the hex pocket. No
# pause is needed; the slot is open, and the screw pulls the nut against the wall.
#
# Print orientation: as modelled, flat on Z = 0 (the profile lies on the bed and is
# extruded up). No supports; the only overhang is the top of the 6.8 mm screw hole.
#
# Axes: X = across the phone (jaw to jaw), Y = phone thickness (Y = 0 is the phone's
# back, +Y toward the screen), Z = along the phone's length (print height).
@param 60..95 step:0.5 desc:"Phone width including case (mm)"
phone_w = 78
@param 7..14 step:0.5 desc:"Phone thickness including case (mm)"
phone_t = 10
@param 20..30 desc:"Clamp height along the phone (mm)"
height = 22
@param 1..3 step:0.5 group:"Spring" desc:"Preload - jaws are this much narrower than the phone (mm)"
preload = 2
@param 1.2..2.4 step:0.1 group:"Spring" desc:"Spring beam thickness (mm)"
beam_t = 1.5
@param 14..30 group:"Spring" desc:"Spring beam length (mm)"
beam_l = 20
@param 0.0..0.6 step:0.05 group:"Nut" desc:"Nut pocket clearance (total, mm)"
nut_clear = 0.3
# --- Fixed dimensions ---
t_gap = phone_t + 0.6 # channel width for the phone (thickness + clearance)
gap = phone_w - preload # jaw-to-jaw distance at rest
back_t = 4 # back bar thickness (Y)
lip_t = 2.5 # front lip thickness (Y)
lip_in = 3 # how far the lips reach over the screen edge (X)
jaw_w = 3.5 # spring-side jaw wall (X)
base_w = 14 # solid jaw block (X): 3 floor + nut + inner wall
pitch = 4.5 # spring beam spacing (X)
c = 0.8 # air gap between spring folds and the bar above them
# --- Nut and screw (1/4-20 UNC: 6.35 major diameter) ---
nut_af = 11.11 + nut_clear # across flats
nut_th = 5.56 + nut_clear # thickness
nut_r = nut_af / sqrt(3) # circumradius of the hex pocket
screw_d = 6.8 # clearance hole for the 6.35 screw
floor_x = 3 # wall between the tripod plate face and the nut
skin = 1.5 # wall left between the screw hole end and the phone
y_front = t_gap + lip_t
yt = -back_t - c - beam_t / 2 # centreline of the upper spring folds
yb = yt - beam_l # centreline of the lower spring folds
y_back = yb - beam_t / 2 # rear-most face (spring bottom)
# Spring beam X positions: 6 beams, the last one sits under the spring jaw
x6 = gap - 2
x1 = x6 - 5 * pitch
x2 = x1 + pitch
x3 = x2 + pitch
x4 = x3 + pitch
x5 = x4 + pitch
x_s = x3 + pitch / 2 - c / 2 # back bar ends here; spring jaw pad starts at x_s + c
# --- Profile (XY plane) ---
block = rect base_w (y_front - y_back) at:((-base_w / 2), ((y_front + y_back) / 2))
lip0 = rect (lip_in + 1) lip_t at:(((lip_in - 1) / 2), (t_gap + lip_t / 2))
bar = rect (x_s + 1) back_t at:(((x_s - 1) / 2), (-back_t / 2))
jaw_wall = rect jaw_w (y_front + back_t) at:((gap + jaw_w / 2), ((y_front - back_t) / 2))
jaw_pad = rect (gap - x_s - c + 0.5) back_t at:(((x_s + c + gap + 0.5) / 2), (-back_t / 2))
lip1 = rect (lip_in + 0.5) lip_t at:((gap - (lip_in - 0.5) / 2), (t_gap + lip_t / 2))
spring = wire [
(x1, -back_t / 2), (x1, yb), (x2, yb), (x2, yt), (x3, yt), (x3, yb),
(x4, yb), (x4, yt), (x5, yt), (x5, yb), (x6, yb), (x6, -back_t / 2)
] | offset (beam_t / 2)
profile = block + lip0 + bar + jaw_wall + jaw_pad + lip1 + spring
body = profile | extrude height
# --- Captive nut pocket in the solid jaw block (axis X, screw enters from -X) ---
yc = (y_front + y_back) / 2
zc = height / 2
hex = polygon 6 nut_r | extrude nut_th | rotate 0 90 0
| translate (-base_w + floor_x) yc zc
slot = box nut_th nut_af (height - zc + 1) | floor
| translate (-base_w + floor_x + nut_th / 2) yc zc
screw = cylinder (screw_d / 2) (base_w - skin + 1) | rotate 0 90 0
| translate (-base_w + (base_w - skin + 1) / 2 - 1) yc zc
clamp = body - hex - slot - screw
# --- Intent ---
assert clamp.solids == 1
assert clamp.valid
assert clamp.bbox.x ~ (base_w + gap + jaw_w)
assert clamp.bbox.y ~ (y_front - y_back)
assert clamp.bbox.z ~ height
assert clamp.bbox.min[2] ~ 0 tol:0.01
assert zc - nut_r >= 3 # floor under the hex pocket
assert ((y_front - y_back) - nut_af) / 2 >= 3 # side walls of the nut slot
assert base_w - floor_x - nut_th - skin >= 3 # room for the screw past the nut
assert x1 - beam_t / 2 > lip_in + 3 # spring stays clear of the fixed jaw
assert clamp.volume < body.volume - 600 # pocket and hole were really cut
print "rest gap between jaws" gap
print "screw reach past outer face" (base_w - skin)
print "volume" clamp.volume
clamp