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

A taco clip that holds an 8BitDo Micro on the lower part of a phone screen, for DS and other retro emulation in portrait. A PETG spring wraps around the bottom edge of the phone and presses on the back, so it fits phones from 6 to 12 mm thick (with case) and any width. The Micro sits in a tray that slides onto two dovetail rails on the clip. The USB-C port stays free, so you can charge while you play.

The image shows the solid OpenSCAD renders at micro_fit 0.4 · micro_thickness 12 · spring_thickness 2 · layout Print · preview_phone_thickness 11 · color_clip DimGray.

MIT

8BitDo Micro Phone Clip

mick/micro-phone-clip@1.1.0

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 imports3downloads1.1.0latest

Parameters

from source
0.21, steps of 0.1
1014, steps of 0.2
1.62.6, steps of 0.2
612, steps of 0.5

Showing the render for these values.

Description

What is this

This section is empty. The author has not written it yet.

What you use it for

This section is empty. The author has not written it yet.

Design notes

This section is empty. The author has not written it yet.

Parameters

  • micro_fit: room around the Micro in its tray.
  • micro_thickness: thickness of the Micro's body at its edge, without the buttons. Lower it if the Micro sits loose, raise it if it is hard to slide in.
  • spring_thickness: thicker grips harder. Lower it if the clip is too tight on your phone; the edge rounding follows it.
  • layout: Print, Assembled, or On phone (with preview_phone_thickness for the preview).

What it is

A taco clip that holds an 8BitDo Micro on the lower part of a phone screen, for DS and other retro emulation in portrait. A PETG spring wraps around the bottom edge of the phone and presses on the back, so it fits phones from 6 to 12 mm thick (with case) and any width. The Micro sits in a tray that slides onto two dovetail rails on the clip. The USB-C port stays free, so you can charge while you play.

How to use

Slide the tray onto the clip from the top until it stops. Slide the Micro into the tray from the open top end: the walls curl over the edge of its face and press it onto the floor, and a small catch on each side wall drops behind its rounded top corners. Push the clip onto the bottom of your phone; the flared spring tip guides it on. On a typical 6.7 inch phone about 110 mm of screen stays free above the Micro, enough for both DS screens stacked.

Printing

Two parts, no supports, PETG. The clip prints on its side so the spring bends along its layers; the tray prints flat, its lips have 45 degree undersides. Both fit a 180 mm bed.

Changes in 1.1.0

  • Tray as deep as the Micro, with walls that curl over its face instead of snap lips; the Micro slides in from the top.
  • Softer spring: opens 5 mm at rest instead of 3, and is longer.
  • 1 mm edge rounding on the clip, and smaller plan corners so the bottom bar runs cleanly to the sides.
Use with your agent
{
  "mcpServers": {
    "remixcad": {
      "type": "http",
      "url": "https://remix-cad.vercel.app/api/mcp"
    }
  }
}
get_model("mick/micro-phone-clip@1.1.0")

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 8BitDo Micro Phone Clip, with the ranges the source declares
NameDefaultRangeUnitDescription
micro_fit0.40.2 to 1 step 0.1
micro_thickness1210 to 14 step 0.2
spring_thickness21.6 to 2.6 step 0.2
layout"Print"Print, Assembled, On phone
preview_phone_thickness116 to 12 step 0.5
color_clip"DimGray"DimGray, Black, White, Silver, SteelBlue, FireBrick, Goldenrod

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/micro-phone-clip@1.1.0 is MIT

Source

main.scad is the entrypoint
main.scad
// Taco clip that holds an 8BitDo Micro on the lower part of a phone screen, for DS and other
// retro emulation in portrait. The clip wraps around the bottom edge of the phone: a plate on
// the screen, a PETG spring on the back. It fits phones from 6 to 12 mm thick (with case) and
// any width. The Micro sits in a tray that slides onto two dovetail rails on the plate.
// Two prints, no hardware. The USB-C port stays free through the bottom.

/* [Fit] */
// Room around the Micro in its tray, per side.
micro_fit = 0.4; // [0.2:0.1:1]
// Thickness of the Micro's body at its edge, without the buttons. Lower it if the Micro sits loose.
micro_thickness = 12; // [10:0.2:14]
// Thickness of the back spring. Thicker grips harder.
spring_thickness = 2; // [1.6:0.2:2.6]

/* [Preview] */
// Print: both parts laid out on the bed. Assembled: tray on the clip. On phone: with a phone and the Micro.
layout = "Print"; // [Print, Assembled, On phone]
// Phone thickness in the preview.
preview_phone_thickness = 11; // [6:0.5:12]

/* [Colour] */
// Display only, the STL carries no colour.
color_clip = "DimGray"; // [DimGray, Black, White, Silver, SteelBlue, FireBrick, Goldenrod]

/* [Hidden] */
$fn = 48;
// 8BitDo Micro, measured
mw = 72.1;
mh = 39.6;
mt = micro_thickness;
mr = 10;                 // corner radius of its body

