Rendering these values. This takes a few seconds.
Download STL
Read this model as text

A headphone stand that clamps to the edge of a desk: a C-clamp with a printed thumb-screw bolt and a hanger arm at the bottom, reaching out past the edge so the headphones hang in front of the desk. The whole body is built from straight rectangles and polished afterwards: the profile corners are rounded with 2D offsets and the remaining edges with a minkowski pass, both as a final step over the straight construction.

The image shows the solid OpenSCAD renders at part both · desk_max 30 · clamp_depth 40 · clamp_width 32 · jaw 8 · foot 10 · bolt_size 8 · travel 18 · tolerance 0.5 · arm_length 60 · arm_thick 12 · lip 16 · lip_thick 10 · round_r 2.5 · edge_r 1.5 · smoothness 48.

MIT

Headphone stand with desk clamp

mick/desk-headphone-stand@1.0.1

Remix this
Report

For a legal or policy problem: a license violation, personal data, somebody else’s work republished as their own. A model that prints badly is a comment, not a report.

Sign in to report

0reused0 remixes · 0 imports0downloads1.0.2latest

Parameters

from source
1060, steps of 1
2080, steps of 1
1660, steps of 1
514, steps of 0.5
616, steps of 0.5
512, steps of 1
840, steps of 1

Showing the render for these values.

Description

What is this

A headphone stand that clamps to the edge of a desk: a C-clamp with a printed thumb-screw bolt and a hanger arm at the bottom, reaching out past the edge so the headphones hang in front of the desk. The whole body is built from straight rectangles and polished afterwards: the profile corners are rounded with 2D offsets and the remaining edges with a minkowski pass, both as a final step over the straight construction.

What you use it for

Hanging headphones off the desk edge, out of the way below desk level. The thumb screw clamps any desk up to desk_max thick and the lip at the arm end keeps the headband from sliding off.

Design notes

The stand is one 2D profile of axis-aligned squares: top jaw, back, bottom jaw, arm and lip. Rounding never shapes the design, it only polishes it: a closing and opening offset pair rounds every profile corner at round_r, then the extruded body is shrunk and minkowski-grown by edge_r so the side edges match. Set both to zero and the raw straight construction comes back.

The clamp thread is cut into the bottom jaw with ScrewHole and the bolt is generated with ScrewThread at the same tolerance, so both parts fit when printed on the same machine. The knob is an octagon, rounded by the same polish, with flats for finger grip.

Parameters

part picks the assembly, the stand or the bolt. desk_max, clamp_depth, clamp_width, jaw and foot size the clamp, bolt_size picks the metric thread and travel the clamping range. arm_length, arm_thick, lip and lip_thick shape the hanger. round_r and edge_r are the polish, and zero turns it off.

Use with your agent
{
  "mcpServers": {
    "remixcad": {
      "type": "http",
      "url": "https://remix-cad.vercel.app/api/mcp"
    }
  }
}
get_model("mick/desk-headphone-stand@1.0.1")

Returns the manifest, the source, the import closure and the license obligations. Full MCP setup.

Parameter table

Parsed from the Customizer annotations in main.scad
Parameters of Headphone stand with desk clamp, with the ranges the source declares
NameDefaultRangeUnitDescription
part"both"both, stand, bolt
desk_max3010 to 60 step 1
clamp_depth4020 to 80 step 1
clamp_width3216 to 60 step 1
jaw85 to 14 step 0.5
foot106 to 16 step 0.5
bolt_size85 to 12 step 1
travel188 to 40 step 1
tolerance0.50.2 to 1 step 0.05
arm_length6030 to 110 step 1
arm_thick128 to 20 step 1
lip160 to 35 step 1
lip_thick106 to 16 step 1
round_r2.50 to 5 step 0.5
edge_r1.50 to 3 step 0.25
smoothness4816 to 96 step 8

Lineage

0 models depend on this one

Only what this model came from and what came from it.

Remix, the code changed Import, used unchanged and pinned The version you are on Withdrawn, still recorded

License

Whoever downloads this takes these obligations along
  • mick/desk-headphone-stand@1.0.1 is MIT
  • remixcad/threads@1.0.0 is CC0

Source

main.scad is the entrypoint
main.scad
// A headphone stand that clamps to a desk edge, with the hanger arm at the bottom so the
// headphones hang in front of the desk. Built entirely from straight rectangles; corners
// and edges are rounded afterwards as a final polish, never as part of the construction.
// Uses threads.scad by Ryan A. Colyer, released with CC0 into the public domain.
// Published on RemixCAD as remixcad/threads.
use <remixcad/threads/threads.scad>

/* [Parts] */
// Render the assembly, or one part for printing.
part = "both"; // [both, stand, bolt]

