Controller & Headset Wall Mount - 4 Size Presets, Parametric J-Hook (concept)
We calculate the final price from your selected file. You review and accept it before payment.
Saved on this device.
Wall mount with two J-hook prongs and a cable gap for controllers and a headset, 4 sizes. Not test-printed.
- Rating
- 0 / 5
- Likes
- 0
- Downloads
- 2
- Makes
- 0
- Views
- 5
- Reviews
- 0
Updated at source:
Model information
- Source
- Printables
- Category
- Video Games
- License
- Creative Commons — Attribution
Wall mount for a game controller or headset, in 4 size presets: Compact (Switch Pro class), Standard (Xbox class), Wide (PS5 class) and Headset. A flat plate with two keyhole-style hanging slots that open at the top edge, and two J-hook prongs. The gap between the prongs is a cable notch, so a charging cable can hang straight down.
READ FIRST - HONEST LIMITS
- Not test-printed and not load-tested. This is a concept with a full recipe.
- The four presets are design starting points, not verified fits. Controller and headset sizes vary by model and revision. Measure your own grip or headband before printing.
- The plate and the hook prongs are separate closed shells that overlap. They are not boolean-fused, so let your slicer merge them (run the slicer repair step if it complains).
- What it can carry depends on your wall, screws and anchors, not on this file. Do not hang anything you cannot afford to drop until you have checked the print.
- Print in PETG or another tough material, not brittle PLA. Plate back face down, 0.2 mm layers, 4+ perimeters.
- The elbow of each hook is faceted, not a true arc. The Playground exports a triangulated mesh.
SIZES (mm)
Compact: plate 70 x 95, prong gap 26, arm depth 36, lip 20, prong width 12, arm thickness 6
Standard: plate 76 x 100, prong gap 32, arm depth 40, lip 22, prong width 14, arm thickness 6
Wide: plate 84 x 105, prong gap 36, arm depth 44, lip 24, prong width 14, arm thickness 6
Headset: plate 100 x 130, prong gap 44, arm depth 70, lip 20, prong width 22, arm thickness 8
Plate: 3 mm back layer with 5 mm slots, 2 mm front layer with 10 mm slots (stepped slot for the screw head), slot depth 24 mm.
HOW IT WAS MADE
Built in the TrueGeometry Playground with native commands only (/set_var, /parametric box, /bind, /sm_params, /sm_part, /rotate, /move). No booleans: the plate is boxes laid around open slots, each hook prong is one closed extrusion of a J profile with a rear gusset. AI-assisted design and writing.
Full article with images and FAQ: https://blog.truegeometry.com/0_0_0_0/blogs/post-d7ba5f23.html
HOW TO CUSTOMISE
Paste the recipe below into the Playground Script panel and press Run. Change the _W, _H, _X variables to resize a plate, or the numbers in a /sm_part line to resize a hook. The STL attached is the 4-preset layout; cut out the preset you want in your slicer.
FULL PLAYGROUND COMMAND RECIPE
// TrueGeometry controller + headset wall mount, 4 size presets. Units mm, Y up, wall plane z=0, hooks point +Z.
// Plate: 2 stepped layers of overlapping closed boxes (no booleans). Hooks: /sm_part J profile (one closed extrusion per prong).
// To resize a plate edit its _W/_H/_SL variables; to resize a hook edit the numbers in its /sm_part line (see size table).
/set_var T1 3
/set_var T2 2
/set_var SLOTW 5
/set_var HEADW 10
/set_var SLOTL 24
// ---- SP: Compact (Switch Pro class) ----
/set_var SP_W 70
/set_var SP_H 95
/set_var SP_X -165
/set_var SP_SX 19.6
/parametric box 1 1 1
/tag_last SPBackBase
/setprop @SPBackBase color #f97316
/bind @SPBackBase scale.x SP_W
/bind @SPBackBase scale.y SP_H-SLOTL
/bind @SPBackBase scale.z T1
/bind @SPBackBase position.x SP_X
/bind @SPBackBase position.y -SLOTL/2
/bind @SPBackBase position.z T1/2
/parametric box 1 1 1
/tag_last SPBackLeft
/setprop @SPBackLeft color #f97316
/bind @SPBackLeft scale.x (SP_W/2-SP_SX-SLOTW/2)
/bind @SPBackLeft scale.y SLOTL
/bind @SPBackLeft scale.z T1
/bind @SPBackLeft position.x SP_X-(SP_W/2+SP_SX+SLOTW/2)/2
/bind @SPBackLeft position.y SP_H/2-SLOTL/2
/bind @SPBackLeft position.z T1/2
/parametric box 1 1 1
/tag_last SPBackRight
/setprop @SPBackRight color #f97316
/bind @SPBackRight scale.x (SP_W/2-SP_SX-SLOTW/2)
/bind @SPBackRight scale.y SLOTL
/bind @SPBackRight scale.z T1
/bind @SPBackRight position.x SP_X+(SP_W/2+SP_SX+SLOTW/2)/2
/bind @SPBackRight position.y SP_H/2-SLOTL/2
/bind @SPBackRight position.z T1/2
/parametric box 1 1 1
/tag_last SPBackMid
/setprop @SPBackMid color #f97316
/bind @SPBackMid scale.x (2*SP_SX-SLOTW)
/bind @SPBackMid scale.y SLOTL
/bind @SPBackMid scale.z T1
/bind @SPBackMid position.x SP_X
/bind @SPBackMid position.y SP_H/2-SLOTL/2
/bind @SPBackMid position.z T1/2
/parametric box 1 1 1
/tag_last SPFrontBase
/setprop @SPFrontBase color #f97316
/bind @SPFrontBase scale.x SP_W
/bind @SPFrontBase scale.y SP_H-SLOTL
/bind @SPFrontBase scale.z T2
/bind @SPFrontBase position.x SP_X
/bind @SPFrontBase position.y -SLOTL/2
/bind @SPFrontBase position.z T1+T2/2
/parametric box 1 1 1
/tag_last SPFrontLeft
/setprop @SPFrontLeft color #f97316
/bind @SPFrontLeft scale.x (SP_W/2-SP_SX-HEADW/2)
/bind @SPFrontLeft scale.y SLOTL
/bind @SPFrontLeft scale.z T2
/bind @SPFrontLeft position.x SP_X-(SP_W/2+SP_SX+HEADW/2)/2
/bind @SPFrontLeft position.y SP_H/2-SLOTL/2
/bind @SPFrontLeft position.z T1+T2/2
/parametric box 1 1 1
/tag_last SPFrontRight
/setprop @SPFrontRight color #f97316
/bind @SPFrontRight scale.x (SP_W/2-SP_SX-HEADW/2)
/bind @SPFrontRight scale.y SLOTL
/bind @SPFrontRight scale.z T2
/bind @SPFrontRight position.x SP_X+(SP_W/2+SP_SX+HEADW/2)/2
/bind @SPFrontRight position.y SP_H/2-SLOTL/2
/bind @SPFrontRight position.z T1+T2/2
/parametric box 1 1 1
/tag_last SPFrontMid
/setprop @SPFrontMid color #f97316
/bind @SPFrontMid scale.x (2*SP_SX-HEADW)
/bind @SPFrontMid scale.y SLOTL
/bind @SPFrontMid scale.z T2
/bind @SPFrontMid position.x SP_X
/bind @SPFrontMid position.y SP_H/2-SLOTL/2
/bind @SPFrontMid position.z T1+T2/2
/sm_params 12 1 0.44
/sm_part -2 -14 14 0 26 0 27.74 0.15 31.0 1.34 33.66 3.57 35.4 6.58 36.0 10.0 36 18 33.0 20 30 18 30.0 10.0 29.46 8.0 28.0 6.54 26.0 6.0 -2 6
/tag_last SPProngL
/setprop @SPProngL color #f97316
/rotate @SPProngL 0 -90 0
/move @SPProngL -178.0 -29.5 5
/sm_params 12 1 0.44
/sm_part -2 -14 14 0 26 0 27.74 0.15 31.0 1.34 33.66 3.57 35.4 6.58 36.0 10.0 36 18 33.0 20 30 18 30.0 10.0 29.46 8.0 28.0 6.54 26.0 6.0 -2 6
/tag_last SPProngR
/setprop @SPProngR color #f97316
/rotate @SPProngR 0 -90 0
/move @SPProngR -140.0 -29.5 5
// ---- XB: Standard (Xbox class) ----
/set_var XB_W 76
/set_var XB_H 100
/set_var XB_X -55
/set_var XB_SX 21.3
/parametric box 1 1 1
/tag_last XBBackBase
/setprop @XBBackBase color #14b8a6
/bind @XBBackBase scale.x XB_W
/bind @XBBackBase scale.y XB_H-SLOTL
/bind @XBBackBase scale.z T1
/bind @XBBackBase position.x XB_X
/bind @XBBackBase position.y -SLOTL/2
/bind @XBBackBase position.z T1/2
/parametric box 1 1 1
/tag_last XBBackLeft
/setprop @XBBackLeft color #14b8a6
/bind @XBBackLeft scale.x (XB_W/2-XB_SX-SLOTW/2)
/bind @XBBackLeft scale.y SLOTL
/bind @XBBackLeft scale.z T1
/bind @XBBackLeft position.x XB_X-(XB_W/2+XB_SX+SLOTW/2)/2
/bind @XBBackLeft position.y XB_H/2-SLOTL/2
/bind @XBBackLeft position.z T1/2
/parametric box 1 1 1
/tag_last XBBackRight
/setprop @XBBackRight color #14b8a6
/bind @XBBackRight scale.x (XB_W/2-XB_SX-SLOTW/2)
/bind @XBBackRight scale.y SLOTL
/bind @XBBackRight scale.z T1
/bind @XBBackRight position.x XB_X+(XB_W/2+XB_SX+SLOTW/2)/2
/bind @XBBackRight position.y XB_H/2-SLOTL/2
/bind @XBBackRight position.z T1/2
/parametric box 1 1 1
/tag_last XBBackMid
/setprop @XBBackMid color #14b8a6
/bind @XBBackMid scale.x (2*XB_SX-SLOTW)
/bind @XBBackMid scale.y SLOTL
/bind @XBBackMid scale.z T1
/bind @XBBackMid position.x XB_X
/bind @XBBackMid position.y XB_H/2-SLOTL/2
/bind @XBBackMid position.z T1/2
/parametric box 1 1 1
/tag_last XBFrontBase
/setprop @XBFrontBase color #14b8a6
/bind @XBFrontBase scale.x XB_W
/bind @XBFrontBase scale.y XB_H-SLOTL
/bind @XBFrontBase scale.z T2
/bind @XBFrontBase position.x XB_X
/bind @XBFrontBase position.y -SLOTL/2
/bind @XBFrontBase position.z T1+T2/2
/parametric box 1 1 1
/tag_last XBFrontLeft
/setprop @XBFrontLeft color #14b8a6
/bind @XBFrontLeft scale.x (XB_W/2-XB_SX-HEADW/2)
/bind @XBFrontLeft scale.y SLOTL
/bind @XBFrontLeft scale.z T2
/bind @XBFrontLeft position.x XB_X-(XB_W/2+XB_SX+HEADW/2)/2
/bind @XBFrontLeft position.y XB_H/2-SLOTL/2
/bind @XBFrontLeft position.z T1+T2/2
/parametric box 1 1 1
/tag_last XBFrontRight
/setprop @XBFrontRight color #14b8a6
/bind @XBFrontRight scale.x (XB_W/2-XB_SX-HEADW/2)
/bind @XBFrontRight scale.y SLOTL
/bind @XBFrontRight scale.z T2
/bind @XBFrontRight position.x XB_X+(XB_W/2+XB_SX+HEADW/2)/2
/bind @XBFrontRight position.y XB_H/2-SLOTL/2
/bind @XBFrontRight position.z T1+T2/2
/parametric box 1 1 1
/tag_last XBFrontMid
/setprop @XBFrontMid color #14b8a6
/bind @XBFrontMid scale.x (2*XB_SX-HEADW)
/bind @XBFrontMid scale.y SLOTL
/bind @XBFrontMid scale.z T2
/bind @XBFrontMid position.x XB_X
/bind @XBFrontMid position.y XB_H/2-SLOTL/2
/bind @XBFrontMid position.z T1+T2/2
/sm_params 14 1 0.44
/sm_part -2 -14 14 0 30 0 31.74 0.15 35.0 1.34 37.66 3.57 39.4 6.58 40.0 10.0 40 20 37.0 22 34 20 34.0 10.0 33.46 8.0 32.0 6.54 30.0 6.0 -2 6
/tag_last XBProngL
/setprop @XBProngL color #14b8a6
/rotate @XBProngL 0 -90 0
/move @XBProngL -71.0 -32.0 5
/sm_params 14 1 0.44
/sm_part -2 -14 14 0 30 0 31.74 0.15 35.0 1.34 37.66 3.57 39.4 6.58 40.0 10.0 40 20 37.0 22 34 20 34.0 10.0 33.46 8.0 32.0 6.54 30.0 6.0 -2 6
/tag_last XBProngR
/setprop @XBProngR color #14b8a6
/rotate @XBProngR 0 -90 0
/move @XBProngR -25.0 -32.0 5
// ---- PS: Wide (PS5 class) ----
/set_var PS_W 84
/set_var PS_H 105
/set_var PS_X 55
/set_var PS_SX 23.5
/parametric box 1 1 1
/tag_last PSBackBase
/setprop @PSBackBase color #3b82f6
/bind @PSBackBase scale.x PS_W
/bind @PSBackBase scale.y PS_H-SLOTL
/bind @PSBackBase scale.z T1
/bind @PSBackBase position.x PS_X
/bind @PSBackBase position.y -SLOTL/2
/bind @PSBackBase position.z T1/2
/parametric box 1 1 1
/tag_last PSBackLeft
/setprop @PSBackLeft color #3b82f6
/bind @PSBackLeft scale.x (PS_W/2-PS_SX-SLOTW/2)
/bind @PSBackLeft scale.y SLOTL
/bind @PSBackLeft scale.z T1
/bind @PSBackLeft position.x PS_X-(PS_W/2+PS_SX+SLOTW/2)/2
/bind @PSBackLeft position.y PS_H/2-SLOTL/2
/bind @PSBackLeft position.z T1/2
/parametric box 1 1 1
/tag_last PSBackRight
/setprop @PSBackRight color #3b82f6
/bind @PSBackRight scale.x (PS_W/2-PS_SX-SLOTW/2)
/bind @PSBackRight scale.y SLOTL
/bind @PSBackRight scale.z T1
/bind @PSBackRight position.x PS_X+(PS_W/2+PS_SX+SLOTW/2)/2
/bind @PSBackRight position.y PS_H/2-SLOTL/2
/bind @PSBackRight position.z T1/2
/parametric box 1 1 1
/tag_last PSBackMid
/setprop @PSBackMid color #3b82f6
/bind @PSBackMid scale.x (2*PS_SX-SLOTW)
/bind @PSBackMid scale.y SLOTL
/bind @PSBackMid scale.z T1
/bind @PSBackMid position.x PS_X
/bind @PSBackMid position.y PS_H/2-SLOTL/2
/bind @PSBackMid position.z T1/2
/parametric box 1 1 1
/tag_last PSFrontBase
/setprop @PSFrontBase color #3b82f6
/bind @PSFrontBase scale.x PS_W
/bind @PSFrontBase scale.y PS_H-SLOTL
/bind @PSFrontBase scale.z T2
/bind @PSFrontBase position.x PS_X
/bind @PSFrontBase position.y -SLOTL/2
/bind @PSFrontBase position.z T1+T2/2
/parametric box 1 1 1
/tag_last PSFrontLeft
/setprop @PSFrontLeft color #3b82f6
/bind @PSFrontLeft scale.x (PS_W/2-PS_SX-HEADW/2)
/bind @PSFrontLeft scale.y SLOTL
/bind @PSFrontLeft scale.z T2
/bind @PSFrontLeft position.x PS_X-(PS_W/2+PS_SX+HEADW/2)/2
/bind @PSFrontLeft position.y PS_H/2-SLOTL/2
/bind @PSFrontLeft position.z T1+T2/2
/parametric box 1 1 1
/tag_last PSFrontRight
/setprop @PSFrontRight color #3b82f6
/bind @PSFrontRight scale.x (PS_W/2-PS_SX-HEADW/2)
/bind @PSFrontRight scale.y SLOTL
/bind @PSFrontRight scale.z T2
/bind @PSFrontRight position.x PS_X+(PS_W/2+PS_SX+HEADW/2)/2
/bind @PSFrontRight position.y PS_H/2-SLOTL/2
/bind @PSFrontRight position.z T1+T2/2
/parametric box 1 1 1
/tag_last PSFrontMid
/setprop @PSFrontMid color #3b82f6
/bind @PSFrontMid scale.x (2*PS_SX-HEADW)
/bind @PSFrontMid scale.y SLOTL
/bind @PSFrontMid scale.z T2
/bind @PSFrontMid position.x PS_X
/bind @PSFrontMid position.y PS_H/2-SLOTL/2
/bind @PSFrontMid position.z T1+T2/2
/sm_params 14 1 0.44
/sm_part -2 -14 14 0 34 0 35.74 0.15 39.0 1.34 41.66 3.57 43.4 6.58 44.0 10.0 44 22 41.0 24 38 22 38.0 10.0 37.46 8.0 36.0 6.54 34.0 6.0 -2 6
/tag_last PSProngL
/setprop @PSProngL color #3b82f6
/rotate @PSProngL 0 -90 0
/move @PSProngL 37.0 -34.5 5
/sm_params 14 1 0.44
/sm_part -2 -14 14 0 34 0 35.74 0.15 39.0 1.34 41.66 3.57 43.4 6.58 44.0 10.0 44 22 41.0 24 38 22 38.0 10.0 37.46 8.0 36.0 6.54 34.0 6.0 -2 6
/tag_last PSProngR
/setprop @PSProngR color #3b82f6
/rotate @PSProngR 0 -90 0
/move @PSProngR 87.0 -34.5 5
// ---- HS: Headset hanger ----
/set_var HS_W 100
/set_var HS_H 130
/set_var HS_X 165
/set_var HS_SX 28.0
/parametric box 1 1 1
/tag_last HSBackBase
/setprop @HSBackBase color #a855f7
/bind @HSBackBase scale.x HS_W
/bind @HSBackBase scale.y HS_H-SLOTL
/bind @HSBackBase scale.z T1
/bind @HSBackBase position.x HS_X
/bind @HSBackBase position.y -SLOTL/2
/bind @HSBackBase position.z T1/2
/parametric box 1 1 1
/tag_last HSBackLeft
/setprop @HSBackLeft color #a855f7
/bind @HSBackLeft scale.x (HS_W/2-HS_SX-SLOTW/2)
/bind @HSBackLeft scale.y SLOTL
/bind @HSBackLeft scale.z T1
/bind @HSBackLeft position.x HS_X-(HS_W/2+HS_SX+SLOTW/2)/2
/bind @HSBackLeft position.y HS_H/2-SLOTL/2
/bind @HSBackLeft position.z T1/2
/parametric box 1 1 1
/tag_last HSBackRight
/setprop @HSBackRight color #a855f7
/bind @HSBackRight scale.x (HS_W/2-HS_SX-SLOTW/2)
/bind @HSBackRight scale.y SLOTL
/bind @HSBackRight scale.z T1
/bind @HSBackRight position.x HS_X+(HS_W/2+HS_SX+SLOTW/2)/2
/bind @HSBackRight position.y HS_H/2-SLOTL/2
/bind @HSBackRight position.z T1/2
/parametric box 1 1 1
/tag_last HSBackMid
/setprop @HSBackMid color #a855f7
/bind @HSBackMid scale.x (2*HS_SX-SLOTW)
/bind @HSBackMid scale.y SLOTL
/bind @HSBackMid scale.z T1
/bind @HSBackMid position.x HS_X
/bind @HSBackMid position.y HS_H/2-SLOTL/2
/bind @HSBackMid position.z T1/2
/parametric box 1 1 1
/tag_last HSFrontBase
/setprop @HSFrontBase color #a855f7
/bind @HSFrontBase scale.x HS_W
/bind @HSFrontBase scale.y HS_H-SLOTL
/bind @HSFrontBase scale.z T2
/bind @HSFrontBase position.x HS_X
/bind @HSFrontBase position.y -SLOTL/2
/bind @HSFrontBase position.z T1+T2/2
/parametric box 1 1 1
/tag_last HSFrontLeft
/setprop @HSFrontLeft color #a855f7
/bind @HSFrontLeft scale.x (HS_W/2-HS_SX-HEADW/2)
/bind @HSFrontLeft scale.y SLOTL
/bind @HSFrontLeft scale.z T2
/bind @HSFrontLeft position.x HS_X-(HS_W/2+HS_SX+HEADW/2)/2
/bind @HSFrontLeft position.y HS_H/2-SLOTL/2
/bind @HSFrontLeft position.z T1+T2/2
/parametric box 1 1 1
/tag_last HSFrontRight
/setprop @HSFrontRight color #a855f7
/bind @HSFrontRight scale.x (HS_W/2-HS_SX-HEADW/2)
/bind @HSFrontRight scale.y SLOTL
/bind @HSFrontRight scale.z T2
/bind @HSFrontRight position.x HS_X+(HS_W/2+HS_SX+HEADW/2)/2
/bind @HSFrontRight position.y HS_H/2-SLOTL/2
/bind @HSFrontRight position.z T1+T2/2
/parametric box 1 1 1
/tag_last HSFrontMid
/setprop @HSFrontMid color #a855f7
/bind @HSFrontMid scale.x (2*HS_SX-HEADW)
/bind @HSFrontMid scale.y SLOTL
/bind @HSFrontMid scale.z T2
/bind @HSFrontMid position.x HS_X
/bind @HSFrontMid position.y HS_H/2-SLOTL/2
/bind @HSFrontMid position.z T1+T2/2
/sm_params 22 1 0.44
/sm_part -2 -14 14 0 54 0 56.78 0.24 62.0 2.14 66.26 5.72 69.04 10.53 70.0 16.0 70 18 66.0 20 62 18 62.0 16.0 60.93 12.0 58.0 9.07 54.0 8.0 -2 8
/tag_last HSProngL
/setprop @HSProngL color #a855f7
/rotate @HSProngL 0 -90 0
/move @HSProngL 143.0 -47.0 5
/sm_params 22 1 0.44
/sm_part -2 -14 14 0 54 0 56.78 0.24 62.0 2.14 66.26 5.72 69.04 10.53 70.0 16.0 70 18 66.0 20 62 18 62.0 16.0 60.93 12.0 58.0 9.07 54.0 8.0 -2 8
/tag_last HSProngR
/setprop @HSProngR color #a855f7
/rotate @HSProngR 0 -90 0
/move @HSProngR 209.0 -47.0 5