Skip to content

Instantly share code, notes, and snippets.

@pschatzmann
Created March 6, 2020 20:32
Show Gist options
  • Save pschatzmann/3c2600cc70a1da5a3c5532d4f0e0ca99 to your computer and use it in GitHub Desktop.
Save pschatzmann/3c2600cc70a1da5a3c5532d4f0e0ca99 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Defining Nuts and Bolts in OpenSCAD\nI was wondering if we can use 3D printed nuts and bolts. So in a first step I was setting up the design in [OpenSCAD](https://www.openscad.org/) to generate the related STL file. This will be done using [Jupyterlab](https://jupyterlab.readthedocs.io/en/stable/) with the [OpenSCAD Kernel](https://pypi.org/project/jupyter-openscad-kernel/).\n\nHere is a quick overview of the definition of the important terms\n\n![Image of Bolt](https://www.pschatzmann.ch/wp-content/uploads/2020/03/1280px-Bolt_and_nut_annotated.png)\n"},{"metadata":{},"cell_type":"markdown","source":"We start our Notebook with a clear command, so that the content is reset when we recalculate all cells."},{"metadata":{"trusted":true},"cell_type":"code","source":"%clear","execution_count":29,"outputs":[{"name":"stdout","output_type":"stream","text":"SCAD code buffer has been cleared"}]},{"metadata":{},"cell_type":"markdown","source":"## OpenSCAD Threads Library\nThe whole excercise is quite simple because we can use the **OpenSCAD Threads Library** from Dan Kirshner"},{"metadata":{"trusted":true},"cell_type":"code","source":"%include https://dkprojects.net/openscad-threads/threads.scad","execution_count":30,"outputs":[{"name":"stdout","output_type":"stream","text":"Included number of statements: 73"}]},{"metadata":{},"cell_type":"markdown","source":"We start out design with the **desired dimensions**"},{"metadata":{"trusted":true},"cell_type":"code","source":"threadDiameter = 8;\npitch = 2;\nthreadLength = 10;\ngripLength=20;\n\nnutDiameter=11;\nnutLength=4;\nnutEdges=6;\n","execution_count":31,"outputs":[{"name":"stdout","output_type":"stream","text":"Number of lines of OpenSCAD code: 382\n"}]},{"metadata":{},"cell_type":"markdown","source":"## Thread\nWe define our Thread with the help of the library"},{"metadata":{"trusted":true},"cell_type":"code","source":"module myThread() {\n metric_thread(diameter=threadDiameter, pitch=pitch, length=threadLength);\n}\n\n%display myThread();","execution_count":32,"outputs":[{"name":"stdout","output_type":"stream","text":"Compiling design (CSG Products normalization)...\nNormalized CSG tree has 579 elements\n"},{"data":{"image/png":"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"},"metadata":{"image/png":{"height":400,"width":600}},"output_type":"display_data","source":"kernel"}]},{"metadata":{},"cell_type":"markdown","source":"## Bolt\nOur Bolt consists of a Head, the Grip and the Thread"},{"metadata":{"trusted":true},"cell_type":"code","source":"module myBolt() {\n union() {\n translate([0,0,nutLength/2]) cylinder(nutLength, d=nutDiameter,$fn=nutEdges, center=true);\n translate([0,0,nutLength+gripLength/2]) cylinder(gripLength, d=threadDiameter,$fn=100, center=true);\n translate([0,0,nutLength+gripLength]) myThread();\n }\n}\n%display myBolt();","execution_count":33,"outputs":[{"name":"stdout","output_type":"stream","text":"Compiling design (CSG Products normalization)...\nNormalized CSG tree has 581 elements\n"},{"data":{"image/png":"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"},"metadata":{"image/png":{"height":400,"width":600}},"output_type":"display_data","source":"kernel"}]},{"metadata":{},"cell_type":"markdown","source":"# Nut\nFinally we define the corresponding Nut"},{"metadata":{"trusted":true},"cell_type":"code","source":"module myNut() {\n difference() {\n cylinder(nutLength, d=nutDiameter,$fn=nutEdges, center=true);\n translate([0,0.5,-5]) myThread();\n }\n}\n\n%display myNut();","execution_count":34,"outputs":[{"name":"stdout","output_type":"stream","text":"Compiling design (CSG Products normalization)...\nNormalized CSG tree has 151 elements\n"},{"data":{"image/png":"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"},"metadata":{"image/png":{"height":400,"width":600}},"output_type":"display_data","source":"kernel"}]},{"metadata":{},"cell_type":"markdown","source":"## Source Code\nHere is the complete source code of the solution."},{"metadata":{"trusted":true},"cell_type":"code","source":"%displayCode","execution_count":35,"outputs":[{"name":"stdout","output_type":"stream","text":"/*\n * ISO-standard metric threads, following this specification:\n * http://en.wikipedia.org/wiki/ISO_metric_screw_thread\n *\n * Copyright 2020 Dan Kirshner - dan_kirshner@yahoo.com\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * See <http://www.gnu.org/licenses/>.\n *\n * Version 2.4. 2019-07-14 Add test option - do not render threads.\n * Version 2.3. 2017-08-31 Default for leadin: 0 (best for internal threads).\n * Version 2.2. 2017-01-01 Correction for angle; leadfac option. (Thanks to\n * Andrew Allen <a2intl@gmail.com>.)\n * Version 2.1. 2016-12-04 Chamfer bottom end (low-z); leadin option.\n * Version 2.0. 2016-11-05 Backwards compatibility (earlier OpenSCAD) fixes.\n * Version 1.9. 2016-07-03 Option: tapered.\n * Version 1.8. 2016-01-08 Option: (non-standard) angle.\n * Version 1.7. 2015-11-28 Larger x-increment - for small-diameters.\n * Version 1.6. 2015-09-01 Options: square threads, rectangular threads.\n * Version 1.5. 2015-06-12 Options: thread_size, groove.\n * Version 1.4. 2014-10-17 Use \"faces\" instead of \"triangles\" for polyhedron\n * Version 1.3. 2013-12-01 Correct loop over turns -- don't have early cut-off\n * Version 1.2. 2012-09-09 Use discrete polyhedra rather than linear_extrude ()\n * Version 1.1. 2012-09-07 Corrected to right-hand threads!\n */\n\n// Examples.\n//\n// Standard M8 x 1.\n// metric_thread (diameter=8, pitch=1, length=4);\n\n// Square thread.\n// metric_thread (diameter=8, pitch=1, length=4, square=true);\n\n// Non-standard: long pitch, same thread size.\n//metric_thread (diameter=8, pitch=4, length=4, thread_size=1, groove=true);\n\n// Non-standard: 20 mm diameter, long pitch, square \"trough\" width 3 mm,\n// depth 1 mm.\n//metric_thread (diameter=20, pitch=8, length=16, square=true, thread_size=6,\n// groove=true, rectangle=0.333);\n\n// English: 1/4 x 20.\n//english_thread (diameter=1/4, threads_per_inch=20, length=1);\n\n// Tapered. Example -- pipe size 3/4\" -- per:\n// http://www.engineeringtoolbox.com/npt-national-pipe-taper-threads-d_750.html\n// english_thread (diameter=1.05, threads_per_inch=14, length=3/4, taper=1/16);\n\n// Thread for mounting on Rohloff hub.\n//difference () {\n// cylinder (r=20, h=10, $fn=100);\n// metric_thread (diameter=34, pitch=1, length=10, internal=true, n_starts=6);\n//}\n\n\n// ----------------------------------------------------------------------------\nfunction segments (diameter) = min (50, max (ceil (diameter*6), 25));\n\n\n// diameter - outside diameter of threads in mm. Default: 8.\n// pitch - thread axial \"travel\" per turn in mm. Default: 1.\n// length - overall axial length of thread in mm. Default: 1.\n// internal - true = clearances for internal thread (e.g., a nut).\n// false = clearances for external thread (e.g., a bolt).\n// (Internal threads should be \"cut out\" from a solid using\n// difference ()). Default: false.\n// n_starts - Number of thread starts (e.g., DNA, a \"double helix,\" has\n// n_starts=2). See wikipedia Screw_thread. Default: 1.\n// thread_size - (non-standard) axial width of a single thread \"V\" - independent\n// of pitch. Default: same as pitch.\n// groove - (non-standard) true = subtract inverted \"V\" from cylinder\n// (rather thanadd protruding \"V\" to cylinder). Default: false.\n// square - true = square threads (per\n// https://en.wikipedia.org/wiki/Square_thread_form). Default:\n// false.\n// rectangle - (non-standard) \"Rectangular\" thread - ratio depth/(axial) width\n// Default: 0 (standard \"v\" thread).\n// angle - (non-standard) angle (deg) of thread side from perpendicular to\n// axis (default = standard = 30 degrees).\n// taper - diameter change per length (National Pipe Thread/ANSI B1.20.1\n// is 1\" diameter per 16\" length). Taper decreases from 'diameter'\n// as z increases. Default: 0 (no taper).\n// leadin - 0 (default): no chamfer; 1: chamfer (45 degree) at max-z end;\n// 2: chamfer at both ends, 3: chamfer at z=0 end.\n// leadfac - scale of leadin chamfer (default: 1.0 = 1/2 thread).\n// test - true = do not render threads (just draw \"blank\" cylinder).\n// Default: false (draw threads).\nmodule metric_thread (diameter=8, pitch=1, length=1, internal=false, n_starts=1,\n thread_size=-1, groove=false, square=false, rectangle=0,\n angle=30, taper=0, leadin=0, leadfac=1.0, test=false)\n{\n // thread_size: size of thread \"V\" different than travel per turn (pitch).\n // Default: same as pitch.\n local_thread_size = thread_size == -1 ? pitch : thread_size;\n local_rectangle = rectangle ? rectangle : 1;\n\n n_segments = segments (diameter);\n h = (test && ! internal) ? 0 : (square || rectangle) ? local_thread_size*local_rectangle/2 : local_thread_size / (2 * tan(angle));\n\n h_fac1 = (square || rectangle) ? 0.90 : 0.625;\n\n // External thread includes additional relief.\n h_fac2 = (square || rectangle) ? 0.95 : 5.3/8;\n\n tapered_diameter = diameter - length*taper;\n\n difference () {\n union () {\n if (! groove) {\n if (! test) {\n metric_thread_turns (diameter, pitch, length, internal, n_starts,\n local_thread_size, groove, square, rectangle, angle,\n taper);\n }\n }\n\n difference () {\n\n // Solid center, including Dmin truncation.\n if (groove) {\n cylinder (r1=diameter/2, r2=tapered_diameter/2,\n h=length, $fn=n_segments);\n } else if (internal) {\n cylinder (r1=diameter/2 - h*h_fac1, r2=tapered_diameter/2 - h*h_fac1,\n h=length, $fn=n_segments);\n } else {\n\n // External thread.\n cylinder (r1=diameter/2 - h*h_fac2, r2=tapered_diameter/2 - h*h_fac2,\n h=length, $fn=n_segments);\n }\n\n if (groove) {\n if (! test) {\n metric_thread_turns (diameter, pitch, length, internal, n_starts,\n local_thread_size, groove, square, rectangle,\n angle, taper);\n }\n }\n }\n }\n\n // chamfer z=0 end if leadin is 2 or 3\n if (leadin == 2 || leadin == 3) {\n difference () {\n cylinder (r=diameter/2 + 1, h=h*h_fac1*leadfac, $fn=n_segments);\n\n cylinder (r2=diameter/2, r1=diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\n $fn=n_segments);\n }\n }\n\n // chamfer z-max end if leadin is 1 or 2.\n if (leadin == 1 || leadin == 2) {\n translate ([0, 0, length + 0.05 - h*h_fac1*leadfac]) {\n difference () {\n cylinder (r=diameter/2 + 1, h=h*h_fac1*leadfac, $fn=n_segments);\n cylinder (r1=tapered_diameter/2, r2=tapered_diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\n $fn=n_segments);\n }\n }\n }\n }\n}\n\n\n// Input units in inches.\n// Note: units of measure in drawing are mm!\nmodule english_thread (diameter=0.25, threads_per_inch=20, length=1,\n internal=false, n_starts=1, thread_size=-1, groove=false,\n square=false, rectangle=0, angle=30, taper=0, leadin=0,\n leadfac=1.0, test=false)\n{\n // Convert to mm.\n mm_diameter = diameter*25.4;\n mm_pitch = (1.0/threads_per_inch)*25.4;\n mm_length = length*25.4;\n\n echo (str (\"mm_diameter: \", mm_diameter));\n echo (str (\"mm_pitch: \", mm_pitch));\n echo (str (\"mm_length: \", mm_length));\n metric_thread (mm_diameter, mm_pitch, mm_length, internal, n_starts,\n thread_size, groove, square, rectangle, angle, taper, leadin,\n leadfac, test);\n}\n\nmodule metric_thread_turns (diameter, pitch, length, internal, n_starts,\n thread_size, groove, square, rectangle, angle,\n taper)\n{\n // Number of turns needed.\n n_turns = floor (length/pitch);\n\n intersection () {\n\n // Start one below z = 0. Gives an extra turn at each end.\n for (i=[-1*n_starts : n_turns+1]) {\n translate ([0, 0, i*pitch]) {\n metric_thread_turn (diameter, pitch, internal, n_starts,\n thread_size, groove, square, rectangle, angle,\n taper, i*pitch);\n }\n }\n\n // Cut to length.\n translate ([0, 0, length/2]) {\n cube ([diameter*3, diameter*3, length], center=true);\n }\n }\n}\n\n\nmodule metric_thread_turn (diameter, pitch, internal, n_starts, thread_size,\n groove, square, rectangle, angle, taper, z)\n{\n n_segments = segments (diameter);\n fraction_circle = 1.0/n_segments;\n for (i=[0 : n_segments-1]) {\n rotate ([0, 0, i*360*fraction_circle]) {\n translate ([0, 0, i*n_starts*pitch*fraction_circle]) {\n //current_diameter = diameter - taper*(z + i*n_starts*pitch*fraction_circle);\n thread_polyhedron ((diameter - taper*(z + i*n_starts*pitch*fraction_circle))/2,\n pitch, internal, n_starts, thread_size, groove,\n square, rectangle, angle);\n }\n }\n }\n}\n\n\nmodule thread_polyhedron (radius, pitch, internal, n_starts, thread_size,\n groove, square, rectangle, angle)\n{\n n_segments = segments (radius*2);\n fraction_circle = 1.0/n_segments;\n\n local_rectangle = rectangle ? rectangle : 1;\n\n h = (square || rectangle) ? thread_size*local_rectangle/2 : thread_size / (2 * tan(angle));\n outer_r = radius + (internal ? h/20 : 0); // Adds internal relief.\n //echo (str (\"outer_r: \", outer_r));\n\n // A little extra on square thread -- make sure overlaps cylinder.\n h_fac1 = (square || rectangle) ? 1.1 : 0.875;\n inner_r = radius - h*h_fac1; // Does NOT do Dmin_truncation - do later with\n // cylinder.\n\n translate_y = groove ? outer_r + inner_r : 0;\n reflect_x = groove ? 1 : 0;\n\n // Make these just slightly bigger (keep in proportion) so polyhedra will\n // overlap.\n x_incr_outer = (! groove ? outer_r : inner_r) * fraction_circle * 2 * PI * 1.02;\n x_incr_inner = (! groove ? inner_r : outer_r) * fraction_circle * 2 * PI * 1.02;\n z_incr = n_starts * pitch * fraction_circle * 1.005;\n\n /*\n (angles x0 and x3 inner are actually 60 deg)\n\n /\\ (x2_inner, z2_inner) [2]\n / \\\n (x3_inner, z3_inner) / \\\n [3] \\ \\\n |\\ \\ (x2_outer, z2_outer) [6]\n | \\ /\n | \\ /|\n z |[7]\\/ / (x1_outer, z1_outer) [5]\n | | | /\n | x | |/\n | / | / (x0_outer, z0_outer) [4]\n | / | / (behind: (x1_inner, z1_inner) [1]\n |/ | /\n y________| |/\n (r) / (x0_inner, z0_inner) [0]\n\n */\n\n x1_outer = outer_r * fraction_circle * 2 * PI;\n\n z0_outer = (outer_r - inner_r) * tan(angle);\n //echo (str (\"z0_outer: \", z0_outer));\n\n //polygon ([[inner_r, 0], [outer_r, z0_outer],\n // [outer_r, 0.5*pitch], [inner_r, 0.5*pitch]]);\n z1_outer = z0_outer + z_incr;\n\n // Give internal square threads some clearance in the z direction, too.\n bottom = internal ? 0.235 : 0.25;\n top = internal ? 0.765 : 0.75;\n\n translate ([0, translate_y, 0]) {\n mirror ([reflect_x, 0, 0]) {\n\n if (square || rectangle) {\n\n // Rule for face ordering: look at polyhedron from outside: points must\n // be in clockwise order.\n polyhedron (\n points = [\n [-x_incr_inner/2, -inner_r, bottom*thread_size], // [0]\n [x_incr_inner/2, -inner_r, bottom*thread_size + z_incr], // [1]\n [x_incr_inner/2, -inner_r, top*thread_size + z_incr], // [2]\n [-x_incr_inner/2, -inner_r, top*thread_size], // [3]\n\n [-x_incr_outer/2, -outer_r, bottom*thread_size], // [4]\n [x_incr_outer/2, -outer_r, bottom*thread_size + z_incr], // [5]\n [x_incr_outer/2, -outer_r, top*thread_size + z_incr], // [6]\n [-x_incr_outer/2, -outer_r, top*thread_size] // [7]\n ],\n\n faces = [\n [0, 3, 7, 4], // This-side trapezoid\n\n [1, 5, 6, 2], // Back-side trapezoid\n\n [0, 1, 2, 3], // Inner rectangle\n\n [4, 7, 6, 5], // Outer rectangle\n\n // These are not planar, so do with separate triangles.\n [7, 2, 6], // Upper rectangle, bottom\n [7, 3, 2], // Upper rectangle, top\n\n [0, 5, 1], // Lower rectangle, bottom\n [0, 4, 5] // Lower rectangle, top\n ]\n );\n } else {\n\n // Rule for face ordering: look at polyhedron from outside: points must\n // be in clockwise order.\n polyhedron (\n points = [\n [-x_incr_inner/2, -inner_r, 0], // [0]\n [x_incr_inner/2, -inner_r, z_incr], // [1]\n [x_incr_inner/2, -inner_r, thread_size + z_incr], // [2]\n [-x_incr_inner/2, -inner_r, thread_size], // [3]\n\n [-x_incr_outer/2, -outer_r, z0_outer], // [4]\n [x_incr_outer/2, -outer_r, z0_outer + z_incr], // [5]\n [x_incr_outer/2, -outer_r, thread_size - z0_outer + z_incr], // [6]\n [-x_incr_outer/2, -outer_r, thread_size - z0_outer] // [7]\n ],\n\n faces = [\n [0, 3, 7, 4], // This-side trapezoid\n\n [1, 5, 6, 2], // Back-side trapezoid\n\n [0, 1, 2, 3], // Inner rectangle\n\n [4, 7, 6, 5], // Outer rectangle\n\n // These are not planar, so do with separate triangles.\n [7, 2, 6], // Upper rectangle, bottom\n [7, 3, 2], // Upper rectangle, top\n\n [0, 5, 1], // Lower rectangle, bottom\n [0, 4, 5] // Lower rectangle, top\n ]\n );\n }\n }\n }\n}threadDiameter = 8;\npitch = 2;\nthreadLength = 10;\ngripLength=20;\n\nnutDiameter=11;\nnutLength=4;\nnutEdges=6;\nmodule myThread() {\n metric_thread(diameter=threadDiameter, pitch=pitch, length=threadLength);\n}\n\nmodule myBolt() {\n union() {\n translate([0,0,nutLength/2]) cylinder(nutLength, d=nutDiameter,$fn=nutEdges, center=true);\n translate([0,0,nutLength+gripLength/2]) cylinder(gripLength, d=threadDiameter,$fn=100, center=true);\n translate([0,0,nutLength+gripLength]) myThread();\n }\n}\nmodule myNut() {\n difference() {\n cylinder(nutLength, d=nutDiameter,$fn=nutEdges, center=true);\n translate([0,0.5,-5]) myThread();\n }\n}\n\n\n"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"openscad","display_name":"OpenSCAD","language":"application-xopenscad"},"language_info":{"name":"OpenSCAD","mimetype":"application/x-openscad","extension":".scad"},"toc":{"nav_menu":{},"number_sections":false,"sideBar":false,"skip_h1_title":false,"base_numbering":1,"title_cell":"Table of Contents","title_sidebar":"Contents","toc_cell":false,"toc_position":{},"toc_section_display":false,"toc_window_display":false}},"nbformat":4,"nbformat_minor":4}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment