「3Dプリンター TEVO Tarantula 56 – 歯車のデータを作る –」
歯車のSTLデータの作り方というか入手方法を書いてなかったので書く。
といっても、便利なサイトがあるので、ここへ行って作ってダウンロードする。
http://www.knowhave.com/gear/index.php
http://knowhave.main.jp/gear/indexjp.php
あと、関係が分からないのだが上からリンクした先の
http://joostn.github.io/OpenJsCad/
では、もっとシンプルなUIが表示され、作った歯車の設定をテキスト形式の.jscadファイルで保存できる。
自分でもそのうち忘れそうなので、少し詳しく覚書きしておく。
大まかな流れは以下の絵の通りだ。
パラメータの意味は、調べて分かった範囲では以下のようになっている。
pitchDiameterは歯の山と谷の間を通る円の直径だ。
moduleの値は重要だが求め方などは知らなくてもいいだろう。
detail parametersを変更しなければ、moduleの値で歯の大きさが決まる。
かみ合う相手がある訳だから、大事なのは歯車の中心の軸の距離と、歯の大きさだ。
pitchDiameterの値を足して半分にすれば、それが軸間距離となる。
ただし、それより優先するのは歯の大きさだ。
大きさが違えば歯はかみ合わないので、これを表す数値であるmoduleは必ず同じにする。
上の例では2になっている。
この値が大きいと歯が大きくなる。
先に直径や歯数を決めてみても、下のようにmoduleの値が異なると歯車はかみ合わないので、
直径や歯数を変えてmoduleを合わせる必要がある。
ここでは、直径を15にしようとしたが16に変更しなければならなかった。
歯数は自然数にしかできないので、微調整は直径を変えて行うことになると思う。
追記
detail parametersを変更してみた。
Blenderに重ねて読み込んで違いを比較してみる。
pressureAngle
先端部分の角度、歯の幅が変わった。
clearance
谷の深さ、山の高さが変わった。
twistAngle
歯が軸方向に対してねじれた。
detail parametersは初期値のまま、20, 0, 0 で特に問題無いと思う。
追記
Blenderにもギアを作るプラグインがある。
ただ、ギアが直線だ。
上で紹介したサイトは少なくともInvolute Curveというので出来ていて、この方が滑らかなんだそうだ。
追記
http://joostn.github.io/OpenJsCad/
ここで、コピペしたコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
// Here we define the user editable parameters: function getParameterDefinitions() { return [ { name: 'numTeeth', caption: 'Number of teeth:', type: 'int', default: 10 }, { name: 'circularPitch', caption: 'Circular pitch:', type: 'float', default: 5 }, { name: 'pressureAngle', caption: 'Pressure angle:', type: 'float', default: 20 }, { name: 'clearance', caption: 'Clearance:', type: 'float', default: 0 }, { name: 'thickness', caption: 'Thickness:', type: 'float', default: 5 }, { name: 'centerholeradius', caption: 'Radius of center hole (0 for no hole):', type: 'float', default: 2 }, ]; } // Main entry point; here we construct our solid: function main(params) { var gear = involuteGear( params.numTeeth, params.circularPitch, params.pressureAngle, params.clearance, params.thickness ); if(params.centerholeradius > 0) { var centerhole = CSG.cylinder({start: [0,0,-params.thickness], end: [0,0,params.thickness], radius: params.centerholeradius, resolution: 16}); gear = gear.subtract(centerhole); } return gear; } /* For gear terminology see: http://www.astronomiainumbria.org/advanced_internet_files/meccanica/easyweb.easynet.co.uk/_chrish/geardata.htm Algorithm based on: http://www.cartertools.com/involute.html circularPitch: The distance between adjacent teeth measured at the pitch circle */ function involuteGear(numTeeth, circularPitch, pressureAngle, clearance, thickness) { // default values: if(arguments.length < 3) pressureAngle = 20; if(arguments.length < 4) clearance = 0; if(arguments.length < 4) thickness = 1; var addendum = circularPitch / Math.PI; var dedendum = addendum + clearance; // radiuses of the 4 circles: var pitchRadius = numTeeth * circularPitch / (2 * Math.PI); var baseRadius = pitchRadius * Math.cos(Math.PI * pressureAngle / 180); var outerRadius = pitchRadius + addendum; var rootRadius = pitchRadius - dedendum; var maxtanlength = Math.sqrt(outerRadius*outerRadius - baseRadius*baseRadius); var maxangle = maxtanlength / baseRadius; var tl_at_pitchcircle = Math.sqrt(pitchRadius*pitchRadius - baseRadius*baseRadius); var angle_at_pitchcircle = tl_at_pitchcircle / baseRadius; var diffangle = angle_at_pitchcircle - Math.atan(angle_at_pitchcircle); var angularToothWidthAtBase = Math.PI / numTeeth + 2*diffangle; // build a single 2d tooth in the 'points' array: var resolution = 5; var points = [new CSG.Vector2D(0,0)]; for(var i = 0; i <= resolution; i++) { // first side of the tooth: var angle = maxangle * i / resolution; var tanlength = angle * baseRadius; var radvector = CSG.Vector2D.fromAngle(angle); var tanvector = radvector.normal(); var p = radvector.times(baseRadius).plus(tanvector.times(tanlength)); points[i+1] = p; // opposite side of the tooth: radvector = CSG.Vector2D.fromAngle(angularToothWidthAtBase - angle); tanvector = radvector.normal().negated(); p = radvector.times(baseRadius).plus(tanvector.times(tanlength)); points[2 * resolution + 2 - i] = p; } // create the polygon and extrude into 3D: var tooth3d = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]}); var allteeth = new CSG(); for(var i = 0; i < numTeeth; i++) { var angle = i*360/numTeeth; var rotatedtooth = tooth3d.rotateZ(angle); allteeth = allteeth.unionForNonIntersecting(rotatedtooth); } // build the root circle: points = []; var toothAngle = 2 * Math.PI / numTeeth; var toothCenterAngle = 0.5 * angularToothWidthAtBase; for(var i = 0; i < numTeeth; i++) { var angle = toothCenterAngle + i * toothAngle; var p = CSG.Vector2D.fromAngle(angle).times(rootRadius); points.push(p); } // create the polygon and extrude into 3D: var rootcircle = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]}); var result = rootcircle.union(allteeth); // center at origin: result = result.translate([0, 0, -thickness/2]); return result; } |
を.jscadファイルとして保存(例えばgear.jscad)し、
https://openjscad.org/
を開いてそのファイルをドラッグ
してもSTLデータが得られる。
どうやら、https://openjscad.org/が総本山のようだ。
ユーザーガイドはここに。
Just for sake of providing context, OpenJSCAD.org is built on OpenJsCad (Github), which itself was inspired by OpenSCAD.org, and essentially provides a programmers approach to develop 3D models. In particular, this enhancement is tuned towards creating precise models for 3D printing.
OpenSCADを3Dプリント用のデータ作成のためにチューンしたものって感じのようだ。
JavaScriptすら知らない私に、OpenSCADやら、ましてその派生形らしきOpenJsCadが理解できるはずもないが…。
追記
ここに、いろんな環境に合わせたバージョンがある。
https://github.com/jscad/OpenJSCAD.org
追記(2021/11/27)
記事の一番上のリンク先が消滅していた。
rack、pinion、bevel gear、worm gearなどが作成出来て非常に有用だった。
魚拓から発掘したphpファイルのリンクを編集し直した。
うちのローカルなサーバーで使わせていただいている。
「WEB上から失われた有用な.phpスクリプトを発掘・復活させる方法」
追記(2021/11/27)
こちらに移転していただけだった。
「サイトマップ」へ
Tweet