Programmation JavaScript pour un tour

Cet article devrait être intitulé «générer des combinaisons de matériel de guitare de tour chinois pour choisir la hauteur avec un script JavaScript», mais il ne semble pas si intriguant.


Le tour le moins cher avec Aliexpress MX-180V m'a étonnamment amusé depuis son apparition dans mon atelier à domicile pendant plus de six mois. Malgré le fait que les Chinois ont oublié de le fixer au tiroir, le panneau avant a été froissé.


Malgré l'incapacité de cet appareil à couper les fils pour gauchers, contrairement aux vœux du vendeur, cela peut. Malgré le fait que le tournevis inclus, il s'est dispersé après la première touche.



Malgré, enfin, la faible qualité de fabrication de cet appareil, je l'utilise, fabrique les pièces dont j'ai besoin et, en général, accumule des compétences. Pour moi, la beauté des métiers à tisser à la maison est que vous n'avez pas à fouiller dans la poubelle à la recherche de quelque chose de similaire à quelque chose de nécessaire, mais faites-le vous-même. C'est le chemin le plus direct de l'idée à la réalisation.
Alors, petit à petit, c'est au tour d'enfiler. J'ai décidé de m'exercer sur un clou d'un diamètre de 6 mm, pour que je ne broie rien, ce sera le diamètre du boulon avec un pas de filetage de 1 mm, pour lequel j'avais un écrou. Selon le tableau, qui se trouve sur le boîtier de la machine, j'ai trouvé la combinaison d'engrenages nécessaire pour l'étape sélectionnée.


Sur l'arbre, il y a un engrenage avec 80 dents, puis 52, et entre cet engrenage et la broche, il devrait y avoir un engrenage avec 50 dents. Mais parmi les 10 vitesses de mon jeu avec 50 dents, ce n'était pas le cas.


Puis j'ai recommencé à être bouleversé, eh bien, comment ça, les frères chinois! J'étais finalement fini par le fait que dans mon set il n'y avait pas non plus de deuxième vitesse pour 80 dents et 66 et 33 dents. Avec un peu de réflexion, je me suis rendu compte que pour une avance de 1 mm par tour, seul le rapport des dents sur la broche et sur l'arbre est important, et les engrenages intermédiaires peuvent être quelconques, l'essentiel est qu'ils s'insèrent là. En conséquence, j'ai coupé le premier fil M6x1 de ma vie à l'aide d'un cutter, pas d'une filière!


Une seule chose éclipsée par la joie de cet événement, l'inadéquation de la table à mes engrenages. Cela signifiait que maintenant je ne pouvais pas simplement le prendre, regarder la table et couper le fil nécessaire si nécessaire. A chaque fois, il faut penser à mettre les engrenages, à chaque fois à recompter. En général, une table est beaucoup plus pratique. Le destin m'a donc fait plonger dans les détails de la conception de la guitare et les subtilités du calcul des rapports de démultiplication des boîtes de vitesses.

Le dispositif de la boîte de vitesses n'est pas difficile et schématiquement quatre façons d'installer des engrenages (quels que soient leurs diamètres) peuvent être représentées comme suit:


Pour plus de précision, nous les appellerons schémas de liaison. J'avais besoin de savoir quelles combinaisons d'engrenages sont acceptables en termes de possibilité de les installer dans un rail de guidage, qui peut tourner autour de l'axe de l'arbre et sur lequel deux axes des engrenages intermédiaires sont fixés.


L'axe supérieur ne doit pas toucher la poulie de broche, et par conséquent le premier engrenage entraîné ne doit pas avoir moins de 52 dents. De plus, le rail de guidage ne doit pas être tourné trop près de l'arbre de broche, afin d'éviter de toucher les aimants du tachymètre.


Une tentative physique de forcer brutalement cette tâche a montré qu'il existe de nombreuses combinaisons acceptables. Sur un morceau de papier, il n'y avait déjà pas assez d'espace pour des décors non encore vérifiés, j'ai commencé à m'embrouiller. Il y avait une grande chance de sauter une combinaison, ou vice versa, d'enregistrer une déjà vérifiée. Le désir de s'engager dans une énumération aveugle des options, assis dans une position inconfortable devant la machine, s'est évanoui très rapidement. Combien et quel type de combinaisons et d'avances sont possibles sur cette machine? Il fallait faire appel à la théorie pour obtenir de l'aide, et mettre le travail sur l'énumération des options sur l'ordinateur afin que ce ne soit pas en vain.


Il sera nécessaire de trouver ou d'écrire un générateur de placement sans répétitions, car chaque équipement que j'ai n'a qu'un seul exemplaire. Il existe de nombreuses façons de choisir parmi 10 options pour les vitesses 3, 4 et 5, mais certaines d'entre elles, évidemment, doivent être rejetées pour des raisons géométriques. Vous aurez besoin d'un filtre qui ne laisse passer que les jeux d'engrenages appropriés. Après le filtrage, il y aura probablement de nombreuses combinaisons qui donneront le même pas, sans différer dans les modèles d'engrenages et les jeux d'engrenages, c'est-à-dire il y aura des permutations équivalentes. Ils doivent également être éliminés.

