diff --git a/README.md b/README.md index cc7ee92..41f3d3b 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,14 @@ This 3D printable HOTAS throttle game controller. It connects as a standard USB It has: - 3 axis (throttle, vertical, horizontal) with center detents an all - - 5 buttons + - 7 buttons - hat switch with 8 directions and press button - lock/program button - RGB LED indicating state: throttle center (green), locked (red), program (blue) - high quality mechanical and electro-mechanical components + - very smooth and easy throttle action with no stiction - adjustable throttle handle angle (twist) for better ergonomics at different table positioning + - customizable throttle axis detents - host additional USB serial connectivity for debugging and programming **Complete Design Explosion View** @@ -44,10 +46,15 @@ The microcontroller was placed in the handle section to minimize the amount of w All 3D printable parts are designed using OpenSCAD and I printed them using my Prusa MK3S running the default .40mm nozzle. Most parts can be printed with 0.30mm layer height but some require 0.20mm layers to get proper results. +Before printing the thumb-side, add supports to the couple of screw locations like below. + +![Printing supports on the thumb side](img/thumb-side-printing-supports.png) + + Some parts require or benefit from post-print processing: - - drill the five button holes with e.g. 8.5mm drill to make the hole walls smooth and the buttons will work smoother - - some screw holes may benefit from drilling for easier fit + - drill the five button holes with e.g. 8.5mm drill to make the button hole walls smooth and the buttons will work smoother - you might also need to gently file the outsides of the buttons too if there is stuff left from printing to get them fit and move well + - some screw holes may benefit from drilling for easier fit (2.5mm for inner screwholes and 3mm for screwholes on circuitboards) - throttle center detent hole could be drilled bigger for stronger detent or cone shaped with a bit larger drill head for smoother detent exit/entry Below is an illustration of all printable parts. @@ -99,10 +106,10 @@ On top of the 3D printable components, you need - 2 x linear motion rods 8mm x 168mm (get one longer and cut in two) - 2 x linear bearings 8x15x45 (e.g. LM8LUU) - 1 x Teensy LC (or another Arduino board with enough pins) - - 2 x 10kohm LIN pot (Bourns BI P160 with center detent e.g. KNOC-model) + - 2 x 10kohm LIN pot (e.g. BI Technologies/TT Electronics P160 with center detent, 15mm shaft - P160KN-1QC15B10K) - 1 x 100mm travel 10kohm LIN slide pot (BI Technologies/TT Electronics PS100 B 10K 0E) - - 1 x multidirectional switch 8 dir + press (Alps 688RKJXL 100401V) - - 5 x switches (a tact switch with pins fitting the circuit board listed) + - 1 x multidirectional switch 8 dir + press (Alps RKJXM1015004) + - 7 x switches (a tact switch with pins fitting the circuit board listed) - 1 x slide switch (any generic model you can fit the case) - some generic circuit board (0.1" / 2.54mm pin pitch) - N x screws (2.5mm and 3mm) for plastic - for case cover, handle thumb section and internal parts @@ -116,7 +123,7 @@ On top of the 3D printable components, you need The Teensy LC can quite easily be replaced with any Arduino compatible device with USB connectivity and enough pins. With more coding effort any USB capable micro controller that fits the case could also do. -The RGB LED and slide switch (lock/program) are fully optional. The multi-directional hat switch can also easily be left out, replaced with a simple switch or with a similar hat switch. +The RGB LED and slide switch (lock/program) are fully optional. The multi-directional hat switch can also easily be left out or replaced with a simpler 4-directional hat switch. The steel ball and spring are used to make the center detent for the throttle. Different size ball and spring can be used by modifying the printed *BallSpringPlunger* parameters in the OpenSCAD files. diff --git a/commercial-parts.scad b/commercial-parts.scad index 51ccc4e..88d741d 100644 --- a/commercial-parts.scad +++ b/commercial-parts.scad @@ -97,8 +97,8 @@ module PotentiometerBournsPCW1JDown() PotentiometerBournsPCW1J(); } -// LIN 10kohm pot with center detent -module PotentiometerBournsBIP160(flip = false, cavityOnly = false) +// BI/TT P160 pot with 15mm shaft (e.g. LIN 10kohm pot P160KN-1QC15B10K) +module PotentiometerBIP160(flip = false, cavityOnly = false) { base_diameter = 16.5; base_height = 9.4; @@ -148,7 +148,7 @@ module PotentiometerBournsBIP160(flip = false, cavityOnly = false) } // 8-direction + push button switch -module Alps688RKJXL100401V() +module AlpsRKJXM1015004() { color("brown") { @@ -268,3 +268,25 @@ module Gt2BeltCircular(l,d=12.5,width=6) } } } + + +module SlideSwitch(l=12, w=5, h=5, screwDistance = 16) +{ + translate([-l/2,-w/2,-h]) + cube([l,w,h]); + + difference() + { + translate([-screwDistance/2-2,-w/2,-0.5]) + cube([screwDistance+4,w,0.5]); + + translate([-screwDistance/2,0,-1]) + cylinder(d=2, h=2); + translate([screwDistance/2,0,-1]) + cylinder(d=2, h=2); + } + + lever = [2, 2, 4]; + translate([-lever.x/2, -lever.y/2, 0]) + cube(lever); +} diff --git a/common.scad b/common.scad index fe566a9..4a73ba3 100644 --- a/common.scad +++ b/common.scad @@ -356,54 +356,59 @@ module SwitchButton(d=8, h=7, cavityOnly=false) } else { - translate([0,0,-0.5]) - { - cylinder(d=d, h=10); - } + translate([0,0,-0.5]) cylinder(d=d, h=10); // button hole + moveZ(-1.9-0.1) cylinder(d=d+2.2, h=1.9); // make sure buttons don't hit anything } } SwitchButtonBallOffsetZ = 1.2; -module SwitchButtonBall(d=8, h=7) +module SwitchButtonBall(d=8, h=7, topRounding=4, text="") { difference() { - union () + union() { - intersection() + difference() { - translate([0,0,-1.2]) - cylinder(d=d, h=h+0.8); - union() + union () { - translate([0,0,h - 4]) - sphere(d=d); - translate([0,0,6-d]) - cylinder(d=d, h=h-2); + intersection() + { + translate([0,0,-1.2]) + cylinder(d=d, h=h+0.8); + union() + { + translate([0,0,h - topRounding]) + sphere(d=d); + translate([0,0,(10-topRounding)-d]) + cylinder(d=d, h=h-2); + } + } + translate([0,0,-1.2]) + cylinder(d=d+1.6, h=1.2); } + translate([0,0,-d/2]) + cylinder(d=d-1, h=h); + translate([0,0,-1.25]) + cylinder(d1=d+0.8, d2=d-1, h=1); + + // Top inner cavity + translate([0,0,h - 4]) + sphere(d=d-1); } + + // Center shaft translate([0,0,-1.2]) - cylinder(d=d+1.6, h=1.2); + cylinder(d=2.5,h=h+0.7); } - translate([0,0,-d/2]) - cylinder(d=d-1, h=h); - translate([0,0,-1.25]) - cylinder(d1=d+0.8, d2=d-1, h=1); - // Top inner cavity - translate([0,0,h - 4]) - sphere(d=d-1); + if (text != "") + { + translate([0,-1.4,h-0.599]) + linear_extrude(height = 0.2) + text(text,size=3,halign="center"); + } } - - // Center shaft - translate([0,0,-1.2]) - cylinder(d=2.4,h=h+0.6); -} - - -module SwitchButtonSpring() -{ - } // Hat Switch with 4 directions and center push with 2x2x2mm shaft @@ -791,3 +796,19 @@ module roundCube(d=3, size=[1, 1, 1], offset=[0, 0, 0], extended=0) } } } + +module ScrewSupport(din, dout, dbase, h) +{ + difference() + { + union() + { + translate([0,0,h-1]) + cylinder(d1=dout, d2=dbase, h=1); + cylinder(d=dout, h=h); +//# translate([0,0,-10]) cylinder(d=din, h=10); + } + translate([0,0,-0.9]) + cylinder(d=din, h=h+1); + } +} diff --git a/img/printed-parts.png b/img/printed-parts.png index 0c1f3c0..22c1618 100644 Binary files a/img/printed-parts.png and b/img/printed-parts.png differ diff --git a/img/thumb-side-printing-supports.png b/img/thumb-side-printing-supports.png new file mode 100644 index 0000000..6a10218 Binary files /dev/null and b/img/thumb-side-printing-supports.png differ diff --git a/img/wiring-thumb-size.png b/img/wiring-thumb-size.png new file mode 100644 index 0000000..9d1d7d8 Binary files /dev/null and b/img/wiring-thumb-size.png differ diff --git a/printed-parts.scad b/printed-parts.scad index 0cae28c..1a6fe3f 100644 --- a/printed-parts.scad +++ b/printed-parts.scad @@ -69,9 +69,16 @@ module PrintableKnobsAndButtons() moveX(15) for (i=[0:1:4]) { - moveY(15*i) + moveY(10*i) moveZ(SwitchButtonBallOffsetZ) - SwitchButtonBall(); + SwitchButtonBall(d=8, h=7, topRounding=3.5); + } + moveY(20) + for (i=[0:1:2]) + { + moveY(10*i) + moveZ(SwitchButtonBallOffsetZ) + SwitchButtonBall(d=8, h=6, topRounding=3.5); } } } diff --git a/throttle-handle.scad b/throttle-handle.scad index c1480a4..4e1d4ac 100644 --- a/throttle-handle.scad +++ b/throttle-handle.scad @@ -8,9 +8,9 @@ include ; // Some part definitions for easier switch'n'replace // -------------------------------------------------- -module HatSwitch() { Alps688RKJXL100401V(); } -module YAxisPot(cavityOnly=false) { PotentiometerBournsBIP160(cavityOnly=cavityOnly); } -module XAxisPot(cavityOnly=false) { rotate([0,0,180]) PotentiometerBournsBIP160(flip=true,cavityOnly=cavityOnly); } +module HatSwitch() { AlpsRKJXM1015004(); } +module YAxisPot(cavityOnly=false) { PotentiometerBIP160(cavityOnly=cavityOnly); } +module XAxisPot(cavityOnly=false) { rotate([0,0,180]) PotentiometerBIP160(flip=true,cavityOnly=cavityOnly); } XYPotKnobSkirt = 3; module XPotKnob() { PotKnobBristles(22.5, 17.5, 12, 3); } module YPotKnob() { PotKnobBristles(22.5, 17.5, 12, 3); } @@ -20,14 +20,13 @@ module YPotKnob() { PotKnobBristles(22.5, 17.5, 12, 3); } // ---------------------------------- solidOnly = false; // set true for faster preview rendering -showHandle = true; +showHandle = false;//true; showThumb = true; // Effective values based on the above settings and rendering mode thumbSeparation = separation; fnForMinkowskiHull = $preview ? 10 : 15; -draw_other_parts = $preview ? drawOtherParts : false; // ---------------------------------- // Main handle case parameters @@ -42,8 +41,10 @@ handleAngle = 30; handleLength = 60; // Main handle length handleBaseHeight = 0; // level of the base connector plate +handleCaseSwitch = [0,0,0]; + // Screw locations and depths for connecting main handle and the thumb side piece -thumb_screws = [ +thumbScrews = [ [[21.7,-20.5, -caseThickness], 2*caseThickness, 20], [[-25,18,-caseThickness], 2*caseThickness, 20], [[25.8,37,-caseThickness], 2*caseThickness, 20] @@ -56,51 +57,70 @@ thumbPlateDepth = 77; thumbPlateAngle = [10, 40, 0]; thumbTipDepth = 57; -thumb_buttons = [ - // x,y,d,z - [-10.7,-0.5,8,0], // forward - [9.7,-0.5,8,0], // back - [-0.5,7,8,0], // down - [-0.5,-8.2,8,0], // up - [9.7,14.7,8,0] // low extra - ]; - -thumbHat = [-2.5, -21, 0, 20-45, 8]; // x,y,z,angle,hole diameter +backPlateHeight = 6.3 + 0.4; // ???? Added a bit (0.4) of extra to make sure buttons get to move -button_module_supports = [ - [-12.5,-23],// [-13,-24.5], // left top (hat left) - [7.5,-18.5],// [7,-17], // right top (hat right) - [7.6,-8.7], // upper right - [-3.8,0.7], // center - [14.9,5.7], // right - [-3.8,18.5] // center low +// Thumb part buttons in the button module +thumbButtons = [ + // x,y,d,z + [-10.7,-0.5,8,0, [75, 290]], // forward + [9.7,-0.5,8,0, [100, -30, 183]], // back + [-0.5,7,8,0, [0, 180]], // down + [-0.5,-8.2,8,0, [175, 70]], // up + [9.7,14.7,8,0, [30, 150, 260]], // low extra + [-10.7-2.54,-0.5+6*2.54,8,0, [285, 30]], // forward extra ]; - -back_plate_height = 6.3 + 0.4; // ???? Added a bit (0.4) of extra to make sure buttons get to move backPlatePoints = [ - [4,-14], - [18,-10], // back button - [18,20], [-7,20], // down button +/* [4,-14], + [23,-10], // back button + [23,20], [-7,20], // down button [-17,20], [-17,-3], // forward button [-8,-13] + */ + [17,-25], + [17, -10], + [23, -10], // back button + [23,20], [-7,20], // down button + [-17-2.54,20], [-17-2.54,-8], // forward button + [-12,-8], + [-12,-25] ]; -backPlateOffset = [-2.5, 1.5, -8]; // x, y, angle - -backPlateHatPoints = [ - [-23,-14], - [-23,-18], - [-18,-25], - [6,-25], - [6,-14] - ]; -backPlateHatOffset = [-1.8, -0.8, 20]; // x, y, angle +backPlateOffset = [-5, 0, -8]; // x, y, angle +//blackPlateRasterOffset=[0,0.7]; // x, y +blackPlateRasterOffset=[0, 1.6]; // x, y +buttonModuleSupportDOut=5.2; +buttonModuleButtonSupports = [ + [0.8 + 3*2.54, -0.6 - 3*2.54], // upper right + [0.8 - 2.54, -0.6], // center + [0.8 - 2*2.54, -0.6 + 6*2.54], // down + [0.8 + 5*2.54, -0.6 + 3*2.54] // back + ]; + +// Thumb hat switch module +//thumbHatOffset = [-2, -10, 0]; // x, y, z +thumbHatOffset = [-3.1, -11.5, 0]; // x, y, z +thumbHatAngle = [0, 0, -8]; +thumbHat = [-2.5, -11, 0, 45, 9]; // x,y,z,angle,hole diameter +backPlateHatPoints = [];/* + [-16,-5], + [-16,-15], + [12,-15], + [14,-13], + [14,-5] + ];*/ +backPlateHatRasterOffset = [0.8, 0.2]; // x, y +buttonModuleHatSupports = [ + [-5*2.54,-4*2.54+0.4], // hat left + [4*2.54,-4*2.54+0.4] // hat right + ]; + +thumbButtonsFront = [[8, 0]]; // offset from thumb side bottom, angle // Axis pots axisHoleDiameter = 9.6 + 0.2; axisYPos = [-3, 31, 0]; axisYRaiserHeight = 1; -axisXPos = [27, 30]; // offset from thumb side bottom, angle +axisXPos = [28, 27]; // offset from thumb side bottom, angle axisXRaiserHeight = 4.5; axisXRaiserOffset = 0.0; @@ -135,6 +155,7 @@ module xyPots() } rotate (thumbPlateAngle) + translate(thumbHatOffset) rotate(thumbHatAngle) translate ([thumbHat.x, thumbHat.y, thumbHat.z + thumbLength-thumbPlateDepth]) rotate([0,180,thumbHat[3]]) union() @@ -149,47 +170,170 @@ module xyPots() } } +plateThickness = 1.6; + +module buttonModuleButtons() +{ + for (b = thumbButtons) + { + translate ([b[0],b[1],b[3]-0.05]) + { + color("orange") + translate ([0,0,1.5+ (backPlateHeight-6.7)]) + %SwitchButtonBall(); + } + } +} + +module buttonModuleSprings(d=8, h=backPlateHeight - 2) +{ + f = 0.0; + color("green") + moveZ(-0.9 + f + (backPlateHeight - 6.7)) + { + for (b = thumbButtons) + { + translate ([b[0],b[1],b[3]]) + { + moveZ(+0.7-f) + tubeD(din=d-1, dout=d+2, h=0.4); + for (s = b[4]) + { + translate([0,0,-backPlateHeight+1.1+plateThickness]) + { + rotate(s) + { + translate([4,-1.5/2,h-f]) + cube([d-4, 1.5, 0.4]); + translate([d,0,0.3-f]) + //cylinder(d=1.5, h=h+0.1 + (backPlateHeight-h-0.1)); + cylinder(d=1.5, h=h+0.1); + } + } + } + } + } + + for (s = [buttonModuleButtonSupports[3]]) + { + translate([0,0,1.1 + plateThickness - 2 - f]) + translate(s) + { + tubeD(din=buttonModuleSupportDOut+0.25, dout=buttonModuleSupportDOut+0.25+1, h=0.4); + moveX(-buttonModuleSupportDOut/2-3) + moveY(-1) + cube([2.7,2,0.4]); + } + } + + for (s = [buttonModuleButtonSupports[2]]) + { + translate([0,0, 1.1+plateThickness - 2 - f]) + translate(s) + { + difference() + { + tubeD(din=buttonModuleSupportDOut+0.25, dout=buttonModuleSupportDOut+0.25+1, h=0.4); + turnZ(30) + moveY(-4.5) + moveX(-3.5) + moveZ(-0.5) + cube([7,3,1]); + } + moveY(2) + moveX(-2) + turnZ(30) + cube([2,1.5,0.4]); + } + } + } +} + +module buttonModuleSwitches() +{ + for (b = thumbButtons) + { + translate ([b[0],b[1],b[3]-0.5]) + Switch(); + } +} + +module buttonModuleFront(supports = false, holes = false) +{ + raiser = caseThickness+0.4; + for (b = thumbButtonsFront) + { + rotate([0,thumbAngle,0]) + rotate ([0,0,b.y]) + translate ([-primaryHandleCylinder[0]/2 + raiser, 0, b.x-9]) + rotate ([0,90,0]) + flipX() + { + if (supports == true) + { + cylinder(d=10, h=2); + moveZ(-backPlateHeight+0.8) + moveX(1.25) + { + moveY(3*2.54) + ScrewSupport(din=2.5, dout=buttonModuleSupportDOut, dbase=6.5, h=backPlateHeight-0.4); + moveY(-3*2.54) + ScrewSupport(din=2.5, dout=buttonModuleSupportDOut, dbase=6.5, h=backPlateHeight-0.4); + } + } + if (holes == true) + { + moveZ(-0.9) + cylinder(d=8, h=5); + } + if (draw_other_parts) + { + moveZ(-1.4) + Switch(); + %SwitchButtonBall(); + translate([-3*2.54, -4*2.54, -backPlateHeight]) + CircuitBoard(py=8, px=6, rasterOffset=[1.25,0]); + } + } + } +} + module buttonModule() { - plateThickness = 1.6; translate([backPlateOffset.x, backPlateOffset.y, 0]) rotate([0, 0, backPlateOffset.z]) { color("orange") { translate ([0, 0, -plateThickness]) - CircuitBoard(backPlatePoints); + CircuitBoard(backPlatePoints, rasterOffset=blackPlateRasterOffset); } translate ([0,0,plateThickness + 3]) - for (b = thumb_buttons) { - translate ([b[0],b[1],b[3]-0.5]) - { - Switch(); - %translate ([0,0,1.5]) - SwitchButtonBall(); - } + buttonModuleButtons(); + // buttonModuleSprings(); + buttonModuleSwitches(); } } - translate([backPlateHatOffset.x, backPlateHatOffset.y, 0]) - rotate([0, 0, backPlateHatOffset.z]) + translate(thumbHatOffset) rotate(thumbHatAngle) { color("orange") { translate ([0, 0, -plateThickness]) - CircuitBoard(backPlateHatPoints); + CircuitBoard(backPlateHatPoints, rasterOffset=backPlateHatRasterOffset); } } } module buttonHoles() { + // Thumb-side button holes translate([backPlateOffset.x, backPlateOffset.y, 0]) rotate([0, 0, backPlateOffset.z]) - for (b = thumb_buttons) + for (b = thumbButtons) { translate ([b[0],b[1],-0.5]) SwitchButton(d=b[2],cavityOnly=true); @@ -294,7 +438,7 @@ module handleCase() translate([0,0,handleLength]) union() { - for (item = thumb_screws) + for (item = thumbScrews) translate(item[0]) ScrewThreadSupport3m(12); } @@ -308,7 +452,7 @@ module handleCase() // Screw locking holes rotate ([0,0,0]) translate([0,0,handleLength-1.3]) - for (item = thumb_screws) + for (item = thumbScrews) translate(item[0]) cylinder(d=4.5, h=2); // Tilted shaft hole @@ -379,7 +523,7 @@ module thumbScrewHoles() translate([0,0,caseThickness]) union () { - for (item = thumb_screws) + for (item = thumbScrews) translate(item[0]) ScrewCavity3m(item[1], capDepth=thumbLength); } } @@ -391,6 +535,8 @@ module thumbHoles() translate ([0,0,thumbLength-thumbPlateDepth]) buttonHoles(); + buttonModuleFront(holes=true); + // Y-axis pot hole rotate (thumbPlateAngle) translate ([axisYPos.x,axisYPos.y,thumbLength-thumbPlateDepth - axisYRaiserHeight-0.01]) @@ -405,6 +551,7 @@ module thumbHoles() // Hat shaft hole rotate (thumbPlateAngle) + translate(thumbHatOffset) rotate(thumbHatAngle) translate ([thumbHat.x, thumbHat.y, thumbLength-thumbPlateDepth + 2]) rotate([0,180,thumbHat[3]]) cylinder (d2=thumbHat[4]*0.7, d1=thumbHat[4], h=4); @@ -419,7 +566,7 @@ module thumbSupports() translate ([0,0,thumbLength-thumbPlateDepth-raiser_height]) translate([backPlateOffset.x, backPlateOffset.y, 0]) rotate([0, 0, backPlateOffset.z]) - for (b = thumb_buttons) + for (b = thumbButtons) { translate ([b[0],b[1],0]) difference() @@ -432,6 +579,7 @@ module thumbSupports() // Hat switch raiser rotate (thumbPlateAngle) + translate(thumbHatOffset) rotate(thumbHatAngle) translate ([thumbHat.x, thumbHat.y, thumbLength-thumbPlateDepth]) rotate([0,180,thumbHat[3]]) difference() @@ -443,30 +591,32 @@ module thumbSupports() // Backplate supports rotate(thumbPlateAngle) - translate ([0,0,thumbLength-thumbPlateDepth-2*back_plate_height]) + translate ([0,0,thumbLength-thumbPlateDepth-2*backPlateHeight]) { - for (b = button_module_supports) + translate([backPlateOffset.x, backPlateOffset.y, 0]) + rotate([0, 0, backPlateOffset.z]) + for (b = buttonModuleButtonSupports) { - translate ([b[0],b[1],back_plate_height]) - difference() - { - union() - { - translate([0,0,back_plate_height-1]) - cylinder(d1=5.2, d2=6.5, h=1); - cylinder(d=5.2, h=back_plate_height); - } - translate([0,0,-0.9]) - cylinder(d=2.5, h=back_plate_height+1); - } + translate ([b[0],b[1],backPlateHeight]) + ScrewSupport(din=2.5, dout=buttonModuleSupportDOut, dbase=6.5, h=backPlateHeight); + } + + translate(thumbHatOffset) rotate(thumbHatAngle) + for (b = buttonModuleHatSupports) + { + translate ([b[0],b[1],backPlateHeight]) + ScrewSupport(din=2.5, dout=buttonModuleSupportDOut, dbase=6.5, h=backPlateHeight); } if (draw_other_parts) { - translate ([0,0,back_plate_height]) + translate ([0,0,backPlateHeight]) buttonModule(); - } + } } + + buttonModuleFront(supports=true); + // X-axis pot support rotate([0,thumbAngle,0]) rotate ([0,0,axisXPos.y]) @@ -485,7 +635,7 @@ module thumbScrewSupports() translate([0,0, 5-caseThickness]) union () { - for (item = thumb_screws) + for (item = thumbScrews) translate(item[0]) ScrewEntrySupport3m(4, item[2]); } } @@ -493,11 +643,28 @@ module thumbScrewSupports() module thumbConnectors() { l = lowerBoxSize.x * cos(thumbAngle) + caseThickness + 1; - translate([-l/2 + caseThickness, 43 - caseThickness, -3]) - cube([l, 1, 6]); + translate([-l/2 + caseThickness, 43 - caseThickness, 0]) + cube([l, 1, 4]); + + moveX(0.6) + difference() + { + tubeD(din=primaryHandleCylinder[0]-1.5, dout=primaryHandleCylinder[0]+1, h=3); + moveY(65) + cube([100,100,100], center=true); + + for (item = thumbScrews) + translate(item[0]) cylinder(d=12, h=5); - translate([0,-primaryHandleCylinder[0]/2 + 0.1,-3]) - cube([4, 1, 6]); + // Make sure it fits to the main handle part + difference() + { + cube([100,100,30], center=true); + translate([0,0, -handleLength + 2*caseThickness - 0.1]) + moveZ(5) + handleSolidBody(); + } + } } thumb_print_offset_z = 24.5; @@ -533,20 +700,21 @@ module thumbCase() // Screw locking extrudes translate([0,0, 5-caseThickness]) - for (item = thumb_screws) + for (item = thumbScrews) translate(item[0]) tubeD(din=3, dout=4.2, h=1); translate([-2*sin(thumbAngle),0,0]) { thumbSupports(); thumbConnectors(); - - xyPots(); } } translate([-2*sin(thumbAngle),0,0]) thumbHoles(); } + + translate([-2*sin(thumbAngle),0,0]) + xyPots(); } module handleThumbPart() diff --git a/throttle-parameters.scad b/throttle-parameters.scad index d4c0e08..ecce8ac 100644 --- a/throttle-parameters.scad +++ b/throttle-parameters.scad @@ -1,9 +1,9 @@ // Rendering -throttle_value = 0.5; // Position the throttle when drawing the whole throttle unit +throttleValue = 0.5; // Position the throttle when drawing the whole throttle unit separation = 10; // Separation for making exploded view -drawOtherParts = true; // Whether to render non-printable parts as well in preview mode -showKnobs = true; // Whether to render all knobs as well (heavy calculation warning) +drawOtherParts = false; // Whether to render non-printable parts as well in preview mode +showKnobs = false; // Whether to render all knobs as well (heavy calculation warning) $fn = $preview ? 30 : 100; draw_other_parts = $preview ? drawOtherParts : false; diff --git a/throttle.scad b/throttle.scad index 274f7be..a602ed9 100644 --- a/throttle.scad +++ b/throttle.scad @@ -18,19 +18,19 @@ module Throttle() if (draw_other_parts == true) { translate ([0,0,case_bottom]) - Tracks(-case_inside.x/2 + throttle_offset + throttle_value * throttle_travel); + Tracks(-case_inside.x/2 + throttle_offset + throttleValue * throttle_travel); color("Snow") moveX(throttle_offset) translate ([-case_inside.x/2 - throttle_lever_width/2, -base_width/2 - throttle_lever_distance, case_bottom]) { SlidePotentiometer(sliderEndLength=throttle_slider_end_length, sliderHeight=throttle_slider_height, leverHeight=20, - value=throttle_value, alignPin=true, alignLever=true, alignValueMax=true); + value=throttleValue, alignPin=true, alignLever=true, alignValueMax=true); } } color("Silver") - moveX(throttle_offset + throttle_value * throttle_travel - case_inside.x/2) + moveX(throttle_offset + throttleValue * throttle_travel - case_inside.x/2) { translate ([0,0,case_bottom]) BasePrinted(leverDistance=throttle_lever_distance);