JavaScript-Programmierung für eine Drehmaschine

Dieser Artikel sollte als "Generieren von chinesischen Drehgitarrenkombinationen für die Tonhöhenauswahl mit einem JavaScript-Skript" bezeichnet werden, klingt aber nicht so faszinierend.


Die billigste Drehmaschine mit Aliexpress MX-180V hat mich seit ihrem Erscheinen in meiner Heimwerkstatt seit mehr als sechs Monaten überraschend amüsiert. Trotz der Tatsache, dass die Chinesen vergessen hatten, es an der Schublade zu befestigen, wodurch die Frontplatte zerknittert wurde.


Trotz der Unfähigkeit dieses Geräts, Linkshänder-Fäden zu schneiden, kann dies entgegen den Gelübden des Verkäufers der Fall sein. Trotz der Tatsache, dass der mitgelieferte Schraubendreher nach der ersten Berührung verstreut war.



Trotz der geringen Qualität der Herstellung dieses Geräts verwende ich es, mache die Teile, die ich brauche, und sammle im Allgemeinen Fähigkeiten. Für mich ist der Reiz von Heimwebstühlen, dass Sie nicht auf der Suche nach etwas Ähnlichem wie etwas Notwendigem im Müll stöbern müssen, sondern es einfach selbst tun müssen. Dies ist der direkteste Weg von der Idee zur Verwirklichung.
So kam es allmählich zum Einfädeln. Ich habe mich entschlossen, an einem Nagel mit einem Durchmesser von 6 mm zu üben, damit ich nichts schleife. Dies ist der Durchmesser des Bolzens mit einer Gewindesteigung von 1 mm, für den ich eine Mutter hatte. Entsprechend der Tabelle, die sich auf dem Maschinengehäuse befindet, habe ich die notwendige Getriebekombination für den ausgewählten Schritt gefunden.


Auf der Welle befindet sich ein Zahnrad mit 80 Zähnen, dann 52, und zwischen diesem Zahnrad und der Spindel sollte sich ein Zahnrad mit 50 Zähnen befinden. Aber unter den 10 Gängen in meinem Set mit 50 Zähnen war das nicht.


Dann wurde ich wieder wütend, na ja, wie, die chinesischen Brüder! Abgerundet wurde ich schließlich durch die Tatsache, dass es in meinem Set auch keinen zweiten Gang für 80 Zähne und 66 und 33 Zähne gab. Mit ein wenig Nachdenken wurde mir klar, dass für einen Vorschub von 1 mm pro Umdrehung nur das Verhältnis der Zähne auf der Spindel und auf der Welle wichtig ist und die Zwischenräder beliebig sein können. Hauptsache, dass sie dort passen. Infolgedessen habe ich den ersten M6x1-Faden in meinem Leben mit einem Cutter geschnitten, nicht mit einer Matrize!


Eine Sache, die nur von der Freude an diesem Ereignis überschattet wurde, die Nichtübereinstimmung des Tisches mit meinen Gängen. Dies bedeutete, dass ich es jetzt nicht einfach nehmen, auf den Tisch schauen und bei Bedarf den erforderlichen Faden abschneiden kann. Jedes Mal, wenn Sie überlegen müssen, wie Sie die Zahnräder einsetzen sollen, jedes Mal, um neu zu zählen. Im Allgemeinen ist ein Tisch viel bequemer. Das Schicksal brachte mich dazu, mich mit den Details des Gitarrendesigns und den Feinheiten der Berechnung der Übersetzungsverhältnisse der Getriebe zu befassen.

Die Vorrichtung des Getriebes ist nicht schwierig und schematisch können vier Möglichkeiten zur Installation von Zahnrädern (unabhängig von deren Durchmessern) wie folgt dargestellt werden:


Der Bestimmtheit halber werden wir sie Verknüpfungsschemata nennen. Ich musste herausfinden, welche Zahnradkombinationen im Hinblick auf die Möglichkeit des Einbaus in eine Führungsschiene zulässig sind, die sich um die Achse der Welle drehen kann und auf der zwei Achsen der Zwischenräder befestigt sind.


Die obere Achse sollte die Spindelscheibe nicht berühren, und daher sollte das erste angetriebene Zahnrad nicht weniger als 52 Zähne haben. Außerdem sollte die Führungsschiene nicht zu nahe an der Spindelwelle gedreht werden, um ein Berühren der Drehzahlmessermagnete zu vermeiden.


Ein physischer Versuch, diese Aufgabe brutal zu erzwingen, zeigte, dass es viele akzeptable Kombinationen gibt. Auf einem Blatt Papier war bereits nicht genug Platz für Sets, die noch nicht verifiziert waren. Ich wurde verwirrt. Es bestand eine große Chance, eine Kombination zu überspringen oder umgekehrt, um eine bereits geprüfte aufzuzeichnen. Der Wunsch, blind Optionen aufzuzählen und in einer unbequemen Position vor der Maschine zu sitzen, verschwand sehr schnell. Wie viele und welche Kombinationen und Vorschübe sind auf dieser Maschine möglich? Es war notwendig, die Theorie um Hilfe zu bitten und die Aufzählung von Optionen auf dem Computer durchzuführen, damit dies nicht umsonst war.


Es wird notwendig sein, einen Platzierungsgenerator ohne Wiederholungen zu finden oder zu schreiben, da jedes Zahnrad, das ich habe, nur in einer Kopie vorhanden ist. Es gibt viele Möglichkeiten, aus 10 Optionen für 3, 4 und 5 Gänge zu wählen, aber einige davon sollten natürlich aus geometrischen Gründen verworfen werden. Sie benötigen einen Filter, durch den nur geeignete Zahnradsätze hindurchtreten können. Nach dem Filtern wird es wahrscheinlich viele Kombinationen geben, die die gleiche Steigung ergeben, ohne sich in Getriebemustern und Zahnradsätzen zu unterscheiden, d.h. es wird äquivalente Permutationen geben. Sie sollten auch entsorgt werden.

