车床的JavaScript编程

本文应被称为“使用JavaScript脚本生成用于选择音高的中国车床吉他齿轮组合”,但听起来并不那么吸引人。


自从Aliexpress MX-180V出现在我的家庭作坊中六个多月以来,最便宜的车床一直让我感到惊讶。 尽管中国人忘记将其固定在抽屉上,结果前面板起了皱纹。


尽管该设备无法切断左手螺纹,但与卖方的誓言相反,这可能会发生。 尽管附带了螺丝起子,但第一次触摸后它还是散落了。



尽管最后这种设备的制造质量很差,但我还是使用它,制造了我需要的零件,并且总体上积累了技能。 对我来说,家用织布机的魅力在于,您不必在垃圾桶里翻找寻找与必需品类似的东西,而自己动手做即可。 这是从构思到实现的最直接方法。
因此,逐渐地转向了穿线。 我决定在直径6毫米的钉子上练习,以免打磨任何东西,这将是螺距为1毫米的螺栓的直径,为此我有一个螺母。 根据位于机器外壳上的表格,我找到了所选步骤所需的齿轮组合。


在轴上有一个80齿的齿轮,然后是52齿,在该齿轮和主轴之间应该有一个50齿的齿轮。 但是我那套有50个齿的10档齿轮中没有。


然后我又开始不高兴了,中国兄弟! 我最终完成了这一事实,在我的装置中也没有用于80齿,66和33齿的第二齿轮。 稍加思考,我意识到对于每转进给1毫米的进给,只有主轴和轴上的齿比是重要的,而中间齿轮可以是任何齿轮,主要的是它们适合在那里。 结果,我用刀而不是模具切出了我生命中的第一条M6x1螺纹!


一件事情只因这一事件的欢乐而黯然失色,因为桌子与我的齿轮不匹配。 这意味着现在我不能随便拿起它,看看桌子,并在必要时切断必要的螺纹。 每次您必须思考如何摆放齿轮时,每次都要重新计算。 通常,一张桌子要方便得多。 因此,命运让我深入研究了吉他设计的细节以及计算变速箱齿轮比的精妙之处。

齿轮箱的装置并不困难,可以用以下四种方式来表示齿轮的安装方式(无论齿轮直径如何):


为了确定性,我们将它们称为链接方案。 我需要找出哪些齿轮组合是可以接受的,以将它们安装在导轨中,导轨可以绕轴的轴线旋转,中间齿轮的两个轴固定在导轨上。


上轴不应接触主轴皮带轮,因此第一从动齿轮不得少于52个齿。 此外,不要将导轨的旋转角度调得太靠近主轴,以免接触转速计磁铁。


尝试强行执行此任务的物理尝试表明,存在许多可接受的组合。 在一张纸上,已经没有足够的空间容纳尚未验证的布景,我开始感到困惑。 有很大的机会跳过组合,反之亦然,以记录已检查的组合。 坐在机器前不舒服的位置上进行盲目枚举的愿望很快消失了。 这台机器可以进行多少种组合和供料? 有必要向该理论寻求帮助,并将工作放在计算机上的枚举选项上,以使它不会白费。


因为我拥有的每个齿轮只有一个副本,所以有必要找到或编写一个不重复的位置生成器。 对于3档,4档和5档,有很多方法可供选择,从10个选项中进行选择,但是显然,出于几何考虑,应放弃其中的一些。 您将需要一个过滤器,该过滤器仅允许合适的齿轮组通过。 过滤后,可能会有许多组合将给出相同的螺距,而齿轮模式和齿轮组没有差异,即 会有等效的排列。 也应将它们丢弃。

毫不犹豫地,我决定使用JS进行编程,尽管我也可以使用C ++,但是在我的实践中,当涉及到将数据刷新到磁盘时,我还没有遇到无法在基于浏览器的JS中解决的任务。 通过这种方法,我对基础结构,记事本和浏览器的简约性和充分性感到着迷,其他所有东西都是多余的。 该语言提供算法,浏览器提供图形界面,解释器和调试器。 任何库都可以自己快速编写,也可以找到并下载。 如果您不参与工业或商业编程,那么简单地讲,通用计算器就足够了。

