Programación de JavaScript para un torno

Este artículo debería llamarse "generar combinaciones de engranajes de guitarra de torno chinos para elegir el tono con un script JavaScript", pero no suena tan intrigante.


El torno más barato con Aliexpress MX-180V me ha sorprendido sorprendentemente desde su aparición en el taller de mi casa durante más de seis meses. A pesar del hecho de que los chinos olvidaron sujetarlo al cajón, como resultado de lo cual el panel frontal estaba arrugado.


A pesar de la incapacidad de este dispositivo para cortar hilos zurdos, contrariamente a los votos del vendedor, es posible. A pesar del hecho de que el destornillador incluido, se dispersó después del primer toque.



A pesar de, por fin, la baja calidad de fabricación de este dispositivo, lo uso, hago las piezas que necesito y, en general, acumulo habilidad. Para mí, el encanto de los telares hogareños es que no tienes que hurgar en la basura en busca de algo similar a algo necesario, sino solo hacerlo tú mismo. Este es el camino más directo desde la idea hasta la realización.
Entonces, gradualmente, el turno llegó a enhebrar. Decidí practicar con un clavo con un diámetro de 6 mm, para no moler nada, este será el diámetro del perno con un paso de rosca de 1 mm, para lo cual tenía una tuerca. De acuerdo con la tabla, que se encuentra en la carcasa de la máquina, encontré la combinación de engranajes necesaria para el paso seleccionado.


En el eje hay un engranaje con 80 dientes, luego 52, y entre este engranaje y el eje debe haber un engranaje con 50 dientes. Pero entre los 10 engranajes en mi conjunto con 50 dientes no estaba.


Entonces comencé a enojarme de nuevo, bueno, ¡cómo es eso, los hermanos chinos! Finalmente terminé por el hecho de que en mi set tampoco había una segunda marcha para 80 dientes y 66, y engranajes de 33 dientes. Con un poco de pensamiento, me di cuenta de que para una alimentación de 1 mm por revolución, solo la relación de los dientes en el husillo y en el eje es importante, y los engranajes intermedios pueden ser cualquiera, lo principal es que encajan allí. Como resultado, corté el primer hilo M6x1 en mi vida usando un cortador, ¡no un dado!


Una cosa solo eclipsada por la alegría de este evento, el desajuste de la mesa con mis engranajes. Esto significa que ahora no puedo tomarlo, mirar la mesa y cortar el hilo necesario cuando sea necesario. Cada vez que tienes que pensar cómo poner los engranajes, cada vez para volver a contar. En general, una mesa es mucho más conveniente. Así que el destino me hizo profundizar en los detalles del diseño de la guitarra y las sutilezas de calcular las relaciones de transmisión de las cajas de cambios.

El dispositivo de la caja de cambios no es difícil y esquemáticamente cuatro formas de instalar engranajes (independientemente de sus diámetros) se pueden representar de la siguiente manera:


Por definición, los llamaremos esquemas de enlace. Necesitaba averiguar qué combinaciones de engranajes son permisibles en términos de la posibilidad de instalarlos en un riel de guía, que puede girar alrededor del eje del eje y en el que se fijan dos ejes de los engranajes intermedios.


El eje superior no debe tocar la polea del husillo y, por lo tanto, el primer engranaje impulsado no debe tener menos de 52 dientes. Además, el riel de guía no debe girarse demasiado cerca del eje del eje, para evitar tocar los imanes del tacómetro.


Un intento físico de fuerza bruta en esta tarea demostró que hay muchas combinaciones aceptables. En una hoja de papel, ya no había suficiente espacio para los conjuntos aún no verificados, comencé a confundirme. Hubo una gran oportunidad de omitir una combinación, o viceversa, para grabar una ya marcada. El deseo de participar en una enumeración ciega de opciones, sentado en una posición incómoda frente a la máquina, desapareció muy rápidamente. ¿Cuántas y qué tipo de combinaciones y alimentaciones son posibles en esta máquina? Era necesario recurrir a la teoría para pedir ayuda, y poner el trabajo de enumerar opciones en la computadora para que no fuera en vano.


Será necesario encontrar o escribir un generador de ubicación sin repeticiones, ya que cada equipo que tengo solo está en una copia. Hay muchas maneras de elegir entre 10 opciones para 3, 4 y 5 marchas, pero algunas de ellas, obviamente, deberían descartarse debido a consideraciones geométricas. Necesitará un filtro que permita que solo pasen conjuntos de engranajes adecuados. Después del filtrado, probablemente habrá muchas combinaciones que darán el mismo tono, sin diferir en los patrones de engranajes y conjuntos de engranajes, es decir. habrá permutaciones equivalentes. También deben eliminarse.