Ohne zu zögern entschied ich mich, in JS zu programmieren, obwohl ich auch C ++ verwenden konnte, aber in meiner Praxis bin ich noch nicht auf eine Aufgabe gestoßen, die in browserbasiertem JS beim Löschen von Daten auf die Festplatte nicht gelöst werden konnte. Bei dieser Methode fühle ich mich vom Minimalismus und der ausreichenden Infrastruktur, dem Editor und dem Browser angezogen, alles andere ist überflüssig. Die Sprache bietet Algorithmen, der Browser eine grafische Oberfläche, einen Interpreter und einen Debugger. Jede Bibliothek kann entweder schnell selbst geschrieben oder gefunden und heruntergeladen werden. Wenn Sie nicht an industrieller oder kommerzieller Programmierung beteiligt sind, reicht einfach ein Universalrechner aus.

Ich habe den Platzierungsgenerator schnell gefunden und angepasst. Der Zweck des Programms besteht darin, die Indizes des Arrays neu anzuordnen, in denen Zahnradinstanzen gespeichert werden. Hier werden Platzierungen in der Suchfunktion generiert und frühere Filter von der Testfunktion in das Ergebnisarray gepackt. Zusätzlich wird der Vorschub in der letzten Funktion berechnet. Für die Bestimmtheit bezeichnen wir alle Zahnräder wie in der Abbildung.


Wir schreiben die Formeln zur Berechnung des Vorschubs in Abhängigkeit von der Steigung der Vorschubwelle und der Anzahl der Zahnradzähne für jedes der Eingriffsschemata auf:


Um einen Filter zu entwickeln, sollten Sie sich eingehender mit den geometrischen Parametern der Gitarre befassen. Die Achsen von Spindel, Welle und oberem Zwischenrad bilden ein Dreieck.

Die L-Seite wird direkt gemessen, und der Rest wird aus den Radien der Zahnräder berechnet. Der Radius der Zahnräder ist um den Betrag der Überlappung beim Einrücken kleiner als ihr Außenradius. Da die Zahnräder nicht perfekt hergestellt sind, sollte das Ausmaß der Überlappung empirisch bestimmt werden. Die Überlappung muss so sein, dass ein Eingriff gewährleistet ist, aber ein Einklemmen der Zahnräder verhindert wird. In meinem Fall stellte sich heraus, dass es 1 mm war. Die folgende Einschränkung gilt für Seite S, die Achse des oberen Zwischenrads darf die Spindelscheibe nicht berühren. Sie wird direkt gemessen, wenn die Führung mit der Achse in der oberen Position so nah wie möglich an der Spindel gedreht wird, während die Achse die Riemenscheibe fast berühren sollte. Der Abstand V kann nicht größer sein als der Abstand zwischen der Achse der Welle und der oberen Zwischenachse, die vollständig in die Nut gedrückt wird. Es ist auch erforderlich, den Winkel zwischen L und V einzuschränken. Wenn Sie die Zahnstange ohne Zahnräder und Achsen so nah wie möglich an der Spindel drehen, den Abstand S zwischen der Spindelachse und dem oberen Punkt der Führung messen oder berechnen und den Winkel anhand der Formel berechnen


Hier ist V der Abstand von der Wellenachse zum oberen Punkt der Führung und nicht zum oberen Punkt der Nut (dies kann ein beliebiger Punkt der Schienen sein, die Hauptsache ist, dass die Abstände V und S dazu gemessen werden). Nach der gleichen Formel wird der Winkel während des Tests berechnet, die Abstände S und V hängen jedoch von den Radien der Zahnräder ab.


Außerdem darf Zahnrad B nicht größer als A sein und C darf nicht größer als D sein. D darf die Welle nicht berühren und C darf beim Getriebe B und D nicht an A haften.

Sobald die Liste der erfolgreichen Kombinationen erstellt wurde, sollten Sie sie mithilfe der Eliminierungsfunktion vor Redundanz schützen. Dies geschieht durch die einfache Suche nach Lösungen, die in irgendeiner Weise einzigartig sind. Sie können die Einzigartigkeit des Schritts oder die Einzigartigkeit eines Satzes von Zahnrädern und dergleichen verwenden.

In meinem Fall gibt es 751 Kombinationen, die sich in der Steigung, der Anzahl der Gänge und ihrem Satz unterscheiden. Es gibt nur 222 einzigartige Innings. Natürlich werden viele von ihnen nicht häufig oder überhaupt nicht verwendet, aber es gibt Zoll-Innings.


Während ich an diesem Text arbeitete, ließ mich die Idee nicht los, dass der Weg zur Lösung dieses Problems auf der Stufe 5 liegt, was sogar eine Schande ist, darüber zu sprechen. Es ist nur so, dass in diesem Fall das Ergebnis (Feed-Tabelle) viel wichtiger ist als die Art und Weise, wie es empfangen wird. Die Maschinen, Gitarren, Getriebe und Zahnräder können jedoch unterschiedlich sein, und es wäre nicht schlecht, mindestens einen der Ansätze zur Konstruktion eines solchen Tisches in Betracht zu ziehen.

Abschließend gebe ich den vollständigen Text des Skripts an, der mit einer ausreichenden Anzahl von Kommentaren ausgestattet ist.

Versteckter Text
<!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/de457248/


All Articles