我迅速找到并调整了展示位置生成器。 它在程序中的目的是重新排列将存储齿轮实例的数组的索引。 在这里,搜索功能会生成展示位置,而测试功能会将过去的过滤条件塞到结果数组中。 另外,在最后一个函数中计算提要。 为了确定起见,我们如图所示指定所有齿轮。


我们写出用于计算进给量的公式,该公式是进给轴螺距和每种啮合方式的齿轮齿数的函数:


要开发过滤器,您应该更详细地介绍吉他的几何参数。 主轴,轴和上中间齿轮的轴形成一个三角形。

L侧直接测量,其余部分从齿轮的半径计算得出。 齿轮的半径小于其外半径啮合时的重叠量。 由于齿轮制造不完美,因此重叠量应根据经验确定。 重叠部分必须确保啮合,但要防止齿轮挤压。 就我而言,它是1毫米。 S侧受到以下限制,上部中间齿轮的轴线不应接触主轴皮带轮。 当将轴位于较高位置的导向器尽可能地靠近主轴旋转,而轴应几乎与皮带轮接触时,将直接进行测量。 距离V不能大于一直推到凹槽中的轴的轴线和上中间轴线之间的距离。 还必须限制L和V之间的角度。转动没有齿轮和轴的齿条,使其尽可能靠近主轴,测量或计算主轴轴线与导轨顶端之间的距离S,并使用公式计算角度


这里的V是从轴轴线到引导件的上点的距离,而不是到凹槽的上点的距离(这可以是导轨的任意点,主要是距离V和S的测量值)。 使用相同的公式,将在测试过程中计算角度,但距离S和V将取决于齿轮的半径。


此外,齿轮B不能大于A,齿轮C不能大于D。D不得接触轴,并且在使B和D啮合时C不得紧贴A。

建立成功组合列表后,应使用消除功能将其保存为冗余。 这是通过简单地搜索以任何方式唯一的解决方案来完成的。 您可以使用步骤的唯一性,也可以使用一组齿轮等的唯一性。

在我的情况下,共有751个组合,它们的螺距,齿轮数和齿轮组不同。 只有22个独特的局,当然,其中许多并不常用或根本不适用,但也有英寸的局。


在编写本书时,这个想法并没有让我想到解决这个问题的方法是五年级,这简直是可耻的。 只是在这种情况下,结果(提要表)比其接收方式重要得多。 但是,每种设备的机器,吉他,变速箱和齿轮可以有所不同,牢记至少一种构造这种桌子的方法也不错。

总之,鉴于以上所述,我给出了脚本的全文,该脚本配有足够数量的注释。