fit = micro_fit;
t = spring_thickness;
w = 2.4;                 // walls, also the bottom bar
pw = mw + 2 * fit;
ph = mh + 2 * fit;
W = pw + 2 * w;
F1 = 2;                  // clip plate on the screen
FT = 2.6;                // tray floor, carries the dovetail grooves
side_top = ph - 2;       // the walls end here, the tray is open at the top
ov = 1.8;                // the lips reach this far over the face of the Micro
lt = 1.6;                // lip thickness
press = 0.3;             // the lips sit this much below the face, so they press the Micro onto the floor

// Phone: bottom edge at y = 0, screen at z = 0, back at z = -thickness
t_max = 12;
t_min = 6;
gap = t_max + 0.6;
L = 52;                  // spring length up the back
rest = t_min - 1;        // the tip rests here, so a 6 mm phone is still gripped
flare = 8;               // lead-in so the phone slides in
theta = atan((gap - rest) / L);
usb_w = 16;
ch = 4;                  // 45 degree corners, so the clip prints on its side

// Dovetail rails
rx = 30;                 // centre of each rail
rb = 5;                  // width at the plate
rh = 1.6;                // height, flanks at 45 degrees
ry0 = 3;                 // rails start here, the tray stops against them
rclr = 0.2;

echo(str("Fits phones 6 to 12 mm thick, any width. Floor on the screen ", F1 + FT, " mm."));

module rounded(rad) { offset(r = rad) offset(delta = -rad) children(); }
module fillet(rad) { offset(r = -rad) offset(delta = rad) children(); }
module stroke(a, b, d) { hull() { translate(a) circle(d = d); translate(b) circle(d = d); } }
module along_x(width) { rotate([90, 0, 90]) translate([0, 0, -width / 2]) linear_extrude(width) children(); }

module pocket2d() { translate([-pw / 2, 0]) rounded(mr) square([pw, ph + mr]); }

// Outline of the tray and the plate, seen from the screen. The corners are kept small, so the
// bottom bar of the clip runs out to the sides instead of being cut away at the corners.
plan_r = 5;
module plan2d() { translate([-W / 2, -w]) rounded(plan_r) square([W, ph + w]); }

// Same corners as the tray at the bottom, so clip and tray line up; rounded at the tip of the spring.
module arm_plan2d() {
  c = 8;
  hull() {
    intersection() { plan2d(); translate([-W, -w - 1]) square([2 * W, mr + w + 1]); }
    for (s = [-1, 1]) translate([s * (W / 2 - c), L + flare - c]) circle(r = c);
  }
}

// A slab whose top edge is rounded with radius r, in small steps.
module round_top(h, r, n = 6) {
  for (i = [0:n]) {
    a = 90 * i / n;
    linear_extrude(h - r + r * sin(a)) offset(delta = -r * (1 - cos(a))) children();
  }
}

// ---- Clip ----
// Bottom bar seen from the side, rounded only at the back corner. The front corner stays
// square, so the tray sits flush on it.
bend_r = 3;   // inside radius of the bend around the bottom edge of the phone

module bar2d() {
  r = 2;
  hull() {
    translate([-w, -gap - t + r]) square([w, gap + t + F1 - r]);
    translate([-w + r, -gap - t + r]) circle(r = r);
    translate([-0.01, -gap - t]) square(0.01);
  }
}

module front_profile2d() {
  fillet(2.5) union() {
    translate([-w, 0]) square([ph + w, F1]);
    bar2d();
  }
}

// The spring at rest, swung open by a given angle for the preview.
module arm_profile2d(open = 0) {
  root = [0, -gap - t / 2];
  fillet(bend_r) union() {
    bar2d();
    translate(root) rotate(-open) translate(-root) {
      knee = [L, -rest - t / 2];
      stroke(root, knee, t);
      stroke(knee, [L + flare, -rest - t / 2 - flare * 0.6], t);
    }
  }
}

// Dovetail profile across x, at the plate surface.
module dovetail2d(c = 0) {
  polygon([[-rb / 2 - c, -0.01], [rb / 2 + c, -0.01], [rb / 2 + rh + c, rh + c], [-rb / 2 - rh - c, rh + c]]);
}

module rails() {
  // rails run out to the top edge, so the joint is flush there
  intersection() {
    for (s = [-1, 1]) translate([s * rx, ph + 1, F1]) rotate([90, 0, 0]) linear_extrude(ph + 1 - ry0) dovetail2d();
    translate([0, 0, -50]) linear_extrude(100) plan2d();
  }
  // small bump near the top of each rail keeps the tray from sliding off
  for (s = [-1, 1]) translate([s * rx, ph - 6, F1 + rh]) scale([1, 1, 0.5]) sphere(r = 0.5, $fn = 16);
}

// Small diamond studs on the inside of the spring, for grip in every direction.
module studs(open = 0) {
  root = [0, -gap - t / 2];
  translate([0, root[0], root[1]]) rotate([-open, 0, 0]) translate([0, -root[0], -root[1]])
    for (yy = [L - 18:3:L - 3], xx = [-30:3:30]) {
      zc = -gap - t / 2 + yy * tan(theta);
      translate([xx + (round(yy) % 2) * 1.5, yy - t / 2 * sin(theta), zc + t / 2 * cos(theta) - 0.1])
        rotate([theta, 0, 0]) cylinder(r1 = 0.8, r2 = 0, h = 0.6, $fn = 4);
    }
}