Sin dudarlo, decidí programar en JS, aunque también podía usar C ++, pero en mi práctica todavía no he encontrado una tarea que no se pueda resolver en JS basado en navegador cuando se trata de vaciar datos al disco. En este método, me atrae el minimalismo y la suficiencia de la infraestructura, el bloc de notas y el navegador, todo lo demás es superfluo. El lenguaje proporciona algoritmos, el navegador proporciona una interfaz gráfica, un intérprete y un depurador. Cualquier biblioteca puede escribirse rápidamente usted mismo o encontrarse y descargarse. Cuando no está involucrado en la programación industrial o comercial, entonces, simplemente, una calculadora universal es suficiente.

Encontré y adapté el generador de ubicación rápidamente. Su propósito en el programa es reorganizar los índices de la matriz en la que se almacenarán las instancias de engranajes. Aquí, las ubicaciones se generan en la función de búsqueda, y la función de prueba agrupa los filtros pasados ​​en la matriz de resultados. Además, la alimentación se calcula en la última función. Para mayor precisión, designamos todos los engranajes como en la figura.


Escribimos las fórmulas para calcular la alimentación, en función del paso del eje de alimentación y el número de dientes de engranaje para cada uno de los esquemas de acoplamiento:


Para desarrollar un filtro, debe detenerse con más detalle en los parámetros geométricos de la guitarra. Los ejes del husillo, el eje y el engranaje intermedio superior forman un triángulo.

El lado L se mide directamente y el resto se calcula a partir de los radios de los engranajes. El radio de los engranajes es menor que su radio exterior por la cantidad de superposición cuando se activa. Como los engranajes no están hechos a la perfección, la cantidad de superposición debe determinarse empíricamente. La superposición debe ser tal que asegure el enganche, pero para evitar el pellizco de los engranajes. En mi caso, resultó ser de 1 mm. La siguiente restricción se impone en el lado S, el eje del engranaje intermedio superior no debe tocar la polea del husillo. Se mide directamente cuando la guía con el eje en la posición superior se gira lo más cerca posible del eje, mientras que el eje casi debe tocar la polea. La distancia V no puede ser mayor que la distancia entre el eje del eje y el eje intermedio superior, empujado hacia arriba por la ranura. También es necesario imponer un límite en el ángulo entre L y V. Girar la cremallera sin engranajes y ejes lo más cerca posible del eje, medir o calcular la distancia S entre el eje del eje y el punto superior de la guía y calcular el ángulo usando la fórmula


Aquí V es la distancia desde el eje del eje al punto superior de la guía, y no al punto superior de la ranura (este puede ser un punto arbitrario de los rieles, lo principal es que las distancias V y S se miden a él). Usando la misma fórmula, el ángulo se calculará durante la prueba, pero las distancias S y V dependerán de los radios de los engranajes.


Además, el engranaje B no puede ser mayor que A, y C no puede ser mayor que D. D no debe tocar el eje, y C no debe aferrarse a A cuando se engancha B y D.

Una vez que se construye la lista de combinaciones exitosas, debe guardarla de la redundancia utilizando la función Eliminar. Esto se hace simplemente buscando soluciones que sean únicas de cualquier manera. Puede usar la singularidad del paso o la singularidad de un conjunto de engranajes y similares.

En mi caso, hay 751 combinaciones que difieren en el tono, el número de marchas y su conjunto. Solo hay 222 entradas únicas. Por supuesto, muchas de ellas no se usan comúnmente o no se usan en absoluto, pero hay algunas pulgadas.


Mientras trabajaba en este texto, la idea no me dejó que la forma de resolver este problema es en el nivel de grado 5, lo cual es incluso una pena hablar. Es solo que en este caso, el resultado (tabla de alimentación) es mucho más importante que la forma en que se recibe. Sin embargo, las máquinas, guitarras, cajas de cambios, engranajes para cada uno pueden ser diferentes y no sería malo tener en cuenta al menos uno de los enfoques para construir una mesa de este tipo.

En conclusión, doy el texto completo del guión, que está equipado con un número suficiente de comentarios, dado lo anterior.

Texto oculto
<!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/457248/


All Articles