隐藏文字
<!DOCTYPE html> <html> <body> <div> <textarea id="out"></textarea> </div> <div><button onclick="calc()">Calc</button></div> <script> var out = document.getElementById("out"); out.style.width = '600px'; out.style.height = '500px'; //   function gear(n,r){ var overlap = 1.0;//    this.n = n;//  this.r = r - overlap;// this.R = r; } //  var gears = [ new gear(40,20.50),//  new gear(20,10.90), new gear(24,12.85), new gear(30,15.95), new gear(35,18.50), new gear(40,21.00), new gear(52,26.90), new gear(60,30.85), new gear(72,36.90), new gear(80,40.95), new gear(84,43.00) ]; var sh_sp = 154.0,//  -   () sh_rail = 134.5,//  -    sp_rail = 24.0;//  -      //      var alfa_min = Math.acos((sh_rail*sh_rail+sh_sp*sh_sp-sp_rail*sp_rail)/ (2*sh_rail*sh_sp)); var shaft_step = 2.0,//mm sp_oa_min = 45.0,//     //    sh_oa_max = 116.0;//     //    //      n   m  function nextVar(a, n, m){ var j, s; do{//   j = n - 2; while (j != -1 && a[j] >= a[j + 1]) j--; if (j == -1) return false; //   var k = n - 1; while (a[j] >= a[k]) k--; s = a[j]; a[j] = a[k]; a[k] = s;//swap(a, j, k); var l = j + 1, r = n - 1;//    while (l < r){ s = a[l]; a[l] = a[r]; a[r] = s;//swap(a, l++, r--); l++; r--; } } while (j > m - 1); return true; } // // Sp // AB // CD // ShSh // function test(a,v,result){ var Sh, D, C, B, A, Sp, step, d = 1000; switch(v){ case 0:// III Sh = gears[a[0]];//  C = gears[a[1]]; D = C; A = gears[a[2]]; B = A; Sp = gears[0];// //        step = Math.ceil(d*shaft_step*Sp.n/(Sh.n))/d; break; case 1:// IV Sh = gears[a[0]];//  D = gears[a[1]]; C = D; B = gears[a[2]]; A = gears[a[3]]; Sp = gears[0];// //        step = Math.ceil(d*shaft_step*Sp.n*Bn/(An*Sh.n))/d; break; case 2:// IV Sh = gears[a[0]];//  D = gears[a[1]]; C = gears[a[2]]; A = gears[a[3]]; B = A; Sp = gears[0];// //        step = Math.ceil(d*shaft_step*Sp.n*Dn/(Cn*Sh.n))/d; break; case 3:// V Sh = gears[a[0]];//  C = gears[a[1]]; D = gears[a[2]]; B = gears[a[3]]; A = gears[a[4]]; Sp = gears[0];// //        step = Math.ceil(d*shaft_step*Sp.n*Bn*Cn/(An*Dn*Sh.n))/d; break; default: return false; } // var S = Sp.r + Ar; var V = Sh.r + Dr + Cr + Br; var L = sh_sp; //         if(Math.acos((V*V+L*LS*S)/(2*V*L)) < alfa_min) return false; // AB     if(S < sp_oa_min) return false; //      AB if(V > sh_oa_max) return false; // A      if(S + V <= L) return false; // B      A if(Br > Ar) return false; // C      D if(Cr > Dr) return false; // C  D      if(Dr != Cr) if(Sh.r-9.0 < DR-Cr) return false; // A     C   B  D if(Dr != Cr) if(AR-Br >= Dr-CR) return false; // switch(v){ case 0: result.push([step,1,Sh.n,Cn,An]); break;// III case 1: result.push([step,2,Sh.n,Dn,Bn,An]); break;// IV case 2: result.push([step,3,Sh.n,Dn,Cn,An]); break;// IV case 3: result.push([step,4,Sh.n,Cn,Dn,Bn,An]); break;// V } // return true; } //   function search(result){ var k = [3,4,4,5];//    for(var v=0;v<4;v++){ var G = [1,2,3,4,5,6,7,8,9,10]; do{ test(G,v,result);//  } while (nextVar(G, 10, k[v])); } } //  function eliminate(result){ //       var J = 1, I = result.length; for(var i=1;i<I;i++){ var f1 = true, f2 = true, f3 = false; for(var j=0;j<J;j++){ if(result[j][0] == result[i][0]){//   f1 = false; if(result[j].length == result[i].length){//    f2 = false; var a1 = result[j].slice().sort(); var a2 = result[i].slice().sort(); for(var n=0;n<a1.length;n++) if(a1[n] != a2[n]){ f3 = true;//  break; } } } } if(f1)//  //if(f1 || f2 || (!f2 && f3))//  result[J++] = result[i]; } result.splice(J, IJ);//      result.sort(function(a, b){return a[0]-b[0]}); } // function calc() { var result = []; search(result); eliminate(result); var a = []; for(var i=0;i<result.length;i++) a.push(result[i].join("\t")); out.value = a.join("\n"); } </script> </body> </html> 

Source: https://habr.com/ru/post/zh-CN457248/


All Articles