// Radius on every edge of the clip. It leaves a core of at least 0.3 mm in the thinnest part,
// so the rounding never eats the spring or the plate away.
er = min(1, (t - 0.3) / 2, (F1 - 0.3) / 2);

module usb2d() { translate([-usb_w / 2, -gap + 0.8]) rounded(2.5) square([usb_w, gap - 1.6]); }

// The clip shrunk by er everywhere, then grown back with a ball, so every edge comes out round.
module clip_core(open = 0) {
  $fn = 20;
  minkowski() {
    difference() {
      union() {
        intersection() {
          along_x(W - 2 * er) offset(delta = -er) front_profile2d();
          translate([0, 0, -50]) linear_extrude(100) offset(delta = -er) plan2d();
        }
        intersection() {
          along_x(W - 2 * er) offset(delta = -er) arm_profile2d(open);
          translate([0, 0, -50]) linear_extrude(100) offset(delta = -er) arm_plan2d();
        }
      }
      // opening for a USB-C plug through the bottom
      translate([0, 2, 0]) rotate([90, 0, 0]) linear_extrude(w + 4) offset(delta = er) usb2d();
    }
    sphere(r = er, $fn = 12);
  }
}

module clip(open = 0) {
  clip_core(open);
  // the face under the tray stays square at its edge, so the tray sits flush on it
  translate([0, 0, F1 - er]) linear_extrude(er) plan2d();
  rails();
  studs(open);
}

// ---- Tray for the Micro ----
// As deep as the Micro, with walls whose top curls inward over the edge of its face. The Micro
// slides in from the open top end and the lips press it onto the floor. The tray slides down
// onto the rails of the clip.

// The walls seen from above, with the lips reaching d over the face of the Micro.
module wall_band2d(d) {
  rounded(0.8) intersection() {
    plan2d();
    translate([-W, -w - 1]) square([2 * W, side_top + w + 1]);
    difference() { plan2d(); offset(delta = -d) pocket2d(); }
  }
}

module tray() {
  zf = F1 + FT;            // top of the floor
  zl = zf + mt - press;    // underside of the lip tips
  zt = zl + lt;            // top of the walls
  rr = 1;                  // rounding on the top of the walls
  n = 8;
  difference() {
    union() {
      translate([0, 0, F1]) round_top(FT, 1.2, 10) plan2d();
      translate([0, 0, F1]) linear_extrude(zt - rr - F1) wall_band2d(0);
      // lips, undersides at 45 degrees so they print without support
      for (i = [1:n]) {
        z0 = zl - ov + ov * i / n;
        translate([0, 0, z0]) linear_extrude(zt - rr - z0) wall_band2d(ov * i / n);
      }
      translate([0, 0, zt - rr - 0.01]) round_top(rr + 0.01, rr, 8) wall_band2d(ov);
    }
    for (s = [-1, 1]) translate([s * rx, ph + 1, F1]) rotate([90, 0, 0])
      linear_extrude(ph + 1 - ry0 + rclr) dovetail2d(rclr);
    // lead-in at the open end: the lips rise so the Micro slides in under them
    intersection() {
      translate([0, 0, zf + 0.5]) linear_extrude(zt) pocket2d();
      along_x(2 * W) polygon([[side_top - 6, zl], [side_top + 1, zl + 1.4], [side_top + 1, zl - 4], [side_top - 6, zl - 4]]);
    }
  }
  // a small catch on each side wall: it drops behind the rounded top corner of the Micro
  for (m = [0, 1]) mirror([m, 0, 0])
    translate([pw / 2 + 0.01, 0, zf + 1.5]) linear_extrude(mt - 5.5)
      polygon([[0, ph - 2.2], [-0.9, ph - 4.2], [-0.9, ph - 4.8], [0, ph - 5.4]]);
}

if (layout == "Assembled") {
  color(color_clip) clip();
  color("Silver") tray();
} else if (layout == "On phone") {
  T = preview_phone_thickness;
  open = atan((gap - rest) / L) - atan((gap - T) / L);
  color(color_clip) { clip(open); tray(); }
  color([0.12, 0.12, 0.12]) translate([0, 0, -T]) linear_extrude(T) translate([-39.75, 0]) rounded(9) square([79.5, 163.5]);
  for (i = [0, 1]) color("LightSteelBlue") translate([-35, ph + 3 + i * 53, -0.3]) cube([70, 52.5, 0.3]);
  color("SteelBlue") translate([0, fit, F1 + FT]) linear_extrude(mt) translate([-mw / 2, 0]) rounded(mr) square([mw, mh]);
} else {
  color(color_clip) {
    // clip on its side, so the spring bends along its layers
    translate([-20, 0, W / 2]) rotate([0, -90, 0]) clip();
    // tray flat, floor down
    translate([45, 0, -F1]) tray();
  }
}

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