Sans hésitation, j'ai décidé de programmer en JS, même si je pouvais également utiliser C ++, mais dans ma pratique, je n'ai pas encore rencontré de tâche qui ne pouvait pas être résolue dans JS basé sur un navigateur lorsqu'il s'agit de vider les données sur le disque. Dans cette méthode, je suis attiré par le minimalisme et la suffisance de l'infrastructure, du bloc-notes et du navigateur, tout le reste est superflu. Le langage fournit des algorithmes, le navigateur fournit une interface graphique, un interprète et un débogueur. Toute bibliothèque peut être écrite rapidement vous-même, ou trouvée et téléchargée. Lorsque vous n'êtes pas impliqué dans une programmation industrielle ou commerciale, une simple calculatrice universelle suffit.

J'ai trouvé et adapté rapidement le générateur de placement. Son but dans le programme est de réorganiser les indices de la matrice dans laquelle les instances d'engrenage seront stockées. Ici, les emplacements sont générés dans la fonction de recherche et les filtres antérieurs sont entassés dans le tableau de résultats par la fonction de test. De plus, l'avance est calculée dans la dernière fonction. Pour plus de précision, nous désignons tous les engrenages comme sur la figure.


Nous écrivons les formules de calcul de l'avance, en fonction du pas de l'arbre d'alimentation et du nombre de dents d'engrenage pour chacun des schémas d'engagement:


Pour développer un filtre, vous devez vous attarder plus en détail sur les paramètres géométriques de la guitare. Les axes de la broche, de l'arbre et du pignon intermédiaire supérieur forment un triangle.

Dont le côté L est mesuré directement et le reste est calculé à partir des rayons des engrenages. Le rayon des engrenages est inférieur à leur rayon extérieur par la quantité de chevauchement lorsqu'ils sont engagés. Étant donné que les engrenages ne sont pas parfaitement fabriqués, la quantité de chevauchement doit être déterminée empiriquement. Le chevauchement doit être de nature à assurer l'engagement, mais à empêcher le pincement des engrenages. Dans mon cas, il s'est avéré être de 1 mm. La restriction suivante est imposée sur le côté S, l'axe de l'engrenage intermédiaire supérieur ne doit pas toucher la poulie de broche. Elle est mesurée directement lorsque le guide avec l'axe en position haute est tourné le plus près possible de la broche, tandis que l'axe doit presque toucher la poulie. La distance V ne peut pas être supérieure à la distance entre l'axe de l'arbre et l'axe intermédiaire supérieur, poussé jusqu'en haut de la rainure. Il est également nécessaire d'imposer une restriction sur l'angle entre L et V. Tourner la crémaillère sans engrenages et essieux aussi près que possible de la broche, mesurer ou calculer la distance S entre l'axe de la broche et le point haut du guide et calculer l'angle à l'aide de la formule


Ici, V est la distance de l'axe de l'arbre au point supérieur du guide, et non au point supérieur de la rainure (cela peut être un point arbitraire des rails, l'essentiel est que les distances V et S y soient mesurées). En utilisant la même formule, l'angle sera calculé lors des tests, mais les distances S et V dépendront des rayons des engrenages.


De plus, l'engrenage B ne peut pas être plus grand que A et C ne peut pas être supérieur à D. D ne doit pas toucher l'arbre et C ne doit pas s'accrocher à A lors de l'engagement de B et D.

Une fois la liste des combinaisons réussies établie, vous devez l'enregistrer de la redondance à l'aide de la fonction d'élimination. Cela se fait simplement en recherchant des solutions qui sont uniques de quelque manière que ce soit. Vous pouvez utiliser l'unicité de l'étape, ou l'unicité d'un ensemble d'engrenages et similaires.

Dans mon cas, il y a 751 combinaisons qui diffèrent par la hauteur, le nombre de vitesses et leur ensemble. Il n'y a que 22 manches uniques. Bien sûr, beaucoup d'entre elles ne sont pas couramment utilisées ou ne s'appliquent pas du tout, mais il y en a des pouces.


En travaillant sur ce texte, l'idée ne m'a pas laissé que le moyen de résoudre ce problème se situe au niveau 5, ce qui est même dommage de parler. C'est juste que dans ce cas, le résultat (tableau des flux) est beaucoup plus important que la façon dont il est reçu. Cependant, les machines, guitares, boîtes de vitesses, engrenages pour chacun peuvent être différents et il ne serait pas mauvais de garder à l'esprit au moins une des approches pour construire une telle table.

En conclusion, je donne le texte intégral du script, qui est équipé d'un nombre suffisant de commentaires, compte tenu de ce qui précède.

Texte masqué
<!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/fr457248/


All Articles