/* [Clamp] */
// Thickest desk the clamp opens for.
desk_max = 30; // [10:1:60]
// How far the jaws reach over the desk.
clamp_depth = 40; // [20:1:80]
// Width of the clamp along the desk edge.
clamp_width = 32; // [16:1:60]
// Thickness of the top jaw, resting on the desk.
jaw = 8; // [5:0.5:14]
// Thickness of the bottom jaw, carrying the thread.
foot = 10; // [6:0.5:16]
// Nominal metric size of the clamp bolt, so 8 is an M8.
bolt_size = 8; // [5:1:12]
// How far the bolt can travel up from the bottom jaw.
travel = 18; // [8:1:40]
// Taken off the thread to allow for printing.
tolerance = 0.5; // [0.2:0.05:1]

/* [Hanger] */
// How far the arm reaches out past the desk edge.
arm_length = 60; // [30:1:110]
// Thickness of the arm the headband rests on.
arm_thick = 12; // [8:1:20]
// Height of the lip at the arm end. Zero removes it.
lip = 16; // [0:1:35]
// Thickness of the lip.
lip_thick = 10; // [6:1:16]

/* [Polish] */
// Radius the profile corners are rounded to. Zero keeps them sharp.
round_r = 2.5; // [0:0.5:5]
// Radius the remaining edges are rounded to. Zero keeps them sharp.
edge_r = 1.5; // [0:0.25:3]

/* [Quality] */
// Facets on the rounded polish. More is smoother and slower.
smoothness = 48; // [16:8:96]

/* [Hidden] */
back = 12;
gap = desk_max;
bottom = -(gap + foot);
bolt_x = clamp_depth * 0.55;
bolt_len = foot + travel;
knob_d = 3.2 * bolt_size;
knob_h = 7;

// The polish: a closing pass rounds the concave corners, an opening pass the convex
// ones. Applied over the finished straight shape, never during it.
module polish2d(r) {
  if (r > 0)
    offset(r = r, $fn = smoothness)
      offset(r = -2 * r, $fn = smoothness)
        offset(r = r, $fn = smoothness)
          children();
  else
    children();
}

// ---- Stand ----
// One 2D profile of axis-aligned squares, in the XZ plane.
// Origin: top of the desk at z = 0, the desk edge at x = 0, the desk toward +x.

module profile_raw() {
  // Top jaw, resting on the desk.
  square([clamp_depth, jaw]);
  // Back, spanning the desk edge.
  translate([-back, bottom]) square([back, gap + foot + jaw]);
  // Bottom jaw, carrying the clamp thread.
  translate([0, bottom]) square([clamp_depth, foot]);
  // Arm at the bottom, reaching out past the edge.
  translate([-(back + arm_length), bottom]) square([arm_length, arm_thick]);
  // Lip at the arm end, so the headband cannot slide off.
  if (lip > 0)
    translate([-(back + arm_length), bottom])
      square([lip_thick, arm_thick + lip]);
}

module profile() {
  polish2d(round_r) profile_raw();
}

module stand_body() {
  if (edge_r > 0)
    minkowski() {
      rotate([90, 0, 0])
        linear_extrude(height = clamp_width - 2 * edge_r, center = true)
          offset(r = -edge_r, $fn = smoothness) profile();
      sphere(r = edge_r, $fn = 20);
    }
  else
    rotate([90, 0, 0])
      linear_extrude(height = clamp_width, center = true) profile();
}

module stand() {
  // The clamp thread is cut straight into the bottom jaw.
  ScrewHole(bolt_size, foot + 2, [bolt_x, 0, bottom - 1], [0, 0, 0],
            tolerance = tolerance)
    stand_body();
}

// ---- Clamp bolt ----
// An octagonal knob with grip flats, polished by the same passes; thread above and a
// flat pad at the tip so it does not mark the desk.

module knob2d() {
  polish2d(2) circle(d = knob_d, $fn = 8);
}

module pad2d() {
  polish2d(1.5) circle(d = 1.6 * bolt_size, $fn = 8);
}

module clamp_bolt() {
  if (edge_r > 0)
    translate([0, 0, edge_r])
      minkowski() {
        linear_extrude(height = knob_h - 2 * edge_r)
          offset(r = -edge_r, $fn = smoothness) knob2d();
        sphere(r = edge_r, $fn = 20);
      }
  else
    linear_extrude(height = knob_h) knob2d();
  translate([0, 0, knob_h - 0.01])
    ScrewThread(bolt_size, bolt_len, tolerance = tolerance);
  translate([0, 0, knob_h + bolt_len - 0.01])
    linear_extrude(height = 2.5) pad2d();
}

// ---- Layout ----

if (part == "stand") {
  // On its side, ready to print.
  rotate([90, 0, 0]) translate([0, 0, clamp_width / 2]) stand();
} else if (part == "bolt") {
  clamp_bolt();
} else {
  stand();
  // Assembled: knob under the bottom jaw, thread up through the hole.
  translate([bolt_x, 0, bottom - knob_h - 6]) clamp_bolt();
}

Comments

Context, not a score. Comments never move a model up or down the results.

No comments yet

Printed it? A note about your material and the clearance you landed on saves the next person a failed print.

Sign in to comment