<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Knowledge on Schallberts Blog</title><link>https://blog.schallbert.de/tags/knowledge/</link><description>Recent content in Knowledge on Schallberts Blog</description><generator>Hugo</generator><language>de</language><lastBuildDate>Tue, 10 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.schallbert.de/tags/knowledge/index.xml" rel="self" type="application/rss+xml"/><item><title>Werkzeugvermessung automatisieren</title><link>https://blog.schallbert.de/edingcnc-macro-explained/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/edingcnc-macro-explained/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-02-10-tls-thumb.avif"&#10; class="post-cover"&#10; alt="Image: Drawing of Tool Length Sensor on stock material with distance spindle collet, visualizing Z0 measurement"&#10; title="Werkzeugvermessung automatisieren" /&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-02-10-tls.avif" alt="Image: Image: Drawing of Tool Length Sensor on stock material with distance to the spindle collet, visualizing Z0 measurement" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Mich erreichen immer wieder Fragen zu meinem &lt;a href="https://blog.schallbert.de/macros-for-cnc/"&gt;Post über CNC-Makros&lt;/a&gt;. In diesem Beitrag möchte ich ein paar Antworten geben und Details zur Vermessung und Kompensation verschiedener Werkzeuglängen teilen.&lt;/p&gt;&#10;&lt;h2 id="frage-wie-berechnet-das-makro-die-werkzeuglänge"&gt;Frage: Wie berechnet das Makro die Werkzeuglänge?&lt;/h2&gt;&#10;&lt;p&gt;Im Abschnitt &lt;a href="https://blog.schallbert.de/macros-for-cnc/#function-measure-tool-length"&gt;Werkzeuglänge Vermessen&lt;/a&gt; steht folgender Code:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSafety&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ; &lt;span style="color:#75715e"&gt;# Go to safety height (machine coordinates)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; X&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xPosTls&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Y&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xPosTls&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ; &lt;span style="color:#75715e"&gt;# Go to tool length sensor&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSpindleTip &lt;span style="color:#f92672"&gt;+&lt;/span&gt; toolLengthEst &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Move Z down to 10mm above estimated tool tip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Was passiert in den Zeilen &lt;code&gt;1-3&lt;/code&gt;?&#10;Wenn &lt;code&gt;Z=0&lt;/code&gt; im Maschinenkoordinatensystem (&lt;code&gt;G53&lt;/code&gt;) die höchste Position ist, sind &lt;code&gt;zSpindleTip&lt;/code&gt; und &lt;code&gt;toolLengthEst&lt;/code&gt; dann negative Werte?&lt;/p&gt;&#10;&lt;h3 id="antwort"&gt;Antwort:&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Diese Zeile fährt die Maschine zum in Variable &lt;a href="https://github.com/Schallbert/macro_edingCNC_sorotec/blob/a547e36c0f47490464e1fdb56d1a4b0e706b44fe/macro.cnc#L341" target="_blank" rel="noopener noreferrer" class="external-link"&gt;#4506&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; hinterlegten Wert. Bei mir ist er &lt;code&gt;0&lt;/code&gt;, also maximale Z-Höhe. Dieser Wert bleibt permanent gespeichert (siehe &lt;a href="https://github.com/Schallbert/macro_edingCNC_sorotec/tree/main?tab=readme-ov-file#permanent" target="_blank" rel="noopener noreferrer" class="external-link"&gt;hier&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;) und man muss ihn vorher im Makro-Setup-Dialog festlegen.&lt;/li&gt;&#10;&lt;li&gt;Führt eine Bewegung zum Werkzeuglängensensor (WZLS) im Maschinenkoordinatensystem aus. Dafür habe ich meinen Sensor an einem festen Punkt auf der Maschine platziert.&lt;/li&gt;&#10;&lt;li&gt;Mit &lt;code&gt;zSpindleTip&lt;/code&gt; (Variable &lt;code&gt;#4509&lt;/code&gt;) ist die Höhe auf der &lt;code&gt;Z-Achse&lt;/code&gt; gemeint, in der die Spindelnase den Werkzeuglängensensor freitastet. Dieser Wert ist negativ. Weshalb? Der größte Wert der Z-Achse ist &lt;code&gt;Null&lt;/code&gt;, wenn sie sich ganz am oberen Anschlag der Maschine befindet. Senkt man dia Achse von hier aus zum WZLS ab, bewegt man sie in negative Z-Richtung. Addiert man die geschätzte Werkzeuglänge &lt;code&gt;toolLengthEst&lt;/code&gt; sowie eine Sicherheitshöhe von &lt;code&gt;10mm&lt;/code&gt; dazu (falls man sich bei der Werkzeuglängenschätzung vertan hat), bleibt aber unter dem mechanischen Anschlag der Z-Achse, so ist der Wert noch immer negativ. Die Spindelnase hat nun aber genügend Luft zum WZLS, weil jetzt virtuell Werkzeug und Sicherheitshöhe hinzuaddiert wurden.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Pro Tipp: Im &amp;ldquo;Variables&amp;rdquo; Tab von EdingCNC kann man sich Werte von Variablengruppen anzeigen lassen. Man gibt eine Gruppe ein, z.B. &lt;code&gt;#4500&lt;/code&gt; und erhält die Live-Werte aller zehn Variablen.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Um das gut nachvollziehen zu können bietet sich an, die CNC-Software zum Ausprobieren nebenbei im Simulationsmodus laufen zu lassen.&#10;Konkretes Beispiel:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zSafety &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# machine coordinates, Z-axis at top notch&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zSpindleTip &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;86&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;43&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# machine coordinates, where empty spindle collet touches TLS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;toolLengthEst &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# the length the tool is protruding from spindle collet&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;86&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;43&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#75715e"&gt;# = -41.32mm, so below max Z height&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Benennung der Variablen habe ich in meinem Makro-Repository &lt;a href="https://github.com/Schallbert/macro_edingCNC_sorotec/tree/main?tab=readme-ov-file#permanent" target="_blank" rel="noopener noreferrer" class="external-link"&gt;auf Github&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; abgelegt.&lt;/p&gt;&#10;&lt;h3 id="frage-wie-berechne-ich-die-werkstückhöhe-nach-einer-werkzeugvermessung"&gt;Frage: Wie berechne ich die Werkstückhöhe nach einer Werkzeugvermessung?&lt;/h3&gt;&#10;&lt;p&gt;Folgendes Szenario: Man vermisst das Werkzeug und bestimmt anschließend per Makro die Werkstückhöhe. Wenn ich nun die Werkzeuglänge verändere ohne das Werkzeugwechselmakro aufzurufen, stimmt der Werkstücknullpunkt ja nicht mehr. Mit einem kürzeren Werkzeug liegt der Nullpunkt &amp;ldquo;zu tief&amp;rdquo;, bei einem Längeren &amp;ldquo;zu hoch&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Wie kann man dieses Problem lösen?&lt;/p&gt;&#10;&lt;h3 id="antwort-mehrere-lösungswege"&gt;Antwort: Mehrere Lösungswege&lt;/h3&gt;&#10;&lt;p&gt;Aus meiner Sicht gibt es hier drei Lösungswege.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Werkzeuglängenänderung immer über das Werkzeugwechselmakro laufen lassen. Man kann dort ja dieselbe Werkzeugnummer erneut eingeben.&lt;/li&gt;&#10;&lt;li&gt;Den Z-Nullpunkt über die Werkstückvermessung neu setzen (nicht empfohlen&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;)&lt;/li&gt;&#10;&lt;li&gt;Ohne Makro: Per Kommando &lt;code&gt;G92&lt;/code&gt; das Z-Koordinatensystem verschieben. Beispiel folgt.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-02-10-Enter-G92.avif" alt="Image: Coordinate shift G92 executed in the CNC software&amp;#39;s control terminal" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="lösung-3-koordinatensystem-verschieben"&gt;Lösung #3: Koordinatensystem verschieben&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-02-10-coordshift-before.avif" alt="Image: CNC&amp;#39;s coodinate window showing machine and workpiece coordinates before shift to reflect a change of tools" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Man kann das Werkstückkoordinatensystem mit den Befehl &lt;a href="https://www.linuxcnc.org/docs/html/gcode/g-code.html#gcode:g92" target="_blank" rel="noopener noreferrer" class="external-link"&gt;&lt;code&gt;G92 Coordinate System Offset&lt;/code&gt;&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; verschieben. Führt man ihn aus, so wird die ihm übergebene Zahl der angewählten Achse als neuer Wert im Koordinatensystem übernommen.&lt;/p&gt;&#10;&lt;p&gt;In diesem Fall wollen wir ja nur die relative Position verschieben und damit den Unterschied der Werkzeuglängen zueinander ausgleichen. Machen wir es mal konkret:&lt;/p&gt;&#10;&lt;p&gt;Nehmen wir an, das alte Werkzeug &lt;code&gt;T17&lt;/code&gt; hat eine freie Länge von &lt;code&gt;32mm&lt;/code&gt; und das neue Werkzeug (wieder &lt;code&gt;T17&lt;/code&gt;, denn wir spannen in diesem Beispiel nur um oder setzen ein Schlichtwerkzeug mit gleichen Schnittdaten ein) eine freie Länge von &lt;code&gt;24mm&lt;/code&gt;. Der neue Wert ist kürzer, und daher muss der Nullpunkt um &lt;code&gt;8mm&lt;/code&gt; nach unten wandern. &amp;ldquo;Nach unten&amp;rdquo; ist im Koordinatensystem der Z-Achse ein negativer Wert.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;&lt;span style="color:#75715e"&gt;# Pseudocode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;&lt;span style="color:#75715e"&gt;# (CamelCaseWord steht für eine Variablennummer wie #5003):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;G92&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;AktuelleZPosition&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;AlteWerkzeuglänge&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NeueWerkzeuglänge&lt;/span&gt;)&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;&lt;span style="color:#75715e"&gt;# 20mm + (32mm - 24mm ) = 20mm + 8mm = 28mm &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="verschiebung-werkstücknullpunkt-vs-werkstückkoordinatensystem"&gt;Verschiebung Werkstücknullpunkt vs. Werkstückkoordinatensystem&lt;/h3&gt;&#10;&lt;p&gt;Diese Rechnung mag erst einmal verwirren, versetzt sie das Koordinatensystem doch nach oben. Aber genau das ist erforderlich, damit der Werkstücknullpunkt relativ zur Werkzeugspitze erhalten bleibt: Das Werkzeug ist &lt;code&gt;8mm&lt;/code&gt; kürzer. Da wir den Werkstücknullpunkt nicht nach unten schieben, muss das Koordinatensystem halt nach oben versetzt werden. So wird die nun längere Strecke zwischen Werkzeugspitze und Werkstück kompensiert.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Coordinate System&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Tool tip position Z [mm]&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Workpiece position Z [mm]&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Tool top position Z [mm]&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Workpiece position Z [mm]&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Before shift&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Before shift&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;After shift&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;After shift&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Workpiece&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;20&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;28&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Machine&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-41.42&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-61,42&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-41.42&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-69,42&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-02-10-coordshift-after.avif" alt="Image: CNC&amp;#39;s coodinate window showing machine and workpiece coordinates after shift to reflect a change of tools. The shift only affects workpiece coordinates." /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Man sieht hier, dass sich durch das Versetzen des Koordinatensystems die Position der Werkzeugspitze im &lt;em&gt;Werkstückkoordinatensystem&lt;/em&gt; verändert. Die Z-Achse wird dabei nicht bewegt. Das &lt;em&gt;Maschinenkoordinatensystem&lt;/em&gt; bleibt von dieser Änderung unberührt. Da die Z-Achse nun aber einen weiteren Weg zum Werkstück zurücklegen muss, liegt seine Position im Maschinenkoordinatensystem jetzt um &lt;code&gt;-8mm&lt;/code&gt; unter dem vorigen Wert.&lt;/p&gt;&#10;&lt;h2 id="rahmenbedingungen"&gt;Rahmenbedingungen&lt;/h2&gt;&#10;&lt;p&gt;Die Makros funktionieren nur unter bestimmten Voraussetzungen:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Die Werkzeuglänge wurde zuvor gemessen bzw. Werkzeugwechsel werden stets per Makro gesteuert und nicht ohne &amp;ldquo;Wissen&amp;rdquo; der Maschine&lt;/li&gt;&#10;&lt;li&gt;Der Werkstücknullpunkt wird bei bereits bekannter Werkzeuglänge ermittelt.&lt;/li&gt;&#10;&lt;li&gt;Es gab keinen Not-Aus oder einen anderen kritischen Fehler. Dies würde den flüchtigen Speicher für die relevanten Variablen löschen.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="footnotes" role="doc-endnotes"&gt;&#10;&lt;hr&gt;&#10;&lt;ol&gt;&#10;&lt;li id="fn:1"&gt;&#10;&lt;p&gt;Nach einem Werkzeugwechsel die Werkstückhöhe in Z erneut einzumessen verschiebt meiner Ansicht nach den falschen Parameter. In Wirklichkeit hat sich doch nicht die Höhe des Werkstückes geändert, sondern die Position der Werkzeugspitze. Daher würde ich stets vorziehen, den sich ändernden Parameter anzupassen.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Albasia-Holz fräsen</title><link>https://blog.schallbert.de/albasia-on-cnc/</link><pubDate>Mon, 06 Oct 2025 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/albasia-on-cnc/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-on-cnc-thumb.avif"&#10; class="post-cover"&#10; alt="Image: Macro shot of Albasia plywood, layer view"&#10; title="Albasia-Holz fräsen" /&gt;&#10;&lt;h2 id="was-ist-albasia"&gt;Was ist Albasia?&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-samplecolors.avif" alt="Image: Albasia sandwich material samples with coloured melamine surface" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Albasia (&lt;a href="https://en.wikipedia.org/wiki/Falcataria_falcata" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Falcataria falcata&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;) ist ein sehr leichtes Weichholz. Es kommt hauptsächlich in &lt;a href="https://www.plywoodworking.com/exploring-albasia-wood-a-sustainable-solution-for-the-timber-industry.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Südostasien&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; vor und wächst schnell, was sein &lt;a href="https://www.juergensen.de/news/albasia-sperrholz-unsere-gruene-loesung-fuer-die-industrie/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Nachhaltigkeitsrating&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; verbessert. Seine Farbe variiert zwischen weißlich-gelb und pastelligem braun-rosa, ist im Vergleich zu Buche oder Eiche aber deutlich heller.&lt;/p&gt;&#10;&lt;p&gt;Hierzulande ist es meist als Multiplexplatte im Handel. Dadurch werden Nachteile wie die starke Neigung zum &lt;a href="https://www.holzplatten-shop.de/media/pdf/2e/97/f3/Das-Schwinden-und-Quellen-von-Holz.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Schwinden und Quellen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; abgemildert.&lt;/p&gt;&#10;&lt;p&gt;Die Dichte von Albasia ist nochmal etwa 15% geringer als die des ohnehin schon sehr leichten Pappelholzes. Es bildet im Wuchs lange Fasern, was die Zerspanbarkeit beeinträchtigt. Da es durch seine vielen Lufteinschlüsse zudem gut dämmt, wird es häufig im Fahrzeugausbau (Camper, Boote etc.) verwendet. Um die geringere Festigkeit auszugleichen, wird Albasia-Multiplex oft nicht roh, sondern als Sandwich-Platte angeboten.&lt;/p&gt;&#10;&lt;h3 id="mit-sandwichtechnik-zu-guten-materialeigenschaften"&gt;Mit Sandwichtechnik zu guten Materialeigenschaften&lt;/h3&gt;&#10;&lt;p&gt;Mein Testmaterial verfügt über eine beidseitig aufgebrachte, &lt;code&gt;0.8mm&lt;/code&gt; starke Schicht aus Hochdrucklaminat (HPL). Die Oberfläche ist in farbigen Melamindekoren erhältlich und kann als Extra gehärtet bestellt werden, was sie mattiert sowie unempfindlich gegenüber Kratzern macht.&lt;/p&gt;&#10;&lt;h3 id="sind-albasia-verbundplatten-für-den-außenbereich-geeignet"&gt;Sind Albasia-Verbundplatten für den Außenbereich geeignet?&lt;/h3&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Unsere Platten sind übrigens nicht für den Außenbereich vorgesehen.&amp;rdquo; - EpicPLY, Händler&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Auch wenn das Material für den Innenausbau entwickelt wurde: Ich teste die Wetterfestigkeit der Platten momentan mit einem Experiment. Dafür verschraube ich die Verbundplatte im rechten Winkel auf Stoß miteinander, sodass einmal die Beschichtung und einmal die Holzkante der Witterung direkt ausgesetzt sind. Ich habe eine offene Kante mit Hartöl versiegelt und eine unbehandelt belassen. Nun hänge ich die Konstruktion ein Jahr draußen auf den Balkon und sehe dann, wie sich das Material verhält - Update dann in einem gesonderten Post!&lt;/p&gt;&#10;&lt;section class="hugo-gallery"&gt;&#10; &lt;div class="hugo-gallery__frame"&gt;&#10; &lt;div class="hugo-gallery__grid" role="list"&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-0" aria-label="Image: test material and tools: plywood sample, srews, drills"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-outdoor-test-setup.avif" alt="Image: test material and tools: plywood sample, srews, drills" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-1" aria-label="Image: Albasia weather test mounted outside"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-outdoor-test-mount.avif" alt="Image: Albasia weather test mounted outside" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-2" aria-label="Image: Comparison of oiled and raw plywood surface on day0 of test. Both look fresh and new."&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-outdoor-test-surface.avif" alt="Image: Comparison of oiled and raw plywood surface on day0 of test. Both look fresh and new." class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;/div&gt;&lt;div class="hugo-gallery__caption"&gt;Versuchsaufbau für Bewetterungs- und Schraubentest.&lt;/div&gt;&lt;/div&gt;&#10;&lt;/section&gt;&#10;&#10; &lt;div class="hugo-gallery__full" aria-live="polite"&gt;&lt;figure id="gallery-full-0" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-outdoor-test-setup.avif" alt="Image: test material and tools: plywood sample, srews, drills" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Vorbereitung für den Schraubentest&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-1" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-outdoor-test-mount.avif" alt="Image: Albasia weather test mounted outside" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Der zusammengesetzte Testaufbau ist zur Bewitterung angebracht.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-2" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-outdoor-test-surface.avif" alt="Image: Comparison of oiled and raw plywood surface on day0 of test. Both look fresh and new." class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Am Tag 0: Beide Oberflächen sehen noch frisch aus.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#10;&lt;/section&gt;&#10;&lt;p&gt;Meine Erwartung: anders als bei Birkensperrholz und ähnlich wie Pappelholz wird Albasia nicht für den Außenbereich taugen. Ich nehme an, dass sich die Fasern im Kantenbereich mit Wasser vollsaugen und das Material zum Quellen bringen. Dies würde es schnell verrotten lassen. Außerdem schätze ich die Gefahr für Insektenbefall als hoch ein, weil die Fasern echt weich sind und sich leicht abschälen lassen. Daher würde ich es nur in Innenräumen einsetzen.&lt;/p&gt;&#10;&lt;h3 id="verschraubungen"&gt;Verschraubungen&lt;/h3&gt;&#10;&lt;p&gt;Trotz seines leichten Kerns sei die Albasia-Verbundplatte gut zu verschrauben und würde mit einer &amp;ldquo;Schraubenauszugsfestigkeit von &lt;code&gt;120kg&lt;/code&gt;&amp;rdquo; bei einer &lt;code&gt;4mm-Holzschraube&lt;/code&gt; in einem &amp;ldquo;sehr stabilen Bereich&amp;rdquo; liegen, meint mein Händler.&lt;/p&gt;&#10;&lt;p&gt;Als Laie kann ich mit solchen Werten nicht viel anfangen und führe ein kleines Experiment durch. Ich nehme eine &lt;code&gt;4x35&lt;/code&gt; Holzschraube her und schaue mir die vorgesehenen Anzugsmomente an. Hier gilt für meinen Hersteller etwa:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;Parameter&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;Wert&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Auszugsparameter \( f_{ax,k} \)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;14 N/mm²&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Torsionsfestigkeit \( f_{tor,k} \)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3 Nm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Einschraubdrehmoment \( R_{tor,mean} \)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;\( \frac{f_{tor,k}}{R_{tor,mean}} \) ≥ 1,5&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vorbohren in Nadelholz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.5 mm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vorbohren in Laubholz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3 mm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;a href="https://www.spax.com/de-de/p/universalschraube-teilgewinde-senkkopf-t-star-plus-4cut-wirox.html?variant=0191010400353" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Quelle&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Nun schaue ich, ob ich zwei Bretter auf Stoß mit dem vorgesehenen Anzugsmoment verbinden kann. Dafür nehme ich einen Drehmomentschraubendreher zur Hand. Doch ich komme gar nicht bis zum Auslösen der Mechanik: Bereits vorher beginnt die Schraube, sich in die Deckschicht zu ziehen. Das maxinale Drehmoment, bevor die Schraube im Material &amp;ldquo;verschwindet&amp;rdquo;, schätze ich auf lediglich &lt;code&gt;0.8Nm&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2025-10-06-albasia-fastener-test.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Video: Ich versuche, eine Schraube auf Drehmoment im Holz festzuziehen.&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Somit lassen sich durchaus stabile Schraubverbindungen herstellen, jedoch würde ich beim Anziehen stets vorsichtig vorgehen, großzügig mit der Menge an Schrauben sein und zusätzlich Dübel- oder formschlüssige Verbindungsarten wählen.&lt;/p&gt;&#10;&lt;h2 id="albasia-auf-der-cnc-fräse"&gt;Albasia auf der CNC-Fräse&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-6mm-schlicht.avif" alt="Image: fine-cutting Albasia with a 6mm carbide endmill" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Albasia kann wie jedes andere Weichholz auch mit der CNC-Fräse verarbeitet werden. Für Weichhölzer typische Probleme wie Ausrisse oder Fasernester sind auch hier zu erwarten. Hinzu kommt die harte Beschichtung, welche die Bearbeitung wegen anderer Anforderungen an die Parameterwahl noch einmal schwieriger macht.&lt;/p&gt;&#10;&lt;h3 id="mit-welchen-fräsern-gelingt-die-bearbeitung"&gt;Mit welchen Fräsern gelingt die Bearbeitung?&lt;/h3&gt;&#10;&lt;p&gt;Für den Fräser ist der Materialmix herausfordernd. Beim Fräsen in HPL hatte ich im Artikel &lt;a href="https://blog.schallbert.de/cnc-router-overload/"&gt;zur Überlastung meines Fräsmotors&lt;/a&gt; ja bereits schlechte Erfahrungen gesammelt. Das Material damals besaß im Vergleich zu Albasia-Verbund jedoch einen viel höheren Hartpapierfaseranteil (Späne sind hellbraun und mit vielen &amp;ldquo;Punkten&amp;rdquo; durchzogen), was den Fräser in Rekordzeit stumpf werden ließ.&lt;/p&gt;&#10;&lt;p&gt;Ich setze Vollhartmetallfräser &lt;code&gt;VHM&lt;/code&gt; mit Spanbrecher und kaum Drall (&lt;code&gt;15°&lt;/code&gt;) ein, um die langen Holzfasern zu brechen. Sie verstopfen sonst sehr schnell die Absaugung und sammeln sich um den Fräser an, was zu Brandgefahr führen kann.&lt;/p&gt;&#10;&lt;p&gt;Für die Kantenbearbeitung habe ich mit komprimierenden Fräsern wie dem Viertelstab gute Erfahrungen gemacht. Taucht man nur leicht in das Material ein, so eignet sich aber auch ein V-Cut. Bei größerer Eintauchtiefe erreichen Halbrundfräser &amp;ldquo;Ball-nose&amp;rdquo; ein schönes Fräsbild.&lt;/p&gt;&#10;&lt;p&gt;Auf dem Bild ist ein Vergleich dargestellt. Rechts mit grün-grauer Beschichtung das Rohmaterial, geschnitten an einer Formatkreissäge. Links in violett ist das von mir CNC-gefräste Werkstück zu sehen. Das Schnittbild unterscheidet sich deutlich voneinander und die mit dem Fräser bearbeitete Fläche ist viel sauberer und ohne Ausrisse.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-mill-vs-saw.avif" alt="Image: Albasia / Albizia plywood sandwiched between HPL coatings. Saw cut reveals to be much more coarse with pull-outs versus the milled surface." /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Geht man in der Vollnut mit spanbrechenden Fräsern vor, lohnt sich ein Schlichtgang mit gerade gezahntem Fräser und großen Vorschüben bei nur geringer Abnahme von &lt;code&gt;0.2mm&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Allen Fräsern gemein sein muss&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;eine möglichst scharfe Schneide (keine Beschichtung!)&lt;/li&gt;&#10;&lt;li&gt;eine große Schnittgeschwindigkeit (keine zu kleinen Durchmesser verwenden)&lt;/li&gt;&#10;&lt;li&gt;ein verhältnismäßig großer Vorschub.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Mit Einschneidern habe ich eine hohe Oberflächengüte erzielen können. Der große Spankanal sorgt für gute Abfuhr, allerdings sind Ausrisse bei der Arbeit im Vollen mitunter problematisch. Die Schneidlast ist recht hoch, und die Schneiden sind im harten Obermaterial nicht dauerhaltbar. Für Schlichtgänge allerdings ideal.&lt;/p&gt;&#10;&lt;h3 id="welche-parameter"&gt;Welche Parameter?&lt;/h3&gt;&#10;&lt;p&gt;Albasia ist so weich, dass es den Achsantrieben der Fräse kaum Widerstand bietet. Die Schnittgeschwindigkeit ist hoch anzusetzen, Quellen im Internet empfehlen etwa &lt;code&gt;500m/min&lt;/code&gt; als Richtwert. Als Vorschub habe ich Werte bis &lt;code&gt;6000mmm/min&lt;/code&gt; ausprobiert. Ich habe aber auch nur kleine Werkstücke bearbeitet, weswegen noch höhere Vorschübe wegen der ständigen Richtungswechsel kaum einen Zeitvorteil böten. Ein zusätzlicher Schlichtgang ist wegen der Marken des Spanbrechers Pflicht.&lt;/p&gt;&#10;&lt;p&gt;Einen guten Kompromiss zwischen Fräszeit und Oberflächenqualität habe ich für verschiedene Fräser unten festgehalten. Die Gravierfräser lasse ich allerdings ausschließlich in der HPL-Schicht arbeiten, weswegen ich Vorschub und Drehzahl etwas reduziere.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Werkzeug (s= Anzahl Schneiden)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Vorschub &lt;code&gt;F&lt;/code&gt; [mm/min]&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Drehzahl &lt;code&gt;S&lt;/code&gt; [U/min]&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Zustellung Z [mm]&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Zustellung XY [mm]&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VHM-2s spanbrechend 15° 6mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4200&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;24000&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.7&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VHM-2s gerade 6mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3700&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;26500&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;21&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VHM V-cut 3s 90° 10mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3000&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;21000&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.27&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VHM Radienfräser 2s 6mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3000&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;21000&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.27&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VHM Viertelstab 4s r2 6mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3600&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;15000&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="schlichtgang"&gt;Schlichtgang&lt;/h3&gt;&#10;&lt;p&gt;Das folgende Video zeigt die den Schlichtvorgang nach dem Schruppen eines &lt;code&gt;145x145mm&lt;/code&gt; großen Werkstückes. Durch die geringe seitliche Zustellung bilden sich kaum Fasern aus und der geringe Vorschub sorgt trotz leichtem Drall des Fräsers für eine sehr hohe Oberflächengüte.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2025-10-06-albasia-schlicht.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;CNC-Schlichten von Albasia Verbundmaterial&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="gravuren"&gt;Gravuren&lt;/h2&gt;&#10;&lt;p&gt;Bei beschichteten Albasiaplatten finden Gravuren idealerweise in der Deckschicht statt. Wird nicht in das Trägermaterial eingetaucht, so können keine Probleme mit Ausrissen und losen Fasern entstehen. Da die Deckschicht nicht sehr stark ist, fällt die Wahl schnell auf V-Fräser mit stumpfem Winkel oder mit abgeflachter Spitze.&lt;/p&gt;&#10;&lt;p&gt;Alternativ hierzu können Bereiche mit Schaftfräsern vorgeräumt werden, falls das CAM-Programm eine solche Option bereitstellt. So entstehen komplett glatte &amp;ldquo;Böden&amp;rdquo; innerhalb der Taschen. Oder man verwendet Halbrundfräser wegen ihrer nur sanft ansteigenden Geometrie im unteren Bereich. Unterstützt das CAM-Programm die 3D-Gravur hiermit nicht, so kann die Fräsergeometrie wie im Artikel &lt;a href="https://blog.schallbert.de/halftone-image-on-dibond/#simulation-radienfr%c3%a4ser"&gt;Halbtonbilder auf Dibond&lt;/a&gt; beschrieben angenähert werden.&lt;/p&gt;&#10;&lt;p&gt;Zwei Beispiele habe ich im untenstehenden Bild vorbereitet: Der CR-Code in der oberen Hälfte entstand mit einem 6mm-Radienfräser bei &lt;code&gt;0.2mm&lt;/code&gt; Eintauchtiefe. Die entstehenden Punkte und Linien fühlen sich durch die sanften Übergänge weich und angenehm an. Der Schriftzug in der unteren Bildhälfte ist mit einem Gravierfräser und bis zu &lt;code&gt;7mm&lt;/code&gt; Tiefenzustellung gefräst. Hierdurch kommt der natürliche Holzton zwar schön zur Geltung, bei kleinen Schrithöhen wie dieser (max. &lt;code&gt;30mm&lt;/code&gt;) entstehen aber leicht Ausbrüche bei Buchstaben mit &amp;ldquo;Inseln&amp;rdquo; (a, e, b, o, etc.).&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-06-albasia-engrave-compare.avif" alt="Image: Albasia sandwich material engraved. Upper part using a radius endmill not penetrating the HPL cover, yields dark and very clean finish but lacks contrast. Lower part with a classic 60° V-cut with a brighter wooden finish but with artifacts" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="mit-farbe-arbeiten"&gt;Mit Farbe arbeiten&lt;/h2&gt;&#10;&lt;p&gt;Die Kontraste der Gravuren sind zwar in Ordnung, die Lesbarkeit ist aber längst nicht perfekt. Da liegt es nahe, Gravuren mit Farbe auszulegen. Ich habe mit ein paar Farbtönen experimentiert; ein paar Impressionen finden sich im Bild unten.&lt;/p&gt;&#10;&lt;h3 id="welcher-lack"&gt;Welcher Lack?&lt;/h3&gt;&#10;&lt;p&gt;Die Platte wird mit einer Schutzfolie ausgeliefert, um die farbige Beschichtung zu schützen. Das macht das Auslegen mit Farbspray total einfach, wenn ich die Schutzfolie für die Gravurbearbeitung auf dem Werkstück belasse. Ich habe mit handelsüblichem Acryllack auf Wasserbasis (oben rechts), Farbspray mit Metallpartikeln (unten) und mit lösemittelbasiertem Permanent Marker (oben links) gearbeitet.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-10-25-engrave-compare.avif" alt="Image: Impressions of coloured engravings of the name *Schallbert* and the QR-code to this website." /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Dabei ging die Lackierung stets leicht von der Hand. Die Abriebfestigkeit ist bei den in HPL gravierten Flächen hoch. Graviert man bis hindurch zum Holz, so stellen sich die Fasern durch das Lackieren etwas auf, was später nur sehr zeitaufwendig korrigiert werden kann und dem Gesamteindruck nicht zuträglich ist.&lt;/p&gt;&#10;&lt;h3 id="zu-beachten-schutzfolie"&gt;Zu beachten: Schutzfolie&lt;/h3&gt;&#10;&lt;p&gt;Der Lackiervorgang sollte möglichst direkt nach dem Gravieren gestartet werden und nicht erst Tage oder gar Wochen später. Ansonsten nämlich neigt die Schutzfolie zum Ablösen bzw. zur Blasenbildung an den Rändern der Gravur und die Farbe wird durch Kapillarkräfte in Bereiche gezogen, wo sie nicht hingehört. Dies hat mir die gold-blaue Version meiner Testreihe leider deutlich sichtbar ruiniert.&lt;/p&gt;&#10;&lt;h2 id="fazit-albasia-für-was"&gt;Fazit: Albasia für was?&lt;/h2&gt;&#10;&lt;p&gt;Alles in Allem würde ich Albasia zu den eher gutmütigen Materialien zur CNC-Bearbeitung zählen, die einen weiten Parameterbereich von Vorschüben bei hoher Schnittqualität akzeptiert. Herausfordernd sind die Neigung zum Bilden langer Fasern und die sehr unterschiedliche Härte zwischen Deckschicht und Kernmaterial; Geht man mit zu hohen Vorschüben vor, so nutzt der Fräser in den Bereichen mir HPL-Deckschicht sehr schnell ab.&lt;/p&gt;&#10;&lt;p&gt;Als Gravurmaterial eignet es sich ebenfalls, wofür aber die Beschichtung allein bereits genügen würde und durch die kleinen Gravurtiefen enge Grenzen für die Strichbreite gesetzt sind. Die Gravur kann also allenfalls nettes Beiwerk zum eigentlichen Einsatz der Platten sein.&lt;/p&gt;&#10;&lt;p&gt;Die Beschichtung macht das Material absolut möbelbaufähig. Arbeitet man mit verdeckten Kanten, so kann ich mir sogar den Einsatz in der Küche vorstellen. Da es eine hohe Biegestabilität besitzt und die Beschichtung mit hoher Härte besticht, ist es sogar als Oberfläche für den täglichen Gebrauch verwendbar. Das Plattenmaterial ist federleicht und eignet sich daher auch prima für mobile Anwendungen im Sichtbereich.&lt;/p&gt;&#10;&lt;p&gt;An die Robustheit von Birke Multiplex reicht es jedoch nicht heran. Belastete Verbindungen traue ich dem Material ohne Weiteres nicht zu; bei Verschraubungen würde ich Oberflächen maximieren und stets Möbelbauverbindungen einsetzen (also keine Holzschrauben nehmen).&lt;/p&gt;&#10;</description></item><item><title>Graustufenbilder auf Dibond</title><link>https://blog.schallbert.de/halftone-image-on-dibond/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/halftone-image-on-dibond/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-02-25-bloglogo-stipple-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: halftone image engraved with my CNC"&#10; title="Graustufenbilder auf Dibond" /&gt;&#10;&lt;p&gt;Im letzten Artikel hatte ich Dibond (Aluminium-Sandwichplatte) als Material zum Zerspanen wiederentdeckt. Ich setze es aus Umweltgründen - Verbundmaterialien sind nichts, was ich für besonders nachhaltig oder recyclebar halte - immer seltener ein. Dennoch üben die wunderschönen Oberflächen immer wieder eine gewisse Anziehungskraft auf mich aus. Nun denn - zur Sache!&lt;/p&gt;&#10;&lt;h2 id="bloglogo-als-punktwolke"&gt;Bloglogo als Punktwolke&lt;/h2&gt;&#10;&lt;p&gt;Inzwischen war ich in der Lage, ein von Stipplegen erzeugtes Bild mal auf die Fräse zu werfen. Dafür musste ich ein im Vorgängerartikel &lt;a href="https://blog.schallbert.de/halftone-cnc/"&gt;Graustufenbilder mit der CNC fräsen&lt;/a&gt; noch vorhandenes Problem lösen: In meinem meistgenutzten CAM-Werkzeug nämlich können Fräspfade für punktebasierte Halbtonbilder kaum erstellt werden, da jeder der über 2200 Punkte einzeln mit einer Fräsoperation versehen werden müsste.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;CADasCAM&lt;/em&gt; hingegen ermöglicht es, ganze Gruppen von Elementen ein- und derselben Fräsaktion hinzuzufügen. Nun fragte ich mich, mit welchem Fräser ich in Dibond am besten arbeiten solle, denn ich habe ja nur eine sehr dünne Deckschicht zur Verfügung.&lt;/p&gt;&#10;&lt;h3 id="simulation-radienfräser"&gt;Simulation Radienfräser&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-02-25-r2-ballnose-approximation.jpg" alt="Image: my drawing for V-cut to radius cutter approximation" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ich entschied mich für einen Radienfräser mit Halbrundkopf. Für diesen hat das CAM allerdings keine Berechnungsvorschrift, sodass er sich nicht ohne Weiteres auswählen lässt. Nach Rücksprache mit dem Hersteller kam die Idee auf, den Radienfräser durch einen V-cut mit Abflachung an der Spitze für das CAM zu simulieren, tatsächlich auf der Fräse aber den Kugelkopf einzusetzen.&lt;/p&gt;&#10;&lt;p&gt;Um hier passende Werte zu erhalten, fertigte ich ein paar Zeichnungen an. In der Tabelle unten sind Näherungswerte festgehalten für den Falle, dass die Eintauchtiefe &lt;code&gt;0.3mm&lt;/code&gt; nicht überschreitet. Nun konnte ich die Pfadberechnung im CAM durchführen und sogar eine Tiefenbegrenzung von &lt;code&gt;0.22mm&lt;/code&gt; einhalten. Die flachsten Bereiche haben eine Gravurtiefe von lediglich &lt;code&gt;0.10mm&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Bei der Pfadberechnung ist zu beachten, dass die Rückzugshöhen möglichst gering ausfallen sollten. Dann muss die Z-Achse der Maschinen nicht für jeden Punkt so weit hochfahren. Ich halte einen Wert von &lt;code&gt;0.5mm&lt;/code&gt; für angemessen.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Radienfräser&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Simulation durch V-Cut&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;r=3mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;140°, 1.0mm Abflachung&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;r=2mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;140°, 0.5mm Abflachung&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="fräsvorgang"&gt;Fräsvorgang&lt;/h3&gt;&#10;&lt;p&gt;Die Motivgröße für die Gravur beträgt &lt;code&gt;180x180mm&lt;/code&gt; und ich fräse mit folgenden Werten: &lt;code&gt;Radienfräser 2s r3 6mm, S20000, F1800&lt;/code&gt;. Ich durchsteche die Schutzfolie der Dibondplatte, deren Dicke ich nicht kompensiere. Ich verwende eine geringe Menge Schmiermittel zur Verbesserung der Schnittqualität. Nach knapp &lt;code&gt;11&lt;/code&gt; Minuten ist der Fräsvorgang beendet.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-02-25-r2-bloglogo-stipple.avif" alt="Image: Bloglogo as halftone dot image in Dibond, black" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="beobachtungen"&gt;Beobachtungen&lt;/h3&gt;&#10;&lt;p&gt;Das Motiv ist in diesem Versuch schon einmal viel deutlicher zu erkennen. Leider habe ich dennoch klar ein Problem mit der Oberflächenebenheit. So ist im mittleren Bereich rechts beispielsweise zu tief graviert (Aufbauschneide - siehe Video - dort ist die Fräse zum Schluss unterwegs), während die Graviertiefe ganz oben rechts und oben mittig nicht ausreichend erscheint.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Fräse und Fräser haben überhaupt kein Problem mit dem Material. Der Gravurvorgang klingt ein wenig wie die Arbeit mit der Ständerbohrmaschine, unterbrochen von Positioniergeräuschen der Schrittmotoren.&lt;/li&gt;&#10;&lt;li&gt;Die für Dibond verwendete Aluminiumsorte &lt;em&gt;AlMg1&lt;/em&gt; ist weich und zäh. Sie eignet sich nicht gut zum Zerspanen.&lt;/li&gt;&#10;&lt;li&gt;Fräser tendieren hier zum Erzeugen von &lt;a href="https://en.wikipedia.org/wiki/Built_up_edge" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Aufbauschneiden&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, welche den Fräserradius vergrößern und die Schnittqualität verschlechtern.&lt;/li&gt;&#10;&lt;li&gt;Die Schutzfolie verhindert Ausrisse und Spanränder.&lt;/li&gt;&#10;&lt;li&gt;Aufbringen von etwas Schmiermittel ist eine gute Idee.&lt;/li&gt;&#10;&lt;li&gt;Selbst auf einem Vakuumtisch ruiniert jedes Staubkorn unter dem Werkstück die Fräsarbeit. Wenige hundertstel Millimeter Höhendifferenz haben große Auswirkung auf die Punktgröße und führen zu Verfälschungen.&lt;/li&gt;&#10;&lt;li&gt;Das Maschinenbett muss absolut eben sein oder die Maschine muss über eine hochwertige, aktive Höhenkompensation verfügen; z.B. mittels vorheriger Oberflächenvermessung durch einen &lt;a href="https://blog.schallbert.de/touching-off/"&gt;Kantenfinder&lt;/a&gt;. Meine Steuersoftware unterstützt das Verfahren sogar unter dem Namen &lt;em&gt;ZheightComp&lt;/em&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="fazit"&gt;Fazit&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ich mag Dibond als Material sehr, aber es scheint meine Zuneigung nicht zu erwidern.&lt;/li&gt;&#10;&lt;li&gt;Mit meinen technischen Mitteln bekomme ich Gravuren nicht mit wiederholbar in guter Qualität hin.&lt;/li&gt;&#10;&lt;li&gt;Vielleicht sollte ich stattdessen Plastik oder Holz verarbeiten. Oder einen Laser verwenden&amp;hellip;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Zum Abschluss noch ein kurzes Zeitraffer-Video des Fräsvorganges.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/qTd6Ad2QStCp5AiWmrHZem" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Graustufenbilder mit der CNC herstellen - Teil2&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="saturn-als-ascii-art"&gt;Saturn als ASCII-Art&lt;/h2&gt;&#10;&lt;p&gt;Halbtonbilder kann man statt mit Linien, Wellen, Punkten natürlich auch mit Mustern herstellen. Als Beispiel habe ich mal das Bild des Planeten Saturn von &lt;a href="https://asciiart.website/index.php?art=nature/astronomy" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Christopher Johnsons ASCII Art&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für die Fräse aufbereitet.&lt;/p&gt;&#10;&lt;h3 id="cadcam"&gt;CAD/CAM&lt;/h3&gt;&#10;&lt;p&gt;Für das richtige Größenverhältnis wird eine Schriftart benötigt, bei der jedes Zeichen dieselbe Setzbreite besitzt. Ich wähle die TrueType-Schriftart &lt;em&gt;Courier New&lt;/em&gt; und passe Schriftgröße und Zeilenabstand so an, dass das Motiv auf mein Material passt und die Gravur nicht die Deckschicht perforiert.&lt;/p&gt;&#10;&lt;p&gt;Dies zwingt mich zur Verwendung eines &lt;code&gt;1/8&amp;quot; Gravurstichel mit 36° Spitzenwinkel und 0.1mm Abflachung&lt;/code&gt;. Ich hätte hier einen Radienfräser bevorzugt: Im weichen Dibond kommt es bei spitzwinkligen Sticheln zu Materialaufwurf und -Verschmierung. Dies führt zu unsauberen Linien und einer rauen Oberfläche. Da das Werkstück sehr klein ist, würde die Schrift jedoch viel zu breit ausfallen.&lt;/p&gt;&#10;&lt;p&gt;Die Pfadberechnung zeigt, dass ich auf dem nur &lt;code&gt;80x80mm&lt;/code&gt; großen Werkstück Fettdruck wählen muss, um meine Mindesttiefe von &lt;code&gt;0.08mm&lt;/code&gt; überhaupt zu erreichen.&lt;/p&gt;&#10;&lt;h3 id="fertigung"&gt;Fertigung&lt;/h3&gt;&#10;&lt;p&gt;Ich habe das Bild vom Saturn zweimal gefertigt: Auf &lt;code&gt;80x80mm&lt;/code&gt;, um die maximale Auflösung im Material zu testen und auf &lt;code&gt;180x180mm&lt;/code&gt; (Abbildung unten) zum Prüfen der Kontrastwirkung.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-02-25-halftone-saturn.avif" alt="Image: Halftone image of Saturn from my CNC machine. Image rights: asciiart.website" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Ich bin zufrieden mit dem Ergebnis. Der Kontrast ist hoch und die silberweiße Oberfläche des Aluminium(oxyds) sieht auf der mattschwarzen Lackierung richtig edel aus.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/wxcEMorVuY3hVZkseFjXyU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Graustufenbilder mit der CNC fertigen: Teil3&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="qr-codes"&gt;QR-Codes&lt;/h2&gt;&#10;&lt;p&gt;Wenn ich schon einmal mit Dibond arbeite: Ich probiere gleich noch aus, ein paar QR-Codes mit einem Radienfräser einzubringen.&#10;Dieses Mal verwende ich verschiedene Maschinen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-02-25-qr-dibond.avif" alt="Image: QR-codengrave tests in dibond with a radius cutter" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="auf-der-hobbyline"&gt;Auf der Hobbyline&lt;/h3&gt;&#10;&lt;p&gt;In schwarz graviere ich auf der mir zur Verfügung gestellten Hobbyline im übertakteten Gravurmodus. Ich fixiere das Werkstück mit einigen Punkten Doppelklebeband. Ich fräse trocken ohne Schmiermittel. Beobachtungen:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die Gravurtiefe scheint mit zunehmender Linienlänge zuzunehmen (Aufbauschneide, Fräser schmiert ins Material)&lt;/li&gt;&#10;&lt;li&gt;Teilweise wölbt sich die Lackoberfläche am Fräsrand nach oben&lt;/li&gt;&#10;&lt;li&gt;Sehr unsaubere Fräskanäle, starke Richtungsabhängigkeit&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="auf-der-basicline"&gt;Auf der Basicline&lt;/h3&gt;&#10;&lt;p&gt;Hier nutze ich natürlich meinen Vakuumtisch und profitiere vom viel stabileren Aufbau. Ich verwende eine geringe Menge Schmiermittel. War gespannt, ob die das weiße Material trotzdem ausreichende Kontraste zulässt. Beobachtungen:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Auch meine &lt;a href="https://blog.schallbert.de/projects/qr-codengrave/"&gt;QR-codeengrave&lt;/a&gt; Software muss richtig bedient werden. Ansonsten verschieben sich wie hier Nullpunkte und Größenverhältnisse. Folge: Mein Handy erkennt den QR-Code nicht 😐&lt;/li&gt;&#10;&lt;li&gt;Die viel bessere Niederhaltung verhindert starke Unterschiede in der Fräskanalbreite.&lt;/li&gt;&#10;&lt;li&gt;Dennoch sieht man die Austauchpunkte der Maschine und manchmal auch mitgeschleifte Späne.&lt;/li&gt;&#10;&lt;li&gt;Die Fräsqualität ist noch immer nicht befriedigend.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="fazit-1"&gt;Fazit&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-11-01_smallparts-thumb.jpg" alt="Image: single-flute cutter for PMMA/Acrylics." /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;In Zukunft muss ich Dibond ähnlich behandeln wie Acrylglas: Sehr scharf geschliffene Fräser verwenden, die das Material ordentlich schneiden. Idealerweise Einschneider mit Habichtschnabel und Eckenfase (weiche Kanten), zentrumsschneidend, dazu ordentlich Drall. Z.B. &lt;a href="https://shop.vhf.de/articleGroups/Einzahnfraeser-mit-Stirnradius-W_F_ES_SCR.htm" target="_blank" rel="noopener noreferrer" class="external-link"&gt;diese hier (Link zu vhf)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. So wird - glaube ich - eine Materialverdrängung in das noch weichere Kernmaterial vermieden und Späne außerdem im Spankanal nach oben gefördert, sodass sie nicht anhaften können oder ein zweites Mal unter den Fräser geraten.&lt;/p&gt;&#10;&lt;p&gt;Zudem sollte ich mit zügigen Vorschubwerten arbeiten. Dann heizt sich das Material nicht zu stark auf. Die Verwendung von ein wenig Schmiermittel sowie das Aufbringen von Schutzfolie trägt zu besserem Fräsergebnis bei. Weitere Verarbeitungshinweise gibt es beispielsweise &lt;a href="https://www.cnc-aus-holz.at/index.php?thread/2397-aluverbundplatte-dibond-gravieren/&amp;amp;postID=27536#post27536" target="_blank" rel="noopener noreferrer" class="external-link"&gt;im CNC-aus-Holz-Forum&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Stöbern kann sich lohnen.&lt;/p&gt;&#10;</description></item><item><title>Graustufenbilder mit der CNC fräsen</title><link>https://blog.schallbert.de/halftone-cnc/</link><pubDate>Mon, 27 Jan 2025 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/halftone-cnc/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-01-27_bloglogo-thumb.avif"&#10; class="post-cover"&#10; alt="Image: TSP-paths of my blog&amp;#39;&amp;#39;s logo"&#10; title="Graustufenbilder mit der CNC fräsen" /&gt;&#10;&lt;p&gt;Bis jetzt habe ich Bilder stets als Gravuren in Volltonfarben erstellt. Damit lassen sich Texte wie &lt;a href="https://blog.schallbert.de/negative-carving-with-estlcam/"&gt;diesen hier&lt;/a&gt;, aber auch &lt;a href="https://blog.schallbert.de/engrave-multicolor/"&gt;Zeichnungen&lt;/a&gt; und &lt;a href="https://blog.schallbert.de/makerfaire-ruhr/#vorbereitung"&gt;Bilder&lt;/a&gt; kontrastreich und hübsch fertigen.&lt;/p&gt;&#10;&lt;h2 id="das-ziel"&gt;Das Ziel&lt;/h2&gt;&#10;&lt;p&gt;Bei der Volltondarstellung können viele Details nicht abgebildet werden. Nun möchte ich aber ein echtes Foto ins Material bringen. Idealerweise soll dies zügig, ohne manuelle Nacharbeit und mit hoher Bildqualität passieren.&lt;/p&gt;&#10;&lt;p&gt;Mein CAM-Werkzeug stellt hierfür eine &amp;ldquo;Halbtonbild&amp;rdquo;-Funktion zur Verfügung, mit der ich im Folgenden herumexperimentiere. Auch hier ist es wieder so, dass selten direkt gute Ergebnisse aus der Maschine fallen. Außerdem sind die Erzeugung solcher Abbildungen sehr zeitintensiv, und Fehlversuche folglich &amp;ldquo;teuer&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Daher gebe ich am Ende des Artikels ein paar Tipps und Tricks, mit deren Hilfe recht schnell gute Ergebnisse erzielt werden können.&lt;/p&gt;&#10;&lt;h2 id="ein-wenig-farbwissen-rasterverfahren"&gt;Ein wenig Farbwissen: Rasterverfahren&lt;/h2&gt;&#10;&lt;p&gt;Das Problem, einen ganzen Farbraum mit nur wenigen verfügbaren Farben abbilden zu wollen, ist schon hunderte Jahre alt. Während Farbverläufe durch Mischen von Farben in der analogen Welt und auch am Bildschirm mittels unterschiedlicher Luminanzwerte der drei Farbkanäle in Pixeln hervorragend dargestellt werden können, stehen bei längst nicht jeder Anwendung eine große Anzahl Farben zur Verfügung.&lt;/p&gt;&#10;&lt;p&gt;Drucker zum Beispiel&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;. Sie haben meist nur die drei Grundfarben &lt;code&gt;cyan (C)&lt;/code&gt; - ein Türkiston, &lt;code&gt;magenta (M)&lt;/code&gt; - ein Pinkton, &lt;code&gt;yellow (Y)&lt;/code&gt; - gelb sowie &lt;code&gt;key (K)&lt;/code&gt; - meist Schwarz - zur Verfügung. Hieraus müssen sie dann die Illusion aller möglicher Farben erzeugen, denn sie können die Pigmente wegen ihrer hohen Deckkraft nicht mischen. Ansonsten würde der zuletzt aufgebrachte Farbton dominieren oder die Farbe würde schlicht verlaufen. Hieraus ergibt sich die Notwendigkeit, Rasterverfahren einzusetzen.&lt;/p&gt;&#10;&lt;h3 id="halftones-halbtonbild"&gt;Halftones (Halbtonbild)&lt;/h3&gt;&#10;&lt;p&gt;Eines dieser Rasterverfahren heißt &lt;em&gt;halftone&lt;/em&gt;. Hierbei wird durch Farbpunkte oder -Muster unterschiedlicher Strichstärke ein &lt;a href="https://en.wikipedia.org/wiki/Halftone" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Farbton simuliert&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, welchen das Auge ab einem gewissen Abstand nicht mehr auflösen kann und daher gemeinsam mit dem umgebenen Freiraum und gegebenenfalls anderen Farbpunkten zu einem Tonwert &amp;ldquo;mittelt&amp;rdquo;.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-01-27_bloglogo_9600dots.avif" alt="Image: 9600 dots stipple image of my blog&amp;#39;s logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Dieses Verfahren eignet sich für die &lt;a href="https://hackaday.com/2011/07/28/creating-halftone-pictures-with-a-cnc-machine/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Fertigung mittels CNC-Fräse&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, sofern die Oberfläche des zu bearbeitenden Werkstücks eine andere Farbe besitzt als das Kernmaterial.&lt;/p&gt;&#10;&lt;p&gt;Für Halftones existieren viele verschiedene Erzeugungsverfahren, bei denen sich Anordnung der Punkte, Striche, Musterform usw. teils stark unterscheiden. Auf der CNC bestimmen das verwendete Gravurmaterial, die benötigte Auflösung und das gewünschte Werkzeug das Verfahren, da sich nicht mit jeder Kombination eine gute Qualität erreichen lässt.&lt;/p&gt;&#10;&lt;h3 id="dithering"&gt;Dithering&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Dithering&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; wird eher bei der Darstellung auf Bildschirmen verwendet. Hierbei variiert nicht wie beim Halbtonverfahren Stärke bzw. Größe von Farbpunkten oder Mustern, sondern die räumliche Verteilung andersfarbiger Punkte, welche in die Grundfarbe gesprenkelt werden. Dadurch entsteht der Eindruck einer Mischfarbe.&lt;/p&gt;&#10;&lt;p&gt;Auch hier gibt es wieder verschiedene Erzeugungsverfahren: Diffusion, Rauschen, Muster, &lt;a href="https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Floyd-Steinberg-Algorithmus&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&amp;hellip;&lt;/p&gt;&#10;&lt;h2 id="materialauswahl"&gt;Materialauswahl&lt;/h2&gt;&#10;&lt;p&gt;Hier habe ich eine Menge ausprobiert. Am Besten eignen sich Materialien mit homogener Zusammensetzung und hohem Kontrast zwischen Oberflächen- und Kernfarbe. Zudem sollte die Schichtdicke des Oberflächenmaterials nicht zu groß ausfallen, da sie komplett durchstochen werden muss und dann schnell sehr große Einzelpunkte erforderlich werden. Die Oberfläche ist idealerweise mattiert, denn Seiden- Metall- oder Hochglanz erzeugen eine Blickwinkelabhängigkeit, bei der die Erkennbarkeit des Motivs leidet.&lt;/p&gt;&#10;&lt;p&gt;Außerdem sollte das Material komplett plan zur Fräsfläche sein, da die Punktgröße sonst unerwünscht stark variiert.&lt;/p&gt;&#10;&lt;h3 id="geeignete-materialien-"&gt;Geeignete Materialien 👍&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Kernmaterial&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Beschichtung&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Besonderheit&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mitteldichte Faserplatte&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Grundierung + Lack&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Fräsbahn nicht überlappen&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Aluverbundmaterial&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Lack oder Folie&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Max. 0.18mm tief fräsen&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Acrylglas (PMMA)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Lack oder Folie&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;XT verwenden (Dickentoleranz)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Am wenigsten Aufwand macht mir die Verarbeitung von fertig lackiertem Aluverbundmaterial. Hier ist praktisch keine Vor- und Nacharbeit erforderlich. Es ist aber darauf zu achten, die Frästiefe auf &lt;code&gt;0.18mm&lt;/code&gt; zu begrenzen. Sonst wird der PU-Kern deformiert oder es entstehen Ausrisse.&lt;/p&gt;&#10;&lt;p&gt;Das Aufbringen einer Folie kann eine gute Lösung sein, wenn man den Zeitaufwand eines Farbauftrags scheut. Ich selbst bin leider nicht besonders geschickt im Umgang mit Folie. Ständig erzeuge ich Luftblasen oder Einschlüsse kleinster Staubkörnchen. Nach dem Fräsvorgang sind die dadurch entstandenen Defekte im Höhenprofil deutlich anhand zu großer Löcher im Material zu erkennen.&lt;/p&gt;&#10;&lt;h3 id="ungeeignete-materialien-"&gt;Ungeeignete Materialien 👎&lt;/h3&gt;&#10;&lt;p&gt;Die hier aufgelisteten Materialien eignen sich meiner Meinung nach so nicht gut zum Erzeugen von Halbtonbildern. Ich habe ein paar Bilder misslungener Versuche hier abgelegt. Oft liegt ein Grund für Fehlschläge in einer für das Material zu hoch gewählten Bildauflösung.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Kernmaterial&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Beschichtung&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Grund&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mitteldichte Faserplatte&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Furnier&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Zu hohe Schichtdicke&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mitteldichte Faserplatte&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Metallfolie&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Papierkern der Metallfolie ist weiß&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Aluverbundmaterial&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Metall, gebürstet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Material &amp;ldquo;matscht&amp;rdquo;, Auflösung schlecht&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Aluverbundmaterial&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Keine, PU-Kern&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Alu in Kern gedrückt, Auflösung mies&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Weiche Alu-Legierungen&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Lack oder Folie&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Aluminium verschmiert, Auflösung mies&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-01-27-3guys_perfect.avif" alt="Image: 3 guys als halftone image on metalized MDF" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Hier experimentiere ich mit der Bildpunktdichte. Im unteren Bereich habe ich sie zu eng angeordnet, sodass sich die Beschichtung beim Fräsen löst. Auf meiner Gravur-CNC benötigt ein solches Bild auf einer Platte mit den Maßen&lt;code&gt;15x10cm&lt;/code&gt; trotz Übertaktung etwa &lt;code&gt;15 Minuten&lt;/code&gt;. Das Material ist wegen des Metallglanzes, der Ausrissgefahr, einer kaum erreichbaren Flächenverleimung und der hohen Schichtdicke nicht gut für solch hohe Auflösungen geeignet.&lt;/p&gt;&#10;&lt;h2 id="halbtonbilder-anforderungen-an-die-cnc"&gt;Halbtonbilder: Anforderungen an die CNC&lt;/h2&gt;&#10;&lt;p&gt;Das Problem hängt hier ausnahmsweise mal nicht mit Haltekräften, Fräskräften oder Schwierigkeiten beim Niederhalten zusammen. Im Gegenteil, beim Fräsen von Bildern werden außerordentlich geringe Kräfte aufgebracht, und die zumeist in Z-Richtung, wo die Maschinen eine Stabilitätsreserve besitzen.&lt;/p&gt;&#10;&lt;p&gt;Die Komplexität der Jobs stellt das Problem dar. Das Portal muss große Strecken zurücklegen und auf dem Weg ständig bremsen und beschleunigen. Endstufen, Schrittmotoren und Lager der Linearspindeln sind hierdurch stark belastet.&lt;/p&gt;&#10;&lt;h3 id="wellenstrichelinien"&gt;Wellen/Striche/Linien&lt;/h3&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-01-27-anywhereamps_halftonegrid.avif" alt="Image: Halftone wave-grid image of AnywhereAmps1.2 compared to original image" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Im Linienverfahren fährt die Maschine ein Bild zeilenweise ab. Helligkeitsinformationen werden dabei üblicherweise per Frästiefe übertragen. Damit ergeben z.B. besonders dunkle Bereiche breitere Schnitte, welche dann im Schatten liegen. Dieses Verfahren eignet sich prima bei Fräsungen in Schaumstoffen, MDF und Acrylglas. Sie lassen sich außerdem recht zügig durchführen, da die Maschine im Materialeingriff bleibt und lediglich für Zeilensprünge Positioniervorgänge erforderlich sind.&lt;/p&gt;&#10;&lt;h3 id="punktverfahren"&gt;Punktverfahren&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-01-27-bloglogo_stipple.avif" alt="Image: bloglogo made of 2000 Vonoroi stipples" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Hier wird die Größe von Punkten verändert, sodass mal größere und mal kleinere Vertiefungen im Material entstehen.&lt;/p&gt;&#10;&lt;p&gt;Halbtonbilder im Punktverfahren benötigen verhältnismäßig viel Zeit auf der Maschine. Was mit einem Hobbylaser in einer halben Stunde vonstatten gehen kann, dauert mit einer CNC-Maschine bei gleicher Größe und Auflösung locker mal zwei Stunden (auch hier gibt es &lt;a href="https://blog.schallbert.de/cnc-tuning-kinematics/"&gt;Optimierungsmöglichkeiten&lt;/a&gt;).&lt;/p&gt;&#10;&lt;p&gt;Zur Fertigung solcher Bilder muss die Maschine extrem oft die Z-Achse bewegen. Beim Fräsen von Punkten muss sie für jeden &amp;ldquo;Pixel&amp;rdquo; einmal zwischen Sicherheitshöhe und Materialeingriff wechseln.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Beispiel: Werden &lt;code&gt;400x400&lt;/code&gt; Punkte gefräst (Das wäre im Pixelmaßstab ein ziemlich mies aufgelöstes Bild), so muss die Maschine &lt;code&gt;32000x&lt;/code&gt; ihre Z-Achse in Gang setzen!&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Daher sollte die Sicherheitshöhe nur ein paar Zehntel über der Werkstückoberfläche liegen, z.B. &lt;code&gt;0.5mm&lt;/code&gt;. Um die schwere Y-Achse zu schonen, macht es Sinn, das Bild per &lt;em&gt;CAM&lt;/em&gt; zeilenweise auf der X-Achse abzuarbeiten. So wird die Y-Achse nur für Zeilensprünge bewegt.&lt;/p&gt;&#10;&lt;p&gt;Vorteilhaft ist hier eine leichte Portalfräsmaschine mit wenig Masse auf der Z-Achse. Sie sollte gut geschmiert und die Achsführungen gereinigt sein. Gleichzeitig sollte sie nicht zu steif sein, damit sie sich nicht durch die vielen abrupten Bewegungen aufschwingt.&lt;/p&gt;&#10;&lt;p&gt;Für Schrittmotoren und -Treiber sind diese Jobs Marathonrennen. Ihre Temperaturen sollten stets gut im Auge behalten werden. Ich empfehle, die Maschine nicht mit Halbtonbildern im Dauerbetrieb zu fahren. Die Achs- und Portalbelastungen hingegen sind vernachlässigbar: Die Maschine ist kaum Last in X- und Y-Richtung ausgesetzt, da sie zumeist nach unten im Materialeingriff steht und dies auch nur minimal zum Erzeugen kegelförmiger Vertiefungen.&lt;/p&gt;&#10;&lt;h3 id="labyrinthliniensegmente"&gt;Labyrinth/Liniensegmente&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-01-27-bloglogo_tsp.avif" alt="Image: TSP-paths my bloglogo connecting 9600 Vonoroi stipples" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Soll das gesamte Bild in nur einem Zug abgefahren werden, so muss erst ein &amp;ldquo;Problem des Handlungsreisenden&amp;rdquo; (&lt;a href="https://en.wikipedia.org/wiki/Travelling_salesman_problem" target="_blank" rel="noopener noreferrer" class="external-link"&gt;TSP&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;) gelöst werden, wie es zum Beispiel die von &lt;a href="https://www.evilmadscientist.com/2012/stipplegen-weighted-voronoi-stippling-and-tsp-paths-in-processing/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;EvilMadScientist&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; vorgestellte Software &lt;em&gt;Stipplegen2&lt;/em&gt; vermag. Bei diesem Verfahren wird die Dichte der Liniensegmente pro Flächeneinheit erhöht, wenn ein Bereich besonders dunkel erscheinen soll. Auf der CNC-Maschine sind solche Bilder recht zügig fertiggestellt, da sie die Z-Achse nur einmal eintauchen lassen.&lt;/p&gt;&#10;&lt;p&gt;Nachteilig bei diesem Verfahren sind die geringe erreichbare Auflösung (Es werden sehr viele Punkte benötigt) und der geringe Kontrast, denn alle Linien sind gleich dick.&lt;/p&gt;&#10;&lt;h2 id="cnc-werkzeuge"&gt;CNC-Werkzeuge&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-01-27-graver.avif" alt="Image: This CNC graver is a good tool for halftone image fabrication" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Die Erzeugung von Halbtonbildern sind Gravurarbeiten. Daher empfiehlt sich die Verwendung von Gravierfräsern mit &lt;code&gt;60°&lt;/code&gt; oder &lt;code&gt;90°&lt;/code&gt; Spitzenwinkel sowie einer Abflachung von &lt;code&gt;0-0.5mm&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Ist das Motiv klein, so sollte gar keine Abflachung verwendet werden. Der Spitzenwinkel sollte groß sein, wenn nicht tief gefräst werden soll oder kann oder falls die &amp;ldquo;helle Farbe&amp;rdquo; die Kernfarbe des Materials ist. So werden tiefe Schatten vermieden, die das Bild zusätzlich abdunkeln.&lt;/p&gt;&#10;&lt;p&gt;Wird lackierte Aluminium-Verbundplatte bearbeitet, so kann ich Halbrundfräser mit &lt;code&gt;r&amp;lt;2mm&lt;/code&gt; bei sehr geringer Eintauchtiefe von maximal &lt;code&gt;0.18mm&lt;/code&gt; empfehlen. Hierbei wird allerdings vorausgesetzt, dass das Maschinenbett überplant und damit sehr eben ausgerichtet ist.&lt;/p&gt;&#10;&lt;h2 id="herstellung"&gt;Herstellung&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-01-27-bloglogo_tsp_machined.avif" alt="Image: TSP-paths on aluminium sandwich" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Bild: Versuch, mein Bloglogo als TSP-Pfad mit 9600 Kanten auf schwarz lackiertes Aluminiumverbundmaterial zu gravieren. Verwendet habe ich einen &lt;code&gt;1/8&amp;quot; 36°-Stichel mit 0.1mm Abflachung&lt;/code&gt;. Am unteren Bildrand ist zu erkennen, dass das Material etwas tiefer liegt und daher nicht mehr vom Stichel erreicht werden kann.&lt;/p&gt;&#10;&lt;h3 id="bildvorbereitung"&gt;Bildvorbereitung&lt;/h3&gt;&#10;&lt;p&gt;Das Bild sollte eine hohe Auflösung besitzen und in Graustufen vorliegen. Idealerweise besitzt es hohe Kontraste und nutzt das gesamte Grautonspektrum.&lt;/p&gt;&#10;&lt;p&gt;Nun wird das Bild entweder in ein CAM-Tool geladen, welche die Anfertigung von Halbtonbildern unterstützt - z.B. von &lt;a href="https://gadgets.vectric.com/v8/halftoner" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Vectric&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, Estlcam - oder aber in ein Bearbeitungswerkzeug, welches Punktewolken oder Pfade erzeugen kann, z.B. &lt;a href="https://www.evilmadscientist.com/2012/stipplegen2/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Stipplegen2&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; oder Inkscape.&lt;/p&gt;&#10;&lt;p&gt;Dort probiere ich stets ein paar verschiedene Einstellungen durch in Abhängigkeit vom verwendeten Material, dem gewünschten Fräser und der Bildwirkung. Oft sieht man bereits dort, ob das Foto wirken kann und erlaubt eine Einschätzung, ob die Auflösung für das verwendete Material geeignet ist.&lt;/p&gt;&#10;&lt;h3 id="wie-man-zu-guten-ergebnissen-kommt"&gt;Wie man zu guten Ergebnissen kommt&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Große Abmessungen bevorzugen: Je größer das Bild gewählt wird, desto weniger fallen Materialinhomogenitäten und ausgebrochene Bereiche auf.&lt;/li&gt;&#10;&lt;li&gt;Große Beobachtungsdistanz ermöglichen: Je weiter das Bild vom Betrachter entfernt positioniert wird, desto schärfer wird die Auflösung wahrgenommen. Bevor es dann irgendwann zu klein erscheint 😆&lt;/li&gt;&#10;&lt;li&gt;Lichteinfallwinkel berücksichtigen: Hat das Material Seidenglanz, metallischen Glanz oder ist sogar hochglänzend, so hängt die Abbildungsqualität sehr vom Blickwinkel und der Distanz zur Lichtquelle ab. Je glänzender das Material, desto kleiner wird der Bereich, in dem die Abbildung gut zu erkennen ist.&lt;/li&gt;&#10;&lt;li&gt;Homogene, nicht schmierende Materialien verwenden. Ich habe mit Acrylglas die besten Ergebnisse erzielen können.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="cnc-durchlauf"&gt;CNC-Durchlauf&lt;/h3&gt;&#10;&lt;p&gt;Hier ist vor allem eines mitzubringen: Zeit. Im Folgenden ein paar Videoausschnitte meiner Versuche (Zeitraffer).&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/n7CnjF5CUn1sidg6mxYhvL" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Graustufenbilder mit der CNC fertigen: Teil1&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;div class="footnotes" role="doc-endnotes"&gt;&#10;&lt;hr&gt;&#10;&lt;ol&gt;&#10;&lt;li id="fn:1"&gt;&#10;&lt;p&gt;Ausnahmen bestätigen die Regel. Natürlich gibt es sowohl bei Bildschirmen als auch bei Druckern Ausführungen, welche dieses Problem umgehen: Sie setzen etwa zusätzliche Subpixel mit zusätzlichen Farben ein und können so größere Farbräume abdecken oder - wie im Tiefdruck (Magazine, Verpackungen etc.) üblich - verwenden eine höhere Anzahl Farben beziehungsweise Farbmischungen, deren Tonwerte näher an den benötigten Halbtönen liegen.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Mehrfarbige Gravuren</title><link>https://blog.schallbert.de/engrave-multicolor/</link><pubDate>Mon, 30 Dec 2024 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/engrave-multicolor/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-12-30-multicolorengrave-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: multicolored sign &amp;#39;&amp;#39;Helft Waldbraende verhueten&amp;#39;&amp;#39;"&#10; title="Mehrfarbige Gravuren" /&gt;&#10;&lt;h2 id="die-projektidee"&gt;Die Projektidee&lt;/h2&gt;&#10;&lt;p&gt;Vor ein paar Wochen war ich im Wald unterwegs. Dort sah ich ein wunderschönes, altes Schild mit dem Aufdruck &amp;ldquo;Helft Waldbrände verhüten&amp;rdquo;. Ein Zeichenstil wie in Tinte aus vergangenen Zeiten. Kurzerhand fotografierte ich es.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-12-30_waldbrand-original.jpg" alt="Image: An old *Waldbrände verhüten* sign" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Leider ist das Schild ziemlich verblichen und wirkt als Foto wenig plastisch. Daher beschloss ich, mit etwas Zeitaufwand aber ohne große Kosten mit Hilfe meiner CNC-Gravurmaschine eine dreidimensionale Kopie des Schildes anzufertigen.&lt;/p&gt;&#10;&lt;h2 id="vom-jpg-nach-svg"&gt;Vom &lt;code&gt;.jpg&lt;/code&gt; nach &lt;code&gt;.svg&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;Bevor ich einen Job für die CNC erstellen kann, muss ich das Bild aufbereiten und in Vektorform bringen. Mein CAM-Programm kann mit Pixelgrafiken nämlich wenig anfangen. Ich möchte das Bild gern als &amp;ldquo;Carve&amp;rdquo; erstellen, also mit einem spitzen Gravierfräser diejenigen Bildbereiche schnitzen, die später farbig erscheinen sollen. Hierfür benötige ich zudem eine Farbtontrennung, da das Bild auch in der gefrästen Fassung später weiße, rote und schwarze Anteile haben soll.&lt;/p&gt;&#10;&lt;h3 id="bildaufbereitung"&gt;Bildaufbereitung&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-12-30_waldbrand-cleaned.jpg" alt="Image: Preparing the image for trace operation" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Hierfür nutze ich gängige Bildbearbeitungsprogramme wie &lt;a href="https://www.gimp.org/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;gimp&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und &lt;a href="https://www.getpaint.net/index.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;paint.net&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Ich verwende das &lt;em&gt;curves&lt;/em&gt;-Werkzeug, um den Kontrast zu erhöhen, richte die Perspektive mittels 3D-Drehung gerade und hole mir anschließend mit dem &lt;em&gt;Zuschneiden&lt;/em&gt;-Werkzeug den gewünschten Bildausschnitt. Anschließend radiere ich Bilddefekte, Schmutz oder durch die Kontrasterhöhung entstandene Artefakte weg. Zum Schluss noch ein wenig Schärfe hineindrehen und eine Tontrennung vornehmen, sodass ich keine Rottöne oder Graustufen, sondern reine Farben erhalte.&lt;/p&gt;&#10;&lt;p&gt;Nun exportiere ich das Bild als &lt;code&gt;.jpg&lt;/code&gt; und importiere es in &lt;a href="https://inkscape.org/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Inkscape&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="pfadkonversion"&gt;Pfadkonversion&lt;/h3&gt;&#10;&lt;p&gt;Hier skaliere ich das Bild zuerst, sodass es auf eine A4-Seite passt. Außerdem erstelle ich ganz unten links im Bild ein &lt;code&gt;1mm x 1mm&lt;/code&gt; kleines Quadrat, was mir für die beiden Farbschichtbilder später im CAM als Nullpunkt dienen soll, selbst aber nicht gefräst wird.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-12-30_waldbrand-trace.jpg" alt="Image: tracer in Inkscape" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Wie bereits in einem früheren &lt;a href="https://blog.schallbert.de/path-from-image/#inkscape"&gt;Artikel zur Pfadkonversion&lt;/a&gt; beschrieben, nutze ich die Trace-Funktion und kann so die roten und schwarzen Bereiche mittels unterschiedlicher Helligkeitsgrenzwerte in je eigene Layers freistellen. Die &amp;ldquo;rote&amp;rdquo; Layer enthält erst einmal auch die schwarzen Bildbereiche. Ich kann jedoch Layers voneinander subtrahieren, sodass nach dieser Aktion nur noch die roten Bildanteile übrig bleiben.&lt;/p&gt;&#10;&lt;p&gt;Anschließend lasse ich die Pfade noch vereinfachen und entferne fälschlicherweise erstellte Pfadartefakte. Ich exportiere die &amp;ldquo;rote&amp;rdquo; und die &amp;ldquo;schwarze&amp;rdquo; Layer jeweils als &lt;code&gt;.svg&lt;/code&gt;-Datei.&lt;/p&gt;&#10;&lt;h2 id="pfadplanung-im-cam"&gt;Pfadplanung im CAM&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-12-30-feuertrace.jpg" alt="Image: *red* areas to be cut" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Im CAM muss ich zwei Jobs planen - je einen für jede Farbe. Die unbearbeiteten Bildbereiche sollen weiß erscheinen. Die Gravur des ersten Jobs wird mit roter Farbe ausgelegt werden, und die zweite Gravur soll später tiefschwarz erscheinen.&lt;/p&gt;&#10;&lt;p&gt;Ich importiere also zuerst die &amp;ldquo;rote&amp;rdquo; SVG-Datei, wähle die für DIN A4 passende Skalierung, setze den Nullpunkt unten links und mache mich anschließend an die Erstellung der Carve-Pfade.&lt;/p&gt;&#10;&lt;h3 id="job1-rote-bereiche"&gt;Job1: &amp;ldquo;rote&amp;rdquo; Bereiche&lt;/h3&gt;&#10;&lt;p&gt;Ich setze eine Tiefenbegrenzung von &lt;code&gt;2mm&lt;/code&gt; und wähle für die Gravur einen &lt;code&gt;6mm 90°&lt;/code&gt; Stichel mit einer Schneide und &lt;code&gt;0.5mm&lt;/code&gt; Abflachung an der Spitze. Für die Räumarbeiten größerer gravierter Bereiche suche ich einen &lt;code&gt;3mm&lt;/code&gt; Zweischneider für Holz heraus und fräse mit &lt;code&gt;60%&lt;/code&gt; seitlicher Zustellung. Die Drehzahl stelle ich für beide Fräser bei &lt;code&gt;24000U/min&lt;/code&gt;, den Vorschub auf &lt;code&gt;3000mm/min&lt;/code&gt; ein.&lt;/p&gt;&#10;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-12-30-waldtrace.jpg" alt="Image: *black* areas to be cut" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="job2-schwarze-bereiche"&gt;Job2: &amp;ldquo;schwarze&amp;rdquo; Bereiche&lt;/h3&gt;&#10;&lt;p&gt;Bei den schwarzen Bereichen erlaube ich für Job2 eine höhere Tiefenzustellung von &lt;code&gt;2.8mm&lt;/code&gt; und spare mir den Räumfräser, da hier weniger zusammenhängende Flächen abgenommen werden müssen. Durch die größere Tiefe soll das Schwarz noch dunkler und das Motiv plastischer wirken.&lt;/p&gt;&#10;&lt;h2 id="durchführung"&gt;Durchführung&lt;/h2&gt;&#10;&lt;p&gt;Für das Projekt nehme ich eine schwarz durchgefärbte Faserplatte (MDF) zur Hand. Mit weißem Acryllack streiche ich sie mehrfach an, bis ich eine homogene und gut deckende Oberfläche habe. Nachdem alles getrocknet ist, bringe ich eine selbstklebende Folie auf. Profis nehmen Schablonenfolien (Maskierfolien) z.B. von Orafol, ich behelfe mir jedoch mit einer viel einfacheren Einschlagfolie für Bücher. Nicht perfekt, da ihre Haftung für kleine Flächen nicht ausreicht - aber gut genug für mich.&lt;/p&gt;&#10;&lt;h3 id="rote-flammen"&gt;Rote Flammen&lt;/h3&gt;&#10;&lt;p&gt;Nun lasse ich den ersten Job auf der Fräse durchlaufen. Dafür klebe ich das Werkstück mit Doppelklebeband im Arbeitsbereich der Fräse fest und richte sie ordentlich aus, sodass der Nullpunkt einfach gesetzt werden kann.&lt;/p&gt;&#10;&lt;p&gt;Sobald die Fräse durchgelaufen ist, setze ich Schrauben in die T-Nuten des Grundplatte an den Rändern des Werkstücks. So kann ich es nachher wiederholgenau positionieren. Anschließend löse ich es vom Maschinenbett, reinige es mit Bürste und Pinsel und bringe rote Sprühfarbe auf. Dummerweise zieht diese sofort in das MDF ein (siehe Video unten). Die Flammen bleiben somit schwarz. Ich probiere es erneut, wieder ohne Erfolg. Also muss ich nochmal ins Geschäft und einen viel viskoseren Lack zum Aufbringen per Pinsel kaufen.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Soll MDF lackiert werden, eignet sich Sprühfarbe wegen ihrer geringen Viskosität nicht: Sie zieht ein und hinterlässt kaum Pigmente auf der Oberfläche.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Nachdem ich auch hier wieder gewartet habe bis die ausgelegten Flammen getrocknet sind, montiere ich das Werkstück erneut auf dem Maschinenbett.&lt;/p&gt;&#10;&lt;h3 id="schwarze-tannen"&gt;Schwarze Tannen&lt;/h3&gt;&#10;&lt;p&gt;Nun lasse ich den zweiten Job durchlaufen. Dies geht trotz Verzicht auf den Räumfräser bedeutend schneller, da der Werkzeugwechsel entfällt.&lt;/p&gt;&#10;&lt;p&gt;Anschließend ziehe ich die Schutzfolie vom Werkstück ab und reinige es gründlich.&#10;Wie schön das Schild geworden ist!&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-12-30-multicolorengrave.jpg" alt="Image: carving complete: My copy of *Waldbrände verhüten*." /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="video-der-3d-gravur"&gt;Video der 3D-Gravur&lt;/h2&gt;&#10;&lt;p&gt;Zu diesem Projekt gibt es mal wieder ein Zeitraffer-Video, bereitgestellt auf meinem PeerTube-Kanal.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/briT2e8qbbY6uWFFmv688n" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;multicolorEngrave&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="was-noch-besser-werden-könnte"&gt;Was noch besser werden könnte&lt;/h2&gt;&#10;&lt;p&gt;Im Nachhinein betrachtet gibt es bei meinen Projekten oft Dinge, die noch besser gemacht werden können. Wenn ich so auf das Video gucke, fallen mir zwei Sachen auf:&lt;/p&gt;&#10;&lt;h3 id="1-pfadqualität-bestimmt-fräsqualität"&gt;1. Pfadqualität bestimmt Fräsqualität&lt;/h3&gt;&#10;&lt;p&gt;Ich wollte möglichst schnell zum Ergebnis kommen und habe daher bei der Umwandlung vom Pixelbild zur Vektorgrafik nicht alle Pfadartefakte ausgeräumt. Diese äußern sich am fertigen Produkt als kleine Inseln und Punkte, die weniger tief gefräst wurden als der Rest. Am besten ist dies in den roten Bildbereichen zu erkennen. In Natura fällt das kaum auf. Im Video erkennt man aber, dass Fräse zum Ausarbeiten dieser Stellen zusätzliche Zeit benötigt.&lt;/p&gt;&#10;&lt;h3 id="2-cam-strategie-kostet-zeit"&gt;2. CAM-Strategie kostet Zeit&lt;/h3&gt;&#10;&lt;p&gt;Mein Programm für die Fräsplanung läuft Fräspfade für Räumung, Umrisse und Ausspitzungen von oben nach unten jeweils zeilenweise ab. Dies hat zur Konsequenz, dass unglaublich viele Positioniervorgänge für nicht zusammenhängende Pfade erforderlich werden. Zudem wird jeder Punkt im ungünstigsten Falle drei mal angefahren.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;G00&lt;/code&gt;-Kommandos sind hier schlecht, weil sie eine Menge Zeit kosten und die Maschine unnötige Wege verfährt. Dieses Problem ließe sich nur mit einem professionellerem CAM-Werkzeug beheben.&lt;/p&gt;&#10;</description></item><item><title>Vakuumspannen</title><link>https://blog.schallbert.de/vacuum-clamping/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/vacuum-clamping/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-cuttingforces-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Thumbnail of endmill cutting forces"&#10; title="Vakuumspannen" /&gt;&#10;&lt;p&gt;Wie ich im &lt;a href="https://blog.schallbert.de/makerfaire-ruhr/#verz%c3%b6gerungen"&gt;Artikel zur Maker Faire Ruhr 2024 erwähnte&lt;/a&gt;, hatte ich große Probleme beim Spannen meiner Werkstücke für die Fertigung von Spirographen.&lt;/p&gt;&#10;&lt;p&gt;In diesem Beitrag möchte ich genauer darauf eingehen, eine Analyse der Ursachen vornehmen und schließlich ein paar Lösungsmöglichkeiten vorstellen.&lt;/p&gt;&#10;&lt;p&gt;Was ich vorwegnehmen kann: Sämtliche Probleme lassen sich mit Wissen über die Ursachen sowie etwas Zeit-, Planungs- und Materialaufwand beheben.&lt;/p&gt;&#10;&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;&#10;&lt;p&gt;Ich hatte wie üblich die Bahnplanung für die Spirographen so festgelegt, dass ich erst die inneren Bereiche (Taschen, Teile, Bohrungen) und danach die äußeren Bereiche fräsen lasse. Ganz zum Schluss sollten Ausschnitte und Fasen gefertigt werden. Des Weiteren sah ich vor, die Teile doppelseitig zu bearbeiten, damit auch die Rückseiten der Zahnräder gebrochene Kanten und weiche Übergänge aufweisen würden.&lt;/p&gt;&#10;&lt;h3 id="vakuumverlust"&gt;Vakuumverlust&lt;/h3&gt;&#10;&lt;p&gt;Bei meinem ersten Versuch bin ich so vorgegangen wie ich das im &lt;a href="https://blog.schallbert.de/projects/spirograph/"&gt;Spirographen-Projekt&lt;/a&gt; mit dem Material Acrylglas bereits erfolgreich durchführen konnte: Die Rückseite wird zuerst bearbeitet, aber nicht ganz durchgefräst. Nach dem Wenden des Werkstückes dann soll nur noch mit dem Fasenfräser ausgeschnitten und gleichzeitig die Kanten gebrochen werden.&lt;/p&gt;&#10;&lt;p&gt;Dies funktionierte für die erste Aufspannung auch hervorragend.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2024-04-02-spiro-back.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Rückseitige Bearbeitung der Spirographen.&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Bei der zweiten jedoch ging mit dem Durchstoßen der Oberfläche so viel Unterdruck verloren, dass sich das Material vom Vakuumtisch löste und seine ursprüngliche, leichte Wölbung annahm. Somit musste ich den Fräsvorgang abbrechen und mir eine andere Strategie zum Niederhalten überlegen.&lt;/p&gt;&#10;&lt;p&gt;Ich konnte mir zu diesem Zeitpunkt noch nicht richtig erklären, warum jetzt so viel mehr Druck verloren ging als bei der Fertigung in Acrylglas.&lt;/p&gt;&#10;&lt;h3 id="frischhaltefolie"&gt;Frischhaltefolie&lt;/h3&gt;&#10;&lt;p&gt;Ich probierte mit Frischhaltefolie dem Druckverlust entgegenzuwirken. Dabei stellten sich gleich mehrere Folgeschwierigkeiten: Fährt der Fräser durch die Folie, so wird sie beim Fräsen geschlossener Konturen vom Fräser erfasst und in Windeseile um selbigen gewickelt. Der Fräser schneidet nun nicht mehr, sondern reibt nur noch am Material, was sehr schnell zu Hitzespuren am Holz führt.&lt;/p&gt;&#10;&lt;p&gt;Doch selbst wenn ich die Frischhaltefolie vorab befestige: Da ich Teile ausschneide, ist beim ersten Eindringen in die auf der Unterseite bereits vorhandene Nut der &lt;em&gt;lokale Unterdruck&lt;/em&gt; am Teil bereits wieder so klein, dass es sich kaum an Ort und Stelle halten lässt.&lt;/p&gt;&#10;&lt;h3 id="verdrehung-des-werkstücks"&gt;Verdrehung des Werkstücks&lt;/h3&gt;&#10;&lt;p&gt;Für den zweiten Versuch passte ich die Strategie an: Der Schaftfräser würde das Werkstück durchfräsen, so dass ich keine zweite Aufspannung benötigte. Ich wollte die Kantenbrechung auf der Rückseite später optional über eine auf dem Tisch festgespannte Halterung realisieren, in die ich die Teile würde einlegen können.&lt;/p&gt;&#10;&lt;p&gt;Während das Ausschneiden der Teile noch problemlos funktionierte (erneut die &amp;ldquo;inneren&amp;rdquo; Teile zuerst fräsen), so bekam ich beim Anbringen der Fase bereits auf der Vorderseite große Probleme. Die Zahnräder begannen, sich zu verdrehen und die Schablone mit Hohlrad war überhaupt nicht niederzuhalten.&lt;/p&gt;&#10;&lt;h3 id="zu-wenig-zeit"&gt;Zu wenig Zeit&lt;/h3&gt;&#10;&lt;p&gt;Ich musste also schon bei der Bearbeitung der Vorderseite auf speziell für die Werkstücke angefertigte Halterungen zurückgreifen. Deren Konstruktion und Fertigung nahm Zeit in Anspruch die ich an dieser Stelle so nicht eingeplant hatte.&lt;/p&gt;&#10;&lt;p&gt;Vor der Messe konnte ich mich nicht in der Tiefe mit der Analyse beschäftigen - eine schnelle Lösung musste her.&lt;/p&gt;&#10;&lt;h2 id="die-ursachen"&gt;Die Ursachen&lt;/h2&gt;&#10;&lt;p&gt;Mit ein paar Wochen Abstand kann nun ich sagen, dass mehrere Faktoren zu den Problemen führten. So kommen eine schwierige Geometrie, ungünstige Materialeigenschaften und bestimmte Eigenheiten des Vakuumtischdesigns zusammen. Aber gehen wir dem Ganzen hier mal auf den Grund.&lt;/p&gt;&#10;&lt;h3 id="werkstück"&gt;Werkstück&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-rawmaterial.jpg" alt="Image: Veneered MDF raw material" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Das Ausgangsmaterial ist mitteldichte Faserplatte von &lt;code&gt;10mm&lt;/code&gt; Stärke. Sie ist einseitig mit &lt;code&gt;0.75mm&lt;/code&gt; starkem Olivenholzfurnier versehen. Dieses Material ist für die Bearbeitung auf einem Vakuumtisch bereits von Grund auf problematisch:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Durch Furnierung und Lagerung sind die Platten leicht gewölbt&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, wollen sich also von meinem Vakuumtisch abheben.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;MDF ist luftdurchlässig, sodass die Vakuumpumpe mit größeren Leckageströmen zu tun hat als üblicherweise (so bekomme ich bei Aufspannung der Platte nur &lt;code&gt;-300mBar&lt;/code&gt; zusammen statt der üblichen &lt;code&gt;-800mBar&lt;/code&gt; ohne Leckströme). Die geringe Materialdicke verstärkt diesen Effekt.&lt;/li&gt;&#10;&lt;li&gt;MDF ist nicht nur senkrecht zur Plattenebene luftdurchlässig, sondern auch waagerecht. Dadurch sind die Haltekräfte in der Nähe von Fräsungen stark reduziert, denn Luft kann nun auch seitlich in das Material eindringen und erhöht so zusätzlich die Leckageströme.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Das hier verlinkte Video &lt;a href="https://www.youtube.com/watch?v=osJik4XjZTY" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Youtube: Verschiebekraftmessungen von &lt;em&gt;Anton CNC&lt;/em&gt;&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zeigt anschaulich, wie sich verschiedene Materialien auf einem Vakuumtisch mit poröser Oberfläche verhalten. Ebenfalls sehr empfehlenswert zum Thema ist dieses Video &lt;a href="https://www.youtube.com/watch?v=jk7Clrvtlmo" target="_blank" rel="noopener noreferrer" class="external-link"&gt;YouTube: Haltekraftermittlung während des Zerspanens von &lt;em&gt;vakuumtischDE&lt;/em&gt;&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; um einen Eindruck zu gewinnen, unter welcher Belastung das Werkstück während des Fräsvorganges stehen kann.&lt;/p&gt;&#10;&lt;h3 id="geometrie"&gt;Geometrie&lt;/h3&gt;&#10;&lt;p&gt;Mein Design für die Spirographen lässt sich nicht besonders gut niederhalten:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die Schablone mit Hohlrad besitzt dünne Wände von nur etwa &lt;code&gt;2cm&lt;/code&gt; Stärke. Am dicksten sind sie an den Seiten links und rechts, weisen in der Mitte aber eine große Aussparung auf, durch die Luft in alle Richtungen in das Material eindringen kann und so die Haltekräfte reduziert.&lt;/li&gt;&#10;&lt;li&gt;Das Zahnrad verfügt über Löcher zur Aufnahme von Stiften. Um die Löcher herum ist der Anpressdruck reduziert.&lt;/li&gt;&#10;&lt;li&gt;Die Zähne von Hohlrad und Zahnrad liegen so frei, dass sie durch Querströme der Luft im Material praktisch keinen Beitrag zur Haltekraft leisten können. Gleichzeitig bieten die Zahnköpfe aber einen großen Hebel für Verdrehung oder Verschiebung des Werkstücks: Eine ungünstige Paarung.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-spirograph-on-vacuum-table.jpg" alt="Image: Spirograph on vacuum table: hole grid overlay" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Nehme ich das als Grundlage für die Praxis, so sind nur die im Bild oben innerhalb des Kreises befindlichen Vakuumlöcher überhaupt in der Lage, nennenswerte Spannkräfte zu erzeugen. Diese sind aber wiederum nahe am Zentrum und bieten folglich nur wenig Widerstand gegen Verdrehen des Werkstücks. Hinzu kommt, dass das Zahnrad hier mehrere Bohrungen und damit zusätzliche &amp;ldquo;Lecks&amp;rdquo; aufweist.&lt;/p&gt;&#10;&lt;h3 id="fräskräfte"&gt;Fräskräfte&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-cuttingforces-z.jpg" alt="Image: Cutting forces XY" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Die durch das Werkzeug (den Fräser) in das Material eingebrachten Kräfte wirken stets in XY-Richtung, bei V-cut Fräsern und Schaftfräsern mit Spirale/Drall zusätzlich in Z-Richtung.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Kräfte durch Vorschub: Je schneller durch das Material gefahren wird, desto stärkere Kräfte in XY-Richtung wirken auf das Material in Verfahrrichtung.&lt;/li&gt;&#10;&lt;li&gt;Kräfte durch Fräserdrehung bzw. Gleich- oder Gegenlauf: Verwendet man einen Schaftfräser ohne Drall, so entstehen Kräfte orthogonal in der Ebene der Verfahrrichtung. Fahre ich also in positive X-Richtung, wird der Fräser auch in Y-Richtung eine Kraft ausüben, die durch seine Eigendrehung eingebracht wird: Im Gleichlauf möchte der Fräser dem Material ausweichen, wird also nach &lt;code&gt;Y+&lt;/code&gt; abgelenkt (wie &lt;a href="https://blog.schallbert.de/cnc-router-overload/"&gt;in diesem Artikel anschaulich gezeigt&lt;/a&gt;). Im Gegenlauf ist die Ablenkrichtung invers und der Fräser möchte nach &lt;code&gt;Y-&lt;/code&gt; ausweichen.&lt;/li&gt;&#10;&lt;li&gt;Kräfte durch Fräsergeometrie: Weist der Fräser eine Spirale auf oder ist er in der Geometrie abgeschrägt, so wirken zusätzlich Kräfte in Z-Richtung. Bei Vcut- und Downcut-Fräsern wird das Material auf das Maschinenbett gedrückt, bei Upcut-Spiralfräsern hingegen wird der Span wie gewünscht ausgeworfen. Das Werkstück erfährt aber auch eine Kraft, die es im Extremfall vom Maschinenbett abheben kann.&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-cuttingforces-xy.jpg" alt="Image: Cutting forces Z" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Wird in der Vollnut gefräst (d.h. der Fräser ist statt an der Werkstückkante entlang zu fahren über seinen kompletten Durchmesser im Eingriff), erhöhen sich die Kräfte quer zur Fräsrichtung sogar noch: Im Bild fährt er am oberen Rand der Nut im Gegenlauf, was den Fräser &amp;ldquo;vom Material weg&amp;rdquo;, im Bild also nach unten, drückt. Gleichzeitig fährt er am unteren Nutrand im Gleichlauf, was ihn &amp;ldquo;in das Material&amp;rdquo; zieht - ebenfalls nach unten.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="vakuumspannsystem"&gt;Vakuumspannsystem&lt;/h3&gt;&#10;&lt;p&gt;Wie in den Artikeln &lt;a href="https://blog.schallbert.de/cnc-vacuum-pumps/"&gt;über Vakuumpumpen&lt;/a&gt; und &lt;a href="https://blog.schallbert.de/why-vacuum-table/"&gt;Vakuumtische&lt;/a&gt; beschrieben, verfüge ich über eine trockenlaufende Drehschieberpumpe, angeschlossen an einen Lochrastervakuumtisch. Bei der Bearbeitung poröser Werkstoffe ist diese Kombination ebenso wie Rastervakuumtische mit kleinvolumigen Pumpen problematisch:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Mein Lochrastervakuumtisch besitzt Löcher mit einem Vakuumkanal von &lt;code&gt;0.5mm&lt;/code&gt; Durchmesser. Durch diese Engstelle wird die Pumpe zwar bei offenliegenden Löchern entlastet, denn sie muss nicht den vollen Luftstrom bringen, die das &lt;code&gt;5mm&lt;/code&gt; große Sackloch ermöglicht. Allerdings kann das Loch durch den begrenzten Luftstrom in Kombination mit MDF weniger Unterdruck aufbauen.&lt;/li&gt;&#10;&lt;li&gt;Durch die hohen Leckströme ist meine Vakuumpumpe mit ihrem Volumenstrom an ihrer Grenze. Hier sind andere Pumpentypen deutlich besser geeignet (siehe &lt;a href="https://blog.schallbert.de/cnc-vacuum-pumps/#radial-blower"&gt;Radialgebläse&lt;/a&gt;, &lt;a href="https://blog.schallbert.de/cnc-vacuum-pumps/#seitenkanalverdichter"&gt;Seitenkanalverdichter&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Ein Vakuumtisch spannt generell nur nach unten (in Z-Richtung). Allerdings müssen auch Kräfte in XY-Richtung abgefangen werden, damit es nicht zu einer Verschiebung oder Drehung des Werkstückes kommt. Diese sind über den &lt;a href="https://blog.schallbert.de/cnc-vacuum-pumps/#parallelverschiebung"&gt;Haftreibkoeffizienten µ&lt;/a&gt; zwar an den Unterdruck am Werkstück gekoppelt (und lässt sich über Materialpaarung und Oberflächenbeschaffenheit beeinflussen), wenn Letzterer aber zu niedrig ausfällt, wird das Werkstück nicht zuverlässig gehalten.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-vacuumtable-channels-porousmaterials.jpg" alt="Image: Air flow system of vacuum table and porous material" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Obwohl sich die Vakuumkanäle im &lt;code&gt;10mm&lt;/code&gt;-Raster befinden, beträgt der für den Leckstrom maßgebliche Abstand nur &lt;code&gt;5mm&lt;/code&gt;. Die Ränder der Sacklöcher (je &lt;code&gt;5mm&lt;/code&gt;Durchmesser) befinden sich nämlich in diesem Abstand zueinander, sodass der Luftstrom quer zum Material eine geringere Distanz zurücklegen muss als durch das Material hindurch.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="vergleich-zum-widerstandsnetzwerk"&gt;Vergleich zum Widerstandsnetzwerk&lt;/h4&gt;&#10;&lt;p&gt;Die tatsächliche Spannkraft lässt sich gut abschätzen wenn man sich Pumpe, Vakuumtisch und Werkstück als elektrisches Netzwerk vorstellt. Ich habe hierfür ein Modell vorbereitet und stelle es im Folgenden vor.&lt;/p&gt;&#10;&lt;h4 id="widerstände-vakuumtisch-werkstück"&gt;Widerstände: Vakuumtisch, Werkstück&lt;/h4&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-tableworkpiece.jpg" alt="Image: Vacuum table and workpiece" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Die Sauglöcher des Vakuumtisches stellen Widerstände für den Luftstrom dar, welche sich in einer Parallelschaltung befinden. In Reihe dazu ist das Werkstück erneut als Widerstand geschaltet, was mit seinem anderen Pol an &amp;ldquo;Masse&amp;rdquo;, also dem Umgebungsluftdruck, liegt.&lt;/p&gt;&#10;&lt;h4 id="vakuumverteiler--schalter-manometer--spannungsmesser"&gt;Vakuumverteiler = Schalter, Manometer = Spannungsmesser&lt;/h4&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-manoswitch.jpg" alt="Image: Vacuum manifold and Manometer" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Das Manometer im Saugkanal kann als Spannungsmessgerät gesehen werden. Den Vakuumverteiler mit seinen Ventilen zum Schalten der Vakuumsektionen sehe ich als elektrische Schalteinrichtung. Ist der Schalter geschlossen, so stellt er die Verbindung zwischen Pumpe und Vakuumtisch her. Ist er geöffnet, so blockiert er den Luftstrom.&lt;/p&gt;&#10;&lt;h4 id="vakuumpumpe--spannungsquelle"&gt;Vakuumpumpe = Spannungsquelle&lt;/h4&gt;&#10;&lt;p&gt;In diesem Bild stellt die Pumpe eine Spannungsquelle dar, die in meinem Falle maximal &lt;code&gt;U = 8V&lt;/code&gt; entsprechend &lt;code&gt;-800mBar&lt;/code&gt; bereitstellen kann. Durch den bei realen Spannungsquellen vorhandenen inneren Widerstand von &lt;code&gt;0.2Ohm&lt;/code&gt; kann sie einen Kurzschlussstrom von &lt;code&gt;I = 40A&lt;/code&gt; erzeugen, analog zu den &lt;code&gt;40m³/h&lt;/code&gt; Durchsatz. Dieser Vergleich ist physikalisch natürlich nicht korrekt, denn ich müsste hier mit Masse- statt Volumenströmen arbeiten. Außerdem hängt die Fördermenge nicht überall im Kennfeld linear mit dem Druck zusammen und die von mir angenommenen Widerstandswerte sind nur Richtgrößen. Zur Modellierung des Sachverhaltes eignet es sich meiner Meinung nach trotzdem.&lt;/p&gt;&#10;&lt;p&gt;Bei Werkstückmaterialien wie Acrylglas oder Metall ist der Luftdurchfluss nahe Null, ihr &amp;ldquo;Widerstand&amp;rdquo; ist also extrem hoch. Dadurch fällt hier der allergrößte Teil der Spannung (Unterdruck) ab, sodass das Werkstück fest gespannt wird.&lt;/p&gt;&#10;&lt;p&gt;Bei Verwendung luftdichter Materialien ist die Welt entsprechend in Ordnung: Das Manometer zeigt beim noch unbearbeiteten Werkstück den den Druck auf dem Material korrekt an an. Selbst bei Durchfräsungen wird lediglich der Widerstand des Materials &amp;ldquo;in Reihe&amp;rdquo; zu den betroffenen Sauglöchern zu Null gesetzt. So wird der Unterdruck und damit Haltekraft am Teil selbst kaum reduziert.&lt;/p&gt;&#10;&lt;p&gt;Schaut man genau hin, so ist zu erkennen, dass das Manometer die Druckdifferenz vor dem Vakuumverteiler misst. Sein Wert ist also nur dann auch aussagekräftig für die Spannkraft, wenn das Werkstück einen sehr hohen Durchströmungswiderstand bietet.&lt;/p&gt;&#10;&lt;h4 id="sonderfall-poröse-werkstoffe"&gt;Sonderfall poröse Werkstoffe&lt;/h4&gt;&#10;&lt;p&gt;Ganz anders sieht das Bild bei porösen Werkstoffen wie MDF aus:&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-porousmaterial-circuitdiagram.jpg" alt="Image: equivalent circuit diagram for porous material on a vacuum table" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Hier liegt der Durchgangswiderstand des Materials nur knapp eine Größenordnung über dem der Vakuumlöcher. Ich habe die Werte durch Versuche am Vakuumtisch ermittelt. Sie basieren auf Druckmessungen und Berechnungen von Werkstückfläche und der Anzahl vom Material abgedeckter, aktiver Sauglöcher. Besonders hervorzuheben sind hier zwei Effekte, die mir das Niederhalten zusätzlich schwer gemacht haben:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Augenmerk auf die Widerstände im Material in Parallelschaltung zum Durchgangswiderstand in &lt;code&gt;Z-Richtung&lt;/code&gt;. Sie entstehen dadurch, dass die Luft sich nun auch &amp;ldquo;zwischen den Löchern&amp;rdquo; durch das Material bewegen kann.&lt;/li&gt;&#10;&lt;li&gt;Auf der rechten Seite des Bildes ist zu erkennen, was passiert, wenn das Werkstück in einen inaktiven Vakuumbereich hineinragt: Die Sauglöcher sind untereinander praktisch ohne Widerstand mittels Vakuumkanälen im Tisch verbunden. Da das Werkstück &amp;ldquo;Querluftzug&amp;rdquo; in &lt;code&gt;XY-Richtung&lt;/code&gt; ermöglicht, muss durch Verbindung der Sauglöcher deutlich weniger Widerstand überwunden werden, als für die Durchdringung in &lt;code&gt;Z&lt;/code&gt;. Hierdurch liegen nur noch &lt;code&gt;R29&lt;/code&gt; und &lt;code&gt;R22||R21&lt;/code&gt; in Reihe. Überdeckt das Werkstück mehrere inaktive Lochfelder, geht &lt;code&gt;R22&lt;/code&gt; gegen 0.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;In der Folge werden die Widerstände vor &lt;code&gt;R19&lt;/code&gt;, nämlich &lt;code&gt;R18||(R29+(R21||R22))&lt;/code&gt; so klein, dass die Pumpe hier praktisch nur noch Umgebungsluft zieht und an der Stelle kaum Spannkraft aufbringen kann. Über &lt;code&gt;R25&lt;/code&gt; wirkt sich der Querluftstrom außerdem auf den Druckabfall von &lt;code&gt;R17, R15&lt;/code&gt; aus.&lt;/p&gt;&#10;&lt;p&gt;Jetzt wirken die kleinen Sauglöcher als Spannungsteiler, sodass an ihnen ein nicht unerheblicher Teil des Unterdrucks &amp;ldquo;hängen&amp;rdquo; bleibt.&lt;/p&gt;&#10;&lt;p&gt;Also stimmt auch der auf dem Manometer angezeigte Druck überhaupt nicht mehr mit den Gegebenheiten am Werkstück überein: Obwohl ich hier noch immer &lt;code&gt;-200mBar&lt;/code&gt; angezeigt bekomme, reduziert sich die Spannkraft genau an den für das Niederhalten empfindlichsten Stellen&lt;/p&gt;&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-resnetwork.jpg" alt="Image: Simplified equivalent circuit diagram for a vacuum clamping system" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;am Rand des Werkstücks&lt;/li&gt;&#10;&lt;li&gt;in angrenzenden Bereichen zu denen, wo das Werkstück nicht aktiv angesaugt wird&lt;/li&gt;&#10;&lt;li&gt;sowie an jeder Durchfräsung und einem gewissen Umkreis&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;auf nahe null.&lt;/p&gt;&#10;&lt;p&gt;Für alle anderen Bereiche gelten die &lt;a href="https://en.wikipedia.org/wiki/Kirchhoff%27s_circuit_laws" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Kirchhoff&amp;rsquo;schen Gesetze&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;: Gebildet wird ein Spannungsteiler bestehend aus Innenwiderstand der Pumpe, Vakuumsystem sowie dem Durchdringungswiderstand des Werkstücks. Nur die noch am Werkstück abfallende Spannung bestimmt die Niederhaltekraft. Sie ist - ich wiederhole mich jetzt - unter Umständen &lt;em&gt;viel geringer&lt;/em&gt; als der Blick auf das Manometer vermuten lässt.&lt;/p&gt;&#10;&lt;h2 id="lösungen"&gt;Lösungen&lt;/h2&gt;&#10;&lt;p&gt;Ganz schön viel Theorie für die banale Erkenntnis, dass mir das Werkstück auf dem Maschinenbett verdreht wird, oder? Folgende Lösungen habe ich für ein solches Problem im Köcher:&lt;/p&gt;&#10;&lt;h3 id="pumpe--vakuumtisch"&gt;Pumpe / Vakuumtisch&lt;/h3&gt;&#10;&lt;p&gt;Bei der Arbeit mit porösen Werkstoffen ist es wichtig, dass der Tisch selbst einen geringen Durchströmungswiderstand aufweist. Nur so fällt der Großteil des Unterdrucks am Werkstück ab, was zu höherer Spannkraft führt. Hier wäre nach dem Motto &amp;ldquo;viel hilft viel&amp;rdquo; also eine Pumpe mit mehr Durchsatz, ein Tisch mit größeren Saugöffnungen und ein Vakuumverteiler mit größeren Schlauchdurchmessern angemessen. Kommt für mich aber überhaupt nicht in Frage.&lt;/p&gt;&#10;&lt;h3 id="haftvermittler"&gt;Haftvermittler&lt;/h3&gt;&#10;&lt;p&gt;Ich könnte probieren, eine grobmaschigere Gummimatte zu verwenden. Mit einem &lt;code&gt;20mm&lt;/code&gt; Lochraster etwa verdreifacht sich der Widerstand für den Querluftstrom, sodass Außenbereiche nicht mehr so stark vom Druckverlust betroffen sind. Zudem besitzt eine solche Matte mehr Gummifläche, was die Haftreibung erhöht.&lt;/p&gt;&#10;&lt;p&gt;Klebeband statt Frischhaltefolie auf der Materialoberfläche löst das Problem des Verfangens im Fräser und verschließt lokal die Poren des Werkstoffes, kann also die Haltekraft in kritischen Bereichen verbessern.&lt;/p&gt;&#10;&lt;p&gt;Natürlich können auch auf einem Vakuumtisch gängige Methoden wie die Aufbringung doppelseitigen Klebebandes oder das Festschrauben des Werkstückes angewandt werden. Mache ich aber nicht - denn dann müsste ich mir ja eingestehen, dass mein Vakuumtisch nicht für alle Fälle geeignet ist.&lt;/p&gt;&#10;&lt;h3 id="haltestege-spannvorrichtung"&gt;Haltestege, Spannvorrichtung&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-04-02-spirofixtures.jpg" alt="Image: Fixture for holding my gears in place" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Diese Lösung zielt darauf ab, Verdrehen und Verschieben des Werkstückes zu vermeiden. Der Vakuumtisch wird hier nur noch zum Niederhalten verwendet, während eine passend angefertigte Halterung Kräfte in &lt;code&gt;XY-Richtung&lt;/code&gt; aufnimmt. Im Bild sind Halterungen für die Schablone sowie das Zahnrad zu erkennen, die ebendiese Aufgabe erfüllen. Sie werden auf dem Maschinenbett befestigt und benötigen einen präzisen Nullpunkt, um die Kanten versatzfrei brechen zu können.&lt;/p&gt;&#10;&lt;p&gt;Ich verwende eine Spielpassung mit &lt;code&gt;0.1mm&lt;/code&gt; Luft zwischen den Komponenten. Ist das Spiel kleiner, benötige ich zu viel Kraft, den Rohling einzusetzen. Setze ich größere Werte an, lassen sich die Werkstücke zu stark verdrehen.&lt;/p&gt;&#10;&lt;p&gt;Mit dieser Variante kann ich verzogene Werkstücke geradeziehen, weiterhin sehr feine Gravuren anfertigen und gehe trotzdem sicher, dass mir nichts mehr verrutscht.&lt;/p&gt;&#10;&lt;p&gt;Nachteilig sind der Zeit- und Materialaufwand für Planung und Herstellung individueller Halterungen bzw. Schablonen.&lt;/p&gt;&#10;&lt;h3 id="modifikation-des-werkstückes"&gt;Modifikation des Werkstückes&lt;/h3&gt;&#10;&lt;p&gt;Dies liegt auf der Hand: Ich kann das Werkstück in seinen Eigenschaften so verändern, dass es undurchlässiger wird für Luft. So kann ich z.B. die Unterseite mit einer Folie bekleben und damit zusätzlich die Haftreibung verbessern.&lt;/p&gt;&#10;&lt;p&gt;Wer wie ich nicht so gerne Plastik verwendet: Ich habe herausgefunden, dass Backpapier / Frischhaltepapier aus ungebleichtem Zellstoff kaum Luft hindurch lässt. Demnächst probiere ich mal aus, Materialien damit zu bekleben bzw. von Durchfräsung betroffene Bereiche damit abzudecken statt mit Kunststofffolie.&lt;/p&gt;&#10;&lt;div class="footnotes" role="doc-endnotes"&gt;&#10;&lt;hr&gt;&#10;&lt;ol&gt;&#10;&lt;li id="fn:1"&gt;&#10;&lt;p&gt;Liegt ein solches Problem regelmäßig vor, sind Rastervakuumtische mit Dichtschnur eine hervorragende Lösung: Hier mittels einer linienförmigen Dichtung an den Außenkanten des Werkstückes gegen den Umgebungsluftdruck abgedichtet, sodass Werkstückkanten keine Chance bekommen, sich hochzuwölben. Bei meinem Lochrastertisch jedoch wirkt die gesamte Fläche der Gummimatte als Dichtung, sodass die Wölbung in Form einer Kontaktlinie auf der Matte vorliegt. Linien haben jedoch keinen Flächeninhalt, und nur durch jenen kann mein Tisch niederhalten. Dies ist übrigens auch der Grund, warum biegsame Materialien wie Folien so leicht vom Vakuumtisch abgezogen werden können.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Maker Faire Ruhr 2024</title><link>https://blog.schallbert.de/makerfaire-ruhr/</link><pubDate>Mon, 25 Mar 2024 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/makerfaire-ruhr/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-maker-faire-logo-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Maker Faire Ruhr Logo / Banner"&#10; title="Maker Faire Ruhr 2024" /&gt;&#10;&lt;h2 id="vorbereitung"&gt;Vorbereitung&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-maker-faire-logo.jpg" alt="Image: Maker Faire Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Seit Anfang Januar bereiten sich zwei meiner Freunde und ich auf die &lt;a href="https://www.makerfaire-ruhr.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Maker Fair Ruhr&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; in der &lt;a href="https://www.dasa-dortmund.de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;DASA Dortmund&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; vor. Im Zuge dessen habe ich Faserplatten furniert, Rohlinge für Gravuren ausgeschnitten, Tischdecken besorgt, PC-Gehäuse bearbeitet, Zahnräder gefräst, LED-Streifen programmiert, ein Standschild designt, eine CNC-Maschine eingerichtet, sie für den Gravurbetrieb optimiert und so weiter&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;Als der Termin dann nahte, wurde es dann doch knapp. Es geht schon eine Menge Zeit und Koordination in so eine Messevorbereitung.&lt;/p&gt;&#10;&lt;section class="hugo-gallery"&gt;&#10; &lt;div class="hugo-gallery__frame"&gt;&#10; &lt;div class="hugo-gallery__grid" role="list"&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-0" aria-label="Image: Vacuumpump and -table"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-vacuumpump.jpg" alt="Image: Vacuumpump and -table" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-1" aria-label="Image: CNC machine, ready to run."&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-hobbyline_readytorun.jpg" alt="Image: CNC machine, ready to run." class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-2" aria-label="Image: Signs for my projects that I&amp;#39;ll showcase."&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-standschilder.jpg" alt="Image: Signs for my projects that I&amp;#39;ll showcase." class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-3" aria-label="Image: Retrogaming sign for another booth"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-retrogaming_sign.jpg" alt="Image: Retrogaming sign for another booth" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-4" aria-label="Image: Beautiful scrap - residue piece of PMMA in form of a wave"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-pmma_wave.jpg" alt="Image: Beautiful scrap - residue piece of PMMA in form of a wave" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-5" aria-label="Image: The side panel of a midi-tower PC: now with a window"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-pcwindow_sea.jpg" alt="Image: The side panel of a midi-tower PC: now with a window" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-6" aria-label="Image: Schallbert&amp;#39;s booth on Maker Faire Ruhr 2024"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-DerStand.jpg" alt="Image: Schallbert&amp;#39;s booth on Maker Faire Ruhr 2024" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-7" aria-label="Image: 2000s-retro-PCs set up and ready to play."&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Gaming.jpg" alt="Image: 2000s-retro-PCs set up and ready to play." class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-8" aria-label="Image: CNC machine detail view"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-StandDetail.jpg" alt="Image: CNC machine detail view" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-9" aria-label="Image: Visitors on Saturday"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Besucher.jpg" alt="Image: Visitors on Saturday" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-10" aria-label="Image: Schallbert&amp;#39;s booth, rear view"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Backstage.jpg" alt="Image: Schallbert&amp;#39;s booth, rear view" class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;a class="hugo-gallery__thumb" href="#gallery-full-11" aria-label="Image: Many more visitors on Sunday."&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Menschenmenge.jpg" alt="Image: Many more visitors on Sunday." class="hugo-gallery__thumb-img" loading="lazy" /&gt;&#10; &lt;/a&gt;&lt;/div&gt;&lt;div class="hugo-gallery__caption"&gt;Impressionen von der Maker Faire Ruhr 2024.&lt;/div&gt;&lt;/div&gt;&#10;&lt;/section&gt;&#10;&#10; &lt;div class="hugo-gallery__full" aria-live="polite"&gt;&lt;figure id="gallery-full-0" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-vacuumpump.jpg" alt="Image: Vacuumpump and -table" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Hier wird der Vakuumtisch in Betrieb genommen und getestet.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-1" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-hobbyline_readytorun.jpg" alt="Image: CNC machine, ready to run." class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Die CNC-Maschine für die Messe. Fertig eingerichtet und betriebsbereit.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-2" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-standschilder.jpg" alt="Image: Signs for my projects that I&amp;#39;ll showcase." class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Selbstgefräster Schilder für die dargestellten Projekte.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-3" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-retrogaming_sign.jpg" alt="Image: Retrogaming sign for another booth" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Das Standschild für einen guten Freund, der Retro-PCs und -Spiele ausstellt.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-4" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-pmma_wave.jpg" alt="Image: Beautiful scrap - residue piece of PMMA in form of a wave" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Schöner Abfall - ein Reststück Acrylglas in Form einer Welle&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-5" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-pcwindow_sea.jpg" alt="Image: The side panel of a midi-tower PC: now with a window" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Das Gegenstück zur Welle: Ein PC mit einzigartigem Fenster, selbstgefräst.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-6" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-DerStand.jpg" alt="Image: Schallbert&amp;#39;s booth on Maker Faire Ruhr 2024" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Die LED-Streifen sind fertig programmiert und alles steht an seinem Platz.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-7" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Gaming.jpg" alt="Image: 2000s-retro-PCs set up and ready to play." class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Retro-2000er-PCs sind aufgebaut und vernetzt. Bereit zum Spielen.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-8" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-StandDetail.jpg" alt="Image: CNC machine detail view" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Die betriebsbereite CNC-Maschine auf der Messe.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-9" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Besucher.jpg" alt="Image: Visitors on Saturday" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Bereits einige Besucher, Maker und Interessierte am Samstag.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-10" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Backstage.jpg" alt="Image: Schallbert&amp;#39;s booth, rear view" class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Backstage des betriebsbereiten Standes.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure id="gallery-full-11" class="hugo-gallery__figure"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-Menschenmenge.jpg" alt="Image: Many more visitors on Sunday." class="hugo-gallery__full-img" /&gt;&lt;figcaption class="hugo-gallery__figcaption"&gt;Doch am Sonntag war noch viel mehr los.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#10;&lt;/section&gt;&#10;&lt;h3 id="projekte"&gt;Projekte&lt;/h3&gt;&#10;&lt;p&gt;Auf der Messe wollte ich ein paar meiner schönsten Projekte vorstellen wie etwa den &lt;a href="https://blog.schallbert.de/projects/seifenbutler/"&gt;Seifenbutler&lt;/a&gt;, meine übergroßen &lt;a href="https://blog.schallbert.de/projects/spirograph/"&gt;Spirographen&lt;/a&gt; und Besuchern ermöglichen, eigene Schilder &lt;a href="https://blog.schallbert.de/negative-carving-with-estlcam/"&gt;graviert zu bekommen&lt;/a&gt;, nach Bedarf sogar mit &lt;a href="https://blog.schallbert.de/projects/qr-codengrave/"&gt;QR-Code&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Damit die Fräsarbeiten schnell von der Hand gehen, habe ich Rohlinge gefertigt, die später nur noch graviert werden mussten. Die Spirographen musste ich wegen der erforderlichen doppelseitigen Bearbeitung ebenfalls vorab fertigen.&lt;/p&gt;&#10;&lt;h3 id="maschinen"&gt;Maschinen&lt;/h3&gt;&#10;&lt;p&gt;Ich konnte ein paar Firmen davon überzeugen, mir Maschinen und -Teile für die Messe zu leihen:&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/sorotec.jpg" alt="Bild: Sorotec Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Von &lt;a href="https://www.sorotec.de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Sorotec&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; borgte ich mir eine &amp;ldquo;Hobbyline4530&amp;rdquo;, deren kleinste und leichteste Maschine.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/stritzelberger.jpg" alt="Bild: Stritzelberger Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Die Firma &lt;a href="https://vakuumtisch.de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Stritzelberger&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; stellte mir einen zur Maschine passenden Vakuumtisch inkl. passender Pumpe zur Verfügung.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/eding.jpg" alt="Bild: EdingCNC Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://edingcnc.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;EdingCNC&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; unterstützte bei der Einrichtung ihrer Software, lieh mir Aussteller für die aktuellste Steuerungshardware und kam schließlich sogar live an meinem Messestand zwecks Austausch vorbei.&lt;/p&gt;&#10;&lt;h3 id="das-standschild"&gt;Das Standschild&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-23-schallbert-standschild.jpg" alt="Image: My plan for a great booth sign" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Für das Standschild habe ich mir etwas ganz Besonderes ausgedacht: Ein Planetengetriebe! Drei bewegliche Zahnräder umkreisen hierbei ein feststehendes Sonnenrad. Um das Standschild aufhängen und das Getriebe dabei randlos behalten zu können, kam für die Planetenträger keine mittig gelagerte Achse in Frage.&lt;/p&gt;&#10;&lt;p&gt;Diese Aufgabe übernimmt ein durch das Sonnenrad verdecktes, durch drei Kugellager (Bild: Im 120°-Winkel angeordnet, montiert auf den Zähnen des Sonnenrads) gehaltenes Hohlrad. Es wird von einem Schrittmotor mit der Untersetzung 1:5 angetrieben. Das Hohlrad bietet Aufnahmen für die Planetenträger. So bekomme ich den mittleren Bereich des Sonnenrades frei und kann dort sowohl Antriebsmotor als auch Beleuchtung und Schildhalterungen unterbringen.&lt;/p&gt;&#10;&lt;p&gt;Ein auf meinem PeerTube-Kanal befindliches Video zeigt, wie ich das Standschild mit meiner CNC-Portalfräse fertige.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/xsLhWWygyJbtJGwUGrKvVE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Herstellung Standschild&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="verzögerungen"&gt;Verzögerungen&lt;/h3&gt;&#10;&lt;p&gt;Wie immer bei solchen größeren Unternehmungen ging bei den Vorbereitungen auch einiges schief:&lt;/p&gt;&#10;&lt;h4 id="ablösung-des-vakuums-bei-der-fertigung-der-spirographen"&gt;Ablösung des Vakuums bei der Fertigung der Spirographen&lt;/h4&gt;&#10;&lt;p&gt;Die Spirographen wollte ich aus furniertem MDF herstellen, da das Material sehr schön anzusehen und gleichzeitig stabil genug ist, dass es auch bei rauer Behandlung keinen Schaden nimmt. Also habe ich &lt;code&gt;10mm&lt;/code&gt; starke mitteldichte Faserplatte mit Olivenholzfurnier beklebt (zeitraubend!) und es dann auf meiner Portalfräse beareitet.&lt;/p&gt;&#10;&lt;p&gt;Da ich ein &lt;a href="https://blog.schallbert.de/why-vacuum-table/"&gt;Vakuumspannsystem&lt;/a&gt; verwende, ist es total wichtig, einen Mindestunterdruck zu erreichen, da mir sonst die Werkstücke nicht an Ort und Stelle bleiben. Nun ist MDF luftdurchlässig, sodass die Pumpe selbst bei noch nicht bearbeiteter Platte gut zu tun hat. Die Geometrie meines Entwurfs für die Spirographen ist nun leider so, dass die für das Spannen verbliebene Oberfläche bei der Bearbeitung immer weiter sinkt.&lt;/p&gt;&#10;&lt;p&gt;In letzter Konsequenz hatte ich das Problem, dass sich die Zahnräder spätestens bei der Kantenbearbeitung der Rückseite mitdrehen wollen. Sogar meine verzweifelten Versuche genügend Unterdruck aufrecht zu erhalten, indem ich großflächig Frischhaltefolie auf dem Werkstück aufbrachte, scheiterten.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-03-25-spirograph.jpg" alt="Image: Spirograph under test" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;So erhielt ich anstatt der geplanten zehn Spirographen nur vier - die Restlichen waren Ausschuss. &lt;em&gt;Merke&lt;/em&gt;: MDF ist auf meinem Vakuumspannsystem nur für großflächige Werkstücke einsetzbar.&lt;/p&gt;&#10;&lt;h4 id="problematische-zahnradpaarung-beim-spirographen"&gt;Problematische Zahnradpaarung beim Spirographen&lt;/h4&gt;&#10;&lt;p&gt;Der erste Spirograph aus MDF war zudem leider gar nicht richtig zu gebrauchen: Ständig verklemmte sich ein Zahn auf der Flanke des Hohlrades und weigerte sich, in Eingriff zu gehen. Die Ursachen dafür liegen darin, dass ich kein Flankenspiel vorgesehen und die Zahnköpfe ohne Radius gefertigt hatte.&lt;/p&gt;&#10;&lt;p&gt;In der Folge muss das Zahnrad immer kräftig gegen das Hohlrad gedrückt werden, um den nächsten Zahneingriff zu ermöglichen. Rutscht das Zahnrad nur ein paar Zehntelmillimeter heraus, so blockiert es. &lt;em&gt;Abhilfe&lt;/em&gt;: Sowohl Zahnrad- als auch Hohlradzahnköpfe mit &lt;code&gt;r=3.0mm&lt;/code&gt; versehen und die Zahnradpaarung mit Flankenspiel von &lt;code&gt;a=0.25mm&lt;/code&gt; konstruieren.&lt;/p&gt;&#10;&lt;h4 id="falsch-gravierte-schriften-auf-dem-großen-standschild"&gt;Falsch gravierte Schriften auf dem großen Standschild&lt;/h4&gt;&#10;&lt;p&gt;Hier habe ich mich sogar zweimal vertan und damit leider viel Ausschuss produziert. Beim ersten Versuch hatte ich übersehen, das Zahnrad für die rückseitige Bearbeitung zu spiegeln. Ich dachte, das sei nicht nötig, weil das Zahnrad selbst spiegelsymmetrisch ist. Leider waren die Haltestifte aber nicht spiegelsymmetrisch eingelassen, sodass sich die Rückseite leider nicht in Deckung mit der Vorderseite befand.&lt;/p&gt;&#10;&lt;p&gt;Beim zweiten Versuch - siehe Video oben - hatte ich dies zwar behoben, jedoch vergessen, den Nullpunkt ensprechend der neuen Zentrierstiftlage auf der Rückseite anzupassen. Zum Glück habe ich das während der Bearbeitung bemerkt und konnte korrigieren.&lt;/p&gt;&#10;&lt;h4 id="retro-pc-fensterfertigung"&gt;Retro-PC Fensterfertigung&lt;/h4&gt;&#10;&lt;p&gt;Bei einem der drei Retro-PCs habe ich die Gehäuserückseite um 180° gedreht aufs Maschinenbett gelegt. Das Fenster wurde also &amp;ldquo;verkehrt herum&amp;rdquo; gefräst, was ich erst nach Beendigung des Fräsjobs bemerkte. Zum Glück konnte mein Freund durch Feilen und Biegen der Rastnasen dafür sorgen, dass die Gehäuserückseite auch &amp;ldquo;verkehrt herum&amp;rdquo; am PC angebracht werden konnte.&lt;/p&gt;&#10;&lt;p&gt;Bei der Fertigung des letzten Fensters verhakte sich der Spanschutz im Gehäusefalz und brach, da ich die Maschine nicht rechtzeitig zum Stehen bekam. Dies konnte überhaupt nur passieren, weil sich der Spanschutz durch die Vibrationen bei der Bearbeitung lockerte. &lt;em&gt;Merke&lt;/em&gt;: Die Fräse ist kein Spielzeug. Also keine Kompromisse machen oder halbgare Provisorien anbringen!&lt;/p&gt;&#10;&lt;h2 id="die-maker-faire-ruhr-2024"&gt;Die Maker Faire Ruhr 2024&lt;/h2&gt;&#10;&lt;p&gt;Die Messe selber war super. Ich wurde sehr freundlich empfangen und seitens der DASA erhielt ich hervorragende Unterstützung beim Ausladen und aller weiterer Logistik. Auch der mir zugeteilte Stand war toll: Sehr groß, gut gelegen, mit ausreichend Steckdosen - was will man mehr.&lt;/p&gt;&#10;&lt;p&gt;Ich hatte eine Firma zu Besuch an meinem Stand, Familie und Freunde waren gekommen und sogar einige Leute aus den CNC-Foren sowie ein paar Arbeitskollegen waren extra angereist. Mehr kann ich mir nicht wünschen.&lt;/p&gt;&#10;&lt;h3 id="aufbau"&gt;Aufbau&lt;/h3&gt;&#10;&lt;p&gt;Beim Ausladen kam uns zum Glück ein Stapler zur Hilfe.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2024-03-25-unloading.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Unloading the CNC&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Alles Weitere war Handarbeit und nicht deutlich anders, als für ein Musikkonzert aufzubauen: Tische rücken, Stromleitungen legen, Lichtanlage montieren, Ausstellungsstücke aufbauen.&lt;/p&gt;&#10;&lt;h3 id="besucher"&gt;Besucher&lt;/h3&gt;&#10;&lt;p&gt;Für meine erste Maker Faire kann ich eine positive Bilanz ziehen: Es waren echt viele Leute an unserem Stand und ich hatte kaum ein paar Minuten zum Ausruhen - ständig gab es etwas zu erzählen, meine Projekte vorzustellen oder über die ausgestellte Maschine zu sprechen. Aber genau das war es ja, was uns an diesem Format gereizt hat. Außerdem hat die Technik funktioniert, die Maschine lief problemlos und alle Dinge, die ich so lange vorher vorbereitet hatte (wie etwa das Standschild), konnten ausgestellt bzw. im Betrieb gezeigt werden.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2024-03-25-short_engrave.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;QR-Codengrave Demonstration&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="was-ich-beim-nächsten-mal-trotzdem-anders-machen-würde"&gt;Was ich beim nächsten Mal trotzdem anders machen würde&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die Maker Faire ist vom Setup her keine Verkaufsmesse, sondern ein riesiges Show &amp;amp; Tell. Daher würde ich nicht nochmal einen kostenpflichtigen Verkaufsstand buchen, denn das hat sich in meinem Falle nicht gelohnt.&lt;/li&gt;&#10;&lt;li&gt;Ein bis zwei Personen mehr für die Standbetreuung wären prima. Dann könnte man sich mal ablösen.&lt;/li&gt;&#10;&lt;li&gt;Mehr Material für die Spirographen! Die Stifte waren am Ende der Veranstaltung komplett durch und Papier hatten wir schon Mitte des zweiten Tages keines mehr.&lt;/li&gt;&#10;&lt;li&gt;Mehr Vorträge / Demos. Die Fräse lief zwar schon oft, aber es mangelte dann doch an Vorlagen und Wünschen seitens der Besucher. Beim nächsten Mal werde ich mehr eigene Designs mitnehmen und auch ohne Anfrage zu Demozwecken fertigen.&lt;/li&gt;&#10;&lt;li&gt;Bessere Verweise auf die Internetpräsenz vorbereiten, denn ein QR-Code alleine hilft da nicht allen weiter.&lt;/li&gt;&#10;&lt;li&gt;Mehr Kaffee: Die Versorgung mit Heißgetränken (und jetzt wo ich es schreibe, auch die mit Nahrung) war unterdimensioniert und leider auch nicht so schmackhaft, wie ich mir das gewünscht hätte. Also besser selbst Stullen schmieren und Thermoskannen mitbringen.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>'redir' im Caddyserver</title><link>https://blog.schallbert.de/migrating-to-subdomain/</link><pubDate>Tue, 30 Jan 2024 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/migrating-to-subdomain/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-01-30-migrating-to-subdomain-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Thumbnail of correctly rendered &amp;#39;&amp;#39;website under construction&amp;#39;&amp;#39; page on schallbert.de"&#10; title="&amp;#39;redir&amp;#39; im Caddyserver" /&gt;&#10;&lt;p&gt;Als ich meine Website weg von Github Pages auf einen eigenen Server &lt;a href="https://blog.schallbert.de/projects/move-blog-to-own-server/"&gt;umzog&lt;/a&gt;, hatte ich einige Probleme und offene Fragen bezüglich automatischer Weiterleitungen. Mein Blog ging nämlich von der root-Domain in eine Subdomain (blog.schallbert.de) über.&lt;/p&gt;&#10;&lt;h2 id="anforderungen-an-die-weiterleitung"&gt;Anforderungen an die Weiterleitung&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Bereits auf meine Blogartikel unter altem Namen referenzierte Links z.B. auf &lt;a href="https://blog.schallbert.de/about/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;schallbert.de/about&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; sollen korrekt auf die Subdomain weiterleiten (kein &lt;em&gt;404&lt;/em&gt;)&lt;/li&gt;&#10;&lt;li&gt;Die Stammseite unter &lt;code&gt;schallbert.de&lt;/code&gt; soll vollständig nutzbar sein&lt;/li&gt;&#10;&lt;li&gt;Daten und Dateien für Domain und Subdomains sollen unabhängig voneinander sein&lt;/li&gt;&#10;&lt;li&gt;Die Webserver sollen für verschiedene Unterseiten unterschiedliche Technologien verwenden können&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="umsetzung"&gt;Umsetzung&lt;/h2&gt;&#10;&lt;p&gt;Zuerst hatte ich gedacht, dass ich die Weiterleitungen im DNS-provider über &lt;code&gt;A&lt;/code&gt; und &lt;code&gt;CNAME&lt;/code&gt; Einträge erreichen könnte. Schnell wurde mir jedoch klar, dass ich &lt;em&gt;a)&lt;/em&gt; keine Ahnung hatte, wie DNS überhaupt funktioniert und &lt;em&gt;b)&lt;/em&gt; der richtige Weg über die Konfiguration meines Webservers führt.&lt;/p&gt;&#10;&lt;h3 id="erster-versuch-redir-bei-"&gt;Erster Versuch: redir bei &amp;lsquo;/&amp;rsquo;&lt;/h3&gt;&#10;&lt;p&gt;Auf meinem Webserver (Caddy) werden Weiterleitungen in der &lt;code&gt;Caddyfile&lt;/code&gt; per &lt;code&gt;redir&lt;/code&gt; spezifiziert. Dabei kann das &lt;code&gt;permanent&lt;/code&gt; (als sogenannte http &lt;code&gt;301&lt;/code&gt;) oder &lt;code&gt;temporary&lt;/code&gt; per &lt;code&gt;302&lt;/code&gt; (Standardeinstellung) geschehen.&lt;/p&gt;&#10;&lt;p&gt;Mein erster Gedanke war, dass ich &lt;code&gt;schallbert.de&lt;/code&gt; unmodifiziert lasse und alles hinter einem eventuellen &lt;code&gt;/&lt;/code&gt; weiterleite. Dies sieht dann in der Caddyfile wie folgt aus:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;schallbert.de {&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Define webserver&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;root * /www/landing&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;encode gzip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;file_server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Redir to subdomain if domain has a slash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@redirect path_regexp /*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;redir @redirect https://blog.schallbert.de{uri}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In der Folge hat Caddy schlicht alles an die Subdomain weitergeleitet. Der Haken dabei war, dass die Subdomain selbst ja auch wieder Slashes bzw. eine URI hinter dem Slash enthält und dann wiederum weitergeleitet wird. Beispiel:&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;schallbert.de/post -&amp;gt; blog.schallbert.de/post -&amp;gt; blog.schallbert.de/post -&amp;gt; blog.schallbert.de/post -&amp;gt; [...]&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Somit bekam ich eine rekursive Endlosweiterleitung. Ich habe meinen Server damit komplett lahmgelegt 😅&lt;/p&gt;&#10;&lt;h3 id="zweiter-versuch-filterung-per-regexp"&gt;Zweiter Versuch: Filterung per Regexp&lt;/h3&gt;&#10;&lt;p&gt;Ich brauche also eine bessere Filterung, sodass nur Slashes mit weiteren Zeichen dahinter auch wirklich weitergeleitet werden und die Weiterleitung nicht rekursiv ablaufen kann. Zum Glück hatte ich Hilfe von einem guten Freund, sodass kurze Zeit darauf folgendes &lt;code&gt;Caddyfile&lt;/code&gt; entstand:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;schallbert.de {&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Define webserver&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;root * /www/landing&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;encode gzip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;file_server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Redir to subdomain to maintain links for blog&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@redirect path_regexp ^/[^/]+(/.*)?$&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;redir @redirect https://blog.schallbert.de{uri}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Regexp prüft ab, ob ein Slash hinter der Domain URL vorliegt und dahinter zumindest ein weiteres Zeichen folgt. Hier funktioniert die Weiterleitung nun wie gewünscht und mein Blog ist auch unter den alten Links weiterhin vollständig erreichbar.&lt;/p&gt;&#10;&lt;p&gt;Trotzdem war ich noch nicht ganz zufrieden. Denn als ich mir eine schöne &amp;ldquo;Landing Page&amp;rdquo; auf meiner Root Domain erstellte, war von ihr plötzlich nur noch das reine HTML zu sehen. Kein favicon, keine Bilder, kein CSS.&lt;/p&gt;&#10;&lt;p&gt;Ein kurzer Blick in die Entwickleroptionen brachte schnell die Erkenntnis dass die Pfade aller Assets, die ich auf meiner Landing Page hinterlegt hatte, durch die Ordnerstruktur mit &lt;code&gt;/&lt;/code&gt; gekennzeichnet, an die Subdomain weitergeleitet wurden. Wo sie natürlich nicht liegen.&lt;/p&gt;&#10;&lt;h3 id="dritter-versuch-regexp-plus-dateisuche"&gt;Dritter Versuch: Regexp plus Dateisuche&lt;/h3&gt;&#10;&lt;p&gt;Zum Glück bin ich wieder mal mit dem Problem nicht allein, sodass im &lt;a href="https://caddy.community/t/redirect-if-file-not-present/7902" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Forum von Caddy&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; die Lösung zu finden war:&lt;/p&gt;&#10;&lt;p&gt;Mit dem &lt;code&gt;not file&lt;/code&gt; Marker kann ich in der &lt;code&gt;Caddyfile&lt;/code&gt; Weiterleitungen definieren, falls Ressourcen auf der aktuellen Seite unauffindbar sind.&lt;/p&gt;&#10;&lt;p&gt;Somit sieht meine Lösung jetzt wie folgt aus:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;schallbert.de {&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@filenotfound {&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;path_regexp ^/[^/]+(/.*)?$&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;not file&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# show Caddy where to find page resources&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;root * /www/landing&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;encode gzip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;route {&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Redirect to subdomain if article cannot found on root&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;redir @filenotfound https://blog.schallbert.de{uri}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# else, define webserver and show page&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;file_server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hier ist wichtig, dass ich die Seite mit &lt;code&gt;root * /www/&amp;lt;pagelocation&amp;gt;&lt;/code&gt; definiere, bevor ich die &lt;code&gt;route&lt;/code&gt; anlege. Denn sonst werden die Assets erst verfügbar, nachdem ich bereits aus Ermangelung vorhandener Dateien weitergeleitet habe.&lt;/p&gt;&#10;&lt;h2 id="erfolg"&gt;Erfolg!&lt;/h2&gt;&#10;&lt;p&gt;Jetzt endlich wird meine Baustellenseite korrekt dargestellt.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-01-30-migrating-to-subdomain.jpg" alt="Image: Correctly rendered &amp;#39;website under construction&amp;#39; page on schallbert.de" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Automatische Updates für alles!</title><link>https://blog.schallbert.de/server-auto-upgrade/</link><pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/server-auto-upgrade/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-01-20-server-auto-upgrade-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: unattended-upgrades and Watchtower keep my server and application packages up to date."&#10; title="Automatische Updates für alles!" /&gt;&#10;&lt;p&gt;Wie der Titel schon sagt, möchte ich Sicherheitsupdates gern installiert haben, sobald sie erscheinen. Dies gilt gleichsam für das Ubuntu meines Cloud-Servers wie auch für alle Applikationen, die ich in Docker betreibe. Da ich faul bin, möchte ich diese Sicherheitsupdates nicht manuell vornehmen, sondern vollautomatisch ablaufen lassen.&lt;/p&gt;&#10;&lt;p&gt;Für Funktionsupdates und -Erweiterungen hingegen ist es auch weiterhin OK für mich, von Zeit zu Zeit manuell einzugreifen.&#10;Beginnen wir also mit den Systemupgrades.&lt;/p&gt;&#10;&lt;h2 id="sicherheitsupdates-per-unattended-upgrades"&gt;Sicherheitsupdates per &lt;code&gt;unattended-upgrades&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;Ubuntu stellt - wie eine kurze &lt;a href="https://askubuntu.com/questions/9/how-do-i-enable-automatic-updates" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Suchmaschinenabfrage ergibt&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; - bereits ein konfigurierbares Werkzeug für solche automatisierten Updates zur Verfügung: &lt;code&gt;unattended-upgrades&lt;/code&gt;. Ich prüfe zuerst, ob es bereits auf meinem System vorhanden ist:&lt;/p&gt;&#10;&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;schallbert:~# which unattended-upgrades&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin/unattended-upgrades&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prima, es ist bereits da. Ansonsten hätte ich die Installation schnell mit &lt;code&gt;apt install unattended-upgrades&lt;/code&gt; nachgeholt.&lt;/p&gt;&#10;&lt;h3 id="unattended-upgrades-konfigurieren"&gt;unattended-upgrades konfigurieren&lt;/h3&gt;&#10;&lt;p&gt;Hier hilft das &lt;a href="https://wiki.debian.org/UnattendedUpgrades" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Debian Wiki&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; weiter: Die Konfigurationsdateien liegen in &lt;code&gt;/etc/apt/apt.conf.d&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Zuerst gehe ich sicher, dass automatische Updates aktiviert sind. Hierfür prüfe ich die Datei &lt;code&gt;20auto-upgrades&lt;/code&gt; und stelle sicher, dass Paketindex-Updates und Upgradeinstallation aktiviert sind:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;APT::Periodic::Update-Package-Lists &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;APT::Periodic::Unattended-Upgrade &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sehr gut. Jetzt sollte ich noch festlegen, zu welchem Zeitpunkt das Tool loslaufen und welcher Typ Updates installiert werden soll. Hierfür öffne ich die Datei &lt;code&gt;50unattended-upgrades&lt;/code&gt; und entferne die Kommentare bei den entsprechenden Zeilen.&lt;/p&gt;&#10;&lt;h3 id="updatequellen-festlegen"&gt;Updatequellen festlegen&lt;/h3&gt;&#10;&lt;p&gt;Der erste Abschnitt der Konfigurationsdatei widmet sich der erlaubten Quellen für die Updates. Hier sollten selbstverständlich nur vertrauenswürdige Provider stehen. Meine Konfig sieht hier wie folgt aus:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unattended-Upgrade::Allowed-Origins &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_id&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_codename&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_id&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_codename&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-security&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_id&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ESMApps:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_codename&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-apps-security&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_id&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ESM:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;distro_codename&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-infra-security&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Erlaubt werden hier Quellen für die von mir verwendete Linux-Distribution im Allgemeinen und Sicherheitsupdates inklusive &lt;code&gt;ESM&lt;/code&gt;, was für &amp;ldquo;Extended Security Maintenance&amp;rdquo; steht.&lt;/p&gt;&#10;&lt;h3 id="updates-auch-für-dev-releases"&gt;Updates auch für Dev Releases?&lt;/h3&gt;&#10;&lt;p&gt;Die folgende Zeile legt fest, ob auch Vorabversionen von Ubuntu Updates erhalten sollen. Bei mir steht der Wert auf &lt;code&gt;auto&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unattended-Upgrade::DevRelease &lt;span style="color:#e6db74"&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="automatischer-neustart"&gt;Automatischer Neustart&lt;/h3&gt;&#10;&lt;p&gt;Einige Sicherheitsupdates (z.B. den &lt;a href="https://en.wikipedia.org/wiki/Kernel_%28operating_system%29" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Kernel&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; betreffend) erfordern einen Neustart der Maschine. Sie werden daher nur in Kraft treten, wenn man in der Datei entsprechende Werte gesetzt hat. Dabei ist &lt;code&gt;WithUsers&lt;/code&gt; natürlich Geschmackssache, denn man wird ausgeloggt, falls zufälligerweise gerade ein Update installiert wurde, was einen Neustart erfordert. Um das praktisch auszuschließen, habe ich unter &lt;code&gt;Reboot-Time&lt;/code&gt; eine Zeit eingetragen, bei der ich sicher nicht an der Maschine hocke.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unattended-Upgrade::Automatic-Reboot &lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unattended-Upgrade::Automatic-Reboot-WithUsers &lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unattended-Upgrade::Automatic-Reboot-Time &lt;span style="color:#e6db74"&gt;&amp;#34;03:45&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unangekündigte Neustarts haben natürlich Rückwirkung auf alle Programme, die ich verwende. Daher stelle ich in meinen &lt;code&gt;docker-compose.yml&lt;/code&gt; Dateien sicher, dass dort bei &lt;code&gt;restart:&lt;/code&gt; auch wirklich &lt;code&gt;always&lt;/code&gt; oder &lt;code&gt;unless-stopped&lt;/code&gt; notiert ist.&lt;/p&gt;&#10;&lt;h3 id="benachrichtigungen"&gt;Benachrichtigungen&lt;/h3&gt;&#10;&lt;p&gt;Automatische Mails oder anderweitige Push-Benachrichtigungen habe ich erst einmal nicht eingeschaltet, da ich mich noch im Testbetrieb befinde und keine große Lust auf einen Haufen weiterer Nachrichten habe. Sobald ich dies ändere, gibt es hier ganz bestimmt ein Update.&lt;/p&gt;&#10;&lt;h3 id="funktionsprüfung"&gt;Funktionsprüfung&lt;/h3&gt;&#10;&lt;p&gt;Um zu sehen, ob unattended-upgrades tut was es soll, schaue ich ein paar Tage später mal in die Logs unter &lt;code&gt;/var/log/unattended-upgrades&lt;/code&gt;.&#10;Hier steht in der Datei &lt;code&gt;unattended-upgrades.log&lt;/code&gt; zum Beispiel folgendes:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2024&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;59&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;781&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INFO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Starting&lt;/span&gt; unattended upgrades script&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2024&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;59&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;781&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INFO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Allowed&lt;/span&gt; origins &lt;span style="color:#e6db74"&gt;are&lt;/span&gt;: o&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Ubuntu&lt;/span&gt;,a&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jammy, o&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Ubuntu&lt;/span&gt;,a&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jammy&lt;span style="color:#f92672"&gt;-&lt;/span&gt;security, o&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;UbuntuESMApps&lt;/span&gt;,a&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jammy&lt;span style="color:#f92672"&gt;-&lt;/span&gt;apps&lt;span style="color:#f92672"&gt;-&lt;/span&gt;security, o&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2024&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;59&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;781&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INFO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Initial&lt;/span&gt; &lt;span style="color:#e6db74"&gt;blacklist&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2024&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;59&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;782&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INFO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Initial&lt;/span&gt; whitelist (&lt;span style="color:#f92672"&gt;not&lt;/span&gt; strict):&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2024&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;33&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;956&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INFO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Packages&lt;/span&gt; that will be &lt;span style="color:#e6db74"&gt;upgraded&lt;/span&gt;: libc&lt;span style="color:#f92672"&gt;-&lt;/span&gt;bin libc&lt;span style="color:#f92672"&gt;-&lt;/span&gt;dev&lt;span style="color:#f92672"&gt;-&lt;/span&gt;bin libc&lt;span style="color:#f92672"&gt;-&lt;/span&gt;devtools libc6 libc6&lt;span style="color:#f92672"&gt;-&lt;/span&gt;dev locales python3&lt;span style="color:#f92672"&gt;-&lt;/span&gt;twisted&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2024&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;33&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;956&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INFO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Writing&lt;/span&gt; dpkg log to &lt;span style="color:#e6db74"&gt;/var/&lt;/span&gt;log&lt;span style="color:#f92672"&gt;/&lt;/span&gt;unattended&lt;span style="color:#f92672"&gt;-&lt;/span&gt;upgrades&lt;span style="color:#f92672"&gt;/&lt;/span&gt;unattended&lt;span style="color:#f92672"&gt;-&lt;/span&gt;upgrades&lt;span style="color:#f92672"&gt;-&lt;/span&gt;dpkg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2024&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;06&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;54&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;578&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INFO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;All&lt;/span&gt; upgrades installed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Datei &lt;code&gt;unattended-upgrades-shutdown.log&lt;/code&gt; ist allerdings noch leer. Ich werde zu einem späteren Zeitpunkt prüfen, ob hier auch alles funktioniert.&lt;/p&gt;&#10;&lt;h2 id="container-updates-mit-watchtower-automatisieren"&gt;Container-Updates mit &lt;code&gt;Watchtower&lt;/code&gt; automatisieren&lt;/h2&gt;&#10;&lt;p&gt;Nun zu den Updates meiner Applikationen. Ein kurzes Gespräch mit ein paar Admins ergab:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Es ist mühsam, alle Programme von Hand auf Stand zu halten&lt;/li&gt;&#10;&lt;li&gt;Für Anwendungen im Container gibt es Dienste, die diese Aufgabe zentral lösen&lt;/li&gt;&#10;&lt;li&gt;Es gab bereits schlechte Erfahrungen, wenn in der &lt;code&gt;docker-compose.yml&lt;/code&gt; auf den aktuellsten Release referenziert wird&lt;/li&gt;&#10;&lt;li&gt;Bei &lt;code&gt;image: &amp;lt;application&amp;gt;:latest&lt;/code&gt; seien hier nicht alle Anwendungen stabil bzw. erzeugten Probleme mit Abhängigkeiten&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Einer Lösung für dieses Problem bietet &lt;a href="https://containrrr.dev/watchtower/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Watchtower&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, welches in meinem Falle selbst wieder in einem Container läuft.&lt;/p&gt;&#10;&lt;h3 id="installation-1"&gt;Installation&lt;/h3&gt;&#10;&lt;p&gt;Wie üblich schreibe ich mir in einem neuen Ordner unter &lt;code&gt;opt/watchtower&lt;/code&gt; eine &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# copied from https://containrrr.dev/watchtower/notifications/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# watchtower/docker-compose.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;watchtower&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;containrrr/watchtower&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Watchtower benötigt &lt;code&gt;docker.sock&lt;/code&gt;, um die Updates zu ziehen und auf den vorhandenen Containern anzuwenden.&#10;Ansonsten habe ich hier erst einmal nichts weiter unternommen. Keine Benachrichtigungen (aus obengenannten Gründen), keine Logs, nichts. Ich hoffe, dieses Setup bleibt geräuschlos und ich muss mich hier lange nicht mit einem &lt;em&gt;Update&lt;/em&gt; zu Wort melden.&lt;/p&gt;&#10;&lt;p&gt;Weitergehende Schritte für die Validierung der Funktion von Watchtower finden sich z.B. &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-automatically-update-docker-container-images-with-watchtower-on-ubuntu-22-04" target="_blank" rel="noopener noreferrer" class="external-link"&gt;in einem Tutorial von DigitalOcean&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="ablauf"&gt;Ablauf&lt;/h3&gt;&#10;&lt;p&gt;Watchtower prüft die Installierten Docker images &lt;a href="https://containrrr.dev/watchtower/introduction/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;lt. Doku täglich&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; auf Updates. Sollte des ein neues Image-release geben, schickt Watchtower ein &lt;code&gt;SIGTERM&lt;/code&gt;-Signal an upzudatende Container, worauf sich selbige herunterfahren (&lt;a href="https://containrrr.dev/watchtower/stop-signals/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Quelle&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;). Anschließend werden die Container wieder hochgefahren.&lt;/p&gt;&#10;&lt;h3 id="unfreiwillige-funktionsprüfung"&gt;Unfreiwillige Funktionsprüfung&lt;/h3&gt;&#10;&lt;p&gt;Ein paar Tage nach Start des Containers wählte ich mich nochmal in meinen Server ein und sah auf gut Glück ein paar Logs durch. Ich wollte nur kurz nach dem Rechten schauen.&lt;/p&gt;&#10;&lt;p&gt;In den &lt;code&gt;fail2ban&lt;/code&gt; Logdateien sah ich zu einem bestimmten Zeitpunkt, Uhrzeit &lt;code&gt;14:42:56&lt;/code&gt; plötzlich seitenweise Einträge. Mehr davon, als ich die Tage vorher insgesamt gesehen hatte. Als ich zum Beginn dieser Kette von Einträgen hochscrollte, sah ich, dass fail2ban mir wohl kurz ausgestiegen war.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt; 2024-01-26 14:42:50,817 &amp;lt;container_id&amp;gt; INFO Shutdown in progress...&#10; 2024-01-26 14:42:50,817 &amp;lt;container_id&amp;gt; INFO Observer stop ... try to end queue 5 seconds&#10; 2024-01-26 14:42:50,837 &amp;lt;daemon_id&amp;gt; INFO Observer stopped, 0 events remaining.&#10; 2024-01-26 14:42:50,878 &amp;lt;container_id&amp;gt; INFO Stopping all jails&#10; 2024-01-26 14:42:50,879 &amp;lt;container_id&amp;gt; INFO Removed logfile: &amp;#39;/var/log/auth.log&amp;#39;&#10; 2024-01-26 14:42:50,879 &amp;lt;container_id&amp;gt; INFO Removed logfile: &amp;#39;/var/log/caddy2/gitea_access.log&amp;#39;&#10; 2024-01-26 14:42:50,879 &amp;lt;container_id&amp;gt; INFO Removed logfile: &amp;#39;/var/log/caddy2/server_access.log&amp;#39;&#10; 2024-01-26 14:42:51,052 &amp;lt;daemon_id&amp;gt; NOTIC [sshd] Flush ticket(s) with iptables&#10; 2024-01-26 14:42:51,063 &amp;lt;container_id&amp;gt; INFO Jail &amp;#39;sshd&amp;#39; stopped&#10; 2024-01-26 14:42:51,137 &amp;lt;daemon_id&amp;gt; NOTIC [caddy-status] Flush ticket(s) with iptables-multiport&#10; 2024-01-26 14:42:51,137 &amp;lt;container_id&amp;gt; INFO Jail &amp;#39;caddy-status&amp;#39; stopped&#10; 2024-01-26 14:42:51,138 &amp;lt;container_id&amp;gt; INFO Connection to database closed.&#10; 2024-01-26 14:42:51,139 &amp;lt;container_id&amp;gt; INFO Exiting Fail2ban&#10; 2024-01-26 14:42:56,173 &amp;lt;new_container_id&amp;gt; INFO --------------------------------------------------&#10; 2024-01-26 14:42:56,173 &amp;lt;new_container_id&amp;gt; INFO Starting Fail2ban v1.0.2&#10; 2024-01-26 14:42:56,173 &amp;lt;new_container_id&amp;gt; INFO Observer start...&#10;[...]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die ganzen Log-Einträge zur selben Uhrzeit beginnen am Ende des oben gezeigten Abschnitts. Ein ganzer Haufen IP-Adressen wird dort zur Vorbereitung des Banns in Fail2ban geladen.&#10;Leicht beunruhigt schaute ich ins Syslog von Ubuntu:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;Jan 26 14:42:55 schallbert systemd[1]: docker-&amp;lt;ID&amp;gt;.scope: Deactivated successful&#10;Jan 26 14:42:55 schallbert systemd[1]: docker-&amp;lt;ID&amp;gt;.scope: Consumed 21:05 CPU time&#10;Jan 26 14:42:55 schallbert dockerd[690]: time=&amp;#34;2024-01-26T14:42:55.228607617Z&amp;#34; level=info msg=&amp;#34;ignoring event&amp;#34; &#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.229864632Z&amp;#34; level=info msg=&amp;#34;shim disconnected&amp;#34; &#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.230125409Z&amp;#34; level=warning msg=&amp;#34;cleaning up after shim disconnected&amp;#34; i&amp;gt;&#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.230145478Z&amp;#34; level=info msg=&amp;#34;cleaning up dead shim&amp;#34;&#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.240586557Z&amp;#34; level=warning msg=&amp;#34;cleanup warnings time=\&amp;#34;2024-01-26T14:&amp;gt;&#10;Jan 26 14:42:55 schallbert dockerd[690]: time=&amp;#34;2024-01-26T14:42:55.241839655Z&amp;#34; level=warning msg=&amp;#34;ShouldRestart failed&#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.870912387Z&amp;#34; level=info msg=&amp;#34;loading plugin \&amp;#34;io.containerd.event.v1.p&amp;gt;&#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.870997689Z&amp;#34; level=info msg=&amp;#34;loading plugin \&amp;#34;io.containerd.internal.v&amp;gt;&#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.871007368Z&amp;#34; level=info msg=&amp;#34;loading plugin \&amp;#34;io.containerd.ttrpc.v1.t&amp;gt;&#10;Jan 26 14:42:55 schallbert containerd[639]: time=&amp;#34;2024-01-26T14:42:55.871150831Z&amp;#34; level=info msg=&amp;#34;starting signal loop&amp;#34; namespace=moby path&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hm, &lt;code&gt;cleaning up dead shim&lt;/code&gt;. Das klingt ja bedrohlich. Eine kurze &lt;a href="https://iximiuz.com/en/posts/implementing-container-runtime-shim/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Recherche&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zeigt, dass die Shim eine Zwischenschicht zwischen Containermanager und dem Container selbst bildet und Ein-und Ausgaben des Containers weiterleitet. Ihre Laufzeit ist an die des Containers gekoppelt.&lt;/p&gt;&#10;&lt;p&gt;Also war dies ein normales Herunterfahren mit anschließendem Neustart. Zum Glück kein Einbruch!&#10;Bleibt nur noch der Grund für den Neustart von Fail2ban herauszufinden. Da fällt mir ein, dass ich noch gar nicht weiß, wann Watchtower genau die Updates fährt&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;Also mal schnell in die Logs von Watchtower geschaut mit &lt;code&gt;docker container logs &amp;lt;container_id&amp;gt;&lt;/code&gt; und siehe da:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;time=&amp;#34;2024-01-26T14:42:47Z&amp;#34; level=info msg=&amp;#34;Found new lscr.io/linuxserver/fail2ban:latest image (9bda077d765e)&amp;#34;&#10;time=&amp;#34;2024-01-26T14:42:50Z&amp;#34; level=info msg=&amp;#34;Stopping /fail2ban (e0317a105d53) with SIGTERM&amp;#34;&#10;time=&amp;#34;2024-01-26T14:42:55Z&amp;#34; level=info msg=&amp;#34;Creating /fail2ban&amp;#34;&#10;time=&amp;#34;2024-01-26T14:42:55Z&amp;#34; level=info msg=&amp;#34;Session done&amp;#34; Failed=0 Scanned=6 Updated=1 notify=no&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit habe ich den Beweis: Watchtower tut was es soll. Es zieht Container auf eine neue Version hoch, sobald Updates verfügbar werden. Prima!&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; Da ich Watchtower nicht groß konfiguriert habe, nehme ich anhand der in den Logs befindlichen Zeitstempel an, dass die Updates täglich zur Zeit des Starts von Watchtower gefahren werden. Bald werde ich von &lt;code&gt;latest&lt;/code&gt; für meine Container wohl auf ein älteres Tag release umschwenken.&lt;/p&gt;&#10;</description></item><item><title>Jekyll build: defekte relative Links</title><link>https://blog.schallbert.de/self-hosted-jekyll-page-broken-links/</link><pubDate>Fri, 29 Dec 2023 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/self-hosted-jekyll-page-broken-links/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-29_serves_broken_links-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Webpage, displaying Schallbert&amp;#39;&amp;#39;s Blog with broken links"&#10; title="Jekyll build: defekte relative Links" /&gt;&#10;&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;&#10;&lt;p&gt;Jetzt bin ich nach &lt;a href="https://blog.schallbert.de/gitea-action-runner-jekyll-dockerimage/"&gt;ewigem Probieren&lt;/a&gt; nun endlich in der Lage, meinem Caddyserver die gebauten Dateien per Docker-Volume zur Verfügung zu stellen. Leider sieht die Seite aber wie folgt aus:&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-29_serves_broken_links.jpg" alt="Image: Broken webpage, displaying Schallbert&amp;#39;s Blog without pictures, and other media, and any links lead to 404-nowhere" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="die-analyse"&gt;Die Analyse&lt;/h2&gt;&#10;&lt;p&gt;Zuerst hatte ich den Webserver in Verdacht.&#10;Wenn ich die Website aber testweise in meinem Browser aufrufe&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, zeigt sich dasselbe Verhalten. Merkwürdig.&lt;/p&gt;&#10;&lt;p&gt;Offensichtlich fehlen sämtliche Stylesheets. Sieht man genau hin, sind aber auch Bilder und andere Medien nicht geladen worden, sondern lediglich ihre Beschreibung.&#10;Dann klicke ich wild auf ein paar Links zu Artikeln und Unterseiten. Dabei fällt auf, dass die Pfade anders aussehen, als ich erwartet hätte:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Erwartung ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Bilddatei&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;/assets/images/test.jpg&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Artikel&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;/this-is-a-post&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Stattdessen sehe ich:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Beobachtung ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Bilddatei&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;/pages/&amp;lt;username&amp;gt;/&amp;lt;repositoryname&amp;gt;/assets/images/test.jpg&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Artikel&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;/pages/&amp;lt;username&amp;gt;/&amp;lt;repositoryname&amp;gt;/this-is-a-post&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dies zeigen auch die mit &lt;code&gt;F12&lt;/code&gt; zugeschalteten Entwickleroptionen des Browsers (siehe Bild oben): sämtliche per relativen Link eingebundene Quellen können nicht geladen werden. Übrigens ist es im Allgemeinen eine klare Empfehlung, die Entwickleroptionen bei Problemen mit der Darstellung von Webseiten aktiviert zu haben.&lt;/p&gt;&#10;&lt;p&gt;Liegt ja irgendwie nahe, dass meine Jekyll-Konfigurationsdatei &lt;code&gt;_config.yml&lt;/code&gt; oder meine &lt;a href="https://blog.schallbert.de/jekyll-polyglot-language-support/"&gt;Übersetzungsheader&lt;/a&gt; &lt;code&gt;i10.yml&lt;/code&gt; Fehler enthalten. Dafür gibt es zum Glück bereits hervorragende &lt;a href="https://mademistakes.com/mastering-jekyll/site-url-baseurl/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Hilfeseiten&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Ein Test zeigt jedoch schnell, dass ich die Angabe &lt;code&gt;repository&lt;/code&gt;, woher der Build &lt;code&gt;&amp;lt;username&amp;gt;/&amp;lt;repositoryname&amp;gt;&lt;/code&gt; herbezieht, nicht einfach leer lassen kann:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# bundle exec jekyll serve&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Generating... &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Jekyll Feed: Generating feed &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; posts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Liquid Exception: No repo name found. &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Specify using PAGES_REPO_NWO environment variables, &lt;span style="color:#e6db74"&gt;&amp;#39;repository&amp;#39;&lt;/span&gt; in your configuration, &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; or set up an &lt;span style="color:#e6db74"&gt;&amp;#39;origin&amp;#39;&lt;/span&gt; git remote pointing to your github.com repository. in /_layouts/default.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ERROR: YOUR SITE COULD NOT BE BUILT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und, verflixt, wo kommt der Unterordner &lt;code&gt;/pages&lt;/code&gt; plötzlich her?&lt;/p&gt;&#10;&lt;h2 id="die-lösung"&gt;Die Lösung&lt;/h2&gt;&#10;&lt;p&gt;Durch das &lt;code&gt;/pages&lt;/code&gt; im Pfad liegt die Vermutung nahe, dass die Ursache in einer Kombination aus &lt;a href="https://jekyllrb.com/docs/configuration/options/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Jekyll-Bauoptionen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und dem &lt;a href="https://github.com/github/pages-gem" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Github-Pages Gem&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zu finden ist.&lt;/p&gt;&#10;&lt;p&gt;Natürlich bin ich mit diesem Problem nicht allein, und nach längerer Recherche finde ich &lt;a href="https://stackoverflow.com/questions/51869314/jekyll-serve-generate-wrong-path-in-localhost" target="_blank" rel="noopener noreferrer" class="external-link"&gt;tatsächlich eine Dokumentation der Lösung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Also ändere ich die Umgebungsvariable &lt;code&gt;JEKYLL_ENV&lt;/code&gt; (steht für die Bauumgebung) von &lt;code&gt;production&lt;/code&gt; auf &lt;code&gt;development&lt;/code&gt;, so wie es normalerweise für das lokale Bauen vorgesehen ist.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# workflows/jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;env&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;JEKYLL_ENV&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;development&lt;/span&gt; &lt;span style="color:#75715e"&gt;# I had &amp;#34;production&amp;#34; here before&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und, was soll ich sagen: Kaum macht man es richtig, schon funktioniert&amp;rsquo;s!&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-29_css_assets_show_correctly.jpg" alt="Image: blog.schallbert.de shows correct CSS and media are loaded along working links" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;div class="footnotes" role="doc-endnotes"&gt;&#10;&lt;hr&gt;&#10;&lt;ol&gt;&#10;&lt;li id="fn:1"&gt;&#10;&lt;p&gt;Die Website offline darstellen funktioniert wie folgt: Die gebauten Dateien (den &lt;code&gt;_site&lt;/code&gt;-Ordner) auf den eigenen Rechner ziehen und die &lt;code&gt;index.html&lt;/code&gt; mit dem Browser öffnen.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>🗸 Gitea Actions Teil2 - Jekyll-Dockerimage</title><link>https://blog.schallbert.de/gitea-action-runner-jekyll-dockerimage/</link><pubDate>Sat, 09 Dec 2023 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/gitea-action-runner-jekyll-dockerimage/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-09_gitea_infrastructure-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: giteas infrastructure in a nutshell"&#10; title="🗸 Gitea Actions Teil2 - Jekyll-Dockerimage" /&gt;&#10;&lt;h2 id="die-vorgeschichte"&gt;Die Vorgeschichte&lt;/h2&gt;&#10;&lt;p&gt;Leider hatte ich im &lt;a href="https://blog.schallbert.de/gitea-action-runner-native-jekyll/"&gt;Teil1&lt;/a&gt; mit einer leicht modifizierten Kopie der Github-Action zum Bauen von Jekyll kein Glück. Daher wollte ich nun probieren, Jekyll direkt als Dockerimage laufen zu lassen. Im Docker hub gab es nicht so furchtbar viel Auswahl. Trotzdem habe ich ein (in 2023) aktiv gewartetes und gut dokumentiertes Image finden können.&lt;/p&gt;&#10;&lt;h2 id="set-up-job"&gt;&amp;ldquo;Set up job&amp;rdquo;&lt;/h2&gt;&#10;&lt;p&gt;Und so binde ich das Docker-Jekyllimage dann in meinen workflow ein:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# workflows/jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;jobs&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Build job&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;build&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt; &lt;span style="color:#75715e"&gt;# this is the &amp;#34;label&amp;#34; the runner will use and map to docker target OS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jvconseil/jekyll-docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hier wird dem &lt;code&gt;gitea act_runner&lt;/code&gt; gesagt, dass er mit dem &lt;code&gt;ubuntu-latest&lt;/code&gt; label laufen soll, was in meinem Fall auf eine sehr kleine und schnell hochzufahrende &lt;code&gt;node16:bullseye&lt;/code&gt; Maschine (abgeleitet vom Betriebssystem Debian11) gemappt wird. Zusätzlich wird Docker mitgeteilt, dass bitte das &lt;code&gt;jekyll-docker&lt;/code&gt; image zu laden ist, wo die von mir benötigten Abhängigkeiten (Ruby, Sass, Jekyll&amp;hellip;) bereits berücksichtigt wurden.&lt;/p&gt;&#10;&lt;h2 id="bundle-install"&gt;bundle install&lt;/h2&gt;&#10;&lt;p&gt;Das Bauen schlägt hier allerdings fehl wegen in der &lt;code&gt;Gemfile&lt;/code&gt; angegebenen, aber nicht installierten Abhängigkeiten. Das kann dann so ählich aussehen wie hier:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;bundler: failed to load command: jekyll (/usr/gem/bin/jekyll)&#10;/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.4.22/lib/bundler/resolver.rb:332:in `raise_not_found!&amp;#39;: Could not find gem &amp;#39;github-pages&amp;#39; in locally installed gems. (Bundler::GemNotFound)&#10;&#9;from /usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.4.22/lib/bundler/resolver.rb:392:in `block in prepare_dependencies&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://bundler.io" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Bundler&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; ist der Paketmanager für in Ruby geschriebene Software. Ähnlich wie &lt;code&gt;npm&lt;/code&gt; für Javascript oder &lt;code&gt;pip&lt;/code&gt; für Python ist &lt;code&gt;bundler&lt;/code&gt; in der Lage, von einem Ruby-Programm genutzte Bibliotheken und andere Abhängigkeiten herunterzuladen und so einzubinden, dass sie ohne weitere Konfiguration auf dem Zielsystem verwendet werden können. Damit &lt;code&gt;bundler&lt;/code&gt; weiß, was zu installieren ist, wird eine sogenannte &lt;code&gt;Gemfile&lt;/code&gt; angelegt.&lt;/p&gt;&#10;&lt;p&gt;Also dem Script schnell &lt;code&gt;bundle install&lt;/code&gt; hinzufügen, etwa so:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# workflows/jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: --- &lt;span style="color:#ae81ff"&gt;CHECKOUT ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/checkout@v3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: --- &lt;span style="color:#ae81ff"&gt;INSTALL GEMS ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bundle install&lt;/span&gt; &lt;span style="color:#75715e"&gt;# will fail with permissions rights to write to Gemfile.lock but anyways installs required dependencies.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: --- &lt;span style="color:#ae81ff"&gt;BUILD WITH JEKYLL ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Outputs to the &amp;#39;./_site&amp;#39; directory by default&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bundle exec jekyll build --destination /opt/blog_staging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;JEKYLL_ENV&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;production&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="act_runner-kein-schreibzugriff-auf-gemfilelock"&gt;act_runner: Kein Schreibzugriff auf &lt;code&gt;Gemfile.lock&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;Dies schlägt wieder fehl - wegen fehlender Schreibrechte des &lt;code&gt;act_runner&lt;/code&gt;:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;gitea-runner-1 | [Deploy Jekyll site/build] | `/workspace/schallbert/blog/Gemfile.lock`. It is likely that you need to grant&#10;gitea-runner-1 | [Deploy Jekyll site/build] | write permissions for that path.&#10;gitea-runner-1 | [Deploy Jekyll site/build] ❌ Failure - Main ---INSTALL GEMS ---&#10;gitea-runner-1 | [Deploy Jekyll site/build] exitcode &amp;#39;23&amp;#39;: failure&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nach langer Suche muss ich feststellen, dass &lt;code&gt;Gemfile.lock&lt;/code&gt; auf meinem Rechner nicht der Versionskontrolle unterliegt, da es in der &lt;code&gt;.gitignore&lt;/code&gt; auftaucht. Der Bundler des &lt;code&gt;act_runner&lt;/code&gt; versucht nun also, diese Datei selbst aus der &lt;code&gt;Gemfile&lt;/code&gt; zu erzeugen und scheitert, weil keine Schreibrechte auf dem Repository bzw. der temporären Kopie vorliegen.&lt;/p&gt;&#10;&lt;p&gt;Dies lässt sich am besten beheben, indem die &lt;code&gt;Gemfile.lock&lt;/code&gt; in die Versionskontrolle aufgenommen wird, d.h. aus der &lt;code&gt;.gitignore&lt;/code&gt; verschwindet. Somit stelle ich sicher, dass ich für das lokale Bauen auf meinem Laptop dieselben Umgebungsbedingungen habe wie auf dem Server.&lt;/p&gt;&#10;&lt;h2 id="update-nov-2025"&gt;Update Nov-2025&lt;/h2&gt;&#10;&lt;p&gt;Nach einem Update meiner lokalen Bildumgebung per &lt;code&gt;bundle update&lt;/code&gt; stellt sich bei mir nun erneut das oben genannte Problem, obwohl ich &lt;code&gt;Gemfile.lock&lt;/code&gt; inzwischen versioniere. Die Lösung diskutiere ich in einem &lt;a href="https://blog.schallbert.de/bundler-ci-gemfile-issue/"&gt;Artikel zum Thema Bundler&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="abhängigkeiten-sass-embedded"&gt;Abhängigkeiten: &lt;code&gt;sass-embedded&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;Nach weniger als 20 Sekunden die nächste Fehlermeldung:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;Resolving dependencies...&#10;Could not find gem &amp;#39;sass-embedded (= 1.69.5)&amp;#39; with platform &amp;#39;x86_64-linux&amp;#39; in&#10;rubygems repository https://rubygems.org/ or installed locally.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nach weiteren Minuten der Recherche die &lt;a href="https://github.com/helaili/jekyll-action/issues/150#issuecomment-1374388728" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Lösung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;: In der Gemfile eine bestimmte Version des &lt;code&gt;jekyll-sass-converter&lt;/code&gt; spezifizieren oder alternativ das Gem &amp;ldquo;github-pages&amp;rdquo; in der Gemfile belassen. Dieses kümmert sich ebenfalls darum, dass der CascadingStyleSheets (CSS) Präprozessor &lt;a href="https://sass-lang.com/guide/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Sass&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; vorhanden ist.&lt;/p&gt;&#10;&lt;p&gt;Nun endlich läuft &lt;code&gt;bundle install&lt;/code&gt; erfolgreich durch:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;✅ Bundle complete! 5 Gemfile dependencies, 43 gems now installed.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="jekyll-build"&gt;jekyll build&lt;/h2&gt;&#10;&lt;p&gt;Damit Jekyll die gebauten Dateien auch irgendwo abspeichern kann, habe ich dem &lt;code&gt;act_runner&lt;/code&gt; in der &lt;code&gt;docker-compose.yml&lt;/code&gt; ein weiteres &lt;a href="https://docs.docker.com/storage/volumes/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Volume&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; gegönnt:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# gitea/docker-compose.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./runner/blog_staging:/opt/blog_staging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./runner/data:/data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und jetzt direkt nochmal probieren, ob Jekyll erfolgreich baut:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; Destination: /opt/blog_staging&#10; Generating... &#10; Jekyll Feed: Generating feed for posts&#10;jekyll 3.9.3 | Error: Permission denied @ dir_s_mkdir - /opt/blog_staging&#10;/usr/local/lib/ruby/3.2.0/fileutils.rb:406:in `mkdir&amp;#39;: Permission denied @ dir_s_mkdir - /opt/blog_staging (Errno::EACCES)&#10;&#9;from /usr/local/lib/ruby/3.2.0/fileutils.rb:406:in `fu_mkdir&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Auch dieses Problem lässt sich leicht lösen, indem man entweder nach &lt;code&gt;/tmp&lt;/code&gt; baut, wo der user &lt;code&gt;jekyll&lt;/code&gt; während des Bauens ebenfalls Zugriff hat, oder indem man der Action vor dem &lt;code&gt;jekyll build&lt;/code&gt;-Befehl einen Nutzerwechsel im Build-Arbeitsverzeichnis vornimmt: &lt;code&gt;chown -R jekyll /opt/blog_staging&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Mit dieser Änderung läuft die Action endlich durch.&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-09_buildsuccessful.jpg" alt="Image: Gitea snapshot showing a successful build" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;&lt;h2 id="artefakte-transferieren"&gt;Artefakte transferieren&lt;/h2&gt;&#10;&lt;p&gt;Doch wo finde ich jetzt die in der Action gebauten Dateien, welche mein Webserver dann veröffentlichen soll? Der &lt;code&gt;_site&lt;/code&gt;-Ordner ist nirgendwo zu finden - weder auf dem Volume der Hostmaschine, noch im Gitea-Dockercontainer oder im Runner!&lt;/p&gt;&#10;&lt;h3 id="docker-volumes-für-act_runner-können-artefakte-nicht-verteilen"&gt;Docker volumes für &lt;code&gt;act_runner&lt;/code&gt; können Artefakte nicht verteilen&lt;/h3&gt;&#10;&lt;p&gt;Dass ich über Docker volumes nicht dort herankomme erscheint logisch wenn man weiß, wie &lt;code&gt;act-runner&lt;/code&gt; funktioniert: Die Action erzeugt ein eigenes Dockerimage mit wiederum per Task-ID assoziierten Volumes, welches nur für dessen Laufzeit existiert.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;DRIVER VOLUME NAME&#10;--&amp;gt; local GITEA-ACTIONS-TASK-84_WORKFLOW-Deploy-Jekyll-site_JOB-build &amp;lt;--&#10;--&amp;gt; local GITEA-ACTIONS-TASK-84_WORKFLOW-Deploy-Jekyll-site_JOB-build-env &amp;lt;--&#10;local act-toolcache&#10;local blog_staging&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Legt man die Artefakte also nirgendwo extern ab, so werden sie nach Durchlauf der Aktionen zusammen mit dem Image demontiert und sind futsch. Das &lt;a href="https://blog.schallbert.de/gitea-action-runner-jekyll-dockerimage/#jekyll-build"&gt;oben&lt;/a&gt; angelegte Volume des Runners hat gar keine Auswirkung auf die Action, weil sie wieder in einem isolierten Image läuft.&lt;/p&gt;&#10;&lt;p&gt;Dies zu verstehen hat mich einige Zeit und Fehlversuche gekostet, dabei ist es &lt;a href="https://docs.gitea.com/usage/actions/act-runner?_highlight=runner#register-the-runner-with-docker" target="_blank" rel="noopener noreferrer" class="external-link"&gt;in einem Abschnitt der Dokumentation&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; beschrieben.&lt;/p&gt;&#10;&lt;p&gt;Das Ganze gestaltet sich ja deutlich komplizierter als ich dachte. Mit Kanonen auf Spatzen schießen angesichts meiner kleinen Website und als Einziger, der sie pflegt. Egal, ich ziehe das jetzt durch.&lt;/p&gt;&#10;&lt;h3 id="aber-man-kann-doch-upload-artifact-verwenden"&gt;Aber man kann doch &lt;code&gt;upload-artifact&lt;/code&gt; verwenden!&lt;/h3&gt;&#10;&lt;p&gt;Na ja, das dachte ich jedenfalls. Also habe ich mein Action-Skript entsprechend erweitert und die von Github Actions zur Verfügung gestellte Funktion eingebaut:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# workflows/jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Automatically upload the build folder to Giteas blog repo folder&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: --- &lt;span style="color:#ae81ff"&gt;UPLOAD ARTIFACT ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/upload-artifact@v3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/workspace/schallbert/blog/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Blog_Staging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;retention-days&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Super, jetzt erscheint ein herunterladbares Zip-file auf der Weboberfläche von Gitea:&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-09_uploadsuccessful.jpg" alt="Image: Gitea snapshot showing a successful artifact upload" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Nur: Wie bekomme ich das Ding jetzt automatisiert auf meine Serverinstanz? Schließlich kennt die Action diese nicht - sie hat ja nicht einmal einen eigenen Docker Daemon.&lt;/p&gt;&#10;&lt;p&gt;Also schaue ich mal im Gitea-Container selbst nach, wo die Artefakte unter &lt;code&gt;/data/gitea/actions_artifacts/BUILD_ID&lt;/code&gt; abgelegt sind. Allerdings als ein Haufen (hunderte) &lt;code&gt;.chunk.gz&lt;/code&gt; Dateien mit kryptischen Nummernfolgen als Name, bei denen ich wiederum nicht weiß wie ich sie zu einem Archiv zusammenfügen soll.&lt;/p&gt;&#10;&lt;p&gt;Und noch etwas gefällt mir an &lt;code&gt;upload-artifact&lt;/code&gt; nicht: Da meine Website inzwischen eine Menge Bilder, Audiodateien und Videos enthält, ist sie recht groß. Daher benötigt der uploader für&amp;rsquo;s Verpacken und Versenden schon jetzt &lt;em&gt;fast zwei Minuten&lt;/em&gt; - Tendenz linear steigend mit der Anzahl meiner Medieninhalte.&lt;/p&gt;&#10;&lt;p&gt;Sackgasse.&lt;/p&gt;&#10;&lt;h3 id="auch-docker-cp-funktioniert-in-diesem-falle-nicht"&gt;Auch Docker &lt;code&gt;cp&lt;/code&gt; funktioniert in diesem Falle nicht&lt;/h3&gt;&#10;&lt;p&gt;Dann versuche ich mit Hilfe des Kopierbefehls von Docker, die Artefakte auf meinen Host zu transferieren:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# workflows/jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: --- &lt;span style="color:#ae81ff"&gt;COPY ARTIFACT ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;docker cp gitea-runner-1:/workspace/schallbert/blog /tmp/blog_staging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dies schlägt wieder fehl:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | docker cp gitea-runner-1:/workspace/schallbert/blog /tmp/blog_staging&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; | /var/run/act/workflow/3.sh: line 2: docker: not found&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ❌ Failure - Main --- COPY ARTIFACT ---&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Auch erwartbar, denn der Action-Container selbst kennt kein Docker. Es ist also nicht möglich, etwas von &amp;ldquo;innerhalb&amp;rdquo; des Containers per Docker heraus zu bekommen. Dies ist für mich aber erforderlich, da die Action ja den ganzen Prozess vollständig automatisieren soll.&lt;/p&gt;&#10;&lt;p&gt;Oder geht es doch irgendwie? Der Daemon der Hostmaschine &lt;code&gt;docker.sock&lt;/code&gt; steht laut Giteas Dokumentation zumindest dem &lt;code&gt;act_runner&lt;/code&gt; per Volume zur Verfügung - wird aber scheinbar nicht in die Action weitergeleitet. Vielleicht aus gutem Grund, sonst wäre die Kapselung futsch und eine schadhafte Action könnte praktisch meinen Docker Daemon auf dem Host kapern 😰.&lt;/p&gt;&#10;&lt;h3 id="transferieren-per-sftp-würde-klappen"&gt;Transferieren per SFTP würde klappen&lt;/h3&gt;&#10;&lt;p&gt;So langsam gehen mir die Alternativen aus. Ich überlege nun, die Artefakte per &lt;a href="https://de.wikipedia.org/wiki/SSH_File_Transfer_Protocol" target="_blank" rel="noopener noreferrer" class="external-link"&gt;SFTP&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; aus dem vom &lt;code&gt;act_runner&lt;/code&gt; erzeugten Action-Dockerimage heraus in den Webserver-Container zu schieben&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-09_sftp_infrastructure.jpg" alt="Image: Machine architecture if I used SFTP for artifact share between Gitea and webserver" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Glücklicherweise gibt es hierfür wieder eine vorgefertigte Action: &lt;a href="https://github.com/marketplace/actions/scp-files" target="_blank" rel="noopener noreferrer" class="external-link"&gt;scp-files&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Nun muss ich aber den Container des Webservers so umbauen, dass er per SCP erreichbar ist und den SSH-Schlüssel der Action akzeptiert.&lt;/p&gt;&#10;&lt;p&gt;Andererseits wird davor &lt;a href="https://stackoverflow.com/questions/65381311/run-sshd-in-docker-container" target="_blank" rel="noopener noreferrer" class="external-link"&gt;in vielen Foren&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; gewarnt - Ein Container sollte nur eine Applikation beherbergen. Aber auch hier gibt es eine Lösung: &lt;a href="https://hub.docker.com/r/panubo/sshd/#!" target="_blank" rel="noopener noreferrer" class="external-link"&gt;ein eigener Docker-Container mit SSH-Daemon&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Diesem könnte ich dann ein Volume geben, welches er mit dem Webserver teilt.&lt;/p&gt;&#10;&lt;p&gt;Sieht leider nach einigem Aufwand aus. Und ich möchte als fauler Entwickler mein System so einfach wie möglich halten - also recherchiere ich weiter.&lt;/p&gt;&#10;&lt;h3 id="action-volumes"&gt;Dem Action-Container ein Volume zur Verfügung stellen&lt;/h3&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-12-09_gitea_infrastructure.jpg" alt="Image: Docker-Gitea infrastructure overview" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Diese ganzen Fehlschläge und Sackgassen begleiten mich jetzt schon seit über einem Monat. Ich will es trotzdem unbedingt schaffen, vollautomatisch bauen, testen und veröffentlichen zu können. Auf dem Weg hierhin habe ich eine Menge gelernt und jetzt hoffe ich, dass dieser Ansatz mich endlich zur Lösung bringt.&lt;/p&gt;&#10;&lt;p&gt;Bei &lt;a href="https://gitea.com/gitea/act_runner/issues/329" target="_blank" rel="noopener noreferrer" class="external-link"&gt;meiner Suche&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; stieß ich auf &lt;a href="https://gitea.com/gitea/act_runner/src/branch/main/internal/pkg/config/config.example.yaml" target="_blank" rel="noopener noreferrer" class="external-link"&gt;die Möglichkeit, die Konfiguration des Runners&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zu verändern. So könnte ich am Ende vielleicht doch noch ein Volume einbinden, welches ich zwischen der Action und meinem Server über den Daemon auf dem Host teilen kann.&lt;/p&gt;&#10;&lt;p&gt;Wenn das klappt, hätte ich kein zusätzliches Sicherheitsrisiko wie ein öffentlich verfügbarer &lt;code&gt;file transfer container&lt;/code&gt; oder die langen Wartezeiten durch &lt;code&gt;upload-artifact&lt;/code&gt;. Also frisch ans Werk! Es gibt noch &lt;a href="https://gitea.com/gitea/act_runner/issues/407" target="_blank" rel="noopener noreferrer" class="external-link"&gt;weitere Gründe&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, weswegen Volumes in der jeweiligen Action Sinn machen können - es muss also bereits Leute da draußen geben, die das hinbekommen haben.&lt;/p&gt;&#10;&lt;p&gt;Ich versuche also, die Volumes im Action-Skript anzulegen:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# workflows/jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;container&lt;/span&gt;: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jvconseil/jekyll-docker:latest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/tmp/blog_staging:/blog_staging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/opt/cache:/opt/hostedtoolcache&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Doch irgendwie landen die Artefakte noch immer nicht auf der Platte meines Hosts. Ich vereinfache die Action soweit, dass ich nur noch prüfe, ob die Erzeugung des Volumes auch einen entsprechenden Ordner anlegt:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# workflows/jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: --- &lt;span style="color:#ae81ff"&gt;CHECK_VOLUME ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ls -al /blog_staging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;und schon schlägt die Aktion wieder fehl:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;gitea-runner-1 | [Deploy Jekyll site/build] [DEBUG] Working directory &amp;#39;/workspace/schallbert/blog&amp;#39;&#10;gitea-runner-1 | [Deploy Jekyll site/build] | ls: /blog_staging: No such file or directory&#10;gitea-runner-1 | [Deploy Jekyll site/build] ❌ Failure - Main --- CHECK_VOLUME ---&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nach ein paar weiteren, erfolglosen Versuchen (vielleicht hatte ich etwas falsch geschrieben?) und langer Recherche in den Foren fand ich heraus, dass es das &lt;a href="https://gitea.com/gitea/act_runner/issues/329" target="_blank" rel="noopener noreferrer" class="external-link"&gt;valid_volumes&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Attribut im &lt;code&gt;act&lt;/code&gt; gibt - taucht das Volume dort nicht auf, so wird es auch nicht eingebunden.&lt;/p&gt;&#10;&lt;p&gt;OK, also schnell der Action hinzugefügt:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# jekyll-build-action.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;container&lt;/span&gt;: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jvconseil/jekyll-docker:latest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;valid_volumes&lt;/span&gt;: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;**&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# This does not work. Also specialized lists indicating the volumes directly won&amp;#39;t work&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/tmp/blog_staging:/blog_staging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/opt/cache:/opt/hostedtoolcache&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aber immer noch nichts. Immerhin kann ich in den Logs mit dem Wissen über &lt;code&gt;valid_volumes&lt;/code&gt; jetzt eine Warnung entdecken:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;/tmp/blog_staging&lt;span style="color:#f92672"&gt;]&lt;/span&gt; is not a valid volume, will be ignored&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;/opt/cache&lt;span style="color:#f92672"&gt;]&lt;/span&gt; is not a valid volume, will be ignored&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Etwas stimmt mit der Übergabe dieser Option nicht. Also recherchiere ich weiter. Es gibt &lt;a href="https://gitea.com/gitea/act_runner/issues/407" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Berichte&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, in denen das Anmelden der Volumes funktioniert. Also erzeuge ich nach &lt;a href="https://gitea.com/gitea/act_runner/src/branch/main#configuration" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Anleitung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; eine Konfigurationsdatei, wo ich das Folgende eintrage:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# runner/config.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Volumes (including bind mounts) can be mounted to containers. Glob syntax is supported, see https://github.com/gobwas/glob&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# You can specify multiple volumes. If the sequence is empty, no volumes can be mounted.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# For example, if you only allow containers to mount the `data` volume and all the json files in `/src`, you should change the config to:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# valid_volumes:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - /src/*.json&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# If you want to allow any volume, please use the following configuration:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# valid_volumes:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - &amp;#39;**&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;valid_volumes&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;/tmp/blog_staging&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;/opt/hostedtoolcache&amp;#34;&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Wichtig:&lt;/em&gt; Die Notation muss als String vorliegen, kommasepariert, und gibt stets die &lt;code&gt;Source&lt;/code&gt; des Volumes an. Also den Teil, der vor dem &lt;code&gt;:&lt;/code&gt; steht.&#10;Doch noch immer erscheint beim Bauen die Fehlermeldung &amp;ldquo;not a valid volume&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Doch dann fällt mir auf, dass die Config dem &lt;code&gt;act_runner&lt;/code&gt; selbst als Volume zur Verfügung gestellt werden muss - sonst kann der im Container laufende Runner ja gar nicht darauf zugreifen!&lt;/p&gt;&#10;&lt;p&gt;Daher sieht meine &lt;code&gt;docker-compose.yml&lt;/code&gt; für Gitea, Abschnitt &amp;ldquo;runner&amp;rdquo; nun wie folgt aus:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# gitea/docker-compose.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runner&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;gitea/act_runner:latest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;CONFIG_FILE=/config.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GITEA_INSTANCE_URL=https://git.schallbert.de&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GITEA_RUNNER_NAME=ichlaufe&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GITEA_RUNNER_REGISTRATION_TOKEN= &amp;lt;redacted&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./runner/config.yml:/config.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./runner/data:/data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/opt/hostedtoolcache:/opt/hostedtoolcache&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und endlich:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | ls -al /blog_staging&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; | total &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; | drwxr-xr-x &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; Dec &lt;span style="color:#ae81ff"&gt;27&lt;/span&gt; 07:32 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; | drwxr-xr-x &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; Dec &lt;span style="color:#ae81ff"&gt;27&lt;/span&gt; 07:46 ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Deploy Jekyll site/build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ✅ Success - Main --- CHECK_VOLUME ---&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Was für ein Akt. Ich bin so froh, dass jetzt alles durchläuft und ich auf meinem lokalen Hostsystem tatsächlich die gebauten Dateien vorfinde! 🥳&lt;/p&gt;&#10;&lt;h2 id="reverse-proxy-connection-refused"&gt;Noch ein letzter Tipp&lt;/h2&gt;&#10;&lt;p&gt;Wenn ihr so wie ich mit einem Reverse Proxy arbeitet und so komische &lt;code&gt;connection refused&lt;/code&gt; Fehlermeldungen beim Hochfahren des Runners erhaltet wie:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;+&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Running 2/0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✔ Container gitea Created 0.0s &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✔ Container gitea-runner-1 Created 0.0s &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Attaching to gitea, gitea-runner-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | level&lt;span style="color:#f92672"&gt;=&lt;/span&gt;info msg&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Starting runner daemon&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | level&lt;span style="color:#f92672"&gt;=&lt;/span&gt;error msg&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;fail to invoke Declare&amp;#34;&lt;/span&gt; error&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;unavailable: dial tcp &amp;lt;address&amp;gt;: connect: connection refused&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 | Error: unavailable: dial tcp &amp;lt;address&amp;gt; connect: connection refused&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea | Server listening on :: port 22.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitea-runner-1 exited with code &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dann ist euer Reverse Proxy entweder falsch eingestellt oder - wie in meinem Falle - nicht hochgefahren.&lt;/p&gt;&#10;&lt;div class="footnotes" role="doc-endnotes"&gt;&#10;&lt;hr&gt;&#10;&lt;ol&gt;&#10;&lt;li id="fn:1"&gt;&#10;&lt;p&gt;Die Nutzung des SFTP (Secure File Transfer Protocol), also der Dateitransfer über ssh (secure shell), erhöht die Angriffsfläche meines Systems ein wenig. Der SSH-Dienst ist nämlich dann nicht nur für meine Action, sondern ganz allgemein von außen erreichbar.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>🗙 Gitea Actions - Jekyll Workflow</title><link>https://blog.schallbert.de/gitea-action-runner-native-jekyll/</link><pubDate>Thu, 30 Nov 2023 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/gitea-action-runner-native-jekyll/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-11-30_ghaction-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: github actions workflow to build Jekyll page"&#10; title="🗙 Gitea Actions - Jekyll Workflow" /&gt;&#10;&lt;p&gt;Nachdem ich in &lt;a href="https://blog.schallbert.de/projects/move-blog-to-own-server/"&gt;diesem Projekt&lt;/a&gt; meinen eigenen, kleinen Server aufgesetzt und mit den entsprechenden Programmen zum Hosten meines Blogs ausgestattet habe, möchte ich ihn nun in die Lage versetzen, die Website automatisch zu bauen.&lt;/p&gt;&#10;&lt;h2 id="gewünschter-ablauf"&gt;Gewünschter Ablauf&lt;/h2&gt;&#10;&lt;p&gt;Ich möchte folgendes erreichen: Sobald Gitea eine &lt;code&gt;push&lt;/code&gt;-Aktion auf dem Blog-Repository verzeichnet, soll ein Action Runner in einem eigenen Docker-Container loslaufen und Ruby, Bundler, Jekyll sowie sämtliche Abhängigkeiten nachladen. Dann soll der Runner meine Quelldateien für den Blog kopieren und dem &lt;code&gt;bundle exec jekyll build&lt;/code&gt; Prozess zur Verfügung stellen, welcher dann die Website baut und schließlich im &lt;code&gt;_site&lt;/code&gt;-Ordner ablegt. Anschließend soll der Runner sich selbst beenden und alle in Anspruch genommenen Ressourcen wieder freigeben.&lt;/p&gt;&#10;&lt;p&gt;An dieser Stelle möchte ich nachkontrollieren können, ob die Website fehlerfrei gebaut wurde und in Zukunft eventuell noch ein paar weitere Prüfungen darüberlaufen lassen - z.B. kaputte Links erkennen, nicht angezeigte Bilder markieren, Rechtschreibprüfung durchführen.&lt;/p&gt;&#10;&lt;p&gt;Die Freigabe sowie die Veröffentlichung soll dann ein anderer Prozess übernehmen, um den ich mich später kümmere.&lt;/p&gt;&#10;&lt;h2 id="ausgangspunkt-github-actions"&gt;Ausgangspunkt: Github Actions&lt;/h2&gt;&#10;&lt;p&gt;Wie üblich wildere ich erst einmal bei anderen Menschen, die ein ähnliches Problem für sich bereits gelöst haben. Ich wurde im &lt;a href="https://github.com/actions/starter-workflows/blob/main/pages/jekyll.yml" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Github Actions starter-workflows&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Repository von Github selbst fündig und habe die Workflowdatei für Jekyll mit leichten Modifikationen direkt mal mit meiner Gitea-Instanz ausprobiert:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# jekyll-build-pages.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Sample workflow for building and deploying a Jekyll site&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Deploy Jekyll site&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;run-name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${{ gitea.actor }} builds Jekyll site&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;push]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;jobs&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Build job&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;build&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Checkout&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/checkout@v3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Setup Ruby&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf&lt;/span&gt; &lt;span style="color:#75715e"&gt;# v1.146.0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ruby-version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.1&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Not needed with a .ruby-version file&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;bundler-cache&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#75715e"&gt;# runs &amp;#39;bundle install&amp;#39; and caches installed gems automatically&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cache-version&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Increment this number if you need to re-download cached gems&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#[...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nachdem ich diesen Workflow in mein Blogverzeichnis unter &lt;code&gt;workflows/jekyll.yml&lt;/code&gt; hochgeladen hatte, lief der Runner tatsächlich direkt los:&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-11-30_rubyfails.jpg" alt="Image: Gitea action runner returns error on ruby install" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="probleme-mit-der-ruby-installation"&gt;Probleme mit der Ruby-Installation&lt;/h2&gt;&#10;&lt;p&gt;Schon mal prima. Allerdings wenig erbaulich, dass bereits bei der Installation von Ruby etwas nicht passt. Werfen wir einen Blick in die Logs:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;::error::The current runner (debian-11-x64) was detected as self-hosted because the platform does not match a GitHub-hosted runner image &#10;(or that image is deprecated and no longer supported).&#10;In such a case, you should install Ruby in the $RUNNER_TOOL_CACHE yourself, for example using https://github.com/rbenv/ruby-build&#10;You can take inspiration from this workflow for more details: &#10;https://github.com/ruby/ruby-builder/blob/master/.github/workflows/build.yml&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Na, das ist doch mal eine hilfreiche Fehlermeldung!&lt;/p&gt;&#10;&lt;p&gt;Der Runner läuft um Ressourcen zu sparen standardmäßig im Docker mit einem abgespeckten Image basierend auf Debian namens &lt;code&gt;node:16-bullseye&lt;/code&gt; &lt;a href="https://github.com/nektos/act/blob/master/IMAGES.md" target="_blank" rel="noopener noreferrer" class="external-link"&gt;(Referenz)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Scheinbar ist dieser nicht kompatibel mit dem unter Ubuntu22 betriebenen Github Actions Runner. Ich habe also ein paar Lösungsmöglichkeiten zur Verfügung:&lt;/p&gt;&#10;&lt;h3 id="möglichkeiten-zur-fehlerbehebung"&gt;Möglichkeiten zur Fehlerbehebung&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Den Runner über seine &amp;ldquo;Labels&amp;rdquo; auf Ubuntu22.04 umsatteln.&lt;/li&gt;&#10;&lt;li&gt;Ren Runner nicht im Docker, sondern nativ auf dem Server laufen lassen.&lt;/li&gt;&#10;&lt;li&gt;Wie in der Fehlermeldung vorgeschlagen, Ruby im Cache des Runners vorinstallieren.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/gitea-action-runner-jekyll-dockerimage/"&gt;Ein Jekyll-Dockerimage verwenden&lt;/a&gt;, welches Jekyll bereits im Gepäck hat und nicht erst die Installation benötigt.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="den-runner-mit-ubuntu22-statt-node16-betreiben"&gt;Den Runner mit Ubuntu22 statt Node16 betreiben&lt;/h3&gt;&#10;&lt;p&gt;Das entsprechende &lt;a href="https://hub.docker.com/_/ubuntu" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Dockerimage&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; existiert zwar. Aber es kostet aber einen Haufen Speicherplatz auf meinem Server, benötigt durch seinen größeren Funktionsumfang mehr RAM und braucht vor allem länger, bis es hochgefahren ist.&lt;/p&gt;&#10;&lt;p&gt;Und Zeit ist bei Runnern wertvoll, schließlich will ich ja möglichst schnell wissen, ob das Bauen geklappt hat.&lt;/p&gt;&#10;&lt;h3 id="den-runner-direkt-auf-der-hostmaschine-ubuntu22-laufen-lassen"&gt;Den Runner direkt auf der Hostmaschine (Ubuntu22) laufen lassen&lt;/h3&gt;&#10;&lt;p&gt;Ist sicherheitstechnisch nicht so sehr zu empfehlen (Bei &lt;a href="https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches" target="_blank" rel="noopener noreferrer" class="external-link"&gt;einem ungeschützten Branch&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; würde der Runner von Dritten per &lt;code&gt;git push --force&lt;/code&gt; hochgeschobenen Schadcode unbesehen auf meiner Hostmaschine ausführen) und zudem ginge die Portabilität flöten, weil ich das Zielsystem des Runners dann fest verdrahte.&lt;/p&gt;&#10;&lt;h3 id="gitea-act_runner-direkt-auf-dem-host-laufen-lassen"&gt;Gitea act_runner direkt auf dem Host laufen lassen&lt;/h3&gt;&#10;&lt;p&gt;Für den zweiten Ansatz habe ich mir per &lt;a href="https://docs.gitea.com/1.23/usage/actions/act-runner/#configuration" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Anleitung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; eine Konfiguration für den &lt;code&gt;runner&lt;/code&gt; angelegt und darin das bestehende label-mapping so geändert, dass nicht mehr in Richtung Docker, sondern auf dem Ubuntu des Servers selbst gebaut wird. Dafür genügt es in meinem Fall, das Label &lt;code&gt;ubuntu-latest:host&lt;/code&gt; statt &lt;code&gt;ubuntu-latest&lt;/code&gt; in die Konfiguration zu schreiben. Leider erhielt ich hier Fehlermeldungen bei den Zugriffsrechten des Runners, welcher aus Docker heraus auf dem Hostsystem laufen müsste.&lt;/p&gt;&#10;&lt;p&gt;Nicht so schlimm, ich wollte diese Lösung wegen der oben beschriebenen möglichen Probleme sowieso nicht dauerhaft verwenden. Also investiere ich hier keine weitere Zeit.&lt;/p&gt;&#10;&lt;h3 id="ruby-im-cache-vorinstallieren"&gt;Ruby im Cache vorinstallieren&lt;/h3&gt;&#10;&lt;p&gt;Wie von der Fehlermeldung empfohlen habe ich &lt;a href="https://about.gitea.com/resources/tutorials/enable-gitea-actions-cache-to-accelerate-cicd" target="_blank" rel="noopener noreferrer" class="external-link"&gt;dieser Anleitung folgend&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; in der &lt;code&gt;docker-compose.yml&lt;/code&gt; von Gitea ein Volume angelegt für den Tool Cache des runners und das Zielverzeichnis in der Umgebungsvariable &lt;code&gt;RUNNER_TOOL_CACHE&lt;/code&gt; abgelegt.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# gitea/docker-compose.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [...]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;runner&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;gitea/act_runner:nightly&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GITEA_INSTANCE_URL=&amp;lt;redacted&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GITEA_RUNNER_NAME=&amp;lt;redacted&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;RUNNER_TOOL_CACHE=/opt/hostedtoolcache&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;GITEA_RUNNER_REGISTRATION_TOKEN= &amp;lt;redacted&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./runner/data:/data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/opt/hostedtoolcache:/opt/hostedtoolcache&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hiermit wird dem in Docker laufenden Runner der Ordner &lt;code&gt;/opt/hostedtoolcache&lt;/code&gt; im Dateisystem des Hosts unter dem Namen &lt;code&gt;/opt/hostedtoolcache&lt;/code&gt; zur Verfügung gestellt.&#10;Nun probiere ich mal, Ruby direkt dort hinein zu installieren.&lt;/p&gt;&#10;&lt;p&gt;Also lade ich das &lt;a href="https://github.com/rbenv/ruby-build" target="_blank" rel="noopener noreferrer" class="external-link"&gt;&lt;code&gt;ruby-build&lt;/code&gt;&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; repository herunter (&lt;code&gt;git clone&lt;/code&gt;) und lasse das Installerscript mit &lt;code&gt;./ruby-build/install.sh&lt;/code&gt; durchlaufen.&#10;Danach führe ich den Build mit dem in der Fehlermeldung angegebenen Pfad aus: &lt;code&gt;ruby-build 3.1.4 /opt/hostedtoolcache/Ruby/3.1.4/x64&lt;/code&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;==&amp;gt; Downloading openssl-3.1.4.tar.gz...&#10; % Total % Received % Xferd Average Speed Time Time Time Current&#10; Dload Upload Total Spent Left Speed&#10;100 14.8M 100 14.8M 0 0 81.3M 0 --:--:-- --:--:-- --:--:-- 81.1M&#10;==&amp;gt; Installing openssl-3.1.4...&#10;&#10;BUILD FAILED (Ubuntu 22.04 on x86_64 using ruby-build 20231114)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="probleme-mit-prebuilt-ruby"&gt;Probleme mit prebuilt-Ruby&lt;/h3&gt;&#10;&lt;p&gt;Das Log zeigt das Problem:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[...] No C compiler found, please specify one with the environment variable CC [...]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Also tippe ich &lt;code&gt;apt install build-essential&lt;/code&gt; und stelle dann mit &lt;code&gt;which gcc&lt;/code&gt; fest, dass er nun unter &lt;code&gt;/usr/bin/gcc&lt;/code&gt; installiert ist. Auf ein Neues!&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;crypto/comp/c_zlib.c:36:11: fatal error: zlib.h: No such file or directory&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dann schnell &lt;code&gt;apt install libz-dev&lt;/code&gt; eingeben und erneut probieren. Dieses mal läuft er recht lange, dann:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;*** Following extensions are not compiled:&#10;openssl:&#10; Could not be configured. It will not be installed.&#10; /tmp/ruby-build.20231205114312.9174.0gmhNf/ruby-3.1.4/ext/openssl/extconf.rb:100: OpenSSL library could not be found. You might Check ext/openssl/mkmf.log for more details.&#10;readline:&#10; Could not be configured. It will not be installed.&#10; /tmp/ruby-build.20231205114312.9174.0gmhNf/ruby-3.1.4/ext/readline/extconf.rb:62: Neither readline nor libedit was found&#10; Check ext/readline/mkmf.log for more details.&#10;*** Fix the problems, then remove these directories and try again if you want.&#10;[...]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OK, nun ist es openssl. Fix nachinstallieren mit &lt;code&gt;apt install libssl-dev&lt;/code&gt; sowie &lt;code&gt;apt install libreadline-dev&lt;/code&gt; und endlich 🎉:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;Installed ruby-3.1.4 to /opt/hostedtoolcache/Ruby/3.1.4/x64&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="noch-immer-fehler-beim-bauen-mit-dem-github-acitons-script"&gt;Noch immer Fehler beim Bauen mit dem Github-Acitons script&lt;/h2&gt;&#10;&lt;p&gt;Merkwürdig, das Log spuckt mir immer noch denselben Fehler aus:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;💬 ::debug::isExplicit: 3.1.4&#10;&#10;gitea-runner-1 | [Deploy Jekyll site/build] 💬 ::debug::checking cache: /opt/hostedtoolcache/Ruby/3.1.4/x64&#10;gitea-runner-1 | [Deploy Jekyll site/build] | ::debug::checking cache: /opt/hostedtoolcache/Ruby/3.1.4/x64&#10;gitea-runner-1 | [Deploy Jekyll site/build] 💬 ::debug::not found&#10;gitea-runner-1 | [Deploy Jekyll site/build] | ::debug::not found&#10;gitea-runner-1 | [Deploy Jekyll site/build] ❗ ::error::The current runner (debian-11-x64) was detected as self-hosted&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das geht auf folgende Abfage in der ausführenden &lt;a href="https://github.com/ruby/setup-ruby/blob/master/ruby-builder.js#L97" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Action&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zurück:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// setup-ruby/ruby-builder.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;common&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;shouldUseToolCache&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt;)) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;inToolCache&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;common&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toolCacheFind&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;inToolCache&lt;/span&gt;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;rubyPrefix&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;inToolCache&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;toolCacheRubyPrefix&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;common&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getToolCacheRubyPrefix&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;platform&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;common&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;isSelfHostedRunner&lt;/span&gt;()) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rubyBuildDefinition&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ruby&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;version&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;core&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;( [...] )&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="update-jan-2024"&gt;Update Jan-2024&lt;/h3&gt;&#10;&lt;p&gt;Es es gibt zwei weitere Möglichkeiten dafür, dass der &lt;code&gt;toolcache&lt;/code&gt; nicht gefunden wird:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Ich habe das Volume nicht der Action, sondern dem Runner zur Verfügung gestellt. Ich bin mir nicht sicher, dass die Daten auch in der Action verfügbar sind.&lt;/li&gt;&#10;&lt;li&gt;Der &lt;code&gt;toolcache&lt;/code&gt;-Pfad ist nicht in der Konfigurationsdatei des runners unter dem Eintrag &lt;code&gt;valid_volumes&lt;/code&gt; enthalten. Eine &lt;a href="https://gitea.com/gitea/act/pulls/60" target="_blank" rel="noopener noreferrer" class="external-link"&gt;pull request Kommunikation&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; lässt mich jedoch vermuten, dass dies automatisch passiert. Dennoch bin ich mir nicht 100% sicher, ob die Information noch dem Stand der Dinge entspricht.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="docker-volume-überprüfen"&gt;Docker volume überprüfen&lt;/h3&gt;&#10;&lt;p&gt;Mist. Prüfen wir schnell mal, ob Ruby in dem Volume auch wirklich verfügbar ist. Dafür suchen wir mit &lt;code&gt;docker ps&lt;/code&gt; die Container ID des runners heraus und geben sie bei folgendem Kommando ein:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it &amp;lt;containerID&amp;gt; bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dann navigiere ich in den gesuchten Ordner &lt;code&gt;cd /opt/hostedtoolcache&lt;/code&gt;, liste dort den Inhalt mit &lt;code&gt;ls&lt;/code&gt; und siehe da: &lt;code&gt;Ruby&lt;/code&gt;. Es liegt also alles vor, nur wird es nicht gefunden.&lt;/p&gt;&#10;&lt;h2 id="misserfolg-anerkennen"&gt;Misserfolg anerkennen&lt;/h2&gt;&#10;&lt;p&gt;So komme ich hier also nicht weiter 😖. Daher öffne ich mein Problem für die Community unter dem Titel &lt;a href="https://gitea.com/gitea/act_runner/issues/441" target="_blank" rel="noopener noreferrer" class="external-link"&gt;act_runner cannot find hostedtoolcache&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und probiere&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.schallbert.de/gitea-action-runner-jekyll-dockerimage/"&gt;einen anderen Ansatz&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="problemursache"&gt;Problemursache&lt;/h3&gt;&#10;&lt;p&gt;Der Support der Action &lt;code&gt;setup-ruby&lt;/code&gt; für selbsgehostete CI-Pipelines wie meinen &lt;code&gt;act_runner&lt;/code&gt; wurde &lt;a href="https://github.com/ruby/setup-ruby/issues/475#issuecomment-1455099634" target="_blank" rel="noopener noreferrer" class="external-link"&gt;wohl eingestellt&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Die Dokumentation mit den Hinweisen zur Fehlerbehebung bei Verwendung selbstgehosteter Runner allerdings zum Zeitpunkt der Verwendung durch meine Wenigkeit war aber noch nicht auf Stand gebracht worden.&lt;/p&gt;&#10;</description></item><item><title>Kleinteile fräsen</title><link>https://blog.schallbert.de/milling-small-parts/</link><pubDate>Wed, 01 Nov 2023 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/milling-small-parts/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-11-01_smallparts-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Milled small part, size comparison to a coin"&#10; title="Kleinteile fräsen" /&gt;&#10;&lt;h2 id="warum-kleine-teile-überhaupt-fräsen"&gt;Warum kleine Teile überhaupt fräsen?&lt;/h2&gt;&#10;&lt;p&gt;Es ist meist schwierig, sehr kleine Teile zu fertigen, zudem wenn sie nur in geringer Stückzahl benötigt werden. Spritzgießen lohnt sich hier nicht und 3D-Drucker wie sie im Hobbybereich eingesetzt werden sind erfüllen nicht die Toleranzanforderungen für meine Passungen. Die Laserschneider, auf die ich Zugriff habe, können das Teil ebenfalls nicht fertigen, weil es verschiedene Oberflächenhöhen hat. Auf die Option, das Teil in Fernost anfertigen zu lassen, möchte ich verzichten.&lt;/p&gt;&#10;&lt;p&gt;Dennoch: Diese Teile können auf einer Fräsmaschine gefertigt werden. Dieses Video zeigt, wie:&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/64TS5d5cp2eNqf8SSPvY77" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Kleinteile fräsen&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="welche-ausstattung-muss-die-maschine-dafür-besitzen"&gt;Welche Ausstattung muss die Maschine dafür besitzen?&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Einen Vakuumtisch&lt;/li&gt;&#10;&lt;li&gt;Eine Vakuumpumpe, vorzugsweise mit hohen Unterdrücken&lt;/li&gt;&#10;&lt;li&gt;Etwas Frischhaltefolie&lt;/li&gt;&#10;&lt;li&gt;Ein Vakuumvlies&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="wofür-ist-dieses-kleinteil"&gt;Wofür ist dieses Kleinteil?&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-11-01_smallparts_soapbutler.jpg" alt="Image: Video splash preview with soapbutler" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Das im Video gefertigte Teil gehört zu einem meiner &lt;a href="https://blog.schallbert.de/projects/seifenbutler/"&gt;Seifenbutler&lt;/a&gt;. Die aktuelle Version kann an jeder handelsüblichen Duschstange mit Durchmesser von &lt;code&gt;18-25mm&lt;/code&gt; befestigt werden und benötigt dieses Teilchen zum Klemmen. Es drückt sich an der Rückseite an die Stange und sorgt so dafür, dass der Seifenbutler weder verrutscht noch wackelt.&lt;/p&gt;&#10;&lt;p&gt;Mit diesem Upgrade gegenüber früheren Versionen ist der Seifenbutler nicht nur in der Lage, festes Shampoo zu halten, sondern auch die viel schwereren Shampooflaschen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-11-01_soapbutler_shampoobottle.jpg" alt="Image: black soapbutler holding a shampoo bottle" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Der &amp;ldquo;Klemmer&amp;rdquo; muss ohne merkliches Spiel in seine Führung passen und dennoch leichtgängig zu verschieben sein, um sich an verschiedene Duschstangendurchmesser anpassen zu können.&lt;/p&gt;&#10;&lt;h2 id="was-muss-noch-beachtet-werden"&gt;Was muss noch beachtet werden?&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Frischhaltefolie: Wenn Teile ausgeschnitten werden, sollten sie nicht zu groß sein. Ansonsten wird die Folie vom Fräser mitgerissen und hinterlässt hässliche Spuren im Werkstück. Außerdem kann sie eine Unwucht erzeugen, die bei hohen Drehzahlen zu Beschädigung des Fräsers oder sogar der Maschine führen kann. Um das Einziehen zu vermeiden hilft das Anbringen eines kleinen Stückes doppelseitigen Klebebandes auf dem auszuschneidenden Teil.&lt;/li&gt;&#10;&lt;li&gt;Vakuumvlies: Das Vlies wird bei Anlegen des Vakuums auf weniger als die Hälfte seiner Höhe zusammengepresst. Es ist also erforderlich, die Werkstückhöhe bei angelegtem Vakuum abzunullen.&lt;/li&gt;&#10;&lt;li&gt;Nicht ganz durchfräsen sondern eine dünne Materialschicht stehen lassen. Ihre Stärke hängt vom bearteiten Material ab. Bei PMMA lasse ich &lt;code&gt;0.3mm&lt;/code&gt; stehen, bei Holz &lt;code&gt;0.7mm&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Ich berücksichtige die Frischhaltefolie (etwa &lt;code&gt;10µm&lt;/code&gt; stark) nicht beim Einmessen der Werkstückhöhe, da sie sich in der Größenordnung meiner Maschinentoleranz befindet. Dickere Schutzfolien (&lt;code&gt;20-30µm&lt;/code&gt;), wie sie z.B. bei Plexiglas und Dibond verwendet werden, hingegen schon - zumal sie doppelseitig aufgebracht sind.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item><item><title>DIY Kantenfinder</title><link>https://blog.schallbert.de/touching-off/</link><pubDate>Sun, 21 May 2023 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/touching-off/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-05-21_edgefinder-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: DIY low-cost edge finder"&#10; title="DIY Kantenfinder" /&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-05-21_edge_taperedtool.jpg" alt="Image: getting XY0 of a workpiece visually" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Als CNC-Bediener muss ich bei manchen Arbeiten genau wissen, wo sich mein Werkstück befindet. Daher benötige ich in solchen Fällen die &lt;code&gt;X/Y&lt;/code&gt;-Werte einer Ecke des Werkstücks im Maschinenkoordinatensystem. Bisher habe ich dieses Problem mittels eines V-Fräsers gelöst, dessen Spitze ich manuell auf die Kante des Werkstücks verfahren und immer wieder mit Augenmaß geprüft habe, ob die Positionen übereinstimmen.&lt;/p&gt;&#10;&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;&#10;&lt;p&gt;Obwohl diese manuelle Methode relativ schnell und unkompliziert anzuwenden ist, so ist sie für die meisten Aufträge nicht mehr genau genug. Als ich in die doppelseitige Bearbeitung eingestiegen bin &lt;a href="https://blog.schallbert.de/cut-dibond/"&gt;wie damals mit Dibond&lt;/a&gt; war der Versatz so groß, dass ich die ersten Teile nur noch entsorgen konnte.&lt;/p&gt;&#10;&lt;h2 id="lösung"&gt;Lösung&lt;/h2&gt;&#10;&lt;p&gt;Ich habe mein Problem mit dem Hersteller meiner Fräsmaschine besprochen - in der Annahme, dass ich einen elektrischen, in die Spindel einzuspannenden Kantentaster &amp;ldquo;3D finder&amp;rdquo; empfohlen bekommen würde und nun wieder viel Geld und Arbeit in Kauf und Einrichtung eines solchen Messwerkzeugs fließen müsse. Da lag ich aber falsch. Stattdessen erhielt ich einen Tipp, wie ich einen einfachen aber genauen Kantenfinder bauen kann, der zudem praktisch nichts kostet.&lt;/p&gt;&#10;&lt;h3 id="einzelteile"&gt;Einzelteile&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-05-21_build.jpg" alt="Image: Things needed to construct the edge finder" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Roy sagte &amp;ldquo;Na ja, das Einzige, was du dafür brauchst, ist ein Kugellager. Befestige es auf einer Achse und wechsle sie in die Spindel ein wie jedes andere Werkzeug auch. Lasse die Spindel im niedrigen Drehzahlbereich laufen und bewege die Maschine langsam in Richtung Werkstückkante. Sobald der äußere Ring des Kugellagers nicht mehr mitläuft, hast du die Kante gefunden.&amp;rdquo; Alles was ich dann noch tun muss, ist, den Radius des Kugellagers auf die Maschinenposition zu addieren und ich habe die Position bestimmt.&lt;/p&gt;&#10;&lt;h3 id="aufbau"&gt;Aufbau&lt;/h3&gt;&#10;&lt;p&gt;Ich fand die Idee genial. Da ich leider kein gut sortiertes Metallfachgeschäft in der Nähe habe, durchwühlte ich den Haushalt nach einem Kugellager. Voilà, meine Kinder haben einen Fidget Spinner, den sie eine Weile nicht mehr benutzt haben. Also habe ich ihn&amp;hellip; stibitzt. Er enthält ein Kugellager mit 22mm Durchmesser für eine 8mm Welle.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-05-21_edgefinder.jpg" alt="Image: The mounted edge finder" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Hierfür bot sich der Schaft eines stumpfen 8mm Bohrers an. Also schnitt ich ihn in der Mitte durch, setzte den Schaft in das Kugellager ein und befestigte ihn mit einem Tropfen Kleber - Fertig!&lt;/p&gt;&#10;&lt;p&gt;Update: Kurz nach Veröffentlichung dieses Artikels schrieb ein Leser, dass alte Inline Skates oder Roller auch hervorragende Spender für Kugellager im Haushalt seien.&lt;/p&gt;&#10;&lt;h2 id="kanten-finden"&gt;Kanten finden&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Wechseln Sie den selbstgebauten Kantenfinder in die Spindel ein und verfahren sie in die Nähe des Werkstücks&lt;/li&gt;&#10;&lt;li&gt;Schalten Sie die Spindel bei niedriger Drehzahl ein, z.B. &lt;code&gt;S500....S3000&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Optional: Für eine einfachere Positionsbestimmung wechseln Sie in das Maschinenkoordinatensystem&lt;/li&gt;&#10;&lt;li&gt;Lassen Sie die Maschine langsam in Richtung des Werkstücks fahren, z.B. mit dem Kommando &lt;code&gt;G01 X&amp;lt;endpunktImWerkstück&amp;gt; F1&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Drücken Sie auf &lt;code&gt;Stop/Pause&lt;/code&gt;, sobald das Lager sich nicht mehr mitdreht&lt;/li&gt;&#10;&lt;li&gt;Notieren Sie sich die Maschinenkoordinaten bzw. verschieben das Arbeitskoordinatensystem der angetasteten Achse &lt;code&gt;G92&lt;/code&gt; auf diesen Punkt&lt;/li&gt;&#10;&lt;li&gt;Wiederholen Sie ab Schritt 2 für die nächste Achse&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2023-05-22_edgefinder_action.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Einfacher Kantenfinder im Einsatz.&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Estlcam: Inverse Gravuren</title><link>https://blog.schallbert.de/negative-carving-with-estlcam/</link><pubDate>Tue, 27 Sep 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/negative-carving-with-estlcam/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-09-27_carve_results-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: A negative carve in wood"&#10; title="Estlcam: Inverse Gravuren" /&gt;&#10;&lt;p&gt;Der Plan war, ein Holzschild mit meiner CNC zu fertigen. Es sollte jedoch invertiert sein. Das heißt, die Lettern sollten sich vom flachen Hintergrund abheben. Da es verschiedene Wege gibt, so etwas in Estlcam umzusetzen (ein sogenanntes Computer Aided Machining Programm, was aus Zeichnungsdaten Fräspfade und später Maschineninstruktionen erzeugen kann), aber nicht alle Wege leicht zu finden oder gut anwendbar sind, biete ich hier eine Schritt-für-Schritt Anleitung an.&lt;/p&gt;&#10;&lt;h3 id="1-den-rahmen-des-schildes-importieren"&gt;1. Den Rahmen des Schildes importieren&lt;/h3&gt;&#10;&lt;p&gt;Zuerst sollten Zeichnungsdaten des Rahmens von dem zu fertigenden Schild vorliegen, beispielsweise im &lt;code&gt;DXF&lt;/code&gt;-Format. Ich habe ein rechteckiges Schild mit abgerundeten Ecken und definierter Rahmenstärke in meinem CAD-Programm gezeichnet. Es gilt sicherzustellen, dass die Frästiefe später nicht die Breite des Rahmens überschreitet, ansonsten könnte die Fräsarbeit zu instabil werden.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-09-27_frame.jpg" alt="Image: Frame for my sign" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="2-den-text-hinzufügen"&gt;2. Den Text hinzufügen&lt;/h3&gt;&#10;&lt;p&gt;Jetzt kann der Inhalt des Schildes in Form von Text durch Tastendruck auf das &amp;ldquo;Carve&amp;rdquo;-Symbol hinzugefügt werden. Dabei ist es sinnvoll, die Breite der Textbox an die inneren Rahmengrenze anzupassen, sodass der Text stets hineinpasst. Man hat verschiedene Carve-Stile zur Auswahl. Für die hier dargestellte Fräsarbeit ist &lt;code&gt;Carve aussen&lt;/code&gt; zu wählen. Nun den Text eintippen, Schriftart selektieren und die Schrifthöhe so anpassen, dass es im Schild ein harmonisches Bild ergibt.&lt;/p&gt;&#10;&lt;p&gt;Abhängig vom zu verwendenden Fräser sollte dann die Frästiefe gewählt werden. Bei kleineren Winkeln der V-Nutfräsers ist die Frästiefe meist größer zu wählen als bei breiten 90°-Fräsern wie ich ihn verwende. Für mein &lt;code&gt;12mm&lt;/code&gt; starkes Plattenmaterial setze ich eine Frästiefe von &lt;code&gt;4.5mm&lt;/code&gt; an. Anschließend wird die maximale Fräsbreite festgelegt. Gemeint ist hier, wie breit die &amp;ldquo;Täler&amp;rdquo; zwischen den Buchstaben sein sollen. Da ich für den invertierten Carve eine &amp;ldquo;Talsohle&amp;rdquo; benötige, habe ich hier einen sehr großen Wert eingestellt. Zum Schluss dann sollte die Taste &lt;code&gt;Umrahmung auswählen&lt;/code&gt; geklickt werden. Hiermit ist die Fräsarbeit dann nach außen begrenzt.&lt;/p&gt;&#10;&lt;p&gt;Bitte dieses Bearbeitungsfenster vorerst geöffnet lassen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-09-27_carve_text.jpg" alt="Image: Settings for the text to carve" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="3-werkzeugauswahl"&gt;3. Werkzeugauswahl&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-09-27_carve_preview1.jpg" alt="Image: Carve preview 1" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Wählen Sie nun das V-Nutwerkzeug durch Klicken in der entsprechenden Zeile Ihrer Werkzeugliste für die Textfräsung aus. Stellen Sie sicher, dass das Häkchen bei &lt;code&gt;Textobjekt zerlegen&lt;/code&gt; im Fenster &amp;ldquo;Text Fräsen&amp;rdquo; nicht erscheint, denn nur dann können Sie weitere Anpassungen vornehmen. Schließen Sie nun dieses Fenster per Klick auf &lt;code&gt;OK&lt;/code&gt;. Nun wählen Sie &lt;code&gt;Vorschau&lt;/code&gt; aus, um sich einen Eindruck von der Fräsarbeit zu verschaffen. Sehen Sie die eng beisammenstehenden parallelen Linien rechts im Bild? Dies wird durch den Parameter &lt;code&gt;Räumzustellung&lt;/code&gt; aus der Werkzeugtabelle verursacht. Für saubere Arbeiten mit einem Gravurfräser sollte dieser Wert bei kleiner gleich &lt;code&gt;5%&lt;/code&gt; bleiben.&lt;/p&gt;&#10;&lt;p&gt;Hmm, so werden Sie noch keine befriedigenden Arbeitsergebnisse erhalten, und die Fräsarbeit wird lange dauern. Wir benötigen also zusätzlich ein paar Räumpfade mit einem normalen Schaftfräser.&lt;/p&gt;&#10;&lt;h3 id="4-räumen"&gt;4. Räumen&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-09-27_carve_clearing_tool.jpg" alt="Image: Carve preview 1" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Speichern Sie Ihr Projekt spätestens jetzt ab. Nach dem aktuellen Schritt kann der Text nicht mehr bearbeitet werden!&lt;/p&gt;&#10;&lt;p&gt;Um den Fräser für die Räumung der &amp;ldquo;Talsohle&amp;rdquo; hinzuzufügen, wählen Sie den Carve-Pfad aus und wählen &lt;code&gt;Textobjekt zerlegen&lt;/code&gt; an. Bestätigen Sie mit &lt;code&gt;OK&lt;/code&gt; und wählen den Fräspfad erneut aus. Nun erscheint die Werkzeugkonfiguration. Fügen Sie das Räumwerkzeug hinzu. Vorzugsweise ist sein Durchmesser geringer als der Abstand zwischen Schrift und Rahmen, sodass eine möglichst große Fläche später glatt geräumt werden kann (Anmerkung: Ich habe das nicht gemacht, weswegen auf meinem Beispiel ein paar raue Stellen übrig geblieben sind). Die Räumzustellung dieses Fräsers wähle ich bei Holz zwischen 20% und 40%.&lt;/p&gt;&#10;&lt;p&gt;Wenn Sie für die Gravur einen Fräser ohne Abflachung am Boden gewählt haben (ich empfehle hier gern &lt;code&gt;0.5mm&lt;/code&gt; als guten Kompromiss zwischen hoher Auflösung und guter Fertigungsqualität), können Sie die Räumzustellung des Fräsers in der Werkzeugtabelle zur Verbesserung der Oberflächenqualität noch einmal nach unten korrigieren.&lt;/p&gt;&#10;&lt;h3 id="5-zweite-vorschau"&gt;5. Zweite Vorschau&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-09-27_carve_preview2.jpg" alt="Image: Carve preview 2" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ok, jetzt sollten wir durch sein. Nochmal kurz die Vorschau ausgewählt und sich über die reduzierte Verarbeitungszeit gefreut, und ran an die Maschine?&lt;/p&gt;&#10;&lt;p&gt;Ah, eine weitere Optimierung kann für das Gravurfräsen angebracht sein: Unter &lt;code&gt;Einstellungen&lt;/code&gt; die Sicherheitshöhe auf ein Minimum reduzieren (aber ohne in Klemmen oder andere Hindernisse zu rauschen). Das ständige Aus- und Eintauchen ins Material kostet bei Gravuren in Estlcam immer recht viel Zeit, wenn sich die Sicherheitshöhe in großem Abstand zur Werkstückoberfläche befindet.&lt;/p&gt;&#10;&lt;p&gt;Keine Sorge, wenn die Schrift in der Vorschau nun nicht mehr lesbar ist. Das ist total normal, weil ja nur die (jetzt wegen Verwendung des Räumfräsers gröber dargestellten) Fräspfade angezeigt werden.&lt;/p&gt;&#10;&lt;p&gt;Nach einer letzten Prüfung von Vorschüben und Werkzeugen kann&amp;rsquo;s jetzt endlich losgehen :)&lt;/p&gt;&#10;&lt;h3 id="engrave"&gt;6. Auf die CNC damit!&lt;/h3&gt;&#10;&lt;p&gt;Viel Spaß beim Fräsen. Ich für meinen Teil fand es sehr entspannend, der Maschine dabei zuzusehen, wie sie langsam ein immer deutlicher werdendes Bild ins Holz schneidet, was aber erst bei Verwendung des V-Fräsers lesbar wird.&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-09-27_carve_results.jpg" alt="Image: The completed sign" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;</description></item><item><title>CNC job erstellen</title><link>https://blog.schallbert.de/cnc-job-setup/</link><pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/cnc-job-setup/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-22_cnc_job_setup-thumb.jpg"&#10; class="post-cover"&#10; alt="Image of a CNC job demo"&#10; title="CNC job erstellen" /&gt;&#10;&lt;h2 id="demo-video-über-vorbereitung-und-ausführung-eines-fräsjobs"&gt;Demo video über Vorbereitung und Ausführung eines Fräsjobs&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/mFreMUKxXktZH3kpqdENGJ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;How-to: CNC job setup &amp;amp;amp; quick demo&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die folgenden Abschnitte beschreiben die im Video gezeigten Schritte.&lt;/p&gt;&#10;&lt;h3 id="checkliste-zur-vorbereitung"&gt;Checkliste zur Vorbereitung&lt;/h3&gt;&#10;&lt;p&gt;Bei komplett heruntergefahrener Anlage:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Das Werkstück sicher im Arbeitsbereich der CNC befestigen&lt;/li&gt;&#10;&lt;li&gt;Die G-Code Datei auf den Maschinenrechner übertragen&lt;/li&gt;&#10;&lt;li&gt;Not-Aus aktiviert (verhindert unbeabsichtigtes Anlaufen)&lt;/li&gt;&#10;&lt;li&gt;Energieversorgung zur CNC und Peripherie einschalten&lt;/li&gt;&#10;&lt;li&gt;Maschinenrechner mit der CNC verbinden und CNC-Programm starten&lt;/li&gt;&#10;&lt;li&gt;Not-Aus deaktivieren&lt;/li&gt;&#10;&lt;li&gt;Zu verwendende Fräser bereitlegen und auf Beschädigungen prüfen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="checkliste-für-hochfahren-der-cnc"&gt;Checkliste für Hochfahren der CNC&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Not-Aus quittieren (Schrittmotortreiber aktivieren)&lt;/li&gt;&#10;&lt;li&gt;Maschine referenzieren&lt;/li&gt;&#10;&lt;li&gt;Werkzeugwechsel auf das erste Werkzeug im Job&lt;/li&gt;&#10;&lt;li&gt;X/Y Werkstücknullpunkte anfahren und setzen&lt;/li&gt;&#10;&lt;li&gt;Z-Nullpunkt ermitteln und setzen&lt;/li&gt;&#10;&lt;li&gt;CNC zurück in Warteposition fahren&lt;/li&gt;&#10;&lt;li&gt;Spindelwarmlauf durchführen&lt;/li&gt;&#10;&lt;li&gt;Peripheriegeräte auf Funktion prüfen (Absaugung, Kühlschmierung etc.)&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="während-des-automatikbetriebs"&gt;Während des Automatikbetriebs&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Maschine überwachen&#10;&lt;ol&gt;&#10;&lt;li&gt;Hören: Klingt die Maschine &amp;ldquo;wie immer&amp;rdquo;? Gibt es Vibrationen oder hört sich irgend etwas merkwürdig an?&lt;/li&gt;&#10;&lt;li&gt;Sehen: Ist die Düse für Kühlschmierstoff korrekt ausgerichtet? Alle Parameter am PC im grünen Bereich? Verfahrwege OK?&lt;/li&gt;&#10;&lt;li&gt;Fühlen: Treten Vibrationen der Maschine auf? Führen z.B. Kühlgebläse einen merklichen Luftstrom?&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Falls erforderlich: Werkzeugwechsel durchführen bzw. Werkzeuge vermessen&lt;/li&gt;&#10;&lt;li&gt;Falls etwas nicht in Ordnung scheint: Job per &amp;ldquo;Pause&amp;rdquo;-Taste unterbrechen&lt;/li&gt;&#10;&lt;li&gt;Im Falle eines Falles den Not-Aus betätigen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="nach-abschluss-des-fräsjobs"&gt;Nach Abschluss des Fräsjobs&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Maschine zurück vor die Referenzschalter bewegen&lt;/li&gt;&#10;&lt;li&gt;Not-Aus betätigen und Maschinenrechner trennen&lt;/li&gt;&#10;&lt;li&gt;Energieversorgung der Maschine abschalten&lt;/li&gt;&#10;&lt;li&gt;Werkstück und gegebenenfalls Reststücke vom Maschinentisch nehmen&lt;/li&gt;&#10;&lt;li&gt;Reinigung von Maschine und Werkstück&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Einschaltstrom ermitteln</title><link>https://blog.schallbert.de/measure-inrush-current/</link><pubDate>Tue, 16 Aug 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/measure-inrush-current/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_inrush-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Inrush current measurement"&#10; title="Einschaltstrom ermitteln" /&gt;&#10;&lt;h2 id="vorbereiten-des-multimeters--oszilloskops"&gt;Vorbereiten des Multimeters / Oszilloskops&lt;/h2&gt;&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_multimeter.jpg" alt="Image: A Multimeter" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Für diesen Artikel habe ich mir ein Multimeter zur Messung von &amp;ldquo;Power Quality&amp;rdquo; direkt vom Hersteller &lt;a href="https://www.gossenmetrawatt.de/en/products/measuring-and-test-technology/multimeters-and-handheld-calibrators/special-applications/multimeters-for-power-and-energy-measurement/metrahit-energy/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;GMC Instruments&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; leihen können. Da dort ein Datenlogger verbaut ist, kann ich die Messungen aufnehmen und später aufbereiten.&lt;/p&gt;&#10;&lt;h3 id="metrahit-energy"&gt;Metrahit Energy&lt;/h3&gt;&#10;&lt;p&gt;Dieses Multimeter ist eher im Profi-Segment angesiedelt. Sowohl der Reichtum an Funktionen als auch sein Preis deuten für mich klar darauf hin. Zusätzlich zum Datenlogger und den üblichen Funktionen eines Multimeters kann es Leistung- und Energie messen bzw. berechnen, harmonische Signalverzerrungen erkennen und nebenbei auch PT100-Temperatursensoren auswerten.&lt;/p&gt;&#10;&lt;h3 id="software-setup"&gt;Software setup&lt;/h3&gt;&#10;&lt;p&gt;So richtet man die Auswertesoftware ein:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Software &lt;a href="https://www.gmc-instruments.de/en/products/metrawin-10" target="_blank" rel="noopener noreferrer" class="external-link"&gt;MetraWin&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; herunterladen und installieren, um die vom Multimeter erfassten Daten zu übertragen und anzuzeigen.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.gmc-instruments.de/en/products/software-and-accessories/software/product-specific-software/test-technology/driver-control/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Driver-Control&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; &amp;ldquo;Treiber&amp;rdquo; herunterladen und installieren. Diese Software dient dazu, die Kommunikation zwischen USB und dem im Lieferumfang des Multimeters befindlichen Infrarot-Schnittstellenadapter bereitzustellen.&lt;/li&gt;&#10;&lt;li&gt;In der MetraWin-Software &lt;code&gt;METRAHit Starline Series&lt;/code&gt; auswählen (übrigens ist mir unklar, warum der Name der Serie weder auf dem Gerät noch auf der Website erscheint)&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_metrawin_device.jpg" alt="Image of MetraWin settings to choose device" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Nun wird der Infrarot-Adapter am PC angeschlossen. Der IR-Adapter sollte im Gerätemanager mit einer &amp;ldquo;COM&amp;rdquo;-Anschluss-ID angezeigt werden (&lt;code&gt;Windows-Taste&lt;/code&gt; &amp;ndash;&amp;gt; &lt;code&gt;Gerät&lt;/code&gt; in die Suche eingeben und &lt;code&gt;Gerätemanager&lt;/code&gt; auswählen &amp;ndash;&amp;gt; nach unten zu &lt;code&gt;Anschlüsse (COM &amp;amp; LPT)&lt;/code&gt; scrollen, aufklappen). Diese Nummer dann in MetraWins &lt;code&gt;Gerät --&amp;gt; Kommunikation... --&amp;gt; SEL-COM&lt;/code&gt; angeben - fertig.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="einrichtung-des-multimeters-für-die-aufzeichnung-des-einschaltstroms"&gt;Einrichtung des Multimeters für die Aufzeichnung des Einschaltstroms&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_addr.jpg" alt="Bild: Multimeter-Adresseinstellung" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt; In den Einstellungen dieses Multimeters ist darauf zu achten, dass die Adresse auf einen anderen Wert als &lt;code&gt;00&lt;/code&gt; eingestellt ist (&lt;code&gt;Setup --&amp;gt; Set --&amp;gt; System --&amp;gt; Addr&lt;/code&gt;), da die Infrarot-Kommunikation das Gerät mit einem ungültigen Wert hier nicht erkennt (ich habe dies erlebt und brauchte einige Zeit, um herauszufinden, dass nicht die IR-Adapter-Erkennung fehlerhaft ist, sondern die Einstellungen des Multimeters). Hintergrund ist, dass die Software über die Adressierung bis zu 15 Geräte gleichzeitig unterstützt. Warum &lt;code&gt;00&lt;/code&gt; dabei ungültig ist, das wissen wahrscheinlich nur die Entwickler der Software.&lt;/li&gt;&#10;&lt;li&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_rate.jpg" alt="Bild: Multimeter Abtastzeit" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt; Stellen Sie die Abtastzeit auf den niedrigsten Wert für eine gute Impulsverfolgung ein: &lt;code&gt;Measure --&amp;gt; Save --&amp;gt; rate&lt;/code&gt; und wählen &lt;code&gt;0.0005sec&lt;/code&gt; auswählen, was bedeutet, dass der Logger Messungen mit &lt;code&gt;2000Hz&lt;/code&gt; Abtastrate durchführt. Dies ist der niedrigste Wert, den man erreichen kann, und diese Werte beeinträchtigen bereits die Verfügbarkeit des Aufzeichnungskanals, z.B. für Energiemessungen, aufgrund der begrenzten Pufferfähigkeit des Geräts.&lt;/li&gt;&#10;&lt;li&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_trms.jpg" alt="Bild: Multimeter TRMS-Einstellung" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt; Wählen Sie nun den Wert aus, den Sie messen wollen (bei mir ist es &lt;code&gt;DC&lt;/code&gt; Strom in &lt;code&gt;Ampère&lt;/code&gt;), und passen über die &lt;code&gt;MAN/AUTO&lt;/code&gt; Taste den Wertebereich im manuellen Betrieb so an, dass die zu erwartende Impulshöhe abgedeckt wird. Kleiner Hinweis: Wenn das Multimeter den Zusatz &lt;code&gt;TRMS&lt;/code&gt; oder &lt;code&gt;RMS&lt;/code&gt; anzeigt, ist dies für unsere Messung hier eher nicht erwünscht, da in diesem Falle eventuelle Spitzenwerte geglättet werden.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Um den Einschaltstrom meines Verstärkers zu bestimmen, verwende ich den Messbereich &lt;code&gt;&amp;gt;10A&lt;/code&gt;. So habe ich zwar eine für den Normalbetrieb geringe Genauigkeit, kann allerdings die Stromspitze gut abbilden.&lt;/p&gt;&#10;&lt;h3 id="alternative-messgeräte"&gt;Alternative Messgeräte&lt;/h3&gt;&#10;&lt;p&gt;Oszilloskope sind Multimetern bei der Zeitauflösung weit überlegen, benötigen aber weitere Hilfsmittel um Ströme exakt erfassen zu können.&lt;/p&gt;&#10;&lt;p&gt;Dennoch sind sie hier mit einfachen Hilfsmitteln verwendbar: Einen Widerstand mit niedrigem Wert (z.B. &lt;code&gt;0.1 Ohm&lt;/code&gt;) und geringer Toleranz in Reihe mit dem Prüfling schalten und den Spannungsabfall am Widerstand per Oszilloskop bestimmen. Bei einer Auflösung von &lt;code&gt;1V/div&lt;/code&gt; läge dann die Umrechnung für den Einschaltstrom bei &lt;code&gt;10A/division&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Ein günstiges Multimeter hingegen mit &amp;ldquo;Data Max Hold&amp;rdquo; Funktion wird für diesen Anwendungsfall wahrscheinlich aber nicht funktionieren, da die Messintervalle für die zu messenden, sich schnell aufladenden Kondensatoren schlicht zu lang sind.&lt;/p&gt;&#10;&lt;h2 id="der-prüfling"&gt;Der Prüfling&lt;/h2&gt;&#10;&lt;p&gt;Die zu untersuchende Schaltung ist eine Endstufe mit &lt;code&gt;30W&lt;/code&gt; Dauerleistung &lt;a href="https://store.sure-electronics.com/product/AA-AB32996" target="_blank" rel="noopener noreferrer" class="external-link"&gt;AA-AB32996&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, produziert von &amp;ldquo;sure electronics&amp;rdquo;. Er basiert auf dem integrierten Class-D-Verstärkerbaustein &lt;a href="https://www.ti.com/product/TPA3130D2" target="_blank" rel="noopener noreferrer" class="external-link"&gt;TPA3110&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_TPA3110.jpg" alt="Image: sure electronics AA-AB32996 based on TPA3110" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die Energieversorgung besitzt einen Verpolschutz (drei parallel geschaltete Schottkydioden) und bindet sechs Pufferkondensatoren mit einer Kapazität von je &lt;code&gt;220uF&lt;/code&gt; ein. Zusätzlich befinden sich nahe der Versorgungspins des IC zwei weitere Entstörkondensatoren.&lt;/p&gt;&#10;&lt;p&gt;Zum Vergleich: Das Referenzlayout des IC-Herstellers sieht der oben beschriebenen Lösung recht ähnlich. Hier werden zusätzlich &lt;code&gt;FB&lt;/code&gt; (Ferritkerne) verwendet, um die Ströme auf der Eingangsseite zu glätten. Dafür wird weniger Pufferkapatizät vorgesehen.&#10;Darüber hinaus verwendet das Referenzdesign einfache Ferritkerne anstatt hochwertigerer Filterspulen am Verstärkerausgang.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_TPA3110_recommended_layout.jpg" alt="Image: TPA3110 recommended PCB layout" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="motivation-ausfall-eines-prototypen-bei-verwendung-von-usb-c-pd"&gt;Motivation: Ausfall eines Prototypen bei Verwendung von USB-C PD&lt;/h3&gt;&#10;&lt;p&gt;Für einen meiner Prototypen hatte ich vorher ein USB-C Power Delivery Entwicklungsboard - &lt;a href="https://blog.schallbert.de/usbpd-explained/#stusb4500"&gt;erklärt in diesem Beitrag&lt;/a&gt; - verwendet. Leider musste ich feststellen, dass dieser nach nur ein paar Einschaltzyklen in Rauch aufging - wahrscheinlich verursacht durch einen hohen Einschaltstrom, für den der IC nicht ausgelegt ist.&lt;/p&gt;&#10;&lt;p&gt;Daher wollte ich genau wissen, wie hoch die Stromspitzen sind und mit welcher Komponente ich den Einschaltstrom so in den Griff bekomme, dass hierdurch verursachte Schäden an elektronischen Bauteilen ausgeschlossen werden können.&lt;/p&gt;&#10;&lt;h2 id="durchführung-der-messung"&gt;Durchführung der Messung&lt;/h2&gt;&#10;&lt;p&gt;Ich verbinde den Messpfad für Strom des Multimeters mit dem Minuspol des Verstärkers und die Masse des Multimeters mit dem Minuspol des Netzteils. Die Messspitze für Spannung verbinde ich mit dem Pluspol des Verstärkers, und letzteren wiederum schließe ich über einen Schalter am Netzteil an.&lt;/p&gt;&#10;&lt;p&gt;Um die Messung zu beginnen, wähle ich beim Multimeter &lt;code&gt;SET --&amp;gt; Store --&amp;gt; Start --&amp;gt; Store&lt;/code&gt; und lege den Schalter an der Spannungsversorgung um. Nach ein paar Sekunden beende ich die Messung mit der Taste &lt;code&gt;Stop&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Da ich zu beginn die höchstmögliche Datenrate eingestellt hatte, musste ich die Daten hernach manuell an den Computer übermitteln und konnte nicht die Liveübertragung wählen. Hierfür wählt man in der Software folgende Einstellung aus: &lt;code&gt;Read Memory --&amp;gt; Get Memory Info --&amp;gt; Move Memory Data to File --&amp;gt; save --&amp;gt; Open Memory Data File --&amp;gt; Display Data from File&lt;/code&gt;. Mir ist dabei nicht ganz klar, warum an der Stelle so viele Schritte erforderlich sind - ich hätte hierfür nur einen Knopfdruck erwartet.&lt;/p&gt;&#10;&lt;p&gt;Das Dateiformat &lt;code&gt;Measurement Data File&lt;/code&gt; hat einen großen Vorteil gegenüber dem ebenfalls möglichen &lt;code&gt;Memory Data File&lt;/code&gt;: Es enthält Metadaten wie Messdatenauswahl für die Ansicht, Labels und Details zur Darstellung wie Einheiten etc. Ohne großen Aufwand lassen sich Auswertungen erstellen und beispielsweise im PDF-Dateiformat exportieren.&lt;/p&gt;&#10;&lt;h3 id="visualisierung-des-einschaltstroms"&gt;Visualisierung des Einschaltstroms&lt;/h3&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_TPA3110_inrushcurrent.jpg" alt="Image: TPA3110 current over time" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Der ganze Spuk dauert nur &lt;code&gt;~10ms&lt;/code&gt;, also 20 samples. Nach einem hohen Strompuls von &lt;code&gt;&amp;gt;12A&lt;/code&gt; zeigt sich ein Plateau bei rund &lt;code&gt;4A&lt;/code&gt; bis sich die Kondensatoren aufgeladen haben. Danach geht der Strom zurück, bis er dem Leerlaufstrom des Verstärkers entspricht.&lt;/p&gt;&#10;&lt;p&gt;Der Spitzenwert liegt allerdings nur für einen Datenpunkt vor - daher kann ich nicht sagen, ob es sich um einen Messfehler / Ausreißer oder ein tatsächliches Ereignis handelt. Ein paar Annahmen zur Ursache:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Es wurden schaltungsweit Entkopplungskondensatoren mit sehr geringem ESR (Serienwiderstand) verwendet&lt;/li&gt;&#10;&lt;li&gt;Verlassen des Messbereichs des Multimeters&lt;/li&gt;&#10;&lt;li&gt;Limiter des Labornetzteils begrenzt den Strom auf Niveau des Plateaus (war auf &lt;code&gt;5A&lt;/code&gt; konfiguriert, passt also nicht recht zusammen)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="spannungsverlauf-an-den-versorgungspins-des-verstärkers"&gt;Spannungsverlauf an den Versorgungspins des Verstärkers&lt;/h3&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-08-16_TPA3110_inrushvoltage.jpg" alt="Image: TPA3110 voltage over time" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die Spannungsmessung zeigt einen sprunghaften Anstieg beim ersten Messwert nach Einschalten des Verstärkers, gefolgt von einem fast linearen Anstieg bis die Quellspannung nach etwa &lt;code&gt;~6ms&lt;/code&gt; erreicht wird.&lt;/p&gt;&#10;&lt;p&gt;Diese Werte passen zeitlich prima mit den Strommessungen zusammen und bestätigen sowohl Impuls- als auch Plateauwerte.&lt;/p&gt;&#10;&lt;h3 id="wiederholung--ergebnis"&gt;Wiederholung &amp;amp; Ergebnis&lt;/h3&gt;&#10;&lt;p&gt;Ich wiederholte die Messung mit unterschiedlichen Randbedingungen: Lautsprecher angeschlossen/ nicht verbunden, Verstärker in Standby/ Leerlauf usw. aber die Messergebnisse waren stets ähnlich. Somit wird die Verstärkerschaltung im Moment des Einschalten nicht durch seine Konfiguration oder Peripherie beeinflusst.&lt;/p&gt;&#10;&lt;p&gt;Die Werte sind also bedingt durch den Versorgungspfad und seine Schutzmaßnahmen, Energiespeicher und seine Entkopplungsschaltung.&lt;/p&gt;&#10;&lt;p&gt;Nachteile der Messung mittels Multimeter sind geringe Datenrate (10-100kHz wären besser gewesen), keine Möglichkeit, die Messwerte live abzulesen, und langen Datentransferzeiten zum PC, geschuldet durch die Kommunikation per Infrarot. Andererseits kann ich das Multimeter jetzt schnell mal als &amp;ldquo;offline Datenlogger&amp;rdquo; auch über längere Zeit verwenden, ohne einen Computer zur Konfiguration dabei haben zu müssen. Optimal für die Anwendung im Feld.&lt;/p&gt;&#10;&lt;p&gt;Für den Verstärker werde ich mit diesen Erkenntnissen jetzt eine Schutzschaltung entwickeln, ähnlich wie in &lt;a href="https://blog.schallbert.de/inrushlimiter-circuits/"&gt;diesem Beitrag diskutiert&lt;/a&gt;, und so in Zukunft Probleme mit USB-PD ICs vermeiden.&lt;/p&gt;&#10;</description></item><item><title>Meine CNC vibriert</title><link>https://blog.schallbert.de/cnc-vibrates/</link><pubDate>Thu, 14 Jul 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/cnc-vibrates/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-07-14_vibrations-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Distorted image of a circle cut with my CNC"&#10; title="Meine CNC vibriert" /&gt;&#10;&lt;h2 id="hintergrund"&gt;Hintergrund&lt;/h2&gt;&#10;&lt;p&gt;Langsam werde ich mutiger im Umgang mit meiner Maschine. In letzter Zeit bearbeite ich des Öfteren Birke Multiplex in der Vollnut, möglichst mit nur einem Fräsdurchgang um nicht so lange im kalten Keller stehen zu müssen. Das bedeutet aber auch, dass die Maschine eine Tiefenzustellung &lt;code&gt;Z+&lt;/code&gt; von &lt;code&gt;12mm&lt;/code&gt; bei &lt;code&gt;F2700mm/min&lt;/code&gt; mit einem 6mm 2-Schneider Schruppfräser bei &lt;code&gt;S=24000rpm``Z+&lt;/code&gt; bewältigen muss. Dabei fräse ich im Gleichlauf.&lt;/p&gt;&#10;&lt;p&gt;Nun fängt meine Maschine in bestimmten Situation an, hörbar zu vibrieren.&lt;/p&gt;&#10;&lt;p&gt;Nun liegt es nahe, die Schneidkräfte an der Maschine zu reduzieren, entweder durch Reduktion der Tiefenzustellung oder des Vorschubs. Die Drehzahl kann ich bei meinem Fräsmotor nämlich nicht weiter erhöhen. Das werde ich vielleicht auch tun, aber erst einmal möchte ich verstehen, was die Fräse zum Vibrieren bringt und ob ich das auch durch andere Maßnahmen abstellen kann, ohne die Maschinenzeit zu erhöhen oder Standzeiten meiner Fräser merklich zu reduzieren.&lt;/p&gt;&#10;&lt;h2 id="problembeschreibung"&gt;Problembeschreibung&lt;/h2&gt;&#10;&lt;p&gt;Die Maschine vibriert nicht nur bei Konturschnitten, sondern auch wenn ich Taschen fertige. Allerdings nur bei bestimmten Bewegungsrichtungen. Es fühlt sich so an, als würde sich die ganze Maschine leicht schütteln, und das Geräusch ähnelt einem Stuhl, der unter Last über Parkettboden zurückgeschoben wird.&lt;/p&gt;&#10;&lt;p&gt;Um das etwas zu verdeutlichen, habe ich zwei kleine Referenzvideos gemacht.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-07-14-machine_vibrations_pocketing.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Vibrationen nur an bestimmten Stellen beim Taschenfräsen (80% Räumzustellung)&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-07-14-machine_vibrations_slot.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Vibrationen beim Formatieren&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="analyse"&gt;Analyse&lt;/h2&gt;&#10;&lt;p&gt;Das Fräsbild sieht trotz Vibrationen ordentlich aus.&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-07-14_cut_results.jpg" alt="Image: Despite vibrating, the cut still looks clean" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;&lt;p&gt;Ich habe versuchsweise ein paar Einstellungen angepasst: Reduzierte Tiefenzustellung &lt;code&gt;Z+&lt;/code&gt; von nur noch &lt;code&gt;6mm&lt;/code&gt; bei erhöhtem Vorschub von &lt;code&gt;3600mm/min&lt;/code&gt; mit demselben Fräser - Vibrationen abgestellt.&lt;/p&gt;&#10;&lt;p&gt;Nun war es zugegebenermaßen nicht so klug, zwei Parameter gleichzeitig zu ändern - so weiß ich nicht, ob die erhöhten Schnittkräfte oder ein Vorschub im Resonanzbereich der Maschine zu den Vibrationen lag - tsja.&lt;/p&gt;&#10;&lt;p&gt;Dennoch habe ich den Maschinenhersteller auf das Problem angesprochen &lt;a href="https://hobbyline.info/forum/index.php?thread/686-meine-maschine-vibriert-erledigt/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;hier verlinkt&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, und seiner Meinung nach ist der wahrscheinlichste Grund die etwas schwach ausgelegte Verbindung zwischen Fräsmotor und Z-Achse.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-07-14_routermount.jpg" alt="Image: Router mounting to the Z-axis" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Der Fräsmotor hat weniger hochwertige Lager als professionelle Hochfrequenzspindeln, also sind sie potentiell eher von Spiel betroffen. Außerdem klemmt die &lt;code&gt;42mm&lt;/code&gt; Eurohals-Halterung den Fräsmotor mit nur einer Verschraubung, die zudem bei recht niedrigen &lt;code&gt;7Nm&lt;/code&gt; drehmomentbegrenzt ist, da der vordere Lagersitz des Fräsmotors sonst zu stark gequetscht wird.&lt;/p&gt;&#10;&lt;p&gt;Im Gegensatz dazu werden Motorspindeln meist direkt und vollflächig mit der Z-Achse verschraubt, sodass Kraftschluss und Kontaktfläche viel größer ausfallen.&lt;/p&gt;&#10;&lt;h2 id="ergebnis"&gt;Ergebnis&lt;/h2&gt;&#10;&lt;p&gt;Ich habe jetzt ein paar Optionen:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Weiter mit großer Tiefenzustellung arbeiten und die Vibrationen und damit einhergehenden erhöhten Maschinenverschleiß tolerieren&lt;/li&gt;&#10;&lt;li&gt;Geringere Zustellungen fahren, dafür aber Maschinenzeit opfern&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/projects/spindle-upgrade/"&gt;Die Spindel aufrüsten&lt;/a&gt;, welches meine Maschine deutlich teurer macht&lt;/li&gt;&#10;&lt;li&gt;Mein &lt;a href="https://blog.schallbert.de/why-vacuum-table/"&gt;Maschinenbett aufrüsten&lt;/a&gt; und so die Steifigkeit des Grundrahmens erhöhen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="update-september-2023"&gt;Update September 2023&lt;/h2&gt;&#10;&lt;p&gt;So, ich habe jetzt sowohl die Spindel als auch das Maschinenbett aufgerüstet. Die Vibrationen sind leider immer noch da. Das finde ich ziemlich ärgerlich.&lt;/p&gt;&#10;&lt;p&gt;Wenn ich mir die Umstände nochmal genau ansehe, dann treten die Vibrationen immer dann auf, wenn sich das Portal vorwiegend auf der breiten Achse (bei mir X) bewegt, gleichzeitig aber ebenfalls leicht auf der Längsachse (Y) unterwegs ist. Fahre ich nur in &lt;code&gt;Y&lt;/code&gt;, passiert nichts. Fahre ich nur in &lt;code&gt;X&lt;/code&gt;, treten die Vibrationen schwächer auf.&lt;/p&gt;&#10;&lt;p&gt;Ich kan inzwischen ebenfalls sagen, dass die Vibrationen in schwächerer Form auch in Acrylglas bei einer Tiefenzustellung von &lt;code&gt;Z+5mm&lt;/code&gt;, Vorschub &lt;code&gt;F3000mm/min&lt;/code&gt; und einem 4mm-Einschneider auftreten.&lt;/p&gt;&#10;&lt;p&gt;Ich werde einmal ausprobieren, ob ich das Problem auch noch bei &lt;code&gt;F3600mm/min&lt;/code&gt; habe.&lt;/p&gt;&#10;&lt;p&gt;Da ich inzwischen Maschinenbett und Spindelbefestigung als Ursache sicher ausschließen kann, liegt die Ursache der Vibrationen meiner Einschätzung nach am Zusammenspiel der Portalachsen.&lt;/p&gt;&#10;&lt;p&gt;Nun habe ich eine recht breite Maschine ohne zusätzlich verstärkte Portalwangen, die zudem nur mit einer statt zwei Linearführungen auf der Z-Achse ausgestattet ist. Ich spreche die nächsten Wochen nochmal mit dem Hersteller, um diesen Verdacht zu erhärten bzw. aus dem Weg zu räumen.&lt;/p&gt;&#10;</description></item><item><title>CNC: Überlastung Fräsmotor</title><link>https://blog.schallbert.de/cnc-router-overload/</link><pubDate>Sat, 18 Jun 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/cnc-router-overload/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-18_overload-thumb.jpg"&#10; class="post-cover"&#10; alt="Image of an endmill path that doesn&amp;#39;t look good at all"&#10; title="CNC: Überlastung Fräsmotor" /&gt;&#10;&lt;h2 id="was-ich-eigentlich-wollte"&gt;Was ich eigentlich wollte&lt;/h2&gt;&#10;&lt;p&gt;Ich hatte eine Anfrage zum Schneiden und Gravieren von Hochdrucklaminaten. Dabei handelt es sich um eine Lasagne aus gepresstem Papier und &lt;a href="https://en.wikipedia.org/wiki/Phenol_formaldehyde_resin" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Phenolharz&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, überzogen mit einer dünnen Schicht (farbigen) &lt;a href="https://en.wikipedia.org/wiki/Melamine_resin" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Melaminharzes&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. HPL ist so widerstandsfähig, dass es für Fassadenbeplankungen verwendet wird. Es ist spülmaschinenfest und einige Varianten können auf bis zu 200°C erhitzt werden, ohne Schaden zu nehmen. HPL findet man als Platten auf Spielplätzen, Gartentischen, als Paneele in der Straßenbahn und an vielen anderen Stellen im Alltag.&#10;Also dachte ich mir: &amp;ldquo;Cooles Zeug, Probieren geht über Studieren!&amp;rdquo;&lt;/p&gt;&#10;&lt;h2 id="schnittdaten-in-hochdrucklaminaten-hpl-resopal"&gt;Schnittdaten in Hochdrucklaminaten (HPL, &amp;ldquo;Resopal&amp;rdquo;)&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-18_overload_chips.jpg" alt="Image: HPL und Späne nach dem Schneiden" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ich habe die von einigen Websites empfohlenen Schnittdaten mit Werten für &amp;ldquo;Hartholz&amp;rdquo; verwendet.&#10;2-Schneider.Holz-Hartmetallschaftfräser, Schnittgeschwindigkeit &lt;code&gt;450m/min&lt;/code&gt;, &lt;code&gt;d6mm&lt;/code&gt;, &lt;code&gt;Z+6,5mm&lt;/code&gt;, &lt;code&gt;S24000rpm&lt;/code&gt;, &lt;code&gt;F3500mm/min&lt;/code&gt;, Vollnut, Gleichlauffräsen.&lt;/p&gt;&#10;&lt;h2 id="schnittergebnisse"&gt;Schnittergebnisse&lt;/h2&gt;&#10;&lt;p&gt;Und ich war erschrocken, wie der Schnitt aussah, als ich fertig war.&#10;Hier sind die Symptome:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Während des Schneidens fiel die Spindeldrehzahl wiederholt ab, stieg aber schnell wieder auf die gewünschte Drehzahl an.&lt;/li&gt;&#10;&lt;li&gt;hohe Spanlast am Fräser, große Späne, sah alles gut aus&lt;/li&gt;&#10;&lt;li&gt;der Fräser folgte keiner geraden Linie: schien dem Material irgendwie ausweichen zu wollen.&lt;/li&gt;&#10;&lt;li&gt;bei der Herstellung von Anbindungen, um das Werkstück an Ort und Stelle zu halten, bewegt sich der Fräser ein wenig quer zur Fräsbahn, obwohl er das nicht sollte&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="suche-nach-dem-übeltäter"&gt;Suche nach dem Übeltäter&lt;/h2&gt;&#10;&lt;p&gt;Zuerst habe ich die Spindel überprüft. Keine Überhitzung, immer noch fest an der Portalfräse eingespannt, kein Lagerspiel, Schaftfräser sicher befestigt. Dann dachte ich: &amp;ldquo;Vielleicht stimmt etwas mit dem Portal nicht? Kann ich es merklich verwinden?&amp;rdquo; Nein, das konnte ich nicht. Dann sah ich mir den Schaftfräser an.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-18_overload_endmill.jpg" alt="Image: dull carbide endmill after cutting HPL" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Es sah überhaupt nicht gut aus. Die Schnittkanten waren an den Stellen, an denen sie das Material berührt hatten, praktisch weg. Seltsam. Es war nagelneu als ich den Auftrag begann, und der lief nicht einmal 20 Minuten lang.&lt;/p&gt;&#10;&lt;h2 id="analyseergebnisse"&gt;Analyseergebnisse&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ich habe viel zu aggressive Schnittdaten verwendet.&lt;/li&gt;&#10;&lt;li&gt;Dadurch wurde der Motor der Oberfräse weit über seine Möglichkeiten hinaus betrieben.&lt;/li&gt;&#10;&lt;li&gt;Dies führte zu einem plötzlichen Abfall der Motordrehzahl.&lt;/li&gt;&#10;&lt;li&gt;Dies wiederum führte zu einer erhöhten Spanbelastung meines Fräsers&lt;/li&gt;&#10;&lt;li&gt;Da die Lager und die Befestigung des Fräsmotors am Portal &amp;ldquo;weich&amp;rdquo; sind, versuchte der Fräser, seiner Fräsbahn auszuweichen&lt;/li&gt;&#10;&lt;li&gt;Dies hat mich wahrscheinlich vor dem Bruch des Fräsers bewahrt.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="verbesserungen"&gt;Verbesserungen&lt;/h2&gt;&#10;&lt;h3 id="neubewertung-der-schnittparameter-für-hochdrucklaminat"&gt;Neubewertung der Schnittparameter für Hochdrucklaminat&lt;/h3&gt;&#10;&lt;p&gt;Ich habe nochmal online recherchiert. HPL ist unglaublich hart und steif. Hier mal ein paar Werte zum Vergleich (Brinellhärte):&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Buche: &lt;code&gt;~3.7N/mm²&lt;/code&gt; (&lt;a href="https://www.olivenholzprodukte.de/Holzhaerte-Tabelle-nach-Brinell" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Source&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;&#10;&lt;li&gt;HPL: &lt;code&gt;~185N/mm²&lt;/code&gt; (&lt;a href="https://www.pro-hpl.org/assets/uploads/prohpl/files/200330_Technische_Kennziffern_und_physikalische_Eigenschaften_von_HPL.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Source&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;&#10;&lt;li&gt;Baustahl ST70: &lt;code&gt;215N/mm²&lt;/code&gt; (&lt;a href="https://www.ingenieurkurse.de/baustofftechnik-1/stoffeigenschaften-im-bauwesen/mechanische-eigenschaften-von-baustoffen/oberflaechenhaerte/brinellhaerte.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Source&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Des Weiteren fand ich einige Empfehlungen zur spanabhebenden Verarbeitung von HPL, z.B.: &amp;ldquo;Vollhartmetallfräser sollten eine Schnittgeschwindigkeit von bis zu &lt;a href="https://www.dekorplatten.de/sites/default/files/dateien/HPL-Verarbeitungshinweise.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;&lt;code&gt;150m/min&lt;/code&gt;&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&amp;rdquo; und &amp;ldquo;Diamantbeschichtungen aufweisen oder als Einschneider zur Bearbeitung von Aluminium ausgeführt sein&amp;rdquo;.&lt;/p&gt;&#10;&lt;h3 id="zwischenlösung"&gt;Zwischenlösung&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-18_overload_corrected.jpg" alt="Image: dull carbide endmill after cutting HPL" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Um die Dinge zu korrigieren, habe ich alle Ausschnitte mit den Schlicht-Einstellungen in CAM erneut durchgeführt. Mit einem neuen Schaftfräser und weniger aggressiven Vorschubgeschwindigkeiten von &lt;code&gt;F2500mm/min&lt;/code&gt; und einer aktualisierten Tiefe pro Durchgang von &lt;code&gt;Z+1,5mm&lt;/code&gt;.&#10;Das Ergebnis sieht jetzt viel besser aus.&lt;/p&gt;&#10;&lt;h3 id="optimierung-der-schnittdaten"&gt;Optimierung der Schnittdaten&lt;/h3&gt;&#10;&lt;p&gt;Dann berechnen wir schnell mal neue Schnittdaten aufgrund der oben gewonnenen Erkenntnisse. Ich wähle einen &lt;code&gt;4mm&lt;/code&gt; Einschneider (&lt;code&gt;z=1&lt;/code&gt;) mit Beschichtung zur besseren Wärmeabfuhr für Aluminium und lege die oben genannte Schnittgeschwindigkeit von &lt;code&gt;vc=150m/min&lt;/code&gt; für HPL zugrunde. Weiterhin wähle ich einen Zahnvorschub von &lt;code&gt;fTooth = 0,025mm&lt;/code&gt;, ähnlich wie beim Fräsen von Stahl.&lt;/p&gt;&#10;&lt;p&gt;Zieldrehzahl: &lt;/p&gt;&#10;$$n=\frac{v_c}{\pi d}=\frac{150000\frac{mm}{min}}{\pi \cdot 4mm}=12000\frac{1}{min}$$&lt;p&gt;Zielvorschub: &lt;/p&gt;&#10;$$F=n \cdot f_{Tooth} \cdot z = 12000\frac{1}{min} \cdot 0,025mm \cdot min \cdot 1= 300\frac{mm}{min}$$&lt;p&gt;Ich habe einen &lt;code&gt;4mm&lt;/code&gt;-Schaftfräser gewählt, weil das Drehmoment meines Fräsmotors bei sinkender Drehzahl überproportional abnimmt. Bei größerem Fräserdurchmesser würde dieser Effekt wahrscheinlich zu einer unzureichenden Schnittleistung führen. Spindeln mit einer Asynchronmaschine sind hier durch ihr konstant hohes Drehmoment im unteren Drehzahlbereich (bei Vektorsteuerung kann es sogar deutlich über dem Nennmoment des Motors liegen) ganz klar im Vorteil.&lt;/p&gt;&#10;&lt;p&gt;Der berechnete Vorschub kommt mir so langsam vor. Ich hoffe, dass sich das Material dadurch nicht so stark erhitzt, dass es delaminiert (laut Wikipedia schmilzt es nicht&amp;hellip;)&lt;/p&gt;&#10;&lt;p&gt;Zur Information: &lt;a href="https://hobbyline.info/forum/index.php?thread/678-hpl-platten-fr%C3%A4sen/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Hier ist der zugehörige Thread&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; in dem Forum, das ich regelmäßig besuche.&lt;/p&gt;&#10;&lt;h3 id="weitere-tests"&gt;Weitere Tests&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-18_coated_new.jpg" alt="Image: new coated carbide endmill for aluminium" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ich habe einige Teile mit oben angesprochenem Fräser und Einstellungen gefertigt. Um die Fertigungszeiten etwas im Zaum zu halten, habe ich die Werte leicht angepasst: &lt;code&gt;ftooth = 0.04mm&lt;/code&gt; und &lt;code&gt;vc = 130m/min&lt;/code&gt;. Für den &lt;code&gt;4mm&lt;/code&gt; Fräser ergibt sich&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;S = 10300U/min&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;F = 410mm/min&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Z+ = 3mm&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;vc = 1%&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Dieser Schaftfräser lebte etwa 1 Stunde lang. Nicht lange genug. Das Schneiden mit einem solchen Fräser könnte nie wirtschaftlich werden. Das HPL, das ich verwende, hat zwei Materialeigenschaften, die Hartmetallfräser schnell zerstören: Erstens ist es abrasiv, sodass die dünne Schneide des Fräsers abgetragen und zerstört wird. Meines ist ganz besonders abrasiv, da es einen unheimlich hohen Faseranteil besitzt. Zweitens leiten die Späne die entstehende Wärme nicht gut von der Schneide ab, so dass ihre Schärfe noch schneller nachlässt. Hitze scheint das Kryptonit für Hartmetallfräser zu sein.&lt;/p&gt;&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-18_coated_worn.jpg" alt="Image: coated carbide endmill for aluminium after 1h" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="endgültige-lösung"&gt;Endgültige Lösung&lt;/h3&gt;&#10;&lt;p&gt;Eine wirtschaftlichere Lösung mit 40-facher (Herstellerangabe) Lebensdauer wäre ein Hartmetallfräser mit Diamantschneiden (z. B. wie &lt;a href="https://www.artifex24.de/JSO-5mm-Diamant-PKD-Nutschaftfraeser-Diatec-DUO-5x10/50mm-Z2-S6-rechts" target="_blank" rel="noopener noreferrer" class="external-link"&gt;dieser hier&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;). Der Nachteil ist, dass sie fast zehnmal so teuer sind. Wenn ich dieses Material in Zukunft öfter schneiden muss, kaufe ich vielleicht einen und teile meine Erfahrungen - in der Zwischenzeit lasse ich die Fräser lieber schärfen, um Geld zu sparen.&lt;/p&gt;&#10;</description></item><item><title>Mein Fräser 'kreischt'</title><link>https://blog.schallbert.de/my-endmill-screams/</link><pubDate>Mon, 06 Jun 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/my-endmill-screams/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-06_endmill-thumb.jpg"&#10; class="post-cover"&#10; alt="Anfängerproblem mit CNC: Vorschub/Dehzahl"&#10; title="Mein Fräser &amp;#39;kreischt&amp;#39;" /&gt;&#10;&lt;h3 id="einordnung"&gt;Einordnung&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-03_upcut_bit.jpg" alt="Image: a 2-flute upcut bit for wood" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ich arbeite gerade an meinem allerersten CNC-Fräsprojekt: Eine &amp;ldquo;Opferplatte&amp;rdquo; mit Schraubmuffen und T-Nuten für die Niederhalter, welche einen Anschlag für Werkstücke und eine Aufnahme für den Werkzeuglängensensor besitzt.&lt;/p&gt;&#10;&lt;p&gt;Auf der Oberfräse habe ich bis jetzt nur gerade genutete HSS-Fräser mit großen Durchmessern verwendet. Für die CNC kaufte ich nun 6-mm-Vollhartmetallfräser &amp;ldquo;Fischschwanz&amp;rdquo; mit zwei Schneiden und einer Arbeitslänge von &lt;code&gt;21mm&lt;/code&gt;. Und der klingt einfach furchtbar, ganz anders als ich es von der Oberfräse gewöhnt bin.&lt;/p&gt;&#10;&lt;h3 id="die-verwirrung-des-anfängers"&gt;Die Verwirrung des Anfängers&lt;/h3&gt;&#10;&lt;p&gt;Mit diesem Fräser habe ich die vom Hersteller empfohlenen Vorschübe und Geschwindigkeiten für Hartholz auf meinem Werkstück aus mitteldichten Faserplatten eingehalten (Tiefe pro Durchgang: &lt;code&gt;6mm&lt;/code&gt;, Vorschub: &lt;code&gt;3500mm/min&lt;/code&gt;, Drehzahl: &lt;code&gt;24000U/min&lt;/code&gt;). Aber offensichtlich mache ich etwas falsch, denn beim Schneiden gibt es ein schrecklich lautes, unangenehmes schrilles und zischendes Geräusch.&lt;/p&gt;&#10;&lt;p&gt;Ich habe die Vorschubgeschwindigkeit allmählich erhöht, weil ich den Eindruck hatte, dass die Fräser wegen zu geringen Vorschubs so klingen. Ich landete bei &lt;code&gt;9100mm/min&lt;/code&gt; (!), wo es etwas besser war. Trotzdem ging dieses unangenehme Geräusch nicht weg.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-06_endmill_screams.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Fräser &amp;#39;kreischt&amp;#39; beim Zerspanen von MDF&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="analyse"&gt;Analyse&lt;/h3&gt;&#10;&lt;p&gt;Nachdem die 15-minütige Arbeit beendet war, habe ich den Schaftfräser angefasst - die Spannuten sind so gut wie neu und der Fräser fühlt sich kaum warm an. Hmm. Auch der Fräsmotor klang nicht gestresst. Meine Schrittmotoren ließen die Maschine buchstäblich durch das MDF pflügen (reibungslos und ohne Probleme), ich musste sogar die Absaugung aufdrehen, um nicht im Staub zu ertrinken. Auch das Ergebnis sieht für mich gut aus; die Toleranzen sind eng und der Schnitt ist so sauber, wie ich es erwarte - viel besser als ich es von Hand hätte machen können.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-03_mdf_result.jpg" alt="Image: milling in MDF - spoilboard t-nut slots" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="offene-fragen"&gt;Offene Fragen&lt;/h3&gt;&#10;&lt;p&gt;Was mache ich also falsch? Ist dieses Geräusch &amp;ldquo;normal&amp;rdquo; für einen 2-Schneider mit so kleinem Durchmesser? Braucht MDF ganz andere Parameter als Hartholz, um leise zu schneiden, z.B. viel weniger Spindeldrehzahl? Muss ich in meinem CAM-Tool eine andere Frässtrategie wählen?&lt;/p&gt;&#10;&lt;p&gt;Diese Fragen stelle ich schnell mal im Forum.&lt;/p&gt;&#10;&lt;h3 id="fragen-beantwortet"&gt;Fragen beantwortet&lt;/h3&gt;&#10;&lt;p&gt;OK, ich habe eine Antwort vom &lt;a href="https://hobbyline.info/forum/index.php?thread/620-mein-fr%C3%A4ser-kreischt/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Hersteller des Bits&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Dieses Geräusch ist normal für Schaftfräser, die auf das Schneiden von Holz spezialisiert sind. Nun denn. Wahrscheinlich sollte ich ein Gehäuse für meine Maschine bauen und ein paar sehr gute Ohrstöpsel kaufen. 😬 Nach ein paar Gesprächen mit einem weiteren Werkzeughersteller bestätigt sich diese Aussage nochmal:&lt;/p&gt;&#10;&lt;p&gt;&amp;ldquo;Zweischneider sind immer lauter als gleichgroße Ein- oder Dreischneider. Ihre im 180°-Winkel gegenüberliegenden Flanken sorgen durch die im Wechsel im Eingriff befindlichen Schneiden für zusätzliche Schwingungen des Fräsers. Dafür bieten sie ein besseres Verschleißverhalten als Einschneider und ermöglichen eine bessere Spanabfuhr als Dreischneider.&amp;rdquo;&lt;/p&gt;&#10;&lt;h3 id="vergleich-gleiches-material-anderer-fräser"&gt;Vergleich: Gleiches Material, anderer Fräser&lt;/h3&gt;&#10;&lt;p&gt;Hier ist ein Vergleichsvideo um zu beurteilen, wie unterschiedlich Fräser in demselben Material klingen können:&#10;&lt;code&gt;14mm 3-Schneider&lt;/code&gt; Planfräser, &lt;code&gt;10mm Schaft, S5500, F7100, Z0.3, Fxy 90%&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-06_leveling.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;14mm Planfräser nivelliert in aller Ruhe meine Opferplatte.&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Zum Testen habe ich in meinem CAM-Werkzeug eine Spiralstrategie verwendet, die 50% mehr Zeit benötigt als die typischen &amp;ldquo;Rasenmäher&amp;rdquo;-Strategien. Auf diese Weise gibt es keine sichtbaren Fräsbahnen im fertigen Material.&lt;/p&gt;&#10;&lt;h2 id="update-april-2024"&gt;Update April-2024:&lt;/h2&gt;&#10;&lt;p&gt;Nach etwa zwei Jahren Betrieb mit diesen Holzfräsern kann ich sagen, dass sie robust laufen und lange halten. Hier ist mehr Vorschub und mehr Tiefenzustellung besser, als zu behutsam vorzugehen (&lt;code&gt;F4000 S24000 Z+12mm&lt;/code&gt; ist in Birke Multiplex auf meiner Maschine durchaus drin). Und die Fräser sind im Gegenlauf deutlich leiser als im Gleichlauf.&lt;/p&gt;&#10;</description></item><item><title>CNC Teil5 - Makros</title><link>https://blog.schallbert.de/macros-for-cnc/</link><pubDate>Wed, 11 May 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/macros-for-cnc/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-11_sub-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: snippet of the tool length sensor self-test macro for my CNC machine. It shows C-style code and checks if the probe touches the sensor."&#10; title="CNC Teil5 - Makros" /&gt;&#10;&lt;p&gt;Dies ist der fünfte Teil meiner Serie über Portalfräsmaschinen. Er befasst sich mit praktischem Zubehör, welches das Leben als CNC-Bediener erleichtert und zu schnelleren und genaueren Fräsergebnissen führen kann.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/portal-milling/"&gt;&lt;em&gt;Teil 1&lt;/em&gt;: Gedanken zu CNCs im Allgemeinen und zur Maschinenauswahl&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/cnc-electronics/"&gt;&lt;em&gt;Teil 2&lt;/em&gt;: CNC-Elektronik aufbauen&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/portal-milling-build/"&gt;&lt;em&gt;Teil 3:&lt;/em&gt; CNC-Maschinenbau&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/portal-milling-setup/"&gt;&lt;em&gt;Teil 4:&lt;/em&gt; CNC-Einrichtung&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="übersicht"&gt;Übersicht&lt;/h2&gt;&#10;&lt;p&gt;In diesem Artikel geht es um Makros für die CNC, mit deren Hilfe sich wiederholende Vorgänge automatisiert werden können. Ich decke sowohl grundlegende als auch anspruchsvollere Makros für mehrere Zwecke wie automatische Z-Nullstellung, Werkzeuglängenmessung oder Werkzeugwechsel ab.&#10;Ich führe ein paar &lt;a href="https://www.linuxcnc.org/docs/html/gcode/g-code.html#_g_code_quick_reference_table_a_id_gcode_quick_reference_table_a" target="_blank" rel="noopener noreferrer" class="external-link"&gt;G-Code&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Befehle ein. Die Beschäftigung damit half mir dabei, ein tieferes Verständnis der Funktionsweise zu erarbeiten und damit &amp;ldquo;Vertrauen&amp;rdquo; zu meiner Maschine aufzubauen.&lt;/p&gt;&#10;&lt;h2 id="haftungsausschluss"&gt;Haftungsausschluss&lt;/h2&gt;&#10;&lt;p&gt;Die folgenden Subroutinen wurden für den RS274 NGC Interpreter geschrieben. Ich habe sie mit &lt;a href="https://edingcnc.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;EdingCNC&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; validiert, da dies die von mir verwendete CNC-Software ist. Ich habe einige Aspekte von Makro-Dateien abgeleitet, die sowohl &lt;a href="https://webseite.sorotec.de/service/downloads/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Sorotec&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; als auch Eding zusammen mit ihren Maschinen ausliefern.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;⚠️ Ich kann für die Funktion des hier beschriebenen Codes auf anderen Maschinen keine Verantwortung übernehmen. Meine Absicht ist lediglich zu erklären wie die Makros funktionieren.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="was-ist-ein-makro"&gt;Was ist ein Makro?&lt;/h2&gt;&#10;&lt;p&gt;Ein Makro oder Unterprogramm ist eine Sammlung von Anweisungen, die für den CNC-Interpreter geschrieben wurden, um Aktionen auszuführen. Sie werden oft verwendet, um wiederkehrende Vorgänge zu automatisieren. Auf meiner Maschine beginnt ein solches Makro mit einem &lt;code&gt;SUB&lt;/code&gt;-Befehl und endet mit einem &lt;code&gt;ENDSUB&lt;/code&gt;. Makros enthalten oft Verzweigungslogik und G-Code-Befehle, beispielsweise um die Maschine Bewegungen ausführen zu lassen, Parameter abzuspeichern oder Benutzerdialoge anzuzeigen.&lt;/p&gt;&#10;&lt;p&gt;Auf meiner Maschine befinden sich alle Makros in einer einzigen Datei namens &lt;code&gt;macro.cnc&lt;/code&gt;, die von meiner CNC-Software beim Start eingelesen wird. Einige &amp;ldquo;Soft-Buttons&amp;rdquo; der Software rufen direkt Makros aus dieser Datei auf, z.B. für die Referenzfahrt.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-11_macro.jpg" alt="Image: Macro execution in action" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Als kleine Einführung öffne ich das Dokument &lt;code&gt;macro.cnc&lt;/code&gt; mit einem Texteditor. Ich suche nach &lt;code&gt;Sub user_9&lt;/code&gt; (es sollte eine Routine sein, die nichts Relevantes tut), entferne ihren Inhalt und füge stattdessen &lt;code&gt;MSG &amp;quot;hello world!&amp;quot;&lt;/code&gt; ein. Abspeichern, CNC-Software öffnen, die Taste &lt;code&gt;9&lt;/code&gt; im &lt;code&gt;user menu &lt;/code&gt; drücken und Voilà!&lt;/p&gt;&#10;&lt;h2 id="ein-einfaches-makro-zur-erkennung-des-status-des-werkzeuglängensensors"&gt;Ein einfaches Makro zur Erkennung des Status des Werkzeuglängensensors&lt;/h2&gt;&#10;&lt;p&gt;Legen wir los und verbinden das neu erworbene Wissen über Makros mit einem nützlichen Beispiel.&lt;/p&gt;&#10;&lt;h3 id="der-werkzeuglängensensor"&gt;Der Werkzeuglängensensor&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-11_tls3d.jpg" alt="Image: Mein Werkzeuglängensensor" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ein Werkzeuglängensensor (im Folgenden &lt;em&gt;WZLS&lt;/em&gt;) ist ein Zubehörteil, das an einen Eingang der CNC-Maschine angeschlossen wird und bei Berührung (z.B. durch eine Werkzeugspitze) auslöst. Es gibt viele verschiedene Ausführungen, von einem einfachen Mikroschalter mit Gehäuse und Tastmechanismus bis hin zu hochpräzisen induktiven Sensoren aus feingedrehtem Edelstahl mit automatischer Luftspülung um sicherzustellen, dass die Oberfläche des Sensors sauber ist.&lt;/p&gt;&#10;&lt;p&gt;Der Werkzeuglängensensor wird entweder am Maschinenbett, auf dem Ablagetisch oder einfach an einer anderen festen Position an der Maschine angebracht. Meiner ist ein sehr einfacher Schalter. Seine Wiederholgenauigkeit ist mit &lt;code&gt;10µm&lt;/code&gt; angegeben.&lt;/p&gt;&#10;&lt;h3 id="makro-aufgabe"&gt;Makro-Aufgabe&lt;/h3&gt;&#10;&lt;p&gt;Das Makro soll vor der Messung prüfen, ob der WZLS betriebsbereit ist. Ich teste also, ob der Sensorschalter den Status &amp;ldquo;nicht ausgelöst&amp;rdquo; hat. Seine Verdrahtung ist als &amp;ldquo;normally closed&amp;rdquo; (NC) ausgeführt. Falls er doch ausgelöst ist (seine Kontakte also offen sind), könnte das Folgendes bedeuten:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Der Sensor klemmt in der ausgelösten Position&lt;/li&gt;&#10;&lt;li&gt;Kabelbruch in der Zuleitung zum WZLS&lt;/li&gt;&#10;&lt;li&gt;Sensor ist nicht mit der Maschine verbunden&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="code-prüfe-betriebsbereitschaft-wzls"&gt;Code: Prüfe Betriebsbereitschaft WZLS&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SUB&lt;/span&gt; is_sensor_ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;sensorStatus &lt;span style="color:#f92672"&gt;==&lt;/span&gt; triggered&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# 5068 == 0 (normally closed)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;DLGMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Tool length sensor not connected or already triggered - please check&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;dialogButton &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;sensorStatus &lt;span style="color:#f92672"&gt;==&lt;/span&gt; triggered&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Tool length sensor input still unexpected - aborting&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;User abort.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENDSUB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Name des Makros lautet &lt;code&gt;is_sensor_ok&lt;/code&gt;. Ich prüfe den Sensorstatus und zeige eine Dialogmeldung an, falls hier etwas nicht stimmt. Sobald auf &amp;ldquo;OK&amp;rdquo; gedrückt wird, gehe ich davon aus, dass das Problem behoben wurde und versuche es erneut. Wenn er immer noch ausgelöst ist, breche ich die Routine ab.&lt;/p&gt;&#10;&lt;p&gt;Dieses Prüf-Makro ist in allen folgenden Abschnitten zu finden.&lt;/p&gt;&#10;&lt;h3 id="benennung-von-variablen"&gt;Benennung von Variablen&lt;/h3&gt;&#10;&lt;p&gt;Die RS274/NGC-Sprache ist alt. Wirklich alt. Ihre erste Version wurde in den späten 1950er Jahren veröffentlicht. Kein Wunder, dass die Parameter (#1 - #5399 ist der erlaubte Bereich) alle numerisch sind. Sowohl in der Benennung als auch in den Werten, die sie speichern können. Es gibt kein Typsystem (wie &lt;code&gt;Strings&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; usw.) und keine praktischen Aliase oder menschenlesbare Namen, die das Verständnis eines Parameters wie &lt;code&gt;sensorStatus&lt;/code&gt; erleichtert.&lt;/p&gt;&#10;&lt;p&gt;Im Makro auf der Maschine wird stattdessen &lt;code&gt;#5068&lt;/code&gt; erscheinen man muss sich selbst daran erinnern, dass der Hersteller der CNC-Software such auf diese Variable festgelegt hat, um den Status des Werkzeuglängensensors zu kennzeichnen. Und dass sie vom Typ &lt;code&gt;boolean&lt;/code&gt; ist mit &lt;code&gt;0&lt;/code&gt; = nicht ausgelöst und &lt;code&gt;1&lt;/code&gt; = ausgelöst.&lt;/p&gt;&#10;&lt;p&gt;Um den Makrocode so lesbar und verständlich wie möglich zu gestalten, verzichte ich in diesem Artikel auf die Verwendung von numerischen Parameternamen. Eine Übersetzungstabelle ist &lt;a href="https://blog.schallbert.de/macros-for-cnc/#tables"&gt;ganz unten&lt;/a&gt; zu finden.&lt;/p&gt;&#10;&lt;h2 id="verwendung-des-werkzeuglängensensors-zur-ermittlung-der-werkstückhöhe-z0"&gt;Verwendung des Werkzeuglängensensors zur Ermittlung der Werkstückhöhe (Z=0)&lt;/h2&gt;&#10;&lt;p&gt;Hiermit kann die Werkstückhöhe automatisch eingemessen und auf der Obefläche abgenullt werden. So entfallen das manuelle Absenken der Z-Achse bis das Werkzeug die Oberfläche leicht ankratzt und dann das Festlegen der Werkstückkoordinaten.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-11_tls.jpg" alt="Image: Skizze Werkzeuglängensensor" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Sobald das Makro programmiert und eingerichtet ist, wird der WZLS möglichst mittig auf dem Werkstück platziert und die Spindel der Maschine mit ein paar Millimeter Luft direkt über diesem in Position gebracht. Dann wird das Makro gestartet. Die Maschine wird nun automatisch ihre Z-Achse langsam absenken, bis der Sensor schaltet. Dann fährt sie sehr langsam zurück, bis der Sensorkontakt wieder geschlossen ist. Dieser Punkt wird dann zur Bestimmung von &lt;code&gt;Z0&lt;/code&gt; herangezogen, welcher dann automatisch gesetzt wird.&lt;/p&gt;&#10;&lt;h3 id="voraussetzungen"&gt;Voraussetzungen&lt;/h3&gt;&#10;&lt;p&gt;Bevor wir das Makro schreiben können, benötigen wir die Z-Position des Werkzeuglängensensors &amp;ldquo;zTls&amp;rdquo; zum Zeitpunkt des Umschaltens von &amp;ldquo;ausgelöst&amp;rdquo; auf &amp;ldquo;nicht ausgelöst&amp;rdquo;. Ich habe meine vorerst (denn das ist nicht sehr genau) mit einem Messschieber gemessen und notiert. Wir brauchen diesen Wert, damit die Maschine ihn beim Ansetzen von der Z-Höhe abziehen kann, um die Position der Werkstückoberfläche zu ermitteln.&lt;/p&gt;&#10;&lt;p&gt;Wie man die Messung des Auslösepunktes präziser hinbekommt soll Gegenstand eines eigenen Artikels werden.&lt;/p&gt;&#10;&lt;p&gt;Außerdem ist es wichtig zu wissen, wie der Schalter mit der Maschine verbunden ist. Die bevorzugte Art ist &amp;ldquo;NC&amp;rdquo;, d.h. der Schalter öffnet sich, wenn er ausgelöst wird: &amp;ldquo;Ausgelöst = 0&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Schließlich müssen wir den Vorwärts- und Rückwärtsvorschub des Messtasters festlegen, z.B. &lt;code&gt;Absenken = 100mm/min&lt;/code&gt;, &lt;code&gt;Anheben = 10mm/min&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Das Makro enthält auch einen etwas aufwändigeren Teil: Wenn &lt;code&gt;Z0&lt;/code&gt; gemessen werden soll, obwohl die aktuell Werkzeuglänge noch unbekannt ist, macht das keinen Sinn: Bei einem Werkzeugwechsel wäre sie nicht in der Lage, den Nullabgleich auszuführen.&lt;/p&gt;&#10;&lt;p&gt;Daher wird in diesem Fall die Werkzeugvermessung zwischengeschoben: die Maschine speichert die aktuelle Position &lt;code&gt;posX, posY&lt;/code&gt; vor der Fahrt zum Werkzeuglängensensor in Hilfsvariablen zwischen und führt direkt das Makro &lt;code&gt;get_tool_length&lt;/code&gt; aus. Anschließend fährt sie wieder in die Ausgangsposition zurück, um die Vermessung von &lt;code&gt;Z0&lt;/code&gt; nachzuholen.&lt;/p&gt;&#10;&lt;h3 id="das-unterprogramm-z0-bestimmen"&gt;Das Unterprogramm &amp;ldquo;Z0 bestimmen&amp;rdquo;&lt;/h3&gt;&#10;&lt;p&gt;Nach dem Ausschalten der Spindel senkt das Programm mit dem Befehl &lt;code&gt;G38.2&lt;/code&gt; die Z-Achse der Maschine ab, bis der Fräser Werkzeuglängensensor auslöst (oder bis sie ohne eingelegtes Werkzeug so weit nach unten gefahren ist, dass die Spindelnase den Sensor fast berührt, wo das Makro dann wiederum abbrechen würde, weil es den Sensor nicht gefunden hat). Sobald der Sensor ausgelöst, fährt die Maschine vorsichtig die Z-Achse wieder hoch. Der Punkt der erneuten Freigabe des Sensors durch das Werkzeug wird dann als Koordinaten-Offset für die Z-Achse mit dem Befehl &lt;code&gt;G92&lt;/code&gt; gespeichert.&lt;/p&gt;&#10;&lt;h3 id="code-werkstücknullpunkt-bestimmen"&gt;Code: Werkstücknullpunkt bestimmen&lt;/h3&gt;&#10;&lt;p&gt;Bevor wir beginnen stellen wir sicher, dass alle Vorbedingungen erfüllt sind:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die Werkzeuglänge ist bekannt&lt;/li&gt;&#10;&lt;li&gt;Der WZLS ist korrekt angeschlossen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SUB&lt;/span&gt; measure_workpiece_z0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;![&lt;/span&gt;toolLengthStat&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;DLGMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;WARNING - Please first measure tool length!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;dialogButton &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xPosReposition &lt;span style="color:#f92672"&gt;=&lt;/span&gt; xPos&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yPosReposition &lt;span style="color:#f92672"&gt;=&lt;/span&gt; yPos&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repositionTo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GOSUB&lt;/span&gt; get_tool_length&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GOSUB&lt;/span&gt; is_sensor_ok ;&lt;span style="color:#75715e"&gt;# Check if tool length sensor status is OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Programmieren wir nun die eigentliche Routine, indem wir abfragen, ob der Z-Nullabgleich jetzt durchgeführt werden soll. Wenn die CNC im Simulationsmodus läuft (ohne angeschlossene Hardware), wird der Z-Nullabgleich nicht funktionieren. Also müssen wir auch dies überprüfen und den Schritt gegebenenfalls überspringen.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;DLGMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Start Z-Zeroing?&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;dialogButton &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;operatingMode &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; simulator&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;M5&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;#Switch spindle off&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;M9&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;#Switch coolant off&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G38&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSpindleTip &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; F&lt;span style="color:#f92672"&gt;[&lt;/span&gt;touch&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;&lt;span style="color:#75715e"&gt;# G38.2 = touch toward probe, stop on contact, flag error on fail&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;&lt;span style="color:#75715e"&gt;# fail = 5mm before touching spindle tip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;probeOk &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# #5067 == 1 : G38.2 command success&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G38&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G91&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Z20&lt;/span&gt; F&lt;span style="color:#f92672"&gt;[&lt;/span&gt;rev&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# now reverse slowly to find untrigger point (max. 20mm up)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G90&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# back to absolute coordinates&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;probeOk &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zTouched&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# #5063 Go to Z-axis&amp;#39;s probe point&#9;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G92&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zTls&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Set Z-axis&amp;#39;s coordinate offset (0) to tool length sensor&amp;#39;s height&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zTls &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# clear sensor&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Could not locate sensor untrigger point.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;DLGMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Could not locate sensor trigger point. Retry?&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;dialogButton &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &#9;&#9;&#9;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GOSUB&lt;/span&gt; measure_workpiece_z0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;User abort.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENDSUB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-06-11_z_zeroing.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Ausführen des Makros Z-Nullabgleich auf Zerspanobert&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="messung-der-werkzeuglänge"&gt;Messung der Werkzeuglänge&lt;/h2&gt;&#10;&lt;p&gt;Wenn die Maschine die Werkzeuglänge kennt, bevor sie den Z-Nullpunkt misst, muss der Z-Nullpunkt bei anstehenden Werkzeugwechseln während des Auftrags nicht erneut bestimmt werden. Das passende Makro beschreibe ich im Folgenden.&lt;/p&gt;&#10;&lt;h3 id="vorbereitung"&gt;Vorbereitung&lt;/h3&gt;&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-06-11_toolLengthVariables.jpg" alt="Image: get_tool_length macro parameters" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die meisten CNCs leiten ihre aktuellen Positionsdaten durch Zählen der Motorschritte ab, die sie nach Abschluss der Referenzfahrt ausgeführt hat. Um nun die Werkzeuglänge zu vermessen, benötigt sie ein paar einprogrammierte Parameter:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Z-Position der Spindelnase &lt;code&gt;zSpindleTip&lt;/code&gt; (berührt Werkzeuglängensensor ohne eingelegtes Werkzeug) damit berechnet werden kann, wie weit das Werkzeug aus der Spindel herausragt&lt;/li&gt;&#10;&lt;li&gt;X-Position &lt;code&gt;xPosTls&lt;/code&gt; des Werkzeuglängensensors beim Werkzeugwechsel&lt;/li&gt;&#10;&lt;li&gt;Y-Position &lt;code&gt;yPosTls&lt;/code&gt; des Werkzeuglängensensors bei Werkzeugwechseln&lt;/li&gt;&#10;&lt;li&gt;Sicherheitshöhe &lt;code&gt;zSafety&lt;/code&gt; (stellt sicher, dass die Spindel auf ihrem Weg zum Werkzeugwechselbereich nicht auf ein Hindernis stößt)&lt;/li&gt;&#10;&lt;li&gt;Tastvorschub vorwärts und rückwärts. Wir können ihn aus dem Makro für den Werkstücknullpunkt wiederverwenden.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="die-unterroutine-werkzeuglänge-messen"&gt;Die Unterroutine &amp;ldquo;Werkzeuglänge messen&amp;rdquo;&lt;/h3&gt;&#10;&lt;p&gt;Legen wir zunächst fest, was diese Unterroutine tun soll:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Spindel, Kühlmittel etc. anhalten.&lt;/li&gt;&#10;&lt;li&gt;Dialog: Bediener soll geschätzte Werkzeuglänge eingeben&lt;/li&gt;&#10;&lt;li&gt;Eilgang Z auf Sicherheitshöhe, dann XY zur Position des Werkzeugsensors&lt;/li&gt;&#10;&lt;li&gt;Werkzeuglängensensor antasten, ähnlich wie bei der Werkstücknullpunktbestimmung&lt;/li&gt;&#10;&lt;li&gt;Werkzeuglänge berechnen&lt;/li&gt;&#10;&lt;li&gt;Berechnung der Differenz zwischen der letzten und der aktuellen Werkzeuglänge&lt;/li&gt;&#10;&lt;li&gt;Z-Nullpunkt entsprechend aktualisieren&lt;/li&gt;&#10;&lt;li&gt;Z im Eilgang wieder auf Sicherheitshöhe bringen&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="function-measure-tool-length"&gt;Code: Werkzeug vermessen&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SUB&lt;/span&gt; get_tool_length&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GOSUB&lt;/span&gt; is_sensor_ok ;&lt;span style="color:#75715e"&gt;# Check if tool length sensor status is OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;DLGMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Start tool length measurement? Please enter estimated tool length: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;toolLengthEst&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;dialogButton &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;operatingMode &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; simulator&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;toolLengthEst &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Error: tool length cannot be negative.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSpindleTip&lt;span style="color:#f92672"&gt;+&lt;/span&gt; toolLengthEst &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSafety&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Error: tool too long - could collide with sensor.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;M5&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Switch spindle off&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;M9&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Switch coolant off&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSafety&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Go to safety height (machine coordinates)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; X&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xPosTls&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Y&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xPosTls&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Go to tool length sensor&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSpindleTip &lt;span style="color:#f92672"&gt;+&lt;/span&gt; toolLengthEst &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Move Z down to 10mm above estimated tool tip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;&lt;span style="color:#75715e"&gt;# measure tool length, save results, apply Z-offset if needed&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G38&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSpindleTip&lt;span style="color:#f92672"&gt;]&lt;/span&gt; F&lt;span style="color:#f92672"&gt;[&lt;/span&gt;touch&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# probe sensor, latest stop point is spindle tip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;probeOk &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# #5067 == 1 : G38.2 command success&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G38&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G91&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Z20&lt;/span&gt; F&lt;span style="color:#f92672"&gt;[&lt;/span&gt;rev&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# now reverse slowly to find untrigger point&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G90&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# back to absolute coordinates&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;probeOk &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;zTouched &lt;span style="color:#f92672"&gt;-&lt;/span&gt; sTip&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Tool length = &amp;#34;&lt;/span&gt; toolLength&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;toolLengthStat &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# defaults to 0 on startup&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lastToolLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; currToolLength ;&lt;span style="color:#75715e"&gt;# save last tool&amp;#39;s length&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currToolLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toolLength ;&lt;span style="color:#75715e"&gt;# save current tool&amp;#39;s length&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolLengthDiff &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;currToolLength &lt;span style="color:#f92672"&gt;-&lt;/span&gt; lastToolLength&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G92&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zPos &lt;span style="color:#f92672"&gt;-&lt;/span&gt; toolLengthDiff&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Set Z-axis&amp;#39;s coordinate offset (0)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currToolLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toolLength ;&lt;span style="color:#75715e"&gt;# save current tool&amp;#39;s length&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolLengthStat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GOSUB&lt;/span&gt; reposition_spindle&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Could not locate sensor untrigger point.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Could not locate sensor trigger point.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENDSUB&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-06-11_tool_length_measurement.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Werkzeuglängenmakro auf meiner Maschine&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;In diesem Video ist die Maschine so konfiguriert, dass sie zum XY-Nullpunkt zurückkehrt, wenn die Werkzeugmessung abgeschlossen ist.&lt;/p&gt;&#10;&lt;h2 id="werkzeugwechsel"&gt;Werkzeugwechsel&lt;/h2&gt;&#10;&lt;p&gt;Wenn es kein Makro für den Werkzeugwechsel gibt, hält die Maschine ihren Auftrag an. Sobald die &lt;code&gt;Z0&lt;/code&gt;-Position des Werkstücks erneut ermittelt wurde (denn die Werkzeuglänge hat sich ja wahrscheinlich geändert), kann der Auftrag fortgesetzt werden.&lt;/p&gt;&#10;&lt;p&gt;Diese Aufgabe kann automatisiert werden, indem der Z-Nullpunkt durch Bestimmen der neuen Werkzeuglänge gegenüber der alten neu kalibriert wird.&lt;/p&gt;&#10;&lt;h3 id="voraussetzungen-1"&gt;Voraussetzungen&lt;/h3&gt;&#10;&lt;p&gt;Ein optionales Flag &lt;code&gt;getToolLength&lt;/code&gt; kann das Verhalten des Werkzeugwechsel-Makros konfigurieren - ob die Länge jedes Werkzeugs nach einem Werkzeugwechsel gemessen werden soll oder nicht. Wenn Sie einen automatischen Werkzeugwechsler haben, brauchen Sie dies wahrscheinlich nicht: In diesem Falle ist die Werkzeuglänge in einer Tabelle festgehalten und die Längenkompensation erfolgt ohne Vermessung.&lt;/p&gt;&#10;&lt;p&gt;Die folgenden zusätzlichen Parameter werden ebenfalls benötigt:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;X-Position &lt;code&gt;xToolChg&lt;/code&gt; wo der Werkzeugwechsel stattfindet (bei mir ist es &lt;code&gt;xToolChg = xPosTls&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;Y-Position &lt;code&gt;yToolChg&lt;/code&gt;, wo der Werkzeugwechsel stattfindet (bei mir ist es &lt;code&gt;yToolChg = yPosTls&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;Wiederverwendung von &lt;code&gt;zSafety&lt;/code&gt; aus &lt;code&gt;get_tool_length&lt;/code&gt; Makro&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;newToolNumber&lt;/code&gt; zur Angabe des angeforderten Werkzeugs aus dem G-Code (oder bei manueller Eingabe)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;currToolNumber&lt;/code&gt; zur Angabe des &amp;ldquo;alten&amp;rdquo; Werkzeugs, das ersetzt werden soll&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ToolChangeDone&lt;/code&gt;-Hilfsflag, um anzuzeigen, ob ein Werkzeugwechsel bereits stattgefunden hat&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="das-makro-werkzeugwechsel"&gt;Das Makro &amp;ldquo;Werkzeugwechsel&amp;rdquo;&lt;/h3&gt;&#10;&lt;p&gt;Die folgenden Schritte werden von dem Makro ausgeführt, wenn ein Werkzeugwechsel entweder durch den Befehl &lt;code&gt;M06&lt;/code&gt; &amp;ldquo;Werkzeugwechsel&amp;rdquo; in der G-Code-Datei eines Jobs oder manuell durch Benutzer ausgelöst wird:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Spindel, Kühlmittel etc. anhalten.&lt;/li&gt;&#10;&lt;li&gt;Wenn das angeforderte Werkzeug das aktuelle Werkzeug ist, erscheint ein Dialog mit der Frage, ob es trotzdem gewechselt werden soll.&lt;/li&gt;&#10;&lt;li&gt;Z im Eilgang nach oben (&lt;code&gt;zSafety&lt;/code&gt;), dann XY auf die Werkzeugwechselposition fahren&lt;/li&gt;&#10;&lt;li&gt;Dialog: Angabe des aktuellen Werkzeugs &lt;code&gt;a&lt;/code&gt; und Aufforderung, das gewünschte Werkzeug &lt;code&gt;b&lt;/code&gt; einzusetzen&lt;/li&gt;&#10;&lt;li&gt;Prüfen, ob die Werkzeugwechselkonfiguration die Bestimmung der Werkzeuglänge impliziert. Wenn ja, Makro &amp;ldquo;get_tool_length&amp;rdquo; aufrufen.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="code"&gt;Code&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SUB&lt;/span&gt; change_tool&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolChangeDone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;M5&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Switch spindle off&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;M9&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Switch coolant off&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;operatingMode &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; simulator&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;TCAGuard&lt;/span&gt; off ;&lt;span style="color:#75715e"&gt;# tool change area guard: off for tool change&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;&lt;span style="color:#75715e"&gt;# handle case that tool is already in place&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;newToolNumber &lt;span style="color:#f92672"&gt;==&lt;/span&gt; currToolNumber&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;DLGMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Tool already mounted. Change anyways?&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;dialogButton &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolChangeDone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolChangeDone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;&lt;span style="color:#75715e"&gt;# go to tool change position and prompt to change tool&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;toolChangeDone &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSafety&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Go to safety height (machine coordinates)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; X&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xToolChg&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Y&lt;span style="color:#f92672"&gt;[&lt;/span&gt;yToolChg&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Go to tool change position&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;DLGMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Please mount tool now. Old tool number: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;currToolNumber&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; New tool number: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;newToolNumber&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;dialogButton &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;newToolNumber &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;99&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;OR&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;newToolNumber &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;TCAGuard&lt;/span&gt; on ;&lt;span style="color:#75715e"&gt;# tool change area guard: on for normal job&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;New tool number implausible.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolChangeDone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ERRMSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Tool change aborted.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;&lt;span style="color:#75715e"&gt;# prompt when complete and optionally call tool length measurement&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;toolChangeDone &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MSG&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Tool change from &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;currToolNumber&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; to &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;newToolNumber&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; complete.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;M6&lt;/span&gt; T&lt;span style="color:#f92672"&gt;[&lt;/span&gt;newToolNumber&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#9;&#9;&#9;&#9; ;&lt;span style="color:#75715e"&gt;# set new tool number&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;getToolLength &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# config flag 0 = no, 1 = yes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GOSUB&lt;/span&gt; get_tool_length ;&lt;span style="color:#75715e"&gt;# Measure tool length. Careful: To be called after M6 T !&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GOSUB&lt;/span&gt; reposition_spindle&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;TCAGuard&lt;/span&gt; on ;&lt;span style="color:#75715e"&gt;# tool change area guard: on for normal job&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENDSUB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="repositionieren-auf-gespeicherte-koordinaten"&gt;Repositionieren (auf gespeicherte Koordinaten)&lt;/h2&gt;&#10;&lt;p&gt;Dieses kurze Makro wird von anderen Unterprogrammen aufgerufen, um die Maschine entweder zu einer gewünschten Position oder zum XY-Werkstücknullpunkt zu fahren. Es kann mit mehreren &lt;code&gt;repositionTo&lt;/code&gt;-Flag-Werten erweitert werden, z.B.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;0 = keine_Neupositionierung, 1 = benutzerdefinierte_Position, 2 = Werkstücknullpunkt, 3 = Maschinennullpunkt ...&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="code-1"&gt;Code&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SUB&lt;/span&gt; reposition_spindle&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G53&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; Z&lt;span style="color:#f92672"&gt;[&lt;/span&gt;zSafety&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Go to safety height (machine coordinates)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;repositionTo &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; X&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xPosReposition&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Y&lt;span style="color:#f92672"&gt;[&lt;/span&gt;yPosReposition&lt;span style="color:#f92672"&gt;]&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Move back to where requested before&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repositionTo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# reset reposition flag and values&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xPosReposition &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yPosReposition &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ELSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;G00&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;X0&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Y0&lt;/span&gt; ;&lt;span style="color:#75715e"&gt;# Move back to XY zero (workpiece coordinates)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ENDIF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENDSUB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tables"&gt;Tabelle der Variablen&lt;/h2&gt;&#10;&lt;p&gt;Typ-Erläuterungen:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;protected&lt;/code&gt;: Parameter gehört zu festen Befehlen oder Zuständen, die schreibgeschützt sind&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;reserved&lt;/code&gt; : Parameter hat eine feste Verwendung innerhalb meiner CNC-Software&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;free&lt;/code&gt; : Parameter kann frei durch den Programmierer verwendet werden (Ist nach Not-Aus oder Neustart aber zurückgesetzt!)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;persisted&lt;/code&gt;: Parameter wird im nicht-flüchtigen Speicher abgelegt&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="systemparameter"&gt;Systemparameter&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Variable name&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Parameter nr.&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Comment&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;xPos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;current CNC position&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yPos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5002&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;current CNC position&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;zPos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5003&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;current CNC position&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;currToolNumber&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5008&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[1&amp;hellip;99]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;newToolNumber&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5011&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[1&amp;hellip;99]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;zTouched&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5063&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Z where sensor touched&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;probeOk&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5067&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 = OK&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sensorStatus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5068&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;protected&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 = triggered&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;operatingMode&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5397&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;reserved&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 = simulator&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dialogButton&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5398&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;reserved&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 = OK&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="konfig-parameter"&gt;Konfig-Parameter&lt;/h3&gt;&#10;&lt;p&gt;Config-Parameter sind die Parameter, die einmal eingestellt und dann konstant gehalten werden, da sie an die CNC und ihre Geometrie gebunden sind.&lt;/p&gt;&#10;&lt;p&gt;Die Volatilität der Parameter hängt stark von der CNC-Softwarelösung ab, die Sie verwenden, und die Anzahl der freien Parameter kann unterschiedlich sein. In meiner Software werden die Variablen im Bereich &amp;ldquo;#4000 - #4999&amp;rdquo; beibehalten, während alle anderen freien und reservierten Parameter flüchtig und/oder skaliert sind.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Variable name&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Parameter nr.&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Comment&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;triggered&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4400&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 = normally open&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;currToolLength&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4501&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[mm]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;lastToolLength&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4502&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[mm]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;zSafety&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4506&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Z position for move&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;xPosTls&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4507&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;tls position&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;xPosTls&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4508&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;tls position&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;zSpindleTip&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4509&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Z zpindle on tls&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;zTls&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4510&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TLS height [mm]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;toolLengthEst&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4511&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[mm]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;touch&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4512&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;touch feed [mm/min]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;rev&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4513&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;reverse feed [mm/min]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;getToolLength&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4520&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Flag, 1 = Yes&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;xToolChg&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4521&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;tool change position&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yToolChg&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#4522&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free, persisted&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;tool change position&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="flag-parameter"&gt;Flag-Parameter&lt;/h3&gt;&#10;&lt;p&gt;Freie Parameter können nach Belieben verwendet werden. Es muss jedoch darauf geachtet werden, dass nicht versehentlich eine bestehende Systemvariable wiederverwendet oder überschrieben wird.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Variable name&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Parameter nr.&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Comment&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;toolLengthStat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#3501&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 = measured&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;toolLengthDiff&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#3502&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[mm]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;toolChangeDone&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5015&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 = Yes&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;repositionTo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5020&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Flag, 1 = Yes&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;xPosReposition&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5021&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;reposition flag&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yPosReposition&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5022&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;reposition flag&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;toolLength&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;#5024&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;free&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[mm]&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;PS: Damit die obigen Code-Beispiele ordentlich angezeigt werden, habe ich fürs Markup die Sprachinterpretation &lt;code&gt;ruby&lt;/code&gt; verwendet. Hier kommt die farbige Syntax-Markierung am besten überein mit der Logik des NGC-interpreters.&lt;/p&gt;&#10;</description></item><item><title>CNC Teil 4.1 - Konfiguration</title><link>https://blog.schallbert.de/edingcnc-config/</link><pubDate>Tue, 08 Mar 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/edingcnc-config/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-08_edingcnc-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Zerspanobert&amp;#39;&amp;#39;s switchbox, components labeled"&#10; title="CNC Teil 4.1 - Konfiguration" /&gt;&#10;&lt;p&gt;Dies ist Teil 4.1 meiner Reihe über Portalfräsmaschinen. Er hängt eng zusammen mit &lt;a href="https://blog.schallbert.de/portal-milling-setup/"&gt;Teil4&lt;/a&gt;, konzentriert sich aber auf die korrekte Einstellung meiner Steuersoftware für die Fräse.&lt;/p&gt;&#10;&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://edingcnc.com/product/cpu5a4e/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;EdingCnc V5A-4E&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Prozessorboard oder ähnlich&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.benezan-electronics.de/index.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Interface Advanced PRO&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Breakout board oder ähnlich&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.upload.sorotec.de/doku/manuals/adapter.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Adapter Board&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; falls nötig zum Verbinden von Prozessor- und Breakout board&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Diese Komponenten sind notwendig, um die von der CNC-Software erzeugten Befehle in Signale der physischen Welt zu übersetzen, die mit Materie interagieren können. Die Breakout-Platine wird vom CNC-Prozessor gesteuert und bietet Relaisausgänge für die Oberfräse und meinen Staubabscheider, so dass ich sie über den Laptop einschalten kann. Es gibt auch analoge Spannungsausgänge, z.B. zur Steuerung der Spindeldrehzahl, und mehrere Eingänge, z.B. zum Ablesen des Referenzschalterstatus und zur Rückmeldung von Ereignissen an die CNC-Software.&lt;/p&gt;&#10;&lt;p&gt;Natürlich gibt es viele Hersteller für diese Schaltkreise. Ich verwende das oben genannte Ökosystem, so dass ich nur für dieses sprechen kann. Die zugrundeliegende Technologie ist stets ähnlich oder sogar identisch, und obwohl Sie vielleicht eine andere Benutzeroberfläche oder einen anderen Kommunikationskanal wie USB haben, wird Ihre Software wahrscheinlich ähnliche Einstellungen bieten.&lt;/p&gt;&#10;&lt;h2 id="setup-bildschirm-1"&gt;Setup Bildschirm 1&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-08_settings1.jpg" alt="Image: EdingCNC settings screen1" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="kinematik"&gt;Kinematik&lt;/h3&gt;&#10;&lt;p&gt;Wie bereits ausführlich &lt;a href="https://blog.schallbert.de/portal-milling-setup/#kinematics"&gt;in diesem Beitrag&lt;/a&gt; beschrieben, zeigt der grüne Rahmen die Kinematikeinstellungen. Ein negatives Vorzeichen in &lt;code&gt;Schritte/[mm]&lt;/code&gt; bedeutet, dass die Richtung des Schrittmotors invertiert ist. Zu beachten ist, dass das Feld &amp;ldquo;Umkehrspiel&amp;rdquo; 0 bleiben kann, wenn Kugelumlaufspindeln verwendet werden. Ich verwende &lt;code&gt;einfache Kinematik&lt;/code&gt;, da ich keine Drehachse besitze. Also ist das Koordinatensystem kartesisch.&lt;/p&gt;&#10;&lt;h3 id="referenz--notaus"&gt;Referenz / Notaus&lt;/h3&gt;&#10;&lt;p&gt;Dieser Abschnitt steuert, wie die Software die Signalpegel für die Eingangsschalter auf der Schnittstellenkarte interpretiert. Obwohl ich sicher bin, dass ich alle Eingänge &amp;ldquo;normal geschlossen&amp;rdquo; verdrahtet habe, um einen unentdeckten Kabelbruch zu vermeiden, musste ich den Eingang für den Notschalter invertieren.&lt;/p&gt;&#10;&lt;h3 id="spindel"&gt;Spindel&lt;/h3&gt;&#10;&lt;p&gt;Diese Einstellungen sind sehr spezifisch für die Maschine, die Sie verwenden. Ich wollte, dass die Spindel anhält, wenn ich einen Auftrag unterbreche, und dass sie automatisch wieder anläuft, bevor ich den Auftrag fortsetze.&lt;/p&gt;&#10;&lt;p&gt;Der Parameter &lt;code&gt;ApproachFeed&lt;/code&gt; ist ein wenig verwirrend, weil der Standardwert hier sehr niedrig ist. Seine Bedeutung ist die folgende: Er gibt den Vorschub der Z-Achse nach unten an, wenn ein Auftrag angehalten und die Z-Achse zuvor aufwärts bewegt wurde. Wenn Sie den Auftrag fortsetzen, wird die Z-Achse mit diesem Vorschub abgesenkt, und wenn die Zieltiefe erreicht ist, wird der Auftrag normal fortgesetzt. Ich habe &lt;code&gt;600mm/min&lt;/code&gt; als einen Wert eingegeben, den die meisten Schaftfräser bewältigen können sollten.&lt;/p&gt;&#10;&lt;h2 id="setup-bildschirm-2"&gt;Setup Bildschirm 2&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-08_settings2.jpg" alt="Image: EdingCNC settings screen2" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Viele Einstellungen hier lasse ich (vorerst) bei ihren Standardwerten. Auf meine Anpassungen gehe ich weiter unten ein.&lt;/p&gt;&#10;&lt;h3 id="benutzeroberfläche"&gt;Benutzeroberfläche&lt;/h3&gt;&#10;&lt;p&gt;Ich wollte, dass das Referenzieren der Maschine Pflicht ist, bevor ich einen Auftrag laden oder die Achsen der Maschine im Eilgang verfahren kann.&#10;Außerdem musste ich &amp;ldquo;automatischer Werkzeugwechsel&amp;rdquo; anwählen, obwohl ich keinen Werkzeugwechsler habe: sonst würde mein Makro für den manuellen Werkzeugwechsel nicht aufgerufen werden.&lt;/p&gt;&#10;&lt;h3 id="schnittstelle-ea"&gt;Schnittstelle E/A&lt;/h3&gt;&#10;&lt;p&gt;Um die Hardware-Einstellungen des Breakout-Boards zu berücksichtigen, musste ich einige Software-Ausgänge invertieren. Wenn ich z.B. &lt;code&gt;PWM1&lt;/code&gt; nicht invertiert hätte, würde die Spindel mit voller Drehzahl starten, obwohl ich nur &lt;code&gt;5000rpm&lt;/code&gt; wollte und umgekehrt. Dies liegt an teils unterschiedlicher Interpretation der Logikpegel, welche als &amp;ldquo;open collector&amp;rdquo; oder auch &amp;ldquo;open emitter&amp;rdquo; ausgelegt sein können.&lt;/p&gt;&#10;&lt;h2 id="variablen-bildschirm"&gt;Variablen-Bildschirm&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-08_variables.jpg" alt="IMage: EdingCNC variable screen" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="parkposition-g28--g30"&gt;Parkposition G28 / G30&lt;/h3&gt;&#10;&lt;p&gt;Ich stelle meine Parkpositionen so ein, dass ich effizient arbeiten kann. Einer dieser Befehle bewirkt, dass die Achsen auf den XY-Nullpunkt meines Anschlags fahren, den ich auch in CAM zum Werkstück-Nullpunkt mache, so dass das Einnullen wirklich einfach wird.&lt;/p&gt;&#10;&lt;p&gt;Die andere Parkposition wird auf einen Punkt gesetzt, an dem die Referenzschalter aller drei Achsen ganz nah sind, so dass das Referenzieren der Maschine nach dem Hochfahren sehr schnell abläuft.&lt;/p&gt;&#10;&lt;h3 id="überwachung-der-variablen"&gt;Überwachung der Variablen&lt;/h3&gt;&#10;&lt;p&gt;Schauen wir uns das Überwachungsfenster an. Hier können Sie eine Variable aus dem Interpreterbereich der &lt;code&gt;RS274 NGC&lt;/code&gt;eingeben und sich deren aktuelle Werte anzeigen lassen. Dies ist praktisch, wenn Sie Makros debuggen oder einfach nur interne Parameter wie die gemessene Werkzeuglänge, die Lage des aktuellen Z-Nullpunkts etc. ablesen wollen.&lt;/p&gt;&#10;</description></item><item><title>CNC Teil4 - Setup</title><link>https://blog.schallbert.de/portal-milling-setup/</link><pubDate>Thu, 03 Mar 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/portal-milling-setup/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-03_setup-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: First steps with CNC software &amp; config"&#10; title="CNC Teil4 - Setup" /&gt;&#10;&lt;p&gt;Dies ist der vierte Teil meiner Reihe über Portalfräsmaschinen. Er konzentriert sich auf das Zusammenspiel von Hardware und Software, sodass mein fertig aufgebauter &amp;ldquo;Zerspanobert&amp;rdquo; bald im Produktivbetrieb arbeiten kann.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/portal-milling/"&gt;&lt;em&gt;Teil 1&lt;/em&gt;: Gedanken zu Portalfräsmaschinen und ihre Auslegung für den (ambitionierten) Hobbybereich&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/cnc-electronics/"&gt;&lt;em&gt;Teil 2&lt;/em&gt;: CNC Elektrik / Elektronik&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/portal-milling-build/"&gt;&lt;em&gt;Teil 3:&lt;/em&gt; Zusammenbau&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/edingcnc-config/"&gt;&lt;em&gt;Teil 4.1:&lt;/em&gt; Konfiguration der Software&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/macros-for-cnc/"&gt;&lt;em&gt;Teil 5:&lt;/em&gt; Makros für die CNC&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="kinematics"&gt;Kinematik&lt;/h2&gt;&#10;&lt;p&gt;Bevor die CNC-Software auf meiner &lt;strong&gt;BasicLine 0607&lt;/strong&gt; arbeiten kann, muss sie korrekt eingerichtet werden. Sie muss die Verfahrbereiche der Maschinenachsen kennen und wissen, wo sich die Referenzschalter befinden. Außerdem ist relevant, in welche Richtung die Schrittmotoren gedreht werden müssen, um eine &amp;ldquo;positive/negative&amp;rdquo; Achsenbewegung zu erreichen.&lt;/p&gt;&#10;&lt;p&gt;In einem ersten Schritt muss entschieden werden, wie die Achsen der Maschine benannt werden (X, Y, Z), wo alle Achsen tatsächlich 0 sein sollen, und in welche Richtung die Bewegung gehen soll (positiv, negativ). Alle diese Koordinatenpunkte sind relativ und können willkürlich gewählt werden, aber es gibt einige Konventionen in der CNC-Welt:&lt;/p&gt;&#10;&lt;p&gt;Achsen:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die X-Achse liegt auf dem Portalbett und bewegt die Y-Achse des Portals.&lt;/li&gt;&#10;&lt;li&gt;Die Y-Achse befindet sich oben auf dem Portal und bewegt die Z-Achsen-Baugruppe.&lt;/li&gt;&#10;&lt;li&gt;Die Z-Achse befindet sich an der Spindel und bewegt diese auf- und abwärts.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="maschinen-nullpunkt"&gt;Maschinen-Nullpunkt&lt;/h3&gt;&#10;&lt;p&gt;Maschinen- Nullpunkt und -Bewegungsrichtung:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;X-0 befindet sich auf der &amp;ldquo;hinteren&amp;rdquo; Seite der Achse. Die Bewegungsrichtung ist negativ.&lt;/li&gt;&#10;&lt;li&gt;Y-0 befindet sich auf der &amp;ldquo;linken&amp;rdquo; Seite der Achse. Die Bewegungsrichtung ist positiv.&lt;/li&gt;&#10;&lt;li&gt;Z-0 befindet sich auf der &amp;ldquo;oberen&amp;rdquo; Seite der Achse. Die Bewegungsrichtung ist negativ.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Für meine Maschine (sie ist breiter als lang), ihre Zugänglichkeit und den Raum, den ich zur Verfügung habe, habe ich die Achsen umgelegt. Bei mir ist die X-Achse die lange Achse des Portals und die Y-Achse befindet sich parallel zur Linearschine, die das Portal hält. Vom Arbeitstisch aus betrachtet ist der Maschinen-Nullpunkt bei mir also &amp;ldquo;hinten links oben&amp;rdquo;. Also bewegt sich Z in negative Richtung, Y ebenfalls, nur X geht zu positiven Werten.&lt;/p&gt;&#10;&lt;p&gt;Verwirrend, nicht wahr? Ist aber kein Problem, denn später arbeitet man kaum mehr mit Maschinenkoordinaten ;)&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-03_kinematics.jpg" alt="Image: machine kinematics and 0-point" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="bewegungsrichtungen"&gt;Bewegungsrichtungen&lt;/h3&gt;&#10;&lt;p&gt;Für die Konfiguration habe ich meine CNC-Software &lt;a href="https://edingcnc.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Link zu EdingCNC&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; mit der Maschine verbunden. An ihr erkläre ich das Vorgehen, was bei anderen Steuerungsprogrammen im Kern aber ähnlich funktioniert. In de &lt;em&gt;Setup&lt;/em&gt;-Ansicht gebe ich die Anzahl Schritte ein, die vom Motor zu gehen sind, bis sich die Achse um einen Millimeter bewegt: &lt;code&gt;16 Mikroschritte/Schritt&lt;/code&gt; multipliziert mit &lt;code&gt;200 Schritten/Motorumdrehung&lt;/code&gt; geteilt durch &lt;code&gt;10mm/spindelumdrehung&lt;/code&gt; = &lt;code&gt;320 Mikroschritte/mm&lt;/code&gt;. Für die Z-Achse wird der Wert durch die bei mir engere Gewindespindel verdoppelt.&lt;/p&gt;&#10;&lt;p&gt;Die 16 Mikroschritte/Schritt ist der Standardwert, welcher von meinem Maschinenhersteller vorgeschlagen wurde. Es gibt &lt;a href="https://www.faulhaber.com/en/support/technical-support/motors/tutorials/stepper-motor-tutorial-microstepping-myths-and-realities/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;ein paar gute Argumente&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und eine tiefgehende Analyse &lt;a href="https://www.edn.com/why-microstepping-in-stepper-motors-isnt-as-good-as-you-think/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;hier&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; darüber, dass man Microstepping so wenig wie möglich verwenden sollte. Da ich weder eine Genauigkeit von 1µm erreichen muss, noch die Schrittmotoren bei meiner Anwendung sehr hohe Drehmomente bewältigen müssen, sollte das aber kein Thema sein.&lt;/p&gt;&#10;&lt;p&gt;Ohne vorher eine Referenzfahrt durchzuführen (die sowieso nicht funktionieren würde), habe ich die Maschine per Pfeiltasten vorsichtig verfahren, um zu sehen, welche Taste welche Achse in welche Richtung bewegt. Da mein Setup vom &amp;ldquo;Normal&amp;rdquo; abweicht, können die von mir gewählten Werte individuell ausfallen.&#10;Wenn eine Achse nicht mit der Pfeiltaste übereinstimmt (wenn ich z.B. &amp;ldquo;rechts&amp;rdquo; drücke und erwarte, dass sich meine X-Achse nach rechts bewegt, aber die Z-Achse tatsächlich nach unten geht), so konnte ich die Motoranschlüsse am Schaltkasten vertauschen, bis die Tasten mit den erwarteten Achsen übereinstimmten.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-03_setup_kinematics.jpg" alt="Image: machine kinematics EdingCNC setup" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Wenn die Tasten die Maschine nun in die falsche Richtung bewegen - ich drücke z.B: &amp;ldquo;Bild abwärts) aber die Z-Achse bewegt sich nach oben, würde ich das Vorzeichen der Motorschrittauflösung ändern - Nicht besonders intuitiv, was? Ich habe auch ein paar Foreneinträge durchsuchen müssen, bevor ich das raus hatte.&lt;/p&gt;&#10;&lt;p&gt;Dies kam nun dabei heraus:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;X-axis -320.000&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Y-axis 320.000&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Z-axis -640.000&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="grenzen-der-maschinenbewegung"&gt;Grenzen der Maschinenbewegung&lt;/h3&gt;&#10;&lt;p&gt;Meine Maschine hat einen nutzbaren mechanischen Verfahrweg von &lt;code&gt;0 / 732mm&lt;/code&gt; in X-Richtung, &lt;code&gt;-654mm / 0&lt;/code&gt; in Y-Richtung, und &lt;code&gt;-134mm / 0&lt;/code&gt; in Z-Richtung. Diese Werte habe ich in die Maske für &lt;code&gt;negative limit&lt;/code&gt; / &lt;code&gt;positive limit&lt;/code&gt; eingegeben und die Vorzeichen auf Basis der Bewegungsrichtung relativ zum Maschinennullpunkt eingestellt.&lt;/p&gt;&#10;&lt;h3 id="referenzschalter-triggerpegel"&gt;Referenzschalter: Triggerpegel&lt;/h3&gt;&#10;&lt;p&gt;Die Achsen der meisten Maschinen haben einen &lt;a href="https://cncphilosophy.com/cnc-offsets-and-machine-reference-explained/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Referenzschalter&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Diese Schalter werden verwendet, um die Maschine zu &amp;ldquo;referenzieren&amp;rdquo;. Die Referenzfahrt ist bei jedem Start der Maschine erforderlich, da die Software intern nur die XYZ-Position durch Akkumulation der Motorschritte ermittelt. Sobald das System neu gestartet wird, gehen alle diese Werte auf 0 zurück, so dass die Maschine ihre Position vergisst.&lt;/p&gt;&#10;&lt;p&gt;Ich habe meine Schalter so angeschlossen, dass sie &amp;ldquo;normalerweise geschlossen&amp;rdquo; sind: Ihre Kontakte sind stromführend, wenn sie nicht ausgelöst werden. Auf diese Weise kann eine fehlerhafte, offene Verbindung sofort erkannt werden, da die Maschine in diesem Fall (erfolglos) mit einer ungewöhnlich niedrigen Geschwindigkeit anfahren würde: &lt;code&gt;homeVelocitySlow&lt;/code&gt; ist in meiner Konfiguration nur 1/10 der normalen Fahrgeschwindigkeit für das Anfahren der Nullpunkte. Trotzdem müssen wir sicherstellen, dass der Referenzfahrt-Kontakt richtig interpretiert wird. Dies kann im Abschnitt &amp;ldquo;Homing and E-Stop&amp;rdquo; des &amp;ldquo;Setup&amp;rdquo;-Bildschirms eingestellt werden. Ich gebe also eine &amp;ldquo;1&amp;rdquo; für &amp;ldquo;Normalerweise geschlossen&amp;rdquo; ein.&lt;/p&gt;&#10;&lt;h3 id="referenzschalter-position"&gt;Referenzschalter: Position&lt;/h3&gt;&#10;&lt;p&gt;Einige CNC-Maschinen bieten eine Positioniersteuerung mit geschlossenem Regelkreis - sie benötigen keine Referenzschalter, da ihre Motoren mit Positionsgebern ausgestattet sind, die die absolute Position jeder Achse zurückmelden. Diese Maschinen verlieren keine Schritte und sind in der Lage, Positionierungsfehler zu erkennen, die z. B. durch mechanische Überlastung verursacht werden. Man nennt solche Motoren meist &lt;em&gt;Servos&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;Mit Hilfe des Referenzschalters kann eine Maschine ohne geregelte Positionierung - wie meine - ihre Schrittzahl an einer bekannten Position zurücksetzen, so dass die Achsbewegung wiederholbar wird. Allerdings muss die Position des Referenzschalters bekannt sein, um die Schrittzählung korrekt den Achsenpositionen zuzuordnen, und deshalb müssen wir die Positionen der Referenzschalter an den Achsen eingeben. Ich habe mit Vorsicht beobachtet, wie weit ich die Maschine nach dem Auslösen des Referenzschalters weiter verfahren kann, bevor ich an das mechanische Ende einer Achse stoße (Menü &amp;ldquo;Jog&amp;rdquo;). Dies sind die Werte, die ich schließlich für meine Maschine eingegeben habe:&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Steps/AppUnit&lt;/em&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;X-axis: 10mm&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Y-axis: -4mm&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Z-axis: -16mm&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="not-aus"&gt;Not-Aus&lt;/h3&gt;&#10;&lt;p&gt;Der Not-Aus ist ein weiterer Eingang für die CNC-Software und -Hardware. Durch Drücken dieses Schalters wird die Achsenbewegung gestoppt und im Zuge dessen sowohl Spindel, Kühlschmierstoffzufuhr als auch Hilfsstromkreise deaktiviert. Er ist auch &amp;ldquo;normal geschlossen&amp;rdquo; verdrahtet, um Verbindungsprobleme zu erkennen, und kann wie ein Referenzschalter konfiguriert werden.&lt;/p&gt;&#10;&lt;p&gt;Wenn der Not-Aus-Schalter aktiviert wurde, müssen die Treiber der Maschine zurückgesetzt und die Maschine erneut referenziert werden, bevor sie nach dem Loslassen der Taste wieder normal arbeiten kann.&lt;/p&gt;&#10;&lt;p&gt;Das Not-Aus Signal wird nicht nur an die Software gemeldet, sondern sorgt auf der Steuerplatine selbst für das Abfallen der entsprechenden Relais, sodass die Maschine in den sicheren Zustand gebracht werden kann.&lt;/p&gt;&#10;&lt;h2 id="bewegungsparameter-der-achsen"&gt;Bewegungsparameter der Achsen&lt;/h2&gt;&#10;&lt;p&gt;Die CNC-Software muss wissen, wie sie die Bewegung der Maschinenachsen richtig handhaben muss: Eine schwerere und steifere Maschine mit starken Schrittmotoren wird natürlich schneller verfahren und starke Beschleunigungen sowie ruckartige Bewegungen besser bewältigen können als weichere, leichtere Maschinen. Aus diesem Grund sollten die Bewegungsparameter Ihrer Maschine sorgfältig ermittelt und in der Software hinterlegt werden.&lt;/p&gt;&#10;&lt;h3 id="achsgeschwindigkeit"&gt;Achsgeschwindigkeit&lt;/h3&gt;&#10;&lt;p&gt;&amp;ldquo;Warum sollte Zerspanobert schnell sein?&amp;rdquo; habe ich mich gefragt. Mir fielen nicht allzu viele gute Antworten ein, da die normalen Vorschubgeschwindigkeiten mit den geplanten Schaftfräsern weit unter den Möglichkeiten der Maschine liegen werden. Aber egal, hier sind einige Argumente, eine Maschine schnell verfahren zu lassen:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;die Arbeitszeiten sollten nicht zu lang werden&lt;/li&gt;&#10;&lt;li&gt;lange Verfahrwege, die mit einer großen Maschine zurückzulegen sind&lt;/li&gt;&#10;&lt;li&gt;beim Schneiden weicher Materialien mit geringer Dichte können die Vorschübe viel höher sein&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Wollen Sie noch immer eine schnelle Maschine? Einige Berechnungen helfen uns hier weiter.&lt;/p&gt;&#10;&lt;h4 id="bestimmung-der-fähigkeiten-der-bewegungselektronik"&gt;Bestimmung der Fähigkeiten der Bewegungselektronik&lt;/h4&gt;&#10;&lt;p&gt;Die maximale Geschwindigkeit wird durch mehrere Faktoren begrenzt:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Parameter&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Symbol&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Wert&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Einheit&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;maximale Antriebsfrequenz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;fD&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;125&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kHz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mikroschritt-Einstellung des Antriebs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;N&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;max. Software-Frequenz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;fS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;125&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kHz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Schrittzahl/Umdrehung&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;200&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Schrittmotor max. Drehzahl&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nSm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3300&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1/min&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Kugelgewindebreite&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;P&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,01&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Kugelumlaufspindel max. Drehzahl&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nLm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1700&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1/min&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Nehmen wir ein Beispiel für einen 125-kHz-Treiber und nehmen wir an, dass die Software diese Schrittfrequenz unterstützt. Nehmen wir weiter an, dass die Motoren 200 Schritte/Umdrehung haben und der Treiber auf 16 Mikroschritte/Schritt konfiguriert ist.&lt;/p&gt;&#10;&lt;p&gt;Damit erreicht man eine Maximaldrehzahl der Kugelumlaufspindel von \(\frac{125000}{3200} = 39\) Umdrehungen pro Sekunde oder &lt;code&gt;2340 U/min&lt;/code&gt;, was für einen Schrittmotor echt zügig ist. Auf einer Kugelumlaufspindel mit &lt;code&gt;10mm&lt;/code&gt; Gewindeweite führt das zu einer theoretischen Verfahrgeschwindigkeit von &lt;code&gt;23.4m/min&lt;/code&gt;, was auf einer kleinen Maschine wie meiner unglaublich schnell aussieht.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.schallbert.de/portal-milling-setup/#update"&gt;Achtung! Korrekturen / Updates weiter unten&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h4 id="grenzen-der-mechanik"&gt;Grenzen der Mechanik&lt;/h4&gt;&#10;&lt;p&gt;Gut, dann schauen wir mal, ob die Kugelumlaufspindeln dieses Tempo mitgehen. Die auf meiner Maschine verbaute Serie &lt;code&gt;KGS16&lt;/code&gt; hat eine ungestützte Strecke von &lt;code&gt;~850mm&lt;/code&gt; zwischen den Lagern auf der langen Achse. Aus der &lt;a href="https://www.neff-gewindetriebe.de/fileadmin/PDF-Datenblaetter/berechnungsgrundlagen/kugelgewindetriebe/berechnungsgrundlagen_kgt.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Online-Dokumenation des Herstellers&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; entnehme ich hierbei eine maximale Drehzahl von &lt;code&gt;1700U/min&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Damit bleiben 70% von der anfänglichen Maximalgeschwindigkeit übrig: &lt;code&gt;17m/min&lt;/code&gt;. Immer noch echt flink.&lt;/p&gt;&#10;&lt;p&gt;Nun wissen wir aber, dass das Moment der Schrittmotore bei steigender Geschwindigkeit abnimmt. Wenden wir unseren Blick mal dorthin:&lt;/p&gt;&#10;&lt;h4 id="genügend-motormoment"&gt;Genügend Motormoment?&lt;/h4&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-03_torque_curve.jpg" alt="ESM.6088.42 Schrittmotor: Drehmomentverlauf" /&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Datasheet: Der Drehmomentverlauf meines Schrittmotors (Bild bereitgestellt durch Sorotec GmbH)&lt;/span&gt;&lt;a href="https://www.sorotec.de/webshop/Datenblaetter/Schrittmotoren/ESM.6088.42/ESM.6088.42_V1.1.pdf" class="attr-link" aria-label="Attribution 1"&gt;&#10; &lt;sup class="attr-id"&gt;[1]&lt;/sup&gt;&#10; &lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Der blaue Pfeil markiert meinen Zielvorschub zum Schruppen in Holz. Hier habe ich ordentlich Drehmoment zur Verfügung um auch tiefe Nuten in einem Durchgang fertigen zu können. Selbst bei schnellen Schlichtdurchläufen oder sehr weichen Materialien (grüner Pfeil) habe ich noch fast 50% des maximalen Drehmoments zur Verfügung. Um noch genügend Luft bis zur kritischen Drehzahl der Kugelumlaufspindel zu haben, wähle ich eine maximale Geschwindigkeit für den Eilgang (&lt;code&gt;G0&lt;/code&gt;) von &lt;code&gt;12m/min = 200mm/sek&lt;/code&gt;. An diesem Punkt sind von den ursprünglich &lt;code&gt;3Nm&lt;/code&gt; nur noch &lt;code&gt;0.7Nm&lt;/code&gt; verfügbar.&lt;/p&gt;&#10;&lt;p&gt;Mit dieser Konfiguration habe ich eine recht schnelle Maschine bei genügend Luft zu kritischen Werten.&lt;/p&gt;&#10;&lt;h3 id="acceleration"&gt;Beschleunigungen&lt;/h3&gt;&#10;&lt;p&gt;Stellen Sie sich vor, Sie möchten in einem Ihrer Programme einen 90°-Winkel bei einem Vorschub von &lt;code&gt;12m/min&lt;/code&gt; fahren. Ähnlich wie bei dem Versuch, eine sehr enge Kurve auf dem Fahrrad zu nehmen, ist dies nicht bei hoher Geschwindigkeit möglich. Man muss erst auf eine Geschwindigkeit herunterbremsen, bei der die Kurve gefahrlos genommen werden kann und danach wieder hochbeschleunigen.&lt;/p&gt;&#10;&lt;p&gt;Wenn wir bei der Maschine nicht bereit sind zu warten, bis eine Achse quasi zum Stillstand gekommen ist bevor die andere losfährt, schneiden wir die Ecke rund. Wenn wir jedoch bremsen, ist unsere Bahngeschwindigkeit nicht mehr konstant - ein Dilemma. Um hier einen möglichst guten Kompromiss zu erreichen, ist die Ermittlung einer passenden Maschinenbeschleunigung wichtig.&lt;/p&gt;&#10;&lt;p&gt;Auf dem Fahrrad vermeidet man beim Bremsen bewusst das Blockieren eines Rades, um die Stabilität nicht zu gefährden. Auf der CNC gilt wieder um Ähnliches: Hinreichend hohe Beschleunigungen erreichen, ohne Schrittverlust, unnötige Schwingungen, Verklemmung / Blockade einer Achse, starke Rucke oder Torsion zu riskieren. Zudem möchten wir Maschinenverschleiß minimieren.&lt;/p&gt;&#10;&lt;p&gt;Klingt schwierig? Ist machbar, benötigt aber etwas Mathematik und Gefühl.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-03_cnc_cornering.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Kurven zeichnen: `vmax = 200mm/s`, `a=400mm/s^2`&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Das Video oben illustriert den Sachverhalt: Bei Kanten und engen Kurven bremst die Maschine merklich ab um den Richtungswechsel hinzubekommen.&lt;/p&gt;&#10;&lt;h4 id="motivation"&gt;Motivation&lt;/h4&gt;&#10;&lt;p&gt;Warum möchte ich, dass Zerspanobert hohe Beschleunigungswerte unterstützt? Ein paar meiner Antworten: Meine Projekte haben oft eine Menge kurzer Liniensegmente und 2.5D-Arbeiten. Die Formen sind komplex und die G-Code Dateien zumeist recht lang. Daher verwende ich auch den &lt;a href="https://www.mmsonline.com/articles/a-closer-look-at-look-ahead" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Look-Ahead Feed&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; &lt;code&gt;G64&lt;/code&gt; mit &lt;code&gt;0.1mm&lt;/code&gt; erlaubter Abweichung vom Pfad.&lt;/p&gt;&#10;&lt;p&gt;Außerdem möchte ich möglichst lange mit konstanter Geschwindigkeit durch das Material fahren. So vermeide ich Stellen, an denen das Material heißer wird als nötig. Nicht zuletzt will ich natürlich nicht unnötig viel Zeit an der Maschine verbringen - Die Maschine arbeitet mit höheren Beschleunigungswerten einfach deutlich schneller; dies wirkt sich bei meinen Projekten sogar stärker aus als ein noch flinkerer Eilgang.&lt;/p&gt;&#10;&lt;h4 id="bestimmung-der-maximalen-achsbeschleunigung"&gt;Bestimmung der maximalen Achsbeschleunigung&lt;/h4&gt;&#10;&lt;p&gt;Dann ermitteln wir mal den maximal möglichen Wert für die Maschinenbeschleunigung.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Newton%27s_laws_of_motion" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Newtons zweites Gesetz&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; (axiale Bewegung): \(F_{ax} = m_pa\)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Torque" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Drehmoment&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; an der Achse: \(M_a = \frac{a J}{P}\)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Moment_of_inertia" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Trägheitsmoment&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; der Achse (Zylinder): \(J = m \frac{a}{2}r^2\)&lt;/li&gt;&#10;&lt;li&gt;Benötigtes &lt;a href="https://tech.thk.com/de/products/pdf/de_b17_009.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Motormoment&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für die Linearbewegung: \(M_d =\frac{F_{ax} P}{2 \pi \eta} + M_a\)&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Wenn ich diese Formeln kombiniere, erhalte ich für die Beschleunigung:&lt;/p&gt;&#10;$$a = \frac{M_d}{\frac{m_p P}{2 \pi \eta} + \frac{J}{P}}$$&lt;p&gt;In Worten: Die höchste Beschleunigung, die die Maschine theoretisch erreichen kann, ist das verfügbare Motormoment \(M_d\) geteilt durch die Masse des Portals \(m_p\), gewichtet mit spezifischen Parametern der Kugelumlaufspindel wie Gewindespreizung \(P\) und Wirkungsgrad des bewegten Systems \(\eta\) zuzüglich des Trägheitsmoment \(J\) der rotierenden Komponenten, wiederung gewichtet durch die Gewindespreizung.&lt;/p&gt;&#10;&lt;h4 id="konkrete-richtwerte"&gt;Konkrete Richtwerte&lt;/h4&gt;&#10;&lt;p&gt;Setzen wir mal ein paar Werte ein - meine BasicLine 0607:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Parameter&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Symbol&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Wert&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Einheit&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Stepper torque @ vmax&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Md&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Nm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Portalmasse&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;mp&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;40&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kg&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Spreizung Gewindespindel&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;P&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.01&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Radius Gewindespindel&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;r&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.008&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rotierende Masse&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ma&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kg&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wirkungsgrad der Bewegung&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;n&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;75&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;%&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Wo ich keine exakten Werte zur Verfügung hatte, habe ich worst-case Annahmen getroffen. Beim Schrittmotor z.B. meine Maximalgeschwindigkeit bei geringster Versorgungsspannung. Auch das Gewicht der rotierenden Masse (Spindel, Kupplung, Rotor und Achse des Motors) habe ich geschätzt sowie den Wirkungsgrad von Kugelumlaufspindel, Lagern und Linearführungen.&lt;/p&gt;&#10;&lt;p&gt;Dies ist mein Ergebnis (Trommelwirbel):&lt;/p&gt;&#10;$$a = 5.0m/s^2$$&lt;h4 id="was-dieser-wert-bedeutet"&gt;Was dieser Wert bedeutet&lt;/h4&gt;&#10;&lt;p&gt;Wie lange benötigt die Maschine, um auf Höchstgeschwindigkeit zu beschleunigen?&#10;Nehmen wir unser Physikwissen aus der Sekundarstufe: &lt;a href="https://en.wikipedia.org/wiki/Acceleration" target="_blank" rel="noopener noreferrer" class="external-link"&gt;gleichmäßig beschleunigte Bewegung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;$$v(t) = at \Rightarrow t = \frac{v_{max}}{a} = 40ms$$&lt;p&gt;Wie groß ist der Weg, den wir dabei zurücklegen (&lt;/p&gt;&#10;$$s_0 = 0, v_0 = 0$$&lt;p&gt;)?&lt;/p&gt;&#10;$$s(t) = \frac{a}{2}t^2 + v_0t + s0 \Rightarrow s(t=40ms) = 4mm$$&lt;p&gt;Welche Axialkräfte wirken dabei auf das Portal ein? &lt;/p&gt;&#10;$$F_{ax} = m_pa = 200N$$&lt;p&gt;Die von mir hier errechnete Beschleunigung ist mehr als eine Größenordnung über der Empfehlung des Herstellers von &lt;code&gt;300mm/s^2&lt;/code&gt;. Ich habe mich da deutlich verschätzt.&lt;/p&gt;&#10;&lt;p&gt;🤔 &lt;em&gt;Ich muss etwas übersehen haben.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h4 id="zusammenfassung-erfahrung-zählt"&gt;Zusammenfassung: Erfahrung zählt!&lt;/h4&gt;&#10;&lt;p&gt;Die Formeln oben berücksichtigen weder die Steifheit der Maschine noch Ruck, Torsion oder auftretende Schwingungen unter dynamischer Last. Was ein &amp;ldquo;Ruck&amp;rdquo; im CNC-Kontext darstellt? Dieses kurze &lt;a href="https://www.youtube.com/watch?v=9Z9Zws9K5kc" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Youtube-Video&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; klärt auf. Meine Steuersoftware jedoch verfügt nicht über eine Ruckbegrenzung.&lt;/p&gt;&#10;&lt;p&gt;Obwohl ich viel darüber gelernt habe, wie man sich mit Hilfe der Mathematik eine Einordnung der Parameter ermöglicht, läuft alles wieder auf die Erfahrung hinaus:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Wie schwer und stabil ist die Maschine?&lt;/li&gt;&#10;&lt;li&gt;Mit welcher Art von Material arbeite ich: Ist es nachgiebig oder steif?&lt;/li&gt;&#10;&lt;li&gt;Habe ich komplexe oder möglicherweise langwierige Fräsaufgaben zu erledigen?&lt;/li&gt;&#10;&lt;li&gt;Arbeitet meine CNC in einer Produktionsumgebung, in der die Maschinenzeit wichtig ist?&lt;/li&gt;&#10;&lt;li&gt;Wie klingt und fühlt sich die CNC bei hohen Beschleunigungswerten an?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Ich habe einen Wert von 800 mm/s^2 als Beschleunigung für die X- und Y-Achse eingegeben. Das schien ohne Probleme zu funktionieren. Immerhin bleibt er um den Faktor 6 unter der berechneten Fähigkeit des Bewegungssystems.&lt;/p&gt;&#10;&lt;h2 id="ausprobieren"&gt;Ausprobieren&lt;/h2&gt;&#10;&lt;p&gt;Ich weiß, das war eine lange Lektüre und viel mehr eine fundierte Vermutung als eine strenge Berechnung 😅. Trotzdem sind wir jetzt bereit, die Maschine das erste Mal in Betrieb zu nehmen.&#10;Probieren Sie es aus. Gehen Sie danach im manuellen Betrieb auf allen Achsen auf auf den Maschinennullpunkt. Hält sie an, bevor sie den mechanischen Endstopp erreicht?&lt;/p&gt;&#10;&lt;p&gt;Verwenden Sie dann den kontinuierlichen Tippbetrieb, um sich dem anderen Ende aller Achsen anzunähern. Bewegen Sie vorsichtig die letzten Millimeter. Sind alle Messungen und Einstellungen korrekt?&#10;Wenn ja, versuchen Sie es mit der 100%-Geschwindigkeitstaste (&lt;code&gt;Shift&lt;/code&gt; - auf meiner Tastatur). Bewegt sich die CNC schnell und stoppt automatisch am Achsenende ohne Kollision?&lt;/p&gt;&#10;&lt;p&gt;Herzlichen Glückwunsch!&lt;/p&gt;&#10;&lt;h2 id="rechner-für-maximale-bewegungseinstellungen"&gt;Rechner für maximale Bewegungseinstellungen&lt;/h2&gt;&#10;&lt;p&gt;Sie haben tapfer den ganzen Artikel gelesen. Als Belohnung habe ich ein kleines Excel-Tool vorbereitet: &lt;a href="https://blog.schallbert.de/assets/docs/cnc_kinematics_helper.xlsx"&gt;CNC kinematics helper&lt;/a&gt;, das Sie herunterladen und verwenden können, um Schätzungen für Ihre Maschine zu berechnen. Natürlich kann ich keine Verantwortung für die Ergebnisse übernehmen, die Sie bei der Verwendung dieses Tools erhalten. Selbiges gilt für Schäden, die falsche Werte verursachen können.&lt;/p&gt;&#10;&lt;h2 id="update"&gt;Update&lt;/h2&gt;&#10;&lt;p&gt;Ich habe nochmal mit den maximalen Geschwindigkeits- und Beschleunigungswerten für meine Maschine herumgespielt.&#10;&lt;code&gt;300mm/s&lt;/code&gt; war zu schnell und ich bekam Software-Limit Verletzungsfehler. Bei &lt;code&gt;240mm/s&lt;/code&gt; hat meine Maschine stark vibriert. Also habe ich die Höchstgeschwindigkeit bei &lt;code&gt;220mm/s&lt;/code&gt; belassen, was in Ordnung zu sein scheint.&#10;Außerdem habe ich die Beschleunigung auf &lt;code&gt;1200mm/s^2&lt;/code&gt; erhöhen können. Das einzige Problem mit diesem neuen Wert ist, dass die Maschine bei kurzen Bewegungen ein bisschen schwingt. Wenn die Beschleunigung abgeschlossen ist, wird alles wieder ruhiger. Schauen wir mal, ob sich das auf die Bearbeitungsqualität auswirkt.&lt;/p&gt;&#10;&lt;h2 id="update-2"&gt;Update 2&lt;/h2&gt;&#10;&lt;p&gt;Die obige Berechnung ist zwar mathematisch nicht falsch, aber sie ist &lt;em&gt;irreführend&lt;/em&gt;. Sie suggeriert, dass jede Achse mit dieser Geschwindigkeit laufen könnte, was einfach nicht der Fall ist. Ich habe mir vom &lt;a href="https://edingcnc.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Anbieter der Steuerungssoftware für meine Maschine&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; bestätigen lassen, dass die 125kHz die maximale Befehlsfrequenz des &lt;strong&gt;Systems&lt;/strong&gt; sind. Wenn ich versuche, höhere Geschwindigkeiten zu fahren, erhalte ich die Fehlermeldung &amp;ldquo;Velocity was higher than max!&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Deshalb sollte ein so hoher Geschwindigkeitswert &lt;em&gt;nicht&lt;/em&gt; verwendet werden, wenn die Maschine mit mehreren Achsen gleichzeitig im Eilgang läuft. Ich habe einen Folgeartikel verfasst und &lt;a href="https://blog.schallbert.de/projects/one-year-zerspanobert/#velocityerror"&gt;hier&lt;/a&gt; zur Information verlinkt. Dort verwende ich Werte, die stabil in jeder Situation funktionieren, auch wenn alle Achsen mit voller Geschwindigkeit gleichzeitig betrieben werden.&lt;/p&gt;&#10;&lt;h2 id="noch-immer-weiterlesen"&gt;Noch immer weiterlesen?&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://blog.schallbert.de/edingcnc-config/"&gt;Einrichtung der Maschinensoftware&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>CNC Teil3 - Aufbau</title><link>https://blog.schallbert.de/portal-milling-build/</link><pubDate>Tue, 01 Mar 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/portal-milling-build/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-machine_complete-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Completed build of Zerspanobert - Sorotec Basicline 0607"&#10; title="CNC Teil3 - Aufbau" /&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/aAF2gaBewonh2uvu6mspze" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;&amp;amp;quot;Zerspanobert&amp;amp;quot; CNC assembly&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Dies ist der dritte Teil meiner Artikelserie über Portalfräsmaschinen. Er konzentriert sich auf den mechanischen/mechatronischen Aufbau meiner Maschine.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/portal-milling/"&gt;&lt;em&gt;Teil 1&lt;/em&gt;: Gedanken zu Portalfräsmaschinen und ihre Auslegung für den (ambitionierten) Hobbybereich&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/cnc-electronics/"&gt;&lt;em&gt;Teil 2&lt;/em&gt;: CNC Elektrik / Elektronik&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/portal-milling-setup/"&gt;&lt;em&gt;Teil 4:&lt;/em&gt; Einrichten der Maschine&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/edingcnc-config/"&gt;&lt;em&gt;Teil 4.1:&lt;/em&gt; Konfiguration der Software&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.schallbert.de/macros-for-cnc/"&gt;&lt;em&gt;Teil 5:&lt;/em&gt; Makros für die CNC&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="marke-sorotec-produkt-basicline-0607"&gt;Marke: Sorotec, Produkt: Basicline 0607&lt;/h2&gt;&#10;&lt;p&gt;Meine Portalfräsmaschine wurde als Komplettbausatz geliefert. Nach einer groben Prüfung auf Vollständigkeit konnte ich voller Vorfreude auf die fertige Maschine mit dem Zusammenbau starten.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-allparts.jpg" alt="Image: parts included in the assembly kit" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="eckdaten-der-maschine"&gt;Eckdaten der Maschine&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Stellfläche etwa 1m x 1m x 0.8m&lt;/li&gt;&#10;&lt;li&gt;Arbeitsbereich ~ 654mm x 732mm x 134mm&lt;/li&gt;&#10;&lt;li&gt;Gewicht ohne Spindel, Elektrosatz, Zubehör: 52kg (laut Hersteller)&lt;/li&gt;&#10;&lt;li&gt;Kugelumlauftriebe und Linearführungen auf allen Achsen&lt;/li&gt;&#10;&lt;li&gt;Schrittmotoren: &lt;code&gt;3Nm, 4.2A @48V&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Empfohlene maximale Bewegungsgeschwindigkeit: &lt;code&gt;130mm/s | 7.8m/min, 400mm/s²&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="zusammenbau"&gt;Zusammenbau&lt;/h2&gt;&#10;&lt;p&gt;Der Aufbau der Mechanik und Mechatronik dauerte etwa 16h inkl. Verdrahtung der Schrittmotoren, Stecker und aller Leitungen. Nicht berücksichtigt ist die Maschinensteuerung, worüber ich &lt;a href="https://blog.schallbert.de/cnc-electronics/"&gt;hier&lt;/a&gt; schreibe.&lt;/p&gt;&#10;&lt;p&gt;Die nun folgenden Abschnitte beschreiben je eine Phase des Zusammenbaus. Ich verschweige auch nicht die Schwierigkeiten, die ich dabei hatte.&lt;/p&gt;&#10;&lt;h3 id="1-vorbereitung-der-lager-für-die-kugelumlaufspindeln"&gt;1. Vorbereitung der Lager für die Kugelumlaufspindeln&lt;/h3&gt;&#10;&lt;p&gt;Die Kugelumlaufspindel (&lt;a href="https://www.youtube.com/watch?v=W27pJXlO6ko" target="_blank" rel="noopener noreferrer" class="external-link"&gt;youtube link&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;) ist eine mechanische Vorrichtung, die eine Drehbewegung in lineare Bewegung umwandelt. Dabei wird die mit einem Gewinde versehene Spindel gedreht und dadurch ein auf der Spindel befindlicher Schlitten verfahren. Der Unterschied zur auf demselben Konzept basierenden Trapezgewindespindel ist, dass die Spindelmutter über ein umlaufendes System von Kugeln verfügt, welche Reibung und Spiel zwischen Mutter und Spindel reduzieren. Bei meiner CNC-Maschine werden sie eingesetzt, um die Achsen mit Hilfe eines Schrittmotors zu verfahren.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-ballscrews.jpg" alt="Image: ballscrews with bearings" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die Kugelumlaufspindeln besitzen zwei Lager. Ein Festlager auf der Schrittmotorseite (der schwarze Block auf den Bildern) und ein Loslager, das die andere Seite der Spindel an ihrem Platz hält. Die Montage des Loslagers in seine Halterung stellte sich als schwierig heraus. Ich habe keinerlei Erfahrung im Metallbau, also habe ich statt der klugen Lösung (Kugellager abkühlen, Halterung erwärmen) die einfache gewählt (Hämmern). Ergebnis: das Lager saß schief.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-01_fitting-bad.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Falsch eingesetztes Loslager&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Glücklicherweise hatte ich eine &lt;code&gt;20mm&lt;/code&gt; Nuss zur Hand die Außendurchmesser des Lagers nahekam. So war ich in der Lage, das Lager erst wieder heraus zu schlagen und dann erneut - sanft und gleichmäßig - in seinem Sitz zu befestigen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-01_fitting-ok.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Verhalten nach Korrektur des Lagersitzes&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Ich hoffe mal, dass ich das Lager bei meinen Fehlversuchen nicht zu sehr mit Aluminiumspänen verunreinigt habe.&lt;/p&gt;&#10;&lt;h3 id="2-maschinenrahmen"&gt;2. Maschinenrahmen&lt;/h3&gt;&#10;&lt;p&gt;Der Rahmen meiner Maschine besteht aus Aluminium-Stranggussprofilen, welche mit Winkeln und Nutensteinen miteinander verbunden werden. Massive Aluminiumplatten and Vorder- und Rückseite der Maschine versteifen die Konstruktion zusätzlich. Die Linearführungen werden an der Seite des Rahmens befestigt. Sie halten später das Portal und stellen die Bewegung der X-Achse (Definition des Herstellers) sicher.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-frame.jpg" alt="image: frame of Basicline 0607" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Ich habe ziemlich viel Zeit darauf verwenden müssen, den Rahmen ordentlich auszurichten. Als endlich alle Winkel 90° betrugen, konnte ich einen kleinen Luftspalt an der rechten Rahmenwange lassen, sodass die Portalbreite die Rahmenbreite vorgeben kann und ich nichts verspanne. Als ich die Schrauben jedoch anzog, schien der Rahmen sich stets aus dem rechten Winkel zu verabschieden. Als ich das Spiel ein paarmal erfolglos wiederholt hatte, begann ich, die Schrauben in mehreren Stufen gleichmäßig in &lt;code&gt;3Nm&lt;/code&gt;-Schritten anzuziehen.&lt;/p&gt;&#10;&lt;p&gt;Auf diese Weise konnte ich endlich meine &lt;code&gt;24Nm&lt;/code&gt; bei guter Rechtwinkligkeit 😅 erreichen&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-xaxis.jpg" alt="Image: X-axis fully mounted, view from the rear" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die Montage der Front- und Rückplatte, Kugelumlaufspindel der Y-Achse sowie des Referenzschalters stellten sich als angenehm schnell und einfach heraus. Das obige Bild zeigt die fertig montierte X-Achse. Linearführungen (ebenfalls mit Kugelumlauf), die später das Portal tragen werden, sind bereits montiert. So sehen diese Dinger von innen aus:&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-01_trolley.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Linearführungen mit Kugelumlauf&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="3-portal"&gt;3. Portal&lt;/h3&gt;&#10;&lt;p&gt;Zuerst werden die Portalwangen an den Linearführungen der Y-Achse befestigt. Dabei vereinfachen Metallstifte, die in bereits vorhandene Bohrungen gesteckt werden, die präzise Positionierung. Anschließend werden die Führungsschienen für die Y-Achse am Querbalken des Portals befestigt und dieser dann an der Portalwange montiert. Winkel an beiden Seiten der Portalwange versteifen die Konstruktion. Um die Montage zu erleichtern verwendete ich zwischenzeitlich Schraubzwingen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-portal.jpg" alt="Image: Gantry mounted, secured with clamps" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Diese Maschine arbeitet mit einem Schrittmotor für die Y-Achse, dessen Kugelumlaufspindel mittig am Portalunterzug befestigt wird. Dieser ist im Video unten gut zu erkennen. Da die Maschine langsam an Gewicht zulegte, habe ich mir einen kleine Holzkonstruktion gebaut, um die für die Montage schräg auf der Seite liegende Maschine zu sichern.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-01_portal-move.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Das Portal lässt sich ohne Kugelumlaufspindel leicht von Hand bewegen.&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Nun konnte ich die Schrauben am Luftspalt des Rahmens nochmal vorsichtig lösen, das Portal ein paar mal bewegen um mögliche Verspannungen heraus zu bekommen und sie anschließend wieder gleichmäßig anziehen.&lt;/p&gt;&#10;&lt;p&gt;Als Nächstes waren die Kugelgewindespindel und Linearführungen der X-Achse zu montieren. Auf diesen wird - wieder mit Positionierstiften versehen - eine Flanschplatte montiert, die später die Z-Achse hält.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-yaxis.jpg" alt="Image: X-axis with Z-flange before attaching to ball screw" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Zum Schluss waren noch Referenzschalter und Schrittmotorhalterung anzubringen.&lt;/p&gt;&#10;&lt;h3 id="4-z-achse"&gt;4. Z-Achse&lt;/h3&gt;&#10;&lt;p&gt;Die Z-Achse wir als eigene Baugruppe unabhängig vom Rest der Maschine montiert. Auch hier kommen wieder Passstifte zum Einsatz für die Flanschplatte. Bei meiner Maschine hält eine einzelne Linearführung die Z-Achse an ihrer Position.&lt;/p&gt;&#10;&lt;p&gt;Dies ist für meine Anwendungsbereiche mit kleinen Fräsern und recht geringen Vorschüben sicherlich OK, wird bei herausfordernderen Materialien, schnellen Vorschüben oder der Verwendung großer Fräser durch die viel höheren Schnittkräfte bestimmt schnell ein Problem. Was soll&amp;rsquo;s, ich mache doch eh nur in Holz und Kunststoffen&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;Es ist ja immer schön wenn Dinge einfach funktionieren 🤗 - Herrlich, wie die Teile des Bausatzes satt ineinander greifen!&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2022-03-01_zaxis.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Ich liebe das Geräusch, wenn gut passende Bauteile zusammenkommen.&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Als die Baugruppe soweit fertig war, konnte ich sie an der Flanschplatte des Portals befestigen. Anschließend habe ich die Z-Achse mit Hilfe eines Winkels und einer Messuhr ausgerichtet, sodass sie über den gesamten Fahrweg mit nur ein paar Hundertstel Abweichung senkrecht auf dem Maschinenrahmen steht.&#10;Irgendwann muss man es bei diesem Bausatz aber gut sein lassen, da die Z-Achse mit ordentlichem Druck per Hand am unteren Teil fast 1/10mm gegen die Senkrechte wegbiegen kann.&#10;Es ist halt keine superstabile, entsprechend teure Maschine sondern ein Bausatz für den ambitionierten Hobbybereich.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-zaxis_alignment.jpg" alt="Image: Z-axis alignment with dial gauge" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Das Anbringen der seitlichen Versteifungen auf der Z-Achse stellte sich als viel schwieriger heraus als ich dachte. Die T-Nutensteine sind so klein bei der &lt;code&gt;17mm&lt;/code&gt; Schiene und die Schrauben so kurz, dass da kaum Platz blieb um alles an seinen Platz zu bekommen. Ich musste die Nutensteine mehrfach neu positionieren, um die Konstruktion dann einfädeln zu können. Als das endlich klappte, konnte ich den Referenzschalter montieren.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-zaxis_stiffening.jpg" alt="Image: Z-axis stiffening cheeks, reference switch, Y-axis motor mount" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="5-mechatronik"&gt;5. Mechatronik&lt;/h3&gt;&#10;&lt;p&gt;Nun geht es an die vorher &lt;a href="https://blog.schallbert.de/cnc-electronics/#schrittmotortreiber-im-detail"&gt;vorbereiteten Schrittmotoren&lt;/a&gt; . Dafür werden die Mitnehmer der Klauenkopplungen mit Vaseline eingerieben, sodass sie später keine lauten Knarzgeräusche von sich geben. Dann wird die eine Seite der Kupplung an der Kugelumlaufspindel und die andere am Schrittmotor befestigt. Zum Schluss dann montiert man die Motoren und zieht die Schrauben erst richtig fest, wenn Ausrichtung geprüft und ein leichter Lauf sichergestellt werden kann.&lt;/p&gt;&#10;&lt;p&gt;Auf der X-Achse hatte ich ziemliche Schwierigkeiten, die Madenschraube auf der Motorseite festzuziehen. Daher würde ich es anders als in der Anleitung angegeben direkt wie oben beschrieben mit auseinandergenommener Klauenkupplung montieren und die Motoren erst ganz zum Schluss einpassen.&lt;/p&gt;&#10;&lt;p&gt;Da die Motorzuleitung nicht besonders lang ist, gibt es in Nähe der Motoren kleine Klemmenkästen. Dort werden Motorzuleitung und Signaldrähte für die Referenzschalter aufgelegt. Die andere Seite der Klemmen verbindet eine schleppkettentaugliche Leitung später mit der Steuerung.&#10;Zum Schluss wird noch ein Schutzleiter zu jedem Motor gelegt.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-xaxis_wiring.jpg" alt="Image: Wiring X-axis stepper motor" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Als das für alle drei Achsen erledigt war, machte ich mich an die Schleppketten. Hier ist es vorteilhaft, die Montagerichtung bewusst zu wählen - die Schleppketten lassen sich z.B. zur nachträglichen Verlegung einer zusätzlichen Leitung nämlich nur in eine Richtung öffnen. Wenn deren Mechanismus dann von der Maschine verdeckt wird, kann das zu einem unmöglichen Unterfangen werden.&lt;/p&gt;&#10;&lt;p&gt;Es ist ebenfalls empfehlenswert, die Steuerleitungen länger als berechnet zu lassen und sie erst in einem letzten Schritt zu kürzen, nämlich bevor sie an der Steuerung montiert werden. Die Zuleitung zur Z-Achse kann beispielsweise nach Führen durch alle Schleppketten gern mal in Richtung 5m Länge gehen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-mechatronics.jpg" alt="Image: All wiring done." /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="6-abschmieren"&gt;6. Abschmieren&lt;/h3&gt;&#10;&lt;p&gt;Bonusschritt: Der Wartungsanleitung zum Abschmieren aller Linearführungen und Kugelumlaufspindeln folgen. Herrlich, wenn man nochmal unter die Maschine muss&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;Erwähnte ich bereits, dass ich kein Metallfritze bin? Diese Fettpressen sind echt frustrierend. Am Anfang bekam ich so gar nichts aus ihr raus und dann muss ich eine Luftblase im System gehabt haben, sodass ich nicht mehr wusste, wohin mit dem ganzen überschüssigen Schmierstoff. Immerhin habe ich jetzt einen gut gefetteten Arbeitstisch.&lt;/p&gt;&#10;&lt;p&gt;Und wann ist es eigentlich genug? Reicht &amp;ldquo;zwei mal drücken&amp;rdquo;, um eine Linearführung ausreichend zu schmieren? Kommt das Fett überhaupt in die Schmiernippel? Na ja, sobald es aus der Dichtung der Führungen herausquillt wird es wohl reichen 😜&lt;/p&gt;&#10;&lt;h3 id="7-fehlende-teile"&gt;7. Fehlende Teile&lt;/h3&gt;&#10;&lt;p&gt;Wie oben beschrieben waren alle wichtigen teile der Maschine korrekt und entsprechend der Packliste geliefert worden. Allerdings fehlten ein paar KLeinigkeiten für meine Maschinenkonfiguration:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;18x 18mm M5 Maschinenschrauben mit Innensechskant (Linearführungen X-Achse)&lt;/li&gt;&#10;&lt;li&gt;6x 0.75mm Kabelschuhe (Schutzerde für die Schrittmotoren)&lt;/li&gt;&#10;&lt;li&gt;4x 22mm M4 Maschinenschrauben mit Innensechskant (Montage Schrittmotoren)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Aber ich hatte auch ein paar Teile zu viel&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;1m extra Schleppkette&lt;/li&gt;&#10;&lt;li&gt;4 M5 Unterlegscheiben&lt;/li&gt;&#10;&lt;li&gt;9 M4x10 Senkkopfschrauben mit Innensechskant&lt;/li&gt;&#10;&lt;li&gt;2 Versteifungen z-Achse &amp;ldquo;standard&amp;rdquo;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Mein Vorschlag wäre, nochmal 100 Kabelbinder auf den Bausatz draufzuschlagen, sodass man alle Leitungen schön und ordentlich führen kann.&lt;/p&gt;&#10;&lt;h3 id="8-kritik"&gt;8. Kritik&lt;/h3&gt;&#10;&lt;p&gt;Die Bauanleitung (Version 2.1.5) gefällt mir sehr gut. Sie enthält eine Teileübersicht und jeder Schritt ist sehr detailliert erklärt. Auch der Bauprozess ist gut durchdacht und ich als nicht-professioneller Mechaniker hatte keine größeren Probleme, die Maschine korrekt zusammenzubauen.&lt;/p&gt;&#10;&lt;p&gt;Die bearbeiteten Teile haben eine hohe Qualität und sind frei von Graten oder scharfen Ecken. Alle notwendigen Gewinde wurden im Voraus geschnitten - sogar die für den optionalen Mechatronik-Bausatz, so dass ich keine Werkzeuge kaufen oder mir Wissen darüber aneignen musste, wie und wo ich sie montieren muss.&lt;/p&gt;&#10;&lt;p&gt;Was mir nicht gefiel, war, dass einige Befestigungselemente fehlten, was die Fertigstellung um ein Wochenende verzögerte, und dass die erwartete Anzahl der Befestigungselemente nicht in der Anleitung abgedruckt war, so dass ich erst merkte, dass Teile fehlten, als es bereits zu spät war. Mir ist klar, dass diese Maschine in verschiedenen Größen und Konfigurationen bestellt werden kann, so dass es vielleicht zu viel verlangt ist, eine Bauanleitung für jede einzelne Kombination zu erwarten.&lt;/p&gt;&#10;&lt;p&gt;Einige der größeren Aluminiumteile kamen mit Kratzern an, da die Palette während des Transports irgendwie gebrochen und durch die Verpackung gerissen sein muss. Für mich zeigt das, dass entweder das Logistikunternehmen oder der Hersteller die Maschine nicht 100%ig sicher verpackt oder vielleicht das Gewicht unterschätzt hat.&lt;/p&gt;&#10;&lt;p&gt;Ein letzter Punkt zu diesen Schmiernippeln (bin immer noch kein Metallbauer): Der für die Y-Achse kann nicht mehr gedreht werden, wenn die Mutter der Kugelumlaufspindel am unteren Portalträger montiert ist, weil das Spiel fehlt. Das ist unglücklich, wenn die Schmierung plötzlich in einem anderen Winkel als vorgesehen erfolgen muss. Außerdem bin ich mir ziemlich sicher, dass der untere Schmiernippel der Z-Achse im Handbuch in die falsche Richtung zeigt.&lt;/p&gt;&#10;&lt;p&gt;Ich habe mein Bestes gegeben, um Dinge zu finden, über die ich meckern kann. Ich habe es aber nicht geschafft, mehr als die oben genannten Kleinigkeiten zu finden. Keiner meiner Kritikpunkte schränkt die Funktionalität der Maschine ein, und keiner von ihnen kostete eine beträchtliche Menge an Zeit oder Geld, um ihn zu beheben.&lt;/p&gt;&#10;&lt;p&gt;Bisher sieht alles so aus als hätte ich ein robustes Gerät gekauft, das mir helfen wird, meine Prototyping-Holzarbeiten präziser und schneller als je zuvor zu erledigen.&lt;/p&gt;&#10;&lt;p&gt;Darf ich vorstellen: &lt;strong&gt;Zerspanobert&lt;/strong&gt;!&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-03-01-machine_complete.jpg" alt="Image: Sorotec BasicLine 0607 fully built" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;&lt;h3 id="9-dann-nehmen-wir-sie-mal-in-betrieb"&gt;9. Dann nehmen wir sie mal in Betrieb&lt;/h3&gt;&#10;&lt;p&gt;Weiterlesen? Gern! &lt;a href="https://blog.schallbert.de/portal-milling-setup/"&gt;Einrichtung der Maschine&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>CNC Teil1 - Portalfräsmaschine</title><link>https://blog.schallbert.de/portal-milling/</link><pubDate>Sat, 12 Feb 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/portal-milling/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-02-12_portalmillingmachine-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: My portal milling machine in mid-construction"&#10; title="CNC Teil1 - Portalfräsmaschine" /&gt;&#10;&lt;h2 id="cnc-portalfräsmaschine---für-anfänger"&gt;CNC Portalfräsmaschine - für Anfänger&lt;/h2&gt;&#10;&lt;p&gt;Es ist Winter 2021, und meine erste CNC-Maschine wird bald geliefert. Es wird ein Bausatz sein, der aus einer Menge Pakete und noch mehr Einzelteilen besteht. Ich habe die Maschine bestellt, weil ich Prototypen für &lt;a href="https://blog.schallbert.de/projects/aa_alpha_1_1/"&gt;AnywhereAmps&lt;/a&gt; schneller und genauer fertigen möchte. Und natürlich um ein paar weitere Hardware-Projekte umzusetzen, die mir schon länger im Kopf herumschwirren.&lt;/p&gt;&#10;&lt;h3 id="cnc"&gt;Moment mal&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-02-12_gcode.jpg" alt="G-code example" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Oh, Ok. CNC bedeutet &lt;a href="https://en.wikipedia.org/wiki/Numerical_control" target="_blank" rel="noopener noreferrer" class="external-link"&gt;computer numerical control&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und beschreibt, wie die Maschine gesteuert wird - nicht von Hand, sondern durch Instruktionen eines Computers.&lt;/p&gt;&#10;&lt;p&gt;Diese werden &lt;a href="https://en.wikipedia.org/wiki/G-code" target="_blank" rel="noopener noreferrer" class="external-link"&gt;G-Code&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; genannt, und sind in der häufig benutzten Interpretersprache RS274-NGC geschrieben, die Industriestandard für computergesteuerte Bearbeitungszentren geworden ist.&lt;/p&gt;&#10;&lt;p&gt;Eine Portalfräsmaschine ist einer Oberfräse nicht unähnlich. Der Fräsmotor ist auf einem Gestell montiert, das ihn in (meist) drei Achsen X, Y, Z mithilfe von &lt;a href="https://en.wikipedia.org/wiki/Stepper_motor" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Schrittmotoren&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; oder &lt;a href="https://en.wikipedia.org/wiki/Servomotor" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Servomotoren&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; bewegt. Ein Rechner steuert diese Bewegungen und ist so in der Lage, nahezu beliebige Formen zu schneiden. Die Kinematik der Portalfräsmaschine ist ähnlich zu der von &lt;a href="https://en.wikipedia.org/wiki/3D_printing#Processes_and_printers" target="_blank" rel="noopener noreferrer" class="external-link"&gt;3D-Druckern&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, obwohl sie natürlich ganz unterschiedliche Anforderungen an die Mechanik haben - eine Portalfräsmaschine muss viel stabiler, steifer und schwerer konstruiert werden, da die Rahmenkonstruktion sämtliche Schneid- und Beschleunigungskräfte aufnehmen muss.&lt;/p&gt;&#10;&lt;p&gt;Natürlich sind CNC-Maschinen nicht auf 3D-Drucker und Fräsmaschinen beschränkt. Es gibt CNC-&lt;a href="https://en.wikipedia.org/wiki/Lathe" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Drehmaschinen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Plotter" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Plotter&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Laser_cutting" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Laserschneider&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Water_jet_cutter" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Wasserstrahlschneider&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und viele mehr. Streng genommen sind sogar Industrieroboter CNC-Maschinen.&lt;/p&gt;&#10;&lt;h2 id="fragen"&gt;Fragen&lt;/h2&gt;&#10;&lt;p&gt;Dies sind einige der Fragen, die ich hatte, bevor ich dieses ziemlich teure Stück Technik gekauft habe. Einige davon lassen sich leicht in ein paar Zeilen beantworten, andere würden wahrscheinlich einen ganzen Artikel für sich allein füllen.&lt;/p&gt;&#10;&lt;h3 id="cnc-fräsmaschine"&gt;CNC-Fräsmaschine&lt;/h3&gt;&#10;&lt;h4 id="beschleunigt-sie-wirklich-meinen-prototyping-prozess"&gt;Beschleunigt sie wirklich meinen Prototyping-Prozess?&lt;/h4&gt;&#10;&lt;p&gt;Ich weiß es noch nicht, aber ich hoffe es. Die Holzarbeiten für einen einzigen Prototyp nehmen etwa 8 Stunden meiner Zeit in Anspruch. Am meisten Zeit verschlingen die Vorbereitungen für den Zuschnitt, die Messungen und das Abpausen. Allein der Lautsprecheradapter von AnywhereAmps Alpha mit seiner gewölbten Oberfläche nimmt mehr als eine Stunde Fertigungszeit in Anspruch.&lt;/p&gt;&#10;&lt;p&gt;Mit einer CNC-Portalfräsmaschine hoffe ich, mehr wie ein Plätzchenbäcker zu werden: Alle Teile für AnywhereAmps (mit Ausnahme des zylindrischen Gehäuses) in einem einzigen Stück Sperrholz zu verschachteln, die Maschine die Arbeit machen zu lassen und nach einer Weile nur noch minimale Nacharbeiten beim Ausschneiden und Schleifen der Teile zu erledigen.&lt;/p&gt;&#10;&lt;p&gt;Und wenn ich einen weiteren Prototyp oder andere Lautsprecherdurchmesser haben möchte: Ich passe einige Parameter in meinem CAD-Tool an, stelle die Werkzeugwege neu ein, schicke sie an den Computer der Maschine, spanne ein neues Stück Sperrholz ein und drücke auf &amp;ldquo;Auftrag ausführen&amp;rdquo;. Fertig (in der idealen Welt).&lt;/p&gt;&#10;&lt;p&gt;Andererseits braucht das Einarbeiten in die ganzen Software-Tools auch seine Zeit. Mein Einführungsartikel über &lt;a href="https://blog.schallbert.de/freecad-get-started/"&gt;FreeCAD hier verlinkt&lt;/a&gt; ist ein Beispiel dafür.&lt;/p&gt;&#10;&lt;h4 id="mehr-geld-für-portalhardware-oder-lieber-für-den-spindelantrieb-ausgeben"&gt;Mehr Geld für Portalhardware oder lieber für den Spindelantrieb ausgeben?&lt;/h4&gt;&#10;&lt;p&gt;Das ist eine Frage an die Experten, die ich selbst erst beantworten kann, wenn ich schon eine Weile eine CNC besitze. Ich habe mich dafür entschieden, mehr Geld für das Portal und weniger für die Spindel auszugeben, und zwar aus mehreren Gründen, die sich aus dem Bauch heraus ergeben:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Das Portal ist meine Maschine, die Spindel nur ein Teil davon.&lt;/li&gt;&#10;&lt;li&gt;Die Spindel ist günstiger, leichter auszutauschen und bei weitem nicht so aufwendig zu montieren wie das Portal, also möchte ich, dass das Portal eine Konstante ist.&lt;/li&gt;&#10;&lt;li&gt;Wenn ich durch die Fähigkeiten meiner Portalfräsmaschine eingeschränkt bin, müsste ich zuerst herausfinden, warum, und dann an einzelnen Komponenten herumschrauben, um sie zu verbessern. Wenn die Spindel der limitierende Faktor ist, kaufe ich mir einfach eine stärkere und gut ist.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="spindle-power"&gt;Wie viel Spindelleistung?&lt;/h4&gt;&#10;&lt;p&gt;Das ist meine erste schwierige Frage. Ich bin mir fast sicher, dass ich für meine Holzbearbeitung kein 2,2-kW-Monster brauche. Um anständige Vorschubgeschwindigkeiten zu erzielen und genügend Spielraum für Dichteunregelmäßigkeiten wie Astlöcher zu haben, könnte es eine gute Idee sein, sich im Leistungssegment der Handoberfräse zwischen 700W und 1200W zu orientieren, was mir immer gute Dienste geleistet hat. Ich habe mich für eine 1000W &lt;a href="https://en.wikipedia.org/wiki/Universal_motor#cite_note-tm-6" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Universalmotor&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Maschine entschieden.&lt;/p&gt;&#10;&lt;p&gt;Im Gegensatz zu den oft als &amp;ldquo;HF-Spindeln&amp;rdquo; (HF = Hochfrequenz) bezeichneten Drehstrommotoren benötigen sie keinen &lt;a href="https://blog.schallbert.de/cnc-electronics/#vfd"&gt;Frequenzumrichter&lt;/a&gt; und keine externe Kühlung, da ihr Lüfter auf die Welle geschraubt ist. Andererseits sind sie in der Regel lauter (der Lüfter ist nicht unabhängig von der Motordrehzahl) und weniger effizient (Lüfterverluste, Kommutierungsverluste, Kupferverluste, Magnetisierungsverluste usw.) Ich habe im Internet nur grobe Zahlen zum Wirkungsgrad gefunden, also nehmen wir mal an:&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;1000W&lt;/code&gt; Universalmotorantrieb &lt;code&gt;*30%&lt;/code&gt; Gesamtwirkungsgrad inkl. Elektronik &amp;amp; Lüfter: &lt;code&gt;300W&lt;/code&gt; @ Motorwelle&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;700W&lt;/code&gt; &lt;a href="https://www.scribd.com/document/776268309/2-4-6polig-e-M-asynchron-IP44-IP56" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Asynchronmaschine&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; &lt;code&gt;*85%&lt;/code&gt; Wirkungsgrad &lt;code&gt;*90%&lt;/code&gt; &lt;a href="http://www.variablefrequencydrive.org/vfd-efficiency" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Wirkungsgrad Steuerung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; &lt;code&gt;*97%&lt;/code&gt; external cooling: &lt;code&gt;520W&lt;/code&gt; @ motor shaft&lt;/p&gt;&#10;&lt;p&gt;Das wäre ein gewaltiger Unterschied, so dass sich eine spätere Aufrüstung doch lohnen könnte. Außerdem reichen für eine HF-Spindel im Vergleich zu einem konventionellen Antrieb geringere Wattzahlen aus.&lt;/p&gt;&#10;&lt;h4 id="tool-changer"&gt;Automatischer Werkzeugwechsler - ja oder nein?&lt;/h4&gt;&#10;&lt;p&gt;Das hängt wohl davon ab, was ich brauche. Ich kaufe mir zunächst einen einfachen Fräsmotor mit digitaler Drehzahlregelung als Spindel. Ein &amp;ldquo;richtiger&amp;rdquo; Werkzeugwechsler - richtig bedeutet, dass ich auch Werkzeugschäfte von &lt;code&gt;10mm&lt;/code&gt; und größer montieren kann und gewuchtete Spannzangen, 3-Phasen-Antrieb mit eigenständiger Kühlung und Frequenzumrichter habe - würde ~10 mal so viel kosten. Außerdem kostet jedes ER20-Spannzangenfutter für den Werkzeugwechsler mal eben die Hälfte meines Fräsmotors. Davon bräuchte ich mehr als eine, wenn der Werkzeugwechsler Sinn machen soll. Und ich bräuchte eine Druckluftanlage mit Schaltkasten usw. Das alles zusammen würde die Kosten für die Portalfräse locker überschreiten!&lt;/p&gt;&#10;&lt;p&gt;Schlussfolgerung: Wenn ich die CNC in Zukunft sehr oft benutzen werde und wenn meine Projekte unbedingt häufige Werkzeugwechsel zum Schruppen, Glätten, Fasen, 3D usw. erfordern, dann könnte ich diesen teuren Schritt in Betracht ziehen. Vielleicht. Irgendwann.&lt;/p&gt;&#10;&lt;h4 id="welche-größe-ist-die-beste"&gt;Welche Größe ist die beste?&lt;/h4&gt;&#10;&lt;p&gt;Idealerweise könnte man für die Bearbeitung von Sperrholzplatten eine ganze Standardplatte von &amp;ldquo;1250mm x 2500mm&amp;rdquo; oder einen Bruchteil davon, z.B. &amp;ldquo;610mm x 1250mm&amp;rdquo;, auflegen. Aber selbst die kleineren Platten würden nicht in den Keller meiner kleinen Wohnung passen. Also entschied ich mich für eine mit &lt;code&gt;840mm x 740mm&lt;/code&gt; Auflagefläche.&lt;/p&gt;&#10;&lt;p&gt;Für Ihre Wahl: Prüfen Sie, ob Sie platzmäßig eingeschränkt sind. Wenn nicht, dann machen Sie sich gründlich Gedanken darüber, was Sie mit Ihrer Maschine machen wollen. Die Größe der Maschine ergibt sich automatisch, wenn Sie wissen, wofür Sie sie hauptsächlich einsetzen wollen.&lt;/p&gt;&#10;&lt;h4 id="plug-and-play-oder-ein-bausatz"&gt;Plug-and-play oder ein Bausatz?&lt;/h4&gt;&#10;&lt;p&gt;Dies hängt von mehreren Aspekten ab: Von Budget, der Zeit, die man zu investieren bereit ist, und natürlich davon, ob man zumindest ein bisschen Talent im Umgang mit Schraubendrehern, Muttern, Abisolierzangen und dem Lötkolben hat.&#10;Es kommt auch darauf an, ob einem jede Schraube Ihrer Maschine persönlich bekannt sein soll.&lt;/p&gt;&#10;&lt;h4 id="kugelumlaufspindeln-zum-bewegen-der-achsen"&gt;Kugelumlaufspindeln zum Bewegen der Achsen?&lt;/h4&gt;&#10;&lt;p&gt;Flinke Eilgänge, hohe Wiederholgenauigkeit durch reduziertes oder eliminiertes Spiel oder höhere Vorschubgeschwindigkeiten? Fräsen im Gleichlauf, um die Oberflächenqualität und die Standzeit der Werkzeuge zu erhöhen? Wenn Sie einen dieser Punkte bejahen, sollten Sie das zusätzliche Geld für Kugelumlaufspindeln ausgeben.&lt;/p&gt;&#10;&lt;h4 id="zusätzliche-vielseitigkeit"&gt;zusätzliche Vielseitigkeit?&lt;/h4&gt;&#10;&lt;p&gt;Wie im Abschnitt &lt;a href="https://blog.schallbert.de/portal-milling/#cnc"&gt;Moment mal&lt;/a&gt; beschrieben, wäre das Portal selbst auch für andere Zwecke geeignet. Es gibt Schleppmesser zum Plotten, 3D-Druckköpfe und sogar Gravurlaser, die bei Bedarf an das Portal angeflanscht werden könnten.&lt;/p&gt;&#10;&lt;p&gt;Um sich darauf vorzubereiten, ist eine Spindel, die auf den Euronorm-Hals mit einem Durchmesser von 43 mm passt möglicherweise die beste Wahl, da die meisten anderen Werkzeuge auch für diese Passform erhältlich sind. Dies erleichtert einen eventuellen Umbau. Wobei andererseits die meisten Maschinen, die etwas taugen, spezialisiert sind auf ihr Fach - ein 3D-Drucker schafft wahnwitzige Beschleunigungsvorgänge, der Plotter spart beim Platzverbrauch und die CNC-Fräse ist nunmal wegen der Schneidkräfte stabiler gebaut.&lt;/p&gt;&#10;&lt;h3 id="allgemeine-fragen"&gt;Allgemeine Fragen&lt;/h3&gt;&#10;&lt;h4 id="entsteht-dabei-viel-staub"&gt;Entsteht dabei viel Staub?&lt;/h4&gt;&#10;&lt;p&gt;Ja. Besorgen Sie sich eine gute Staubabsaugung. Ich würde ein Zyklonsystem oder einen dieser riesigen Textilbeutel empfehlen, die normalerweise bei stationären Sägen verwendet werden. Wenn Sie Ihre Maschine regelmäßig benutzen, reicht die Aufnahmekapazität eines Werkstattsaugers allein möglicherweise nicht aus.&lt;/p&gt;&#10;&lt;p&gt;Außerdem sollten Sie den Staubsauger gut erden (z. B. indem Sie die Erdungsleitung(en) mit dem Erdungspunkt Ihres Schaltkastens verbinden) und antistatische Saugschläuche kaufen, die Sie an die Erdung des Staubsaugers oder des Staubbehälters anschließen können.&#10;Auf diese Weise vermeiden Sie, dass Sie jedes Mal, wenn Sie vakuumbezogene Dinge berühren, einen leichten Schlag bekommen, und Sie können einen schwer auszumachenden Grund dafür ausschließen, dass Ihre Maschine verrückt spielt, z. B. plötzliches Einfrieren der Software, zufälliges Erkennen von Not-Aus-Ereignissen durch die Steuerung, Falschauslösung eines Referenzschalters oder sogar Schluckauf bei Schrittmotoren. Es gibt viele Fälle in verschiedenen Foren, in denen dies die Ursache war oder gewesen sein könnte, z. B. &lt;a href="https://cambamcnc.com/forum/index.php?topic=4524.0" target="_blank" rel="noopener noreferrer" class="external-link"&gt;hier&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h4 id="ist-sie-laut"&gt;Ist sie laut?&lt;/h4&gt;&#10;&lt;p&gt;Ja. Der Geräuschpegel ist vergleichbar mit dem einer Handoberfräse. Sie ist schon im Leerlauf laut, und es wird noch schlimmer, wenn sie durch Material fährt. Es könnte also eine gute Idee sein die leiseren, aber teureren Hochfrequenzspindeln mit externer Kühlung zu kaufen. Darüber hinaus sollte (&lt;a href="https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?uri=CELEX:02006L0042-20091215&amp;amp;rid=1" target="_blank" rel="noopener noreferrer" class="external-link"&gt;und je nach den örtlichen Vorschriften sogar muss&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;) Ihre Maschine aus Sicherheitsgründen, aber auch zur Lärmminderung, eine Einhausung erhalten. Sie hilft auch dabei, Feinstaub in der Raumluft zu reduzieren.&lt;/p&gt;&#10;&lt;p&gt;Die Geräuschentwicklung hängt aber auch stark vom verwendeten Fräser ab. Meiner Erfahrung nach klingen kurze Planfräser mit großem Durchmesser und 10-mm-Schaft &lt;a href="https://blog.schallbert.de/my-endmill-screams/"&gt;angenehmer&lt;/a&gt; und sind vielleicht sogar weniger laut als Fräser mit Fischschwanz oder besonders langem Schaft.&lt;/p&gt;&#10;&lt;h4 id="wie-sieht-der-arbeitsablauf-aus"&gt;Wie sieht der Arbeitsablauf aus?&lt;/h4&gt;&#10;&lt;p&gt;Hier ist eine vereinfachte Darstellung des Arbeitsablaufs mit einer CNC-Maschine.&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2022-02-12_cncworkflow.jpg" alt="Bild: CNC-Arbeitsablauf in Kürze" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ähnlich wie beim Handwerk beginnt alles mit einer Idee. Die Zeichnungen und Bemaßungen der Teile werden nicht auf einem leeren Blatt Papier, sondern in einem Computer Aided Design-Tool erstellt. Die Zeichnung oder 3D-Modelldatei wird dann in einem Computer Aided Manufacturing Tool weiterverarbeitet, wo geeignete Fräswerkzeuge ausgewählt, die Frässtrategien festgelegt und die Werkzeugwege erzeugt werden. Die resultierende G-Code-Datei wird dann an die eigentliche CNC Software gesendet, die die Schrittmotortreiber steuert. Diese senden Stromimpulse an die Schrittmotoren, die wiederum die Maschine mechanisch verfahren, um das Teil zu fertigen.&lt;/p&gt;&#10;&lt;h3 id="fragen-zum-betrieb"&gt;Fragen zum Betrieb&lt;/h3&gt;&#10;&lt;h4 id="milling-style"&gt;Fräsen im Gleich- oder Gegenlauf?&lt;/h4&gt;&#10;&lt;p&gt;Dies ist eine Entscheidung, die in der CAM-Software getroffen wird.&lt;/p&gt;&#10;&lt;p&gt;Fräsen im Gegenlauf = der Fräser &amp;ldquo;schnitzt&amp;rdquo; in das Material, seine Schneiden drehen sich entgegen der Materialtransportrichtung. Der Gegenlauf wird bei allen Kreissägen verwendet die ich kenne, um Rückschläge zu vermeiden oder das Werkstück auf dem Tisch zu halten.&#10;Gleichlauffräsen = der Fräser &amp;ldquo;frisst&amp;rdquo; sich in das Material, seine Schneiden rotieren mit der Transportrichtung. Der Fräser neigt dazu, sich selbst in das Material zu ziehen.&#10;Weitere Informationen z.B. auf &lt;a href="https://www.harveyperformance.com/in-the-loupe/conventional-vs-climb-milling/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;harveryperformance&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; oder &lt;a href="https://blog.tormach.com/climb-milling-versus-conventional-milling-sneaky-cnc-tricks" target="_blank" rel="noopener noreferrer" class="external-link"&gt;tormachs blog&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Für welche der beiden Möglichkeiten Sie sich entscheiden sollten, hängt von der Steifigkeit und dem Gewicht Ihrer Maschine, den Drehmoment Ihres Schrittmotors, der Leistung Ihrer Schrittmotorantriebe und dem Material ab, das Sie bearbeiten. Wenn Sie eine steife, schwere, leistungsstarke Maschine (mit Kugelumlaufspindeln) haben und mit eher weichen Materialien arbeiten, sollten Sie das Gleichlauffräsen verwenden. Beobachten Sie Ihre Maschine genau, um zu sehen, ob sich alles glatt anfühlt und anhört (!). Im Zweifelsfall sollten Sie im Gegenlauf fräsen. Arbeiten Sie bei handgeführten Oberfräsen immer den Gegenlauf!&lt;/p&gt;&#10;&lt;p&gt;Nachtrag: Ich fräse Dibond im Gegenlauf mit guten Ergebnissen, Acrylglas und Holz jedoch bearbeite ich im Gleichlauf.&lt;/p&gt;&#10;&lt;h4 id="wie-spannt-man-das-werkstück-schnell-und-einfach-auf"&gt;Wie spannt man das Werkstück schnell und einfach auf?&lt;/h4&gt;&#10;&lt;p&gt;Das hängt wiederum von Ihrem Material ab:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Große Platten: Vakuumtisch oder Anschlag mit Klemmen, die die Platte gegen den Anschlag drücken&lt;/li&gt;&#10;&lt;li&gt;Kleine Platten: Klemmen oder Verschraubung auf dem Fräsbett&lt;/li&gt;&#10;&lt;li&gt;Kleine Blöcke: Schraubstock&lt;/li&gt;&#10;&lt;li&gt;Unregelmäßige Formen: Klemmen, die das Material auf dem Fräsbett niederhalten&lt;/li&gt;&#10;&lt;li&gt;Beidseitiges Fräsen: projektspezifische Vorrichtungen, die das Material in Position halten&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Hmm, die &lt;a href="https://blog.schallbert.de/projects/cnc_spoilboard/"&gt;Opferplatte mit Anschlag&lt;/a&gt; wird wahrscheinlich eins meiner ersten Projekte mit der neuen Maschine.&lt;/p&gt;&#10;&lt;h4 id="mit-welchen-bits--fräsern-sollte-man-beginnen"&gt;Mit welchen Bits / Fräsern sollte man beginnen?&lt;/h4&gt;&#10;&lt;p&gt;Ich würde für den Anfang die folgenden allgemeinen Fräser empfehlen. Sie sollten natürlich in Herstellung, Spiralform, Nutenzahl usw. zum verwendeten Material passen.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Klassischer Schaftfräser mit &lt;code&gt;6mm&lt;/code&gt; oder 1/4&amp;quot;, Spirale mit &lt;code&gt;15-30°&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;2mm&lt;/code&gt; Schaftfräser mit Freischnitt für feines Material oder kleine Löcher&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;60°&lt;/code&gt; und &lt;code&gt;90°&lt;/code&gt; Gravierfräser für Gravuren und Fasen&lt;/li&gt;&#10;&lt;li&gt;Planfräser für großflächiges Fräsen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="mein-schwerpunkt-ist-holz-was-sind-geeignete-vorschübe-und-drehzahlen"&gt;Mein Schwerpunkt ist Holz, was sind geeignete Vorschübe und Drehzahlen?&lt;/h4&gt;&#10;&lt;p&gt;Birkensperrholz ist hart aber nachgiebig. Die geeigneten Werte berücksichtigen immer die Stabilität der Maschine, die Drehmomente der Schrittmotoren und die Spindelleistung.&lt;/p&gt;&#10;&lt;p&gt;Wichtig ist, dass der Fräser Späne erzeugt und keinen Staub. Deshalb sollten niedrige Vorschubgeschwindigkeiten bei hohen Spindeldrehzahlen vermieden werden. Für den Anfang in Holz: Verwenden Sie die Hälfte Ihres Werkzeugdurchmessers als Tiefe pro Durchgang, berechnen Sie die Spindeldrehzahl mit der Formel für Vorschübe und Drehzahlen oder einem Rechner aus dem Internet, und probieren Sie diese aus. Schauen Sie sich die Späne an. Hören Sie der Maschine bei der Arbeit zu. Hört sie sich &amp;ldquo;gut&amp;rdquo; an? Erhöhen Sie die Tiefe pro Durchgang oder die Vorschubgeschwindigkeit allmählich und hören Sie an dem Punkt auf, an dem entweder Ihre Spindel gestresst klingt, Ihr Finish schlechter wird oder Sie sich mit Ihrer Maschine nicht mehr sicher fühlen. Drehen Sie wieder eine Stufe zurück, und das könnte Ihre ideale Vorschubgeschwindigkeit und Durchgangstiefe für das Material und den Fräser sein, den Sie gerade verwenden.&lt;/p&gt;&#10;&lt;p&gt;Für meine Maschine habe ich mich für &lt;code&gt;F3500mm/min&lt;/code&gt; = &lt;code&gt;138in/m&lt;/code&gt; bei &lt;code&gt;S24000U/min&lt;/code&gt; und einer Tiefenzustellung in Höhe des Fräsdurchmessers &lt;code&gt;Z+6mm&lt;/code&gt;, Bahnüberlappung &lt;code&gt;10%&lt;/code&gt; entschieden. Für die Recherche habe ich die folgenden Websites benutzt: &lt;a href="https://www.cnccookbook.com/feeds-speeds-cnc-wood-cutting/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;cnccookbook&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, &lt;a href="https://www.cncrechner.de/rechner/vorschub/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;cnc-rechner&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; sowie Webseiten von Werkzeugherstellern wie &lt;a href="https://webseite.sorotec.de/download/fraesparameter/schnittwerte.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Sorotec&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="weiterlesen"&gt;Weiterlesen?&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://blog.schallbert.de/portal-milling-build/"&gt;CNC: Der Aufbau&lt;/a&gt;&#10;&lt;a href="https://blog.schallbert.de/cnc-electronics/"&gt;CNC Elektronik&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Einschaltstrombegrenzer Teil2</title><link>https://blog.schallbert.de/inrushlimiter-circuits/</link><pubDate>Thu, 10 Feb 2022 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/inrushlimiter-circuits/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/inrushlimiter-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Inrush limiter circuit variant"&#10; title="Einschaltstrombegrenzer Teil2" /&gt;&#10;&lt;h2 id="inhalt"&gt;Inhalt&lt;/h2&gt;&#10;&lt;p&gt;In diesem Artikel konzentriere ich mich auf zwei Möglichkeiten, eine Halbleiter-Einschaltstrombegrenzerschaltung zu erstellen: Die eine kopiert den Relais-Ansatz aus &lt;a href="https://blog.schallbert.de/knowledge-inrushlimiters/"&gt;Elektronikwissen: Einschaltstrombegrenzer&lt;/a&gt;, wobei lediglich das Relais durch einen p-Kanal-MOSFET ersetzt und eine besser definierte Zeitverzögerung hinzugefügt wird. Zum anderen stelle ich einen &amp;ldquo;linearen&amp;rdquo; Ansatz vor, bei dem die Stromversorgung schrittweise durch einen PNP-Leistungstransistor eingeschaltet wird.&lt;/p&gt;&#10;&lt;h2 id="motivation-einschaltstrombegrenzer-für-usb-pd"&gt;Motivation: Einschaltstrombegrenzer für USB-PD&lt;/h2&gt;&#10;&lt;p&gt;Da meine Experimente mit &lt;a href="https://blog.schallbert.de/usbpd-explained/"&gt;USB-PD für AnywhereAmps&lt;/a&gt; vorerst fehlgeschlagen sind, muss ich eine Schaltung erstellen, die den Einschaltstrom in meinem Verstärker begrenzt, bevor ich es erneut versuche.&lt;/p&gt;&#10;&lt;h2 id="schaltungen-erläutert"&gt;Schaltungen erläutert&lt;/h2&gt;&#10;&lt;p&gt;Die beiden Schaltungen sind sich sehr ähnlich. Sie unterscheiden sich eigentlich nur in zwei Komponenten des Leistungsteils. Im Allgemeinen wird die Verzögerungszeit durch eine Vergrößerung des Kondensators &lt;code&gt;C4&lt;/code&gt; oder eine Vergrößerung des Ladewiderstands &lt;code&gt;R9&lt;/code&gt; verlängert.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/inrush_circuit.jpg" alt="Image: inrush current limiter sections" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="eingangsbereich-blau"&gt;Eingangsbereich (blau)&lt;/h3&gt;&#10;&lt;p&gt;Der Eingangsteil verfügt über eine &lt;a href="https://blog.schallbert.de/knowledge-tvsdiodes/"&gt;TVS-Diode&lt;/a&gt;, um Verpolung oder Überspannung zu vermeiden.&lt;/p&gt;&#10;&lt;h3 id="verzögerungsabschnitt-gelb"&gt;Verzögerungsabschnitt (gelb)&lt;/h3&gt;&#10;&lt;p&gt;Nach dem Einschalten wird &lt;code&gt;C4&lt;/code&gt; über &lt;code&gt;R9&lt;/code&gt; allmählich aufgeladen. Wenn die Schwellenspannung des NPN-Bipolartransistors &lt;code&gt;Q2&lt;/code&gt; erreicht ist, wird die Spannung hinter &lt;code&gt;R11&lt;/code&gt; langsam reduziert, was wiederum &lt;code&gt;M2&lt;/code&gt;, den Leistungspfad dieser Schaltung, aktiviert. &lt;code&gt;R12&lt;/code&gt; wurde hinzugefügt, um einen stabilen Arbeitspunkt für &lt;code&gt;Q2&lt;/code&gt; zu schaffen.&lt;/p&gt;&#10;&lt;h3 id="leistungsteil-grün"&gt;Leistungsteil (grün)&lt;/h3&gt;&#10;&lt;p&gt;Die lineare Variante hat einen PNP-Leistungstransistor &lt;code&gt;Q1&lt;/code&gt; im Hauptstrompfad (&lt;a href="https://blog.schallbert.de/inrushlimiter-circuits/#schaltungsvergleich"&gt;Bild unten&lt;/a&gt;). Er wird über &lt;code&gt;Q2&lt;/code&gt; aktiviert, und der Strom, den er liefern kann, wird über &lt;code&gt;R10&lt;/code&gt; gesteuert, der in diesem Fall einen relativ niedrigen Wert hat um hohe Emitter-Kollektor-Ströme zu ermöglichen.&lt;/p&gt;&#10;&lt;p&gt;Während die schaltende Variante einen Strombegrenzungswiderstand &lt;code&gt;R8&lt;/code&gt; verwendet, der durch den p-Kanal-Mosfet &lt;code&gt;M2&lt;/code&gt; kurzgeschlossen wird, erfordert seine spannungsgesteuerte Natur keine besondere Sorgfalt bei der Auswahl von &lt;code&gt;R10&lt;/code&gt;. Man sollte nur darauf achten, dass seine (negative) Gate-Schwellenspannung sicher eingehalten wird.&lt;/p&gt;&#10;&lt;h3 id="simulierte-last-violett"&gt;Simulierte Last (violett)&lt;/h3&gt;&#10;&lt;p&gt;Meine Last ist die Endstufenschaltung. Um den Ruhezustand und das Einschaltverhalten zu simulieren, habe ich einen &lt;code&gt;400Ohm&lt;/code&gt;-Widerstand &lt;code&gt;R5&lt;/code&gt; und einen gepolten &lt;code&gt;1200uF&lt;/code&gt;-Kondensator &lt;code&gt;C3&lt;/code&gt; gewählt. Die TVS-Diode schützt vor Überspannung und Rückströmen. Ich habe die Simulationen mit Kondensatorwerten von bis zu &lt;code&gt;10000uF&lt;/code&gt; und Lastwiderständen bis herunter auf &lt;code&gt;40Ohm&lt;/code&gt; ausprobiert, alle mit ähnlichen und guten Ergebnissen.&lt;/p&gt;&#10;&lt;h2 id="schaltungsvergleich"&gt;Schaltungsvergleich&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/inrushlimiter-variants.jpg" alt="Image: Einschaltstrombegrenzer-Varianten im Vergleich" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die dunkelblaue Linie im Diagramm ist wichtig: Sie beschreibt die Ausgangsspannung des Systems im Zeitverlauf. Beide Schaltungen sind so abgestimmt, dass sie die Ziel-Ausgangsspannung nach 0,2 Sekunden erreichen. Dennoch unterscheiden sich die Kurven ziemlich stark, was die unterschiedliche Natur der beiden Ansätze widerspiegelt.&lt;/p&gt;&#10;&lt;h3 id="p-ch-mosfet-ansatz"&gt;P-CH MOSFET Ansatz&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Aufgrund des Schaltvorgangs ist die Einschaltstrombegrenzung zwar wirksam, aber nicht ganz gleichmäßig&lt;/li&gt;&#10;&lt;li&gt;die Leistungsverluste sind bei dieser Variante sehr gering, da sowohl der auslösende NPN-Transistor als auch der Leistungs-MOSFET für sich genommen nicht viel Strom verbrauchen.&lt;/li&gt;&#10;&lt;li&gt;breiter Einsatzbereich für angeschlossene Geräte, der nur durch den maximalen Dauerstrom des MOSFETs begrenzt wird.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="pnp-leistungstransistor-ansatz"&gt;PNP-Leistungstransistor-Ansatz&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;sehr ruhiger Betrieb, die Einschaltzeit kann aufgrund des großen ohmschen Bereichs des PNP sehr gut gesteuert werden&lt;/li&gt;&#10;&lt;li&gt;höhere Leistungsverluste im eingeschalteten Zustand aufgrund des hohen Basisstroms durch &lt;code&gt;R10&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Nicht sehr vielseitig, da hohe Lastströme einen beträchtlichen Spannungsabfall über den Emitter-Kollektor-Pfad von &lt;code&gt;Q1&lt;/code&gt; erzeugen.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="weitere-verbesserungen"&gt;Weitere Verbesserungen&lt;/h3&gt;&#10;&lt;p&gt;Um die Vielseitigkeit dieser Schaltung zu behalten und gleichzeitig eine glatte Spannungskurve zu erreichen, könnte man einen Operationsverstärker verwenden, um den Laststrom zu überwachen und ihn bei Bedarf auf die zulässigen Werte herunterzuregeln. Der Leistungs-MOSFET könnte beibehalten werden, während der Nachteil des engem ohmschen Betriebsbereichs verschwinden würde. Der Preis dafür wäre zusätzliche Komplexität, wie sie &lt;a href="https://electronics.stackexchange.com/questions/408379/current-limiting-source-using-opamp" target="_blank" rel="noopener noreferrer" class="external-link"&gt;in diesem Stackexchange-Beitrag&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; beschrieben wird.&lt;/p&gt;&#10;</description></item><item><title>Einschaltstrombegrenzer - Teil1</title><link>https://blog.schallbert.de/knowledge-inrushlimiters/</link><pubDate>Sun, 14 Nov 2021 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/knowledge-inrushlimiters/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-14_bulb-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Electrical light bulb, 12V 5W"&#10; title="Einschaltstrombegrenzer - Teil1" /&gt;&#10;&lt;h2 id="elektronikwissen-einschaltstrombegrenzer"&gt;Elektronikwissen: Einschaltstrombegrenzer&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;video controls&gt;&#10; &lt;source src="https://blog.schallbert.de/assets/video/posts/2021-11-14_inrush_current_limiter_relay.mp4" type="video/mp4"&gt;&#10; Your browser does not support the video tag.&#10; &lt;/video&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt; Einschaltstrombegrenzer in Aktion.&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="was-ist-das"&gt;Was ist das?&lt;/h3&gt;&#10;&lt;p&gt;Ein &lt;a href="https://en.wikipedia.org/wiki/Inrush_current" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Einschaltstrom&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; ist der Stromstoß, der direkt nach dem Einschalten durch einen Stromkreis fließt, bis der Stromkreis seinen stabilen Zustand erreicht hat. Hohe Einschaltströme sind oft unerwünscht, da sie Schaltungsteile überlasten und deren Lebensdauer verkürzen können, elektromagnetische Störungen verursachen und einen kurzzeitigen Spannungsabfall bewirken, der zu ständigen Neustarts eines gesteuerten Geräts &lt;a href="https://blog.schallbert.de/capacitor-problems/"&gt;wie hier beschrieben&lt;/a&gt; oder zu anderem unerwünschten Verhalten führen kann.&lt;/p&gt;&#10;&lt;h3 id="beispiel"&gt;Beispiel&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://upload.wikimedia.org/wikipedia/commons/f/f9/Lamp_inrush_current.png" alt="Wikipedia: inrush current of an incandescent light bulb" /&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Oszillograf: Einschaltstrom einer Lampe mit Glühfaden&lt;/span&gt;&lt;a href="https://commons.wikimedia.org/wiki/File:Lamp_inrush_current.png#file" class="attr-link" aria-label="Attribution 1"&gt;&#10; &lt;sup class="attr-id"&gt;[1]&lt;/sup&gt;&#10; &lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Glühlampe: Die rosa Linie ist die Ausgangsspannung des Netzteils, die gelbe Linie zeigt den Strom. Man kann erkennen, dass das Netzteil die Ausgangsspannung verringert, um die Stromaufnahme während des Starts zu reduzieren. Nach etwa &lt;code&gt;100ms&lt;/code&gt; stabilisiert sich die Spannung, da der Stromfluss durch die Lampe immer noch ein wenig abnimmt, während der Glühfaden langsam seine Temperatur erreicht.&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-14_bulb_resistance.jpg" alt="Image: Measuring the resistance of an incandescent light bulb" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;&lt;h3 id="hintergrund"&gt;Hintergrund&lt;/h3&gt;&#10;&lt;p&gt;Der Glühfaden des Leutmittels wirkt wie ein Widerstand mit positivem Temperaturkoeffizienten (PTC): Bei Raumtemperatur hat er einen sehr niedrigen Widerstand, bei seiner normalen Betriebstemperatur von &lt;a href="https://hypertextbook.com/facts/1999/AlexanderEng.shtml" target="_blank" rel="noopener noreferrer" class="external-link"&gt;~3300K&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; einen viel höheren.&#10;Ein kleines Experiment beweist dies:&#10;Nehme ich eine &amp;ldquo;116W&amp;rdquo;-Halogenglühbirne, so beträgt ihr Widerstand im &amp;ldquo;eingeschwungenen Zustand&amp;rdquo; bei &lt;code&gt;230V&lt;/code&gt; etwa \(R_{steady} = \frac{U^2}{P} = 456{Ohm}\).&#10;Wenn ich den Widerstand der Lampe im kalten Zustand mit einem Multimeter messe, liegt der Wert bei \(R_{off} = 38.6{Ohm}\).&#10;Während durch die Glühlampe im eingeschalteten Zustand ein Strom von \(I_{steady} = 0.5A\) fließt, liegt ihr Einschaltstrom bei etwa \(I_{inrush} = 6A\) - also zwölf mal so hoch!&lt;/p&gt;&#10;&lt;h2 id="einschaltstrombegrenzer-schaltungen"&gt;Einschaltstrombegrenzer-Schaltungen&lt;/h2&gt;&#10;&lt;p&gt;Einschaltstrombegrenzer werden häufig in Geräten mit großen induktiven oder kapazitiven Lasten eingesetzt.&#10;&lt;a href="https://www.ti.com/lit/an/slvae30e/slvae30e.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Beispiele (Link zu Texas Instruments)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; sind Transformatoren, Motoren (induktiv), Leistungsverstärker, Schaltnetzteile (kapazitiv) usw.&lt;/p&gt;&#10;&lt;p&gt;Es gibt &lt;a href="https://e2e.ti.com/blogs_/b/powerhouse/posts/powertips-how-to-limit-inrush-current-in-an-ac-dc-power-supply" target="_blank" rel="noopener noreferrer" class="external-link"&gt;verschiedene Arten von Einschaltstrombegrenzern (TI application note)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; mit unterschiedlicher Komplexität.&lt;/p&gt;&#10;&lt;h3 id="widerstand-mit-negativem-temperaturkoeffizient-ntc--heißleiter---thermistor"&gt;Widerstand mit negativem Temperaturkoeffizient (NTC) / Heißleiter / Thermistor&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/ntc.jpg" alt="Image: Elektrisches Symbol eines Thermistors mit negativem Temperaturkoeffizienten" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ein Einschaltstrombegrenzer als NTC-Widerstand in Reihe zur Last ist die einfachste Schaltung in dieser Aufzählung. Sie besteht aus nur einem zusätzlichen Bauteil. Das Verhalten des NTC-Widerstands gegenüber der Temperatur ist dem des obigen Glühbirnenbeispiels entgegengesetzt: Sein Widerstand nimmt mit steigender Temperatur ab, so dass mehr Strom durch den Stromkreis fließen kann.&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-14_NTC.jpg" alt="Image: NTC curve example" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Bei den meisten NTCs verhält sich der Widerstand logarithmisch zur Temperatur, er sinkt also sehr stark bei zunehmender Temperatur. So kann er Einschaltstrompulse sehr effektiv unterdrücken. Nachteilig ist der Eigenenergiebedarf, der den Widerstand auf Betriebstemperatur hält.&#10;Diese Schaltung wird dort verwendet, wo geringe Kosten wichtig sind, das System einfach gehalten werden soll und der zusätzliche Energieverbrauch kein Problem darstellt.&lt;/p&gt;&#10;&lt;h3 id="widerstand-mit-bypass-relais"&gt;Widerstand mit Bypass-Relais&lt;/h3&gt;&#10;&lt;p&gt;Diese Schaltung vermeidet die Nachteile eines zusätzlichen Serienwiderstands zur Last durch Hinzufügen eines Leistungswiderstands und eines Relais. Sie wird typischerweise in Gleichstromversorgungen mit hoher Leistung oder empfindlichen Geräten wie Verstärkern verwendet.&#10;Der Relaiskontakt ist im unbestromten Zustand offen und parallel zum Leistungswiderstand verdrahtet, der je nach Last einen Wert von typischerweise &amp;ldquo;1&amp;hellip;22 Ohm&amp;rdquo; hat. Dahinter wird die Last angeschlossen, die den Einschaltstrom verursacht. Für dieses Beispiel nehme ich die Glühbirne eines Autos als Last. Beim Einschalten des Geräts begrenzt der Widerstand den Stromkreis und die Spannung auf der Lastseite steigt allmählich an. Sobald die Spannung an der Basis des NPN-&amp;ldquo;BC337&amp;rdquo;-Transistors hoch genug ist, schaltet er sich ein und lässt Strom durch die Relaisspule fließen, die dann den Leistungswiderstand kurzschließt, so dass die Last ihren Nennstrom ziehen kann.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-14_relay.jpg" alt="Image: Circuit plan for a start-up relay inrush current limiter" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die Werte von &lt;code&gt;R2, R3&lt;/code&gt; hängen von der Spannung hinter &lt;code&gt;R1&lt;/code&gt; ab, wenn sich die Schaltung bei ausgeschaltetem Relais im eingeschwungenen Zustand befindet. Des Weiteren ist die Charakteristik des Transistors und der Betriebsstrom der Relaisspule zu berücksichtigen. In meinem Beispiel wählte ich &lt;code&gt;R2 = 1kOhm&lt;/code&gt;, da der Transistor &lt;code&gt;~40mA&lt;/code&gt; für den Betrieb des Relais durchlassen muss. Diesen Wert habe ich dem Datenblatt des &lt;code&gt;BC337&lt;/code&gt;, Parameter Stromverstärkung, entnommen. Da ich das Relais nicht zu früh schalten lassen wollte, habe ich &lt;code&gt;R3&lt;/code&gt; hinzugefügt. Je höher sein Widerstand, desto früher wird das Relais aktiv. Ein zu geringer Widerstand hingegen reduziert die Basisspannung des &lt;code&gt;BC337&lt;/code&gt; so weit, dass er das Relais nicht mehr treiben kann - hier muss ein wenig experimentiert werden.&lt;/p&gt;&#10;&lt;p&gt;In diesem &lt;a href="https://www.elektronik-kompendium.de/public/schaerer/onilim.htm" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Anwendungsbeispiel für den &amp;ldquo;Soft Start&amp;rdquo; eines Ringtrafos (Elektronik-Kompendium)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; kommt eine ähnliche Schaltung zum Einsatz.&lt;/p&gt;&#10;&lt;p&gt;Und so verhält sich der Schaltkreis in der Realität:&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-14_relay_circuit.jpg" alt="Image: Start-up relay circuit on a breadboard" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ich habe mir die Freiheit genommen, einen Schalter hinzuzufügen, damit die Steuerung der Stromversorgung für mich bequemer wird. Das Relais ist mit einer Freilaufdiode ausgestattet, um den Transistor vor negativen Spannungsspitzen zu schützen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-14_compare_inrush.jpg" alt="Image: Comparison of inrush currents with and without limiter" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Das Problem des Einschaltstroms ist tatsächlich gelöst. Der Vergleich (gelbe Linie) zeigt einen ungeregelten Einschaltstrom von &lt;code&gt;3.5A&lt;/code&gt;, während der Begrenzer ihn auf &lt;code&gt;0.8A&lt;/code&gt; reduziert, was nur knapp über dem Nennstrom liegt. Ein Leistungswiderstand mit kleinerem Wert hätte diesen Strom noch weiter reduziert.&lt;/p&gt;&#10;&lt;p&gt;Die grüne Linie zeigt die Basisspannung des &lt;code&gt;BC337&lt;/code&gt; an. Man erkennt, dass sie langsam ansteigt (die Genauigkeit des Oszilloskops ist bei &lt;code&gt;40VPP&lt;/code&gt; nicht die beste) und das Relais einschaltet, wenn sich der Stromfluss (gelbe Linie) stabilisiert hat.&lt;/p&gt;&#10;&lt;h3 id="sanftanlauf--konfigurierbare-strombegrenzung"&gt;Sanftanlauf / konfigurierbare Strombegrenzung&lt;/h3&gt;&#10;&lt;p&gt;Es gibt spezielle ICs, die den Sanftanlauf eines Systems unterstützen, je nach&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Leistungsbedarf&lt;/li&gt;&#10;&lt;li&gt;Hochlaufzeit&lt;/li&gt;&#10;&lt;li&gt;Beschränkungen der Anstiegsgeschwindigkeit&lt;/li&gt;&#10;&lt;li&gt;Maximalstrom&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Darüber hinaus gibt es verschiedene Arten von Einschaltstrombegrenzern, die je nach Anwendung ausgewählt werden können:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Zeitgesteuert: Das System wird nach einer bestimmten Zeit vollständig eingeschaltet (einfach, aber dumm)&lt;/li&gt;&#10;&lt;li&gt;Spannungsgesteuert: Das System wird oberhalb eines Spannungsauslösepegels vollständig eingeschaltet (immer noch einfach, mittlere Kosten)&lt;/li&gt;&#10;&lt;li&gt;Stromgesteuert: Begrenzt den Systemstrom oder schaltet das System auf der Grundlage eines Stromauslösepegels vollständig ein (wahrscheinlich teurer)&#10;Hinsichtlich der Anforderungen des Systems muss dann ein passender IC gewählt werden. Typische Namen sind hier &lt;code&gt;Power Supervisors&lt;/code&gt;, &lt;code&gt;IC soft starter&lt;/code&gt;, &lt;code&gt;Supervisor &amp;amp; Reset IC&lt;/code&gt; oder ähnlich. Sie können intern sogar mit Leistungstransistoren ausgestattet sein und selbsttätig schalten, wie z.B. &lt;a href="https://www.analog.com/en/products/MAX17562.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;MAX17562 (Analog Devices)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für meine Evolution von &lt;a href="https://blog.schallbert.de/anywhereamps-get-pcb/#power-supervisor"&gt;AnywhereAmps&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Weiterlesen: &lt;a href="https://blog.schallbert.de/inrushlimiter-circuits/"&gt;Einschaltstrombegrenzer - Teil2&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>TVS-Dioden</title><link>https://blog.schallbert.de/knowledge-tvsdiodes/</link><pubDate>Sat, 13 Nov 2021 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/knowledge-tvsdiodes/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-02_tvs-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Typical TVS voltage diagram"&#10; title="TVS-Dioden" /&gt;&#10;&lt;h2 id="elektronikwissen-zur-tvs-diode"&gt;Elektronikwissen zur TVS-Diode&lt;/h2&gt;&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/tvs_diode.jpg" alt="Image: Electric symbol for TVS diodes" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="was-ist-das"&gt;Was ist das?&lt;/h3&gt;&#10;&lt;p&gt;Eine Transient voltage suppressor diode schützt eine Schaltung vor Spannungsspitzen, die deutlich über der Nennspannung des Schaltkreises liegen. Sie sind für verschiedene Auslösespannungen und Ableitströme verfügbar. Zudem gibt es unterschiedliche Typen, wovon einige sogar sowohl vor positiven als auch vor negativen Spannungsspitzen schützen können.&lt;/p&gt;&#10;&lt;h3 id="unterschiede-zwischen-tvs--und-zenerdioden"&gt;Unterschiede zwischen TVS- und Zenerdioden&lt;/h3&gt;&#10;&lt;p&gt;Wie &lt;a href="https://en.wikipedia.org/wiki/Zener_diode" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Zener-Dioden&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, werden TVS-Dioden in Sperrrichtung eingebaut. Sie haben sogar &lt;a href="https://electronics.stackexchange.com/questions/233600/differences-between-tvs-diode-and-zener-diodes-in-diagrams-and-in-practice" target="_blank" rel="noopener noreferrer" class="external-link"&gt;dasselbe Symbol&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Doch währen Zenerdioden ihren Arbeitspunkt sehr nahe der Durchbruchspannung haben, werden TVS-Dioden üblicherweise weit darunter betrieben. Somit &lt;a href="https://toshiba.semicon-storage.com/content/dam/toshiba-ss-v2/master/en/semiconductor/knowledge/e-learning/discrete/discrete-basic-chap2_en.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;schließen sie Überspannungsspitzen kurz (Link zu Toshiba)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; auf für den Schaltkreis ungefährliche Spannungen und sind dafür ausgelegt, sehr hohe Pulsströme ableiten zu können.&lt;/p&gt;&#10;&lt;h3 id="abgrenzung-zwischen-tvs--and-schottkydioden"&gt;Abgrenzung zwischen TVS- and Schottkydioden&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/schottky_diode.jpg" alt="Image: Schottky diode electronics symbol" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Das Symbol für &lt;a href="https://en.wikipedia.org/wiki/Schottky_diode" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Schottkydioden&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; unterscheidet sich nur geringfügig von Zener/TVS-Dioden. Sie haben in der Regel eine niedrigere Durchlassspannung als ihre Siliziumpendants und sind für ihre schnelle Schaltgeschwindigkeit bekannt. Deshalb werden sie neben Gleichrichterschaltungen auch häufig in Verpolungsschutzschaltungen eingesetzt. TVS-Dioden haben das gleiche schnelle Schaltverhalten und die niedrige Vorwärtsspannung, aber im Gegensatz zu Schottkys haben sie einen genau definierten Schwellenwert für die Sperrspannung und vertragen besonders hohe Pulsströme.&lt;/p&gt;&#10;&lt;h3 id="auswahl-der-richtigen-tvs-diode"&gt;Auswahl der richtigen TVS-Diode&lt;/h3&gt;&#10;&lt;p&gt;Für Gleichstromanwendungen sollte eine unidirektionale TVS-Diode verwendet werden. Ihre Durchbruchspannung ist so zu wählen, dass sie etwas über der normalen Betriebsspannung liegt. Des Weiteren ist die Klemmspannung relevant, die weiter &amp;ldquo;unten&amp;rdquo; auf der Linie des zugehörigen Diagramms abzulesen ist. Liegt sie immer noch unter den &amp;ldquo;absoluten Maximalwerten&amp;rdquo; Ihrer zu schützenden Schaltung Schaltung? Wenn nicht ist eine andere TVS-Diode zu wählen oder ein Kompromiss bei der Spannung einzugehen (dabei nicht die Durchbruchspannung des TVS überschreiten). Alternativ kann auch eine andere Vorrichtung zur Unterdrückung von Spannungsspitzen wie einen spannungsabhängiger Widerstand oder ähnliches verwendet werden.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-11-02_tvs_diagram.jpg" alt="Bild: Diagramm einer typischen TVS-Diode" /&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Strom/Spannungs-Diagramm einer typischen TVS-Diode&lt;/span&gt;&lt;a href="https://www.littelfuse.com/products/tvs-diodes.aspx" class="attr-link" aria-label="Attribution 1"&gt;&#10; &lt;sup class="attr-id"&gt;[1]&lt;/sup&gt;&#10; &lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Tipps für besseres Hardware Design</title><link>https://blog.schallbert.de/anywhereamps-get-pcb/</link><pubDate>Tue, 21 Sep 2021 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/anywhereamps-get-pcb/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-10-16_board-delivered-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Preamp prototype board soldered and working"&#10; title="Tipps für besseres Hardware Design" /&gt;&#10;&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;&#10;&lt;p&gt;Ich habe meine erste Anfrage für die Fertigung eines AnywhereAmps Alpha. Da ich nicht noch einmal 10h für den Bau aufwenden möchte, habe ich beschlossen, die Zeit in die Beschleunigung des Herstellungsprozesses zu investieren. Ich fand heraus, dass ich etwa eine Stunde pro Verstärker sparen könnte, wenn ich die Platine für mich herstellen lassen würde. Leider hat mich die Umstellung der Platine von manuellem Schneiden, Fräsen, Bohren und Löten auf ein PCB-Design doppelt so viel Zeit gekostet, als wenn ich sie bereits komplett gebaut hätte. Und ich weiß noch nicht einmal, ob das funktioniert. Aber fangen wir von vorne an.&lt;/p&gt;&#10;&lt;h2 id="anforderungen-an-die-neue-leiterplatte"&gt;Anforderungen an die neue Leiterplatte&lt;/h2&gt;&#10;&lt;p&gt;Die Platine soll enthalten&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;die Vorverstärkerschaltung, wie sie für AnywhereAmps Alpha entworfen wurde&lt;/li&gt;&#10;&lt;li&gt;die Zwei-Wege-Weichenschaltung, wie sie für &lt;em&gt;zukünftige&lt;/em&gt; AnywhereAmps Beta entwickelt wurde&lt;/li&gt;&#10;&lt;li&gt;einen schaltenden Abwärtswandler zur Bereitstellung von 9V DC für Aux-Effekte&lt;/li&gt;&#10;&lt;li&gt;eine Stromüberwachungsschaltung, die sowohl Batterie als auch Platine vor Überlastung, Kurzschluss, Unterspannung und Rückspannung schützt&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Auf diese Weise möchte ich die Elektronik schrittweise professionalisieren. Ich beabsichtige, die gleiche Platine für alle Varianten der AnywhereAmps zu verwenden. Außerdem würde ich einige externe Komponenten loswerden, die ich von Hand herstellen und platzieren musste: Sicherung, hochstromfähiger Netzschalter, 9V-Regler und seine Kühlung, sowie einige Kabel.&lt;/p&gt;&#10;&lt;h2 id="bauteilauswahl"&gt;Bauteilauswahl&lt;/h2&gt;&#10;&lt;h3 id="abwärtswandler"&gt;Abwärtswandler&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-09-21_switching_efficiency.jpg" alt="Image: Typische Wirkungsgradkurve eines Abwärtsschaltwandlers im Vergleich zum Laststrom" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ich habe im Internet nach einem Abwärtsschaltwandler mit geringer elektromagnetischer Interferenz (EMI) und einem Ausgang von &lt;code&gt;&amp;gt;1A&lt;/code&gt; bei &lt;code&gt;9V&lt;/code&gt; gesucht. Ein Linearregler hätte zwar weniger Störungen ausgesendet, aber bei einer Batterie-Nennspannung von &lt;code&gt;18V&lt;/code&gt; hätte ich im schlimmsten Fall um &lt;code&gt;9W&lt;/code&gt; thermische Verluste in Kauf nehmen müssen. Daher wäre diese Lösung überhaupt nicht batterieschonend gewesen. Ich entschied mich für ein (teures) Design, das alle notwendigen Komponenten in einem Baustein enthält, so dass ich nur noch das PCB-Layout richtig hinbekommen musste, um die EMI zu reduzieren. Ich fügte ein paar Bypass-Kondensatoren und einen Spannungsteiler für den Zielspannungs-Sollwert hinzu. Das war&amp;rsquo;s! (Dachte ich damals noch. &lt;a href="https://blog.schallbert.de/pcbs-arrived/#soldering"&gt;So sah es tatsächlich aus&lt;/a&gt;)&lt;/p&gt;&#10;&lt;h3 id="power-supervisor"&gt;Power Supervisor&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-09-21_converter.jpg" alt="Image: Integrierter Abwärtswandler: Fast ein Würfel" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Der einzige Schutz für meine Verstärker war bisher eine Sicherung, deren Wert auf den höchsten Betriebsstrom eingestellt war, den ich in den Schaltkreisen erwartete. In den frühen Prototypenphasen habe ich einige Operationsverstärker durch versehentliche Verpolung zerstört. Außerdem möchte ich vermeiden, dass der Akku völlig entladen wird, wenn ich vergesse, auf die Ladeanzeigen zu achten. Deshalb habe ich einen &lt;a href="https://blog.schallbert.de/configure-max1756x/"&gt;Power Supervisor IC&lt;/a&gt; ausgewählt, der Über- und Unterspannung und weitere Fehler erkennt und sowohl die Schaltkreise als auch den Akku vor Schäden schützt.&lt;/p&gt;&#10;&lt;h3 id="gruppierung-passiver-bauteile"&gt;Gruppierung passiver Bauteile&lt;/h3&gt;&#10;&lt;p&gt;Ich habe gelernt, dass die Herstellung einer Leiterplatte mit vielen verschiedenen Bauteilen teurer und fehleranfälliger ist als bei Verwendung weniger unterschiedlicher Bauteile, auch wenn ihre Gesamtzahl auf diese Weise steigt. Also habe ich viele Werte überarbeitet und die Simulation für den Audio-Vorverstärker mit diesen neuen Werten erneut durchgeführt. Schließlich gelang es mir, die Schaltung von 8/5 auf 3 verschiedene Widerstands- und 3 verschiedene Kondensatorwerte zu reduzieren!&lt;/p&gt;&#10;&lt;h3 id="kondensatoren---mal-wieder"&gt;Kondensatoren - mal wieder&lt;/h3&gt;&#10;&lt;p&gt;Ich habe zunächst MLCC (Multilayer Ceramic Capacitors) in meinem Design verwendet, sowohl für den Bypass als auch für die Audio-Entkopplungskondensatoren. Nach erneuter Lektüre der Dokumente, auf die ich in meinem Beitrag &lt;a href="https://blog.schallbert.de/preamp-design-considerations/"&gt;preamp-design-considerations/&lt;/a&gt; hingewiesen hatte, stellte ich fest, dass dieses Kondensator-Design Probleme mit Verzerrungen bei Audiosignalen zu haben scheint. Das Bild unten zeigt einen Vergleich verschiedener Kondensatortypen und -größen. Man erkennt, dass Folienkondensatoren hier am besten und MLCCs am schlechtesten abschneiden. Da ich keine Folienkondensatoren in der von mir benötigten Größe auf SMD-Basis finden konnte und Aluminium-Elektrolytkondensatoren zu groß waren, habe ich gepolte Tantalkondensatoren gewählt. Für die Bypass-Kondensatoren wählte ich &lt;a href="https://passive-components.eu/why-low-esr-matters-in-capacitor-design/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;low-ESR&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Typen.&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-09-21_capcompare.jpg" alt="Image: capacitor types compared for Audio usage" /&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;TI Audio Design Journal: Vergleich verschiedener Kondensatortypen&lt;/span&gt;&lt;a href="https://www.ti.com/lit/an/slyt796/slyt796.pdf?ts=1630627717321&amp;amp;ref_url=https%253A%252F%252Fwww.startpage.com%252F" class="attr-link" aria-label="Attribution 1"&gt;&#10; &lt;sup class="attr-id"&gt;[1]&lt;/sup&gt;&#10; &lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;&lt;h2 id="schaltungsentwurf"&gt;Schaltungsentwurf&lt;/h2&gt;&#10;&lt;p&gt;Ich wählte die Open-Source-Software &lt;a href="https://www.kicad.org/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;KiCad&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; als Werkzeug zum Schaltungsentwurf und zeichnete alle meine bestehenden Schaltpläne neu, wobei ich die oben beschriebenen Komponenten hinzufügte. Man erkennt gut, dass der Verstärkerteil nur die rechte Hälfte des Schaltplans füllt, während die linke Hälfte der Stromversorgung und der Überwachungsschaltung gewidmet ist.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-09-21_schematics.jpg" alt="Image: AnywhereAmps Power &amp;amp; Preamp-Schaltung mit KiCad" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Ich habe versucht, die Schaltpläne so übersichtlich wie möglich zu gestalten, damit sie leicht zu lesen sind. Ich habe häufig globale Bezeichnungen verwendet und Steckverbinder zur einfacheren Montage hinzugefügt.&lt;/p&gt;&#10;&lt;h2 id="pcb-design"&gt;PCB-Design&lt;/h2&gt;&#10;&lt;p&gt;Dies war der schwierigste Teil für mich. Ich habe noch nie eine Leiterplatte für Audioanwendungen entworfen, also musste ich eine Menge Richtlinien lesen, bevor ich anfing.&lt;/p&gt;&#10;&lt;h3 id="anleitungen-und-tutorials"&gt;Anleitungen und Tutorials&lt;/h3&gt;&#10;&lt;p&gt;Ich liste einige davon unten zur Information auf:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.allaboutcircuits.com/technical-articles/clean-power-for-every-ic-part-1-understanding-bypass-capacitors/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Rauschen auf Leiterplatten und wie man es vermeidet&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.renesas.com/en/document/apn/an1325-choosing-and-using-bypass-capacitors" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Wie man Bypass-Kondensatoren am besten platziert&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.autodesk.com/products/eagle/blog/8-pcb-grounding-rules/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Massefläche oder nicht?&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://electronics.stackexchange.com/questions/52603/how-to-connect-ground-planes-together" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Wie man verschiedene Massen für Signal, Stromversorgung etc. verbindet&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://resources.altium.com/p/top-5-pcb-design-guidelines-every-pcb-designer-needs-know" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Bauteilpositionen für den Lötvorgang optimieren&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.elektronikpraxis.vogel.de/pcb-design-regeln-sieben-suenden-beim-leiterplatten-design-a-356703/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Übliche Probleme beim Platinendesign&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.multi-circuit-boards.eu/leiterplatten-design-hilfe/oberflaeche/leiterbahn-strombelastbarkeit.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Wie viel Strom kann ich über welche Leiterbahn schicken?&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://community.aisler.net/c/knowledge-base/design-rules/41" target="_blank" rel="noopener noreferrer" class="external-link"&gt;PCB Design Tipps für die maschinelle Fertigung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="anywhereamps-pcb-erklärt"&gt;AnywhereAmps PCB erklärt&lt;/h3&gt;&#10;&lt;p&gt;Das Ergebnis nach ein einigen Stunden Arbeit:&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-09-21_pcb.jpg" alt="Image: PCB fully routed on a 2-layer design" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Die Platine ist in zwei Lagen vollständig geroutet.&lt;/p&gt;&#10;&lt;p&gt;Ich habe die Leiterplatte in drei Bereiche unterteilt.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Links: der 9V-Schaltregler, der seinem Referenzdesign (Datenblatt) folgend mit Hilfe der Bypass-Kondensatoren einen Stromkreis um sich selbst bilden und den größten Teil der elektromagnetischen Störaussendung auslöschen würde. Das thermische Design, lässt viel Platz für Kupfer und einige Durchkontaktierungen, sodass die Wärme vom Chip gut abgeführt werden kann.&lt;/li&gt;&#10;&lt;li&gt;Mitte: Die Stromanschlüsse und die Überwachungsschaltung. Ich habe Lötbrücken gesetzt, um die Nennspannung der Batterie für die Unterspannungserkennung auszuwählen.&lt;/li&gt;&#10;&lt;li&gt;Rechts und oben: Vorverstärker und analoge Signalschaltung, getrennt von der übrigen Elektronik durch eine dicke Massebahn auf der oberen Ebene und eine eigene Massefläche auf der Unterseite. Ich hoffe, das ist genug.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Da ich die ersten Prototypen von Hand löten werde, um zu prüfen, ob alles gut funktioniert, habe ich &amp;ldquo;große&amp;rdquo; 0805 SMD-Bauteile verwendet. Ich habe den Abstand zwischen den Bauteilen größer gemacht, als es die PCB-Spezifikation verlangt. Leider waren die hochintegrierten Leistungs-ICs nicht in &amp;ldquo;Hobby-Löt-Elektronik&amp;rdquo;-Größen erhältlich, so dass ich hier noch einige Mühen auf mich nehmen muss.&lt;/p&gt;&#10;&lt;p&gt;So wird es also aussehen. Die Leiterplatte wird 45mm x 69mm groß sein.&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2021-09-21_pcb3d.jpg" alt="Image: 3D-Ansicht der Leiterplatte" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;&lt;h2 id="herunterladen-oder-eigene-beiträge-erwünscht"&gt;Herunterladen oder eigene Beiträge erwünscht?&lt;/h2&gt;&#10;&lt;p&gt;Alle meine Zeichnungen in CAD sowie Stromlaufpläne sind quelloffen und zum Download auf meinem eigens dafür angelegten &lt;a href="https://github.com/Schallbert/AnywhereAmps/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Github Repo&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; verfügbar.&lt;/p&gt;&#10;&lt;p&gt;Nächste Schritte: &lt;a href="https://blog.schallbert.de/pcbs-arrived/"&gt;Platinen geliefert und verlötet&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Vorverstärker-Design</title><link>https://blog.schallbert.de/preamp-design-considerations/</link><pubDate>Wed, 25 Aug 2021 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/preamp-design-considerations/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/circuit_board_soldered-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Preamp prototype board soldered and working"&#10; title="Vorverstärker-Design" /&gt;&#10;&lt;h2 id="auswahl-der-entkopplungskondensatoren"&gt;Auswahl der Entkopplungskondensatoren&lt;/h2&gt;&#10;&lt;p&gt;Einige technische Hintergrundinformationen über die Auswahl der Komponenten für meine Vorverstärkerplatine.&lt;/p&gt;&#10;&lt;h3 id="warum-entkopplung-nötig-ist"&gt;Warum Entkopplung nötig ist&lt;/h3&gt;&#10;&lt;p&gt;Mit Entkopplung meine ich in diesem Fall speziell die Gleichstromentkopplung (DC-Entkopplung).&#10;Der Vorverstärker muss sowohl von der Quelle (dem Musikinstrument) als auch von der Senke (dem Endverstärker) entkoppelt werden.&#10;Dies hat mehrere Gründe:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;die Versorgungsspannungen der drei Partner können unterschiedlich sein (z.B. 9V Gitarrenspeisung, 18V Vorverstärker, 52V Endstufe) und ich möchte nicht versehentlich einen von ihnen kurzschließen&lt;/li&gt;&#10;&lt;li&gt;Ausgangsimpedanz, d.h. die Belastbarkeit der Ausgangsstufe könnte begrenzt sein. Wenn ich einen niedrigen Eingangswiderstand z.B. direkt an den Tonabnehmer einer Gitarre anschließe, kann es sein, dass ich überhaupt kein Signal herausbekomme, weil die Quellenspannung zu stark einbricht.&lt;/li&gt;&#10;&lt;li&gt;Rauschunterdrückung durch elektrische Entkopplung&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="warum-kondensatoren-die-aufgabe-übernehmen-können"&gt;Warum Kondensatoren die Aufgabe übernehmen können&lt;/h3&gt;&#10;&lt;p&gt;Es gibt mehrere Möglichkeiten, Schaltungen elektrisch zu entkoppeln. Man kann einen &lt;a href="https://en.wikipedia.org/wiki/Opto-isolator" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Optokoppler&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; verwenden, um zwei Schaltkreise vollständig (d.h. galvanisch) voneinander zu trennen. Damit wird nur das erwünschte Signal zwischen den Schaltkreisen durchgelassen. Oder man verwendet - wie in meinem Fall - einen Kondensator, um nur Wechselströme durchzulassen und Gleichstrom zu unterdrücken.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Wie funktioniert das?&lt;/em&gt;, fragen Sie?&#10;Nun, ein Kondensator funktioniert ein bisschen wie ein Wassertank. Wenn man eine konstante Spannung (Druck) anlegt, füllt sich der Tank bis zu einem gewissen Grad. Wenn dieser Pegel erreicht ist, fließt kein Volumenstrom mehr, weder rein noch raus. Variiert man nun aber die Spannung um einen statischen Pegel (Wasserdruckschwankung), so wird man wieder einen Volumenstrom messen, der in den Tank hinein- und herausfließt.&lt;/p&gt;&#10;&lt;p&gt;Genauso verhält es sich mit dem Kondensator. Wenn man ihn in Reihe mit einer Senke schaltet, wird er nur dann Strom durchlassen, wenn sich der die Eingangsspannung ändert.&lt;/p&gt;&#10;&lt;h2 id="typ-des-entkopplungskondensators"&gt;Typ des Entkopplungskondensators&lt;/h2&gt;&#10;&lt;p&gt;Keramik-Vielschichtkondensator, Polypropylen-Kondensator, Elektrolytkondensator&amp;hellip;? Nach Lektüre &lt;a href="https://www.ti.com/lit/an/slyt796/slyt796.pdf?ts=1630627717321&amp;amp;ref_url=https%253A%252F%252Fwww.startpage.com%252F" target="_blank" rel="noopener noreferrer" class="external-link"&gt;dieses Leitfadens&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; von Texas Instruments habe ich verstanden, dass es in diesem Dokument nur um Verzerrungen geht. Die Verzerrung würde am stärksten am Instrumenteneingang vor dem Vorverstärker Einfluss ausüben, da dieser von beiden Verstärkerstufen verstärkt wird. Bei der Verwendung eines Elektrolytkondensators sollte eine Vorspannung angelegt werden, um die Verzerrung im unteren Frequenzbereich zu verringern. Bei meinem Design ist die Vorspannung &lt;code&gt;1/2&lt;/code&gt; von &lt;code&gt;VCC&lt;/code&gt;, also noch höher als die in der Anleitung verwendeten &lt;code&gt;5V&lt;/code&gt; - ich denke, ich werde mit einem &amp;ldquo;billigen&amp;rdquo; polarisierten Aluminiumkondensator auskommen um die Verzerrungen &lt;a href="https://en.wikipedia.org/wiki/Total_harmonic_distortion" target="_blank" rel="noopener noreferrer" class="external-link"&gt;THD+n&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; gering zu halten.&lt;/p&gt;&#10;&lt;p&gt;Es gibt noch eine andere Sache, die ich bei Mehrschicht-Keramikkondensatoren (MLCCs) festgestellt habe: Wenn die Lautsprecher bei hoher Vorverstärkung nicht angeschlossen sind, spielen die von mir verwendeten Endstufen immer noch Musik! Wie kommt das? Die Endstufenplatine verwendet MLCCs, die wie Piezoaktoren wirken. Ihre Vibration wird durch die Platine, auf der sie montiert sind, verstärkt, was einen gewissen Schallpegel ergibt. Verrückt. Weitere interessante Details finden Sie im &lt;a href="https://www.edn.com/power-tip-49-avoid-these-common-mlcc-pitfalls/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;EDN-Blog&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; oder - in einem weiteren &lt;a href="https://e2e.ti.com/blogs_/b/powerhouse/posts/how-to-reduce-acoustic-noise-of-mlccs-in-power-applications" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Texas Instruments-Leitfaden&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="kondensatorgröße"&gt;Kondensatorgröße&lt;/h3&gt;&#10;&lt;p&gt;Um die Größe des Kondensators zu beurteilen sind einige Aspekte zu berücksichtigen:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Ein größerer Kondensator senkt meine untere Grenzfrequenz&lt;/li&gt;&#10;&lt;li&gt;Ein größerer Kondensator belastet die Eingangsquelle aufgrund von Ladungsverlusten stärker&lt;/li&gt;&#10;&lt;li&gt;Ein größerer Kondensator kostet mehr, insbesondere die hochwertigen Kondensatoren.&lt;/li&gt;&#10;&lt;li&gt;Ein größerer Kondensator kann einen größeren Platzbedarf haben.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Ich wollte eine untere Grenzfrequenz von &lt;code&gt;&amp;lt;20Hz&lt;/code&gt; für volle HiFi-Fähigkeit. Da dies bereits der &lt;code&gt;-3dB&lt;/code&gt;-Punkt ist, wählte ich einen noch niedrigeren Wert von &lt;code&gt;15Hz&lt;/code&gt;, berechnet über \(f=\frac{1}{2 \pi RC}\). Bei einer Eingangsimpedanz von &lt;code&gt;10kOhm&lt;/code&gt; (der Wert des Widerstandes, der an die virtuelle Masse geklemmt wird) ergebe ich eine Zielgröße des Eingangskondensators von &lt;code&gt;1µF&lt;/code&gt;.&#10;Bei diesem Kondensator wird die Eingangsquelle wesentlich stärker durch den Eingangswiderstand von &lt;code&gt;10kOhm&lt;/code&gt; beeinflusst als durch den Kondensator mit seinem niedrigen Serienwiderstand (&lt;a href="https://passive-components.eu/why-low-esr-matters-in-capacitor-design/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;ESR&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;) von einigen hundert &lt;code&gt;mOhm&lt;/code&gt;, so dass der gewählte Wert in Ordnung ist.&lt;/p&gt;&#10;&lt;p&gt;Für den Ausgangskondensator ist die Berechnung ähnlich. Die Endstufe hat eine Eingangsimpedanz von &lt;code&gt;20kOhm&lt;/code&gt;, so dass die untere Grenzfrequenz von &lt;code&gt;17Hz&lt;/code&gt; bereits mit einem &lt;code&gt;0.47uF&lt;/code&gt; Kondensator erreicht wird. Um die Wertunterschiede in Grenzen zu halten, habe ich mich auch hier für den &lt;code&gt;1µF&lt;/code&gt; entschieden.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.schallbert.de/projects/aa_alpha/"&gt;Zurück zur Projekt-Hauptseite&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>🎄 Steckbrett-Lagerfeuer</title><link>https://blog.schallbert.de/projects/fireplace/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/projects/fireplace/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/fireplace/fireplace-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: LED-Fireplace, Arduino-controlled"&#10; title="🎄 Steckbrett-Lagerfeuer" /&gt;&#10;&lt;h2 id="projekt-steckbrief"&gt;Projekt-Steckbrief&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Schwierigkeit: Anfänger 1/5&lt;/li&gt;&#10;&lt;li&gt;Kosten: 8&amp;hellip;25€&lt;/li&gt;&#10;&lt;li&gt;Zeit ~1h&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="überblick"&gt;Überblick&lt;/h2&gt;&#10;&lt;p&gt;Dies ist ein schnelles und einfaches Projekt, das zeigt, wie man mit einem Microcontrollerboard und einigen LEDs eine warme und gemütliche Wohnzimmeratmosphäre schaffen kann. An eine Powerbank angeschlossen, wird diese kleine Bastelei den ganzen Abend leuchten und eine warme und gemütliche Atmosphäre schaffen. Ich habe Teile der Idee für dieses Projekt dem Buch &amp;ldquo;Tiny AVR for the evil Genius&amp;rdquo; entliehen, in dem ich viel gelesen habe, als ich vor Jahren mit dem Entwurf eingebetteter Software in &lt;code&gt;C&lt;/code&gt; begann.&lt;/p&gt;&#10;&lt;p&gt;Die Projektkosten hängen von den gewählten Komponenten ab. Wenn ein original Arduino verwendet wird, liegen sie am oberen Ende des Bereichs. So kann man den hart arbeitenden Entwicklern und Ingenieuren von &lt;a href="https://www.arduino.cc/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Arduino&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Anerkennung zollen, die Open-Source-Lösungen für uns alle schaffen 🥳.&lt;/p&gt;&#10;&lt;h2 id="die-hardware"&gt;Die Hardware&lt;/h2&gt;&#10;&lt;p&gt;Natürlich kann man jedes Mikrocontroller-Board verwenden, das mindestens 8 digitale Ausgänge und 1 analogen Eingang unterstützt. In meinem Beispiel verwende ich ein &lt;a href="https://www.arduino.cc/hardware#nano-family" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Arduino Nano&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; (Nachbau), das ich irgendwo herumfliegen hatte. Zeit für ein Upgrade auf das &amp;ldquo;Original&amp;rdquo;&amp;hellip;&#10;Des Weiteren benötigt man ein Steckbrett, ein paar Drähte und acht LEDs. Ich empfehle, 5 warmweiße LEDs, 2 gelbe LEDs und 1 rote LED mit ähnlicher Helligkeit (Lumenzahl) zu verwenden, um Farben zu erhalten, die einem echten Feuer ähnlich sind.&lt;/p&gt;&#10;&lt;h2 id="die-software"&gt;Die Software&lt;/h2&gt;&#10;&lt;p&gt;Die Software erzeugt einen flackernden Lichteffekt mit unterschiedlicher Geschwindigkeit.&lt;/p&gt;&#10;&lt;h3 id="einrichtung"&gt;Einrichtung&lt;/h3&gt;&#10;&lt;p&gt;Beim Start definiere ich in &lt;code&gt;setup()&lt;/code&gt; die Pins, an die die LEDs angeschlossen sind, als Ausgänge.&#10;Ich lasse einen offenen Analog-Pin einmal auslesen und nehme dessen (undefinierten) Wert als Seed für den später besprochenen Pseudo-Zufallszahlengenerator.&lt;/p&gt;&#10;&lt;h3 id="schleife"&gt;Schleife&lt;/h3&gt;&#10;&lt;p&gt;In der Endlosschleife berechnet das Programm eine neue Zufallszahl und übergibt diese dann an die nachgeschalteten Funktionen. Hier erzeugt ein Zufallszahlengenerator einen Wert, der dann verwendet wird, um&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;zu bestimmen, welche der acht LEDs leuchten soll&lt;/li&gt;&#10;&lt;li&gt;die Zeit festzulegen, für die dieser LED-Status beibehalten werden soll.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Schließlich werden die LEDs entsprechend gesetzt und die Schleife wiederholt sich am Anfang.&lt;/p&gt;&#10;&lt;h3 id="linear-rückgekoppeltes-schieberegister"&gt;Linear rückgekoppeltes Schieberegister&lt;/h3&gt;&#10;&lt;p&gt;Der Zufallszahlengenerator ist als sogenanntes &lt;a href="https://en.wikipedia.org/wiki/Linear-feedback_shift_register" target="_blank" rel="noopener noreferrer" class="external-link"&gt;linear feedback shift register (LSFR)&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; mit einer Länge von 32bit implementiert (wiederholt sein Muster nach max. 2^32 Schritten). Diese Implementierung verwendet den &amp;ldquo;Galois-Typ&amp;rdquo; von LFSRs.&lt;/p&gt;&#10;&lt;h3 id="galois-lfsr-implementierung"&gt;Galois LFSR Implementierung&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;loop&lt;/span&gt;() &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; iRandNum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (iRandNum &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;^&lt;/span&gt; (&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(iRandNum &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1u&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0xd0000001u&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [...]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In dieser Codezeile passiert eine Menge, also schauen wir sie uns mal genauer an.&lt;/p&gt;&#10;&lt;p&gt;Wesentlich für diese Art von Zufallszahlengeneratoren ist die &lt;a href="https://en.wikipedia.org/wiki/XOR_gate" target="_blank" rel="noopener noreferrer" class="external-link"&gt;&lt;code&gt;XOR&lt;/code&gt;-Operation&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, die durch ein &lt;code&gt;^&lt;/code&gt; in der Mitte der Codezeile angezeigt wird. XOR&amp;quot; bedeutet &amp;ldquo;eXclusive OR&amp;rdquo;, das nur dann eine logische 1 ausgibt, wenn die logischen Eingänge A und B &lt;em&gt;unterschiedlich&lt;/em&gt; sind. Wenn &amp;ldquo;A&amp;rdquo; und &amp;ldquo;B&amp;rdquo; beide &amp;ldquo;0&amp;rdquo; oder beide &amp;ldquo;1&amp;rdquo; sind, wird dieses Gatter &amp;ldquo;0&amp;rdquo; ausgeben.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Beispiel für binäres XOR:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; A B Ergebnis&#10;0b00001111 ^ 0b00110011 = 00111100&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Links vom &lt;code&gt;XOR&lt;/code&gt;-Operator wird die aktuelle Zufallszahl um &lt;code&gt;1&lt;/code&gt; nach rechts verschoben (&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;). Dabei wird ihr gesamter Inhalt wird um ein Bit geschoben. In numerischer Hinsicht bedeutet dies, dass der Wert ganzzahlig durch zwei dividiert wird.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Beispiel für binäres SHIFT:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; A B Ergebnis Als Zahl:&#10;0b00001111 &amp;gt;&amp;gt; 1 = 0b00000111 15 &amp;gt;&amp;gt; 1 = 7&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OK, analysieren wir die obige Zeile Code weiter.&#10;Direkt neben dem &lt;code&gt;XOR&lt;/code&gt;-Operator findet eine weitere Operation statt: Ein logisches &lt;code&gt;AND&lt;/code&gt; (&lt;code&gt;&amp;amp;&lt;/code&gt;) zwischen unserer aktuellen Zufallszahl und &lt;code&gt;1u&lt;/code&gt;, was &amp;ldquo;unsigned 1&amp;rdquo; bedeutet. Dabei werden alle höheren Bits des Zufallszahlengenerators maskiert. Das Ergebnis dieser Aktion ist eine einfache &amp;ldquo;0&amp;rdquo;, wenn die Zahl eine &amp;ldquo;0&amp;rdquo; als niedrigstwertiges Bit hat usw.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Beispiel für binäres UND:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; A B Ergebnis &#10;0b00001111 &amp;amp; 1 = 0b00000001&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Negation am Anfang dieses Terms bedeutet, dass, wenn das Ergebnis des vorherigen &lt;code&gt;&amp;amp;&lt;/code&gt; &lt;code&gt;0&lt;/code&gt; war, der gesamte Term wieder &lt;code&gt;0b00000000...&lt;/code&gt; sein wird. Wenn das Ergebnis &lt;code&gt;-1&lt;/code&gt; lautet, sieht der 2er-Komplement-Binärcode stattdessen wie folgt aus: &lt;code&gt;0b1111111...&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Dies ist eine einfache Möglichkeit, einen einzelnen booleschen Wert auf einen beliebigen längeren Datentyp anzuwenden, ohne eine Verzweigungslogik wie bei einer &lt;code&gt;if()&lt;/code&gt;-Klausel zu verwenden.&lt;/p&gt;&#10;&lt;p&gt;Und schließlich gibt es ein weiteres logisches &lt;code&gt;AND&lt;/code&gt; zwischen diesem Begriff und einer festen Bitmaske &lt;code&gt;0xd0000001u&lt;/code&gt;. Letztere sind die &amp;ldquo;Anzapfungen&amp;rdquo; des LFSR, d.h. welche Bits des aktuellen Wertes in das System zurückgeführt werden. Die Aufschlüsselung dieses Hex-Wertes in Boolesche Werte zeigt: 0xd = 0b1101&amp;quot;, d.h. die Bits 32, 31, 29 und 1 werden mit der aktuellen Zufallszahl maskiert, so dass nur ihre Werte unberührt bleiben, während alle anderen auf &amp;ldquo;0&amp;rdquo; gesetzt werden.&lt;/p&gt;&#10;&lt;h3 id="galois-lfsr-zusammenfassung"&gt;Galois LFSR Zusammenfassung&lt;/h3&gt;&#10;&lt;p&gt;Puh, das war eine Menge. Es ist Zeit für ein paar Minuten Pause.&lt;/p&gt;&#10;&lt;p&gt;Gut, fassen wir die Codezeile oben nochmal zusammen:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iRandNum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (iRandNum &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;^&lt;/span&gt; (&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(iRandNum &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1u&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0xd0000001u&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Bedeutung: &amp;ldquo;Wenn das niedrigstwertige Bit der aktuellen Zufallszahl Null ist, dann verschiebe die Zufallszahl einfach nach rechts. Andernfalls XOR anwenden mit den abgegriffenen Bits der aktuellen Zufallszahl.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;LFSRs sind weit verbreitet in der &lt;a href="https://courses.cs.washington.edu/courses/cse466/12au/calendar/06-Modulation-posted.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;drahtlosen Kommunikationstechnik&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, sie sind interessant für &lt;a href="https://stackoverflow.com/questions/25415724/understanding-two-different-ways-of-implementing-crc-generation-with-lfsr" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Prüfsummenberechnungen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, [Kryptographen](https://medium. com/@czapfel/an-introduction-to-lfsrs-for-cryptography-bf2602640e91) und können sogar bei &lt;a href="https://evoniuk.github.io/posts/pitfall.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Programmierspielen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; nützlich sein, z.B. bei der Erstellung prozeduraler Karten. LFSRs sind einfach zu implementieren (wie man oben sieht, benötigen sie im Extremfall sogar nur eine einzige Codezeile!) und verbrauchen nicht viele Ressourcen. Hier ist ein hervorragender &lt;a href="https://datagenetics.com/blog/november12017/index.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Blogpost&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, der sich eingehend mit LFSRs beschäftigt, wenn Sie eher der visuelle Typ sind (und weniger der logische).&#10;Nachteilig ist, dass ihre &amp;ldquo;Zufallsqualität&amp;rdquo; schlecht ist, weil sie deterministisch sind.&lt;/p&gt;&#10;&lt;p&gt;Alles in allem fand ich das Thema so interessant, dass ich mich entschlossen habe, hier einen LFSR manuell zu implementieren, anstatt die Arduino-Funktion &lt;code&gt;random()&lt;/code&gt; zu verwenden.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://www.c64-wiki.de/images/9/9d/Pitfall_Animation2.gif" alt="Gif: Pitfall! Game scene" /&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Pitfall! Spielszene: prozedurales Leveldesign mittels LFSR&lt;/span&gt;&lt;a href="https://www.c64-wiki.de/wiki/Datei:Pitfall_Animation2.gif#file" class="attr-link" aria-label="Attribution 1"&gt;&#10; &lt;sup class="attr-id"&gt;[1]&lt;/sup&gt;&#10; &lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="ein-problem-bleibt"&gt;Ein Problem bleibt&lt;/h3&gt;&#10;&lt;p&gt;Nun, wenn Sie die Codezeile vollständig verstanden haben, sehen Sie, was passiert, wenn die Zufallszahl nur Nullen enthält.&lt;/p&gt;&#10;&lt;p&gt;Er wird nie wieder aus diesem Zustand herauskommen 💀.&lt;/p&gt;&#10;&lt;p&gt;Deshalb sollte man diese Art von LFSR niemals mit &amp;ldquo;0&amp;rdquo; initialisieren.&lt;/p&gt;&#10;&lt;h3 id="ansteuerung-der-leds"&gt;Ansteuerung der LEDs&lt;/h3&gt;&#10;&lt;p&gt;Der Rest der Software hat viel mehr Zeilen, macht aber auch viel mehr langweilige Sachen. Sie nimmt den generierten 32-Bit-Zufallswert und lässt ihn an den 8 LED-Ausgängen vorbeilaufen, d.h. jede LED &amp;ldquo;sieht&amp;rdquo; jedes Bit des Wertes. Zwischen jeder dieser Iterationen wird eine zufällige Verzögerung verwendet, so dass die Flackergeschwindigkeit auf eine Änderungsrate begrenzt ist, die wir Menschen noch wahrnehmen können.&lt;/p&gt;&#10;&lt;h2 id="die-hardware-1"&gt;Die Hardware&lt;/h2&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/fireplace/fireplace_detail.jpg" alt="Image: fireplace breadboard design detail view" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Zum Glück ist die Hardware einfacher zu erklären als die Software:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Ein Arduino Nano-Board ist mit einem Prototyping-Board verbunden.&lt;/li&gt;&#10;&lt;li&gt;Anoden der acht LEDs &lt;code&gt;(+)&lt;/code&gt; sind mit den digitalen Ausgängen &lt;code&gt;D2...D9&lt;/code&gt; verbunden.&lt;/li&gt;&#10;&lt;li&gt;Ihre Kathoden werden mit Jumpern gebrückt und mit dem &amp;ldquo;GND&amp;rdquo; des Arduino verbunden.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Dies ist die einfachste Konstruktion, die mir für diese Aufgabe einfiel.&lt;/p&gt;&#10;&lt;h2 id="verbesserungen"&gt;Verbesserungen&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Jede LED sollte einen Vorwiderstand bekommen.&#10;&lt;ul&gt;&#10;&lt;li&gt;In meinem Design ist der Strom nur durch den maximalen Strom begrenzt, den der Arduino Pin treiben kann.&lt;/li&gt;&#10;&lt;li&gt;Entweder kann die LED deutlich mehr als &lt;code&gt;40mA&lt;/code&gt; Spitzenstrom verkraften oder sie wird unweigerlich irgendwann durchbrennen.&lt;/li&gt;&#10;&lt;li&gt;Bei der Berechnung des Widerstands sollte man sich an das Datenblatt der LED halten, da verschiedene LED-Farben unterschiedliche Spannungen haben.&lt;/li&gt;&#10;&lt;li&gt;Beispiel für eine Widerstandsberechnung bei einer Versorgungsspannung von &lt;code&gt;5V&lt;/code&gt; für eine Warmweiße LED: &lt;code&gt;20mA @ 3.1V --&amp;gt; R = U/I = (Usup-Uled) / I = 1.9 / 0.02 = 95Ohm&lt;/code&gt;. Nächster Widerstand aus der E6-Reihe &lt;code&gt;100Ohm&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Jede LED könnte einen Parallelkondensator erhalten.&#10;&lt;ul&gt;&#10;&lt;li&gt;Dies würde den Flackereffekt glätten.&lt;/li&gt;&#10;&lt;li&gt;Man könnte Videos aufnehmen, in denen die Kamera nicht durch das Flackern der LEDs gestört wird. Das wäre doch schön.&lt;/li&gt;&#10;&lt;li&gt;Beispiel Kondensatorberechnung: Durchschnittlicher Strom im ausgeschalteten Zustand &lt;code&gt;20mA&lt;/code&gt;, erlaubter Spannungsabfall &lt;code&gt;0.6V&lt;/code&gt; innerhalb von &lt;code&gt;1ms&lt;/code&gt;. Vorgeschlagene Kapazität ist dann &lt;code&gt;20mA * 1ms / 0.6V = 33uF&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="zeit-für-eine-diy-replik"&gt;Zeit für eine DIY-Replik?&lt;/h2&gt;&#10;&lt;p&gt;Bitteschön!&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.schallbert.de/led-fireplace-diy/"&gt;Steckbrett-Lagerfeuer DIY Anleitung&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>1 Jahr CNC 🎂</title><link>https://blog.schallbert.de/projects/one-year-zerspanobert/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/projects/one-year-zerspanobert/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/machine-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Zerspanobert CNC machine"&#10; title="1 Jahr CNC 🎂" /&gt;&#10;&lt;h2 id="ein-jahr--meine-portalfräsmaschine"&gt;Ein Jahr &lt;a href="https://blog.schallbert.de/portal-milling-build/"&gt;&amp;lsquo;Zerspanobert&amp;rsquo;&lt;/a&gt;, meine Portalfräsmaschine&lt;/h2&gt;&#10;&lt;p&gt;Wir schreiben März 2023. Meine CNC-Maschine ist seit einem Jahr in Betrieb. Es war ein gutes Jahr. Ich habe eine Menge gelernt und hatte viel Spaß beim Schreiben von Artikeln über meine Fortschritte. Natürlich konnte ich nicht jedes Projekt das ich in dieser Zeit durchgeführt habe dokumentieren bloggen, dennoch soll dieser Artikel das Jahr ein wenig Revue passieren lassen&lt;/p&gt;&#10;&lt;h3 id="die-maschine"&gt;Die Maschine&lt;/h3&gt;&#10;&lt;p&gt;Ich kann inzwischen sagen, dass ich die richtige Maschine für meinen Bedarf ausgewählt habe. Es handelt sich um die zweitgünstigste Maschine von Sorotec. Sie bietet viele Eigenschaften &amp;ldquo;gehobenerer&amp;rdquo; Portalfräsmaschinen, wie z.B. Kugelumlaufspindeln, &lt;code&gt;3Nm&lt;/code&gt; Stepper, &lt;code&gt;48V&lt;/code&gt; Kleinspannungsschiene, vorgespannte Linearführungen. Um den Preis moderat zu halten, wurde allerdings auf andere Dinge verzichtet. So besitzt sie weder Riemenantriebe für die Schrittmotoren um Platz zu sparen noch doppelte Linearführungen an der Z-Achse oder zusätzliche Versteifungen für Portal, Z-Achse und Hauptrahmen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/z_axis.jpg" alt="Bild: Detailansicht Z-Achse" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Deshalb muss man wissen, welche Lasten grenzwertig sind und sich etwas zurückhalten. Aber das gilt wahrscheinlich auch für steifere Maschinen - sie heben nur die Grenzen an. Was bei meiner Einstellung schnellere Vorschübe oder höhere Schnitttiefen verhindert, ist der Oberfräsenmotor und die Art und Weise, wie er an der Z-Achse befestigt ist.&lt;/p&gt;&#10;&lt;p&gt;Der Motor ist eindeutig überfordert mit&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Birke Multiplex, Vollnutenfräsen, 6mm Fräser 2-schneidig, &lt;code&gt;S24000&lt;/code&gt;, &lt;code&gt;Z+12mm&lt;/code&gt;, &lt;code&gt;F4000&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;HPL, Vollnutenfräsen, 6mm Fräser 2-Schneide, &lt;code&gt;S24000&lt;/code&gt;, &lt;code&gt;Z+6.5mm&lt;/code&gt;, &lt;code&gt;F3500&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Aluminium AlMg1, Vollnutenfräsen, 6mm Fräser einschneidig, &lt;code&gt;S24000&lt;/code&gt;, &lt;code&gt;Z+3mm&lt;/code&gt;, &lt;code&gt;F1600&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Wenn jedoch Schnitttiefe und/oder den Vorschub reduziert wird, kann die Maschine die Arbeit sehr gut ausführen.&#10;Die Genauigkeit der Maschine ist ziemlich gut; die wirklich begrenzenden Faktoren sind hier die manuelle Bestimmung des Werkstücknullpunkts sowie der Werkzeuglängensensor aber nicht die Maschine selbst.&lt;/p&gt;&#10;&lt;p&gt;Der Vakuumtisch eröffnete die Welt der feinen Gravuren mit Graviersticheln und V-Fräsern. Das Problem war vorher, dass die Verformung des Werkstücks und Ungenauigkeiten des Arbeitstisches dazu führten, dass die Gravuren von sehr unterschiedlicher Qualität waren und größere Toleranzen in der Breite aufwiesen, als ich erwartet hatte. Diese Probleme gibt es jetzt nicht mehr, ebenso wenig wie die zusätzliche Arbeit, Vorrichtungen für kleine oder sperrige Werkstücke herzustellen. Das Halten und Spannen wurde um ein Vielfaches einfacher. Außerdem konnte ich die Z-Sicherheitshöhe reduzieren, was Fräsarbeiten um bis zu 20 % beschleunigte.&lt;/p&gt;&#10;&lt;p&gt;Ich konzentrierte mich darauf, die Bearbeitungszeit so weit wie möglich zu reduzieren, damit ich nicht mehr Zeit als nötig mit der Überwachung der Maschine in der kalten Werkstatt verbringen musste. Deshalb habe ich die Maschine und die Fräser absichtlich an ihre Grenzen gebracht was Eilganggeschwindigkeit, Vorschub und Schnitttiefe angeht. Als ich diese Grenzen herausgefunden hatte, drosselte ich die Parameter um 20-30 %, um auf Nummer sicher zu gehen und die Wiederholgenauigkeit hoch zu halten.&lt;/p&gt;&#10;&lt;h3 id="upgrades"&gt;Upgrades&lt;/h3&gt;&#10;&lt;p&gt;Ich habe die Maschine mit einem &lt;a href="https://blog.schallbert.de/why-vacuum-table/"&gt;Vakuumtisch&lt;/a&gt; aufgerüstet und konnte viel über Haltekräfte und Volumenstrom lernen, was zü meinem Artikel zur &lt;a href="https://blog.schallbert.de/cnc-vacuum-pumps/"&gt;Auswahl der geeigneten Vakuumlösung&lt;/a&gt; führte. Ich habe Schwerschaummatten zur Vibrations- und Schalldämmung installiert. Man kann sie im Bild unten etwas schlecht erkennen, aber der gesamte Arbeittisch ist mit Dämmmatten unterfüttert.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/accessories.jpg" alt="Image: Accessories and machine controller" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Außerdem habe ich eine Absauganlage mit Zyklonabscheider installiert, die während des Fräsvorganges läuft. Die Menge an Spänen, die die Fräse produziert ist wirklich erstaunlich und so bin ich froh, dass ich die Anlage bereits seit Beginn meiner Arbeiten zur Verfügung habe.&lt;/p&gt;&#10;&lt;p&gt;Bald werde ich eine HF-Spindel statt meinem Oberfräsmotor einbauen und so Vibrationen, Toleranzen und Geräuschpegel weiter verringern. Letztendlich sollte ich damit die Vorschubwerte erreichen, die ich oben angegeben habe.&lt;/p&gt;&#10;&lt;h3 id="materialien"&gt;Materialien&lt;/h3&gt;&#10;&lt;p&gt;Ich habe mit Hartholz, &lt;a href="https://blog.schallbert.de/negative-carving-with-estlcam/#engrave"&gt;Multiplex&lt;/a&gt;, &lt;a href="https://blog.schallbert.de/projects/cnc_spoilboard/"&gt;MDF&lt;/a&gt;, Acrylglas (PMMA), &lt;a href="https://hobbyline.info/forum/index.php?thread/717-hobbyglas-polystyrol-fr%C3%A4sen/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Polystyrol&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, &lt;a href="https://blog.schallbert.de/cnc-router-overload/"&gt;Hochdrucklaminaten (HPL)&lt;/a&gt; und &lt;a href="https://blog.schallbert.de/cut-dibond/"&gt;Aluminium-Komposit&lt;/a&gt; gearbeitet.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/materials.jpg" alt="Image: Material samples that I worked with" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Bei all diesen Werkstoffen musste ich lernen, wie sich die Materialien verhalten und mit welchen Parametern die Fräser betrieben werden müssen, um qualitativ hochwertige Ergebnisse zu erzielen. Einige Materialien waren so anspruchsvoll, dass meine Maschine überlastet war, bei anderen hatte ich &lt;a href="https://blog.schallbert.de/cnc-vibrates/"&gt;Vibrationsprobleme&lt;/a&gt; oder Probleme, &lt;a href="https://blog.schallbert.de/cut-dibond-tests/"&gt;die gewünschte Qualität zu erreichen&lt;/a&gt;. Aber ich konnte immer aus Fehlschlägen lernen und meine Abläufe verbessern, um sie in Zukunft zu vermeiden.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/pmma.jpg" alt="Bild: Acryl-Absaugschlauchhalter" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Das Bild oben zeigt eine Absaugschlauchklemme aus PMMA (Acrylglas), die ich an der Z-Achse meiner CNC angebracht habe. Ich habe recht lange dafür gebraucht, die minimalen Fasen genau richtig hinzubekommen und Schlichtvorgänge angewendet, wo ich glaubte, dass sie eine bessere Oberflächengüte bieten könnten.&lt;/p&gt;&#10;&lt;h3 id="software"&gt;Software&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://blog.schallbert.de/assets/images/qr-codengrave/app-thumb.jpg"&gt;Bild: Hauptbildschirm der Qr-codengrave-App&lt;/a&gt;{: .align-right}&#10;Ich habe die &lt;a href="https://blog.schallbert.de/macros-for-cnc/"&gt;Makros&lt;/a&gt; der Maschine sowie &lt;a href="https://blog.schallbert.de/portal-milling-setup/"&gt;die Kinematikparameter&lt;/a&gt; optimiert, und sogar eine vollständige Anwendung, mit der die CNC &lt;a href="https://blog.schallbert.de/projects/qr-codengrave/"&gt;QR-Codes&lt;/a&gt; in praktisch jedes Plattenmaterial gravieren kann, programmiert. Diese QR-Codes werden von Handykameras bestens erkannt.&lt;/p&gt;&#10;&lt;p&gt;Als meine Gravurprojekte immer komplexer wurden, stürzte mein CAM-System bei der Berechnung der Pfade für die Bearbeitung mehrerer Exemplare ständig ab. Daher musste ich die Aneinanderreihung manuell durchführen, was mich dazu brachte, mich mit Koordinatenverschiebungsbefehlen wie &lt;code&gt;G54...G59.3&lt;/code&gt;, &lt;code&gt;G68&lt;/code&gt; und &lt;code&gt;G92&lt;/code&gt; zu beschäftigen, die, wenn sie nicht richtig verstanden werden, die Werkstücke arg in Mitleidenschaft ziehen.&#10;Dies half mir, die numerische Steuerung und ihre Interpretersprache besser zu verstehen.&lt;/p&gt;&#10;&lt;p&gt;Nicht zuletzt war die Lernkurve, die ich durch die Arbeit mit &lt;a href="https://blog.schallbert.de/freecad-get-started/"&gt;FreeCAD&lt;/a&gt; und &lt;a href="https://blog.schallbert.de/negative-carving-with-estlcam/"&gt;Estlcam&lt;/a&gt; durchlaufen musste, ziemlich steil. Aber da musste ich durch, sonst hätte ich meine Teile nicht fertigen können.&lt;/p&gt;&#10;&lt;h3 id="hilfe-und-unterstützung"&gt;Hilfe und Unterstützung&lt;/h3&gt;&#10;&lt;p&gt;Zum Glück hatte ich immer Leute, die mir helfen wollten und konnten. Meine Frau war immer für mich da und erlaubte mir, mir Zeit dafür zu nehmen, und meine Kinder besuchten mich häufig im Keller, so dass ich nie einsam war. Mir meiner Frau und einigen guten Freunden konnte ich immer reden, mir Rat geben lassen, wenn die Arbeit frustrierend wurde. Aber auch von kommerzieller Seite hatte ich hervorragende Unterstützung:&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/sorotec.jpg" alt="Bild: Sorotec Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Vielen Dank an Willy, Roy und Alex von &lt;a href="https://www.sorotec.de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Sorotec&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für Ratschläge, Tipps und Tricks, die mir geholfen haben, meine Maschine zu handhaben und eine bessere Lebensdauer aus den Fräsern herauszuholen. Ich habe den direkten Telefonsupport und die schnellen Bearbeitungszeiten für Fräserlieferungen und Garantiereparaturen geschätzt. Ich besuche auch gerne das &lt;a href="https://hobbyline.info/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;hobbyline CNC forum&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für Diskussionen und um meine Geschichten dort zu veröffentlichen und zu diskutieren. So kann ich der Gemeinschaft etwas zurückgeben.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/eding.jpg" alt="Bild: EdingCNC Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Auch Dank an das Team von &lt;a href="https://edingcnc.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;EdingCNC&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, vor allem an Iwona und Pim für Ihre schnellen und ausführlichen Antworten auf Support-Tickets und Controller-Software bezogene Fragen.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/stritzelberger.jpg" alt="Bild: Stritzelberger Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Vielen Dank an Jo von &lt;a href="https://vakuumtisch.de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Stritzelberger&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für stundenlange Diskussionen über gute Lösungen für meinen Vakuumtisch und Zubehör.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/vhf.jpg" alt="Bild: vhf logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Von &lt;a href="https://shop.vhf.de/catalogs/Werkzeuge-W.htm?showStartpage=true" target="_blank" rel="noopener noreferrer" class="external-link"&gt;vhf&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; möchte ich mich bei Frau Dressner für die Zeit und die häufigen Gespräche über Schnittqualität, Optimierung der Vorschübe und Geschwindigkeiten für Schaftfräser des Unternehmens sowie Beratung über Materialfrässtrategien bedanken.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/benezan.jpg" alt="Bild: Benezan-Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Ein weiterer Dank geht an Nicolas von &lt;a href="https://www.benezan-electronics.de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Benezan Electronics&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für seine Unterstützung bei der Analyse eines Problems mit dem Signal-Breakout-Board und schließlich dessen Austausch.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/gmc.jpg" alt="Bild: Gossen Metrawatt Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Dank an Herrn Leibold von &lt;a href="https://www.gmc-instruments.de/en/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Gossen Metrawatt&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für seine Hilfe bei der Auswahl eines guten Instruments zur Messung von Spannungsspitzen und der Leistungsaufnahme des Systems.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/spinogy.jpg" alt="Bild: Spinogy-Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Vielen Dank an Dominik von &lt;a href="https://www.spinogy.de/en/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Spinogy&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, mit dem ich über ein halbes Jahr lang telefoniert habe, um ein geeignetes Spindel-Upgrade und Zubehör für meine Maschine auszuwählen.&lt;/p&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper left"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/cadascam.jpg" alt="Bild: CadAsCam Logo" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Abschließend möchte ich mich bei Achim von &lt;a href="https://www.cadascam.com/de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;CadAsCam&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; bedanken, für die freundliche Aufnahme von Software-Verbesserungsvorschlägen, die Beantwortung grundlegender Fragen und die extrem schnelle Reaktion mit Software-Updates und Korrekturen. Außerdem war euer kostenloser 2-Tages-Workshop große Klasse!&lt;/p&gt;&#10;&lt;h2 id="laufzeit-und-aufträge"&gt;Laufzeit und Aufträge&lt;/h2&gt;&#10;&lt;p&gt;Innerhalb eines Jahres habe ich 200 Aufträge mit einer Gesamtlaufzeit von knapp 18 Stunden gefertigt. Wenn ich Einrichten der Fräse auf die Jobs, Montage des Werkstücks und so weiter einbeziehe, kann man die Stundenzahl verdreifachen. Bezieht man zusätzlich meine Arbeitsstunden in CAD und CAM mit ein, wäre die Zahl locker nochmal zu verdoppeln - Man sieht also, dass so ein Hobby zu einem wahren Zeitfresser werden kann - umso wichtiger ist es dann, dass es Spaß macht.&lt;/p&gt;&#10;&lt;p&gt;Wie viel Zeit mich Aufbau, Wartung und Pflege der Maschine gekostet haben? Ich weiß es nicht genau. Aber ich schätze, dass es auf Augenhöhe liegt mit dem Betreiben dieser Website, wo die Erstellung von Inhalten für eine Minute Lesedauer mich in etwa eine Stunde in Beschlag nimmt.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/jobs_1year.jpg" alt="Bild: CNC-Softwareanzeige" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Außerdem habe ich viele Stunden damit verbracht, online nach Materialmessgeräten und Fräsern zu suchen, Ratschläge in Foren einzuholen und zu erteilen, nach Maschinen-Upgrades zu suchen und Videos darüber anzusehen, wie andere Leute ihre CNCs benutzen.&lt;/p&gt;&#10;&lt;p&gt;Mein derzeitiger Favorit (Stand: März 2023) ist übrigens von CNC Connect (&lt;a href="https://www.youtube.com/watch?v=iqNTEnlXwO0" target="_blank" rel="noopener noreferrer" class="external-link"&gt;youtube link&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;). Ich werde nicht versuchen, mich damit zu vergleichen - denn ich bin ja kein Profi - aber ich bin immer wieder beeindruckt von Menschen und Herstellern, die ihr Handwerk verstehen.&lt;/p&gt;&#10;&lt;h2 id="kosten"&gt;Kosten&lt;/h2&gt;&#10;&lt;p&gt;Das CNC-Hobby ist &lt;em&gt;teuer&lt;/em&gt;, sowohl in Bezug auf Geld als auch auf Zeit. In meinem Fall habe ich fast 13.000,00€ 😨 in die Maschine, ihr Zubehör, die Spindel, den Maschinentisch, die Stromversorgung und die Schutzausrüstung, die Beleuchtung, die numerische Steuerung, den Laptop, die CAD/CAM/CNC-Software, die Schalldämmung, die Werkzeuge zum Bau der Maschine, die Absauganlage, die persönliche Sicherheitsausrüstung usw. investiert.&lt;/p&gt;&#10;&lt;p&gt;Und dabei habe ich noch nicht einmal die Kosten für Schaftfräser erwähnt.&lt;/p&gt;&#10;&lt;p&gt;Kurz vor dem Kauf denkt man: &amp;ldquo;Die Maschine an sich ist nicht allzu teuer&amp;rdquo;. Aber sobald man sich zum Kauf entschließt, werden sofort weitere Dinge erforderlich. Ich habe fast immer &amp;ldquo;B&amp;rdquo; gesagt nachdem ich &amp;ldquo;A&amp;rdquo; rief, bin nur wenige Kompromisse bei der Qualität der Ausrüstung eingegangen und habe mich nicht auf ein Material spezialisiert, was die Kosten geringer gehalten hätte.&lt;/p&gt;&#10;&lt;p&gt;Ich war fasziniert von den verschiedenen Materialien und ihren Eigenschaften, und es war immer eine Freude, wenn ein Teil wirklich gut wurde, unabhängig von dem Material, aus dem es bestand.&lt;/p&gt;&#10;&lt;h2 id="misserfolge-und-lösungen"&gt;Misserfolge und Lösungen&lt;/h2&gt;&#10;&lt;p&gt;Hier ist eine Liste größerer Probleme, die ich im letzten Jahr erlebt habe.&lt;/p&gt;&#10;&lt;h3 id="oberfräsenmotor-fällt-aus-bzw-wackelkontakt-im-betrieb-"&gt;Oberfräsenmotor fällt aus bzw. Wackelkontakt im Betrieb. Ⓜ️&lt;/h3&gt;&#10;&lt;p&gt;Dieses Problem war in Hartholz und Multiplex nach nur 8h Spindelbetrieb reproduzierbar. Die Lösung war der Einbau einer neuen Elektronikplatine, die Maffell kurzerhand lieferte.&lt;/p&gt;&#10;&lt;h3 id="die-geschwindigkeit-des-oberfräsenmotors-fällt-mitten-im-auftrag-auf-die-mindestdrehzahl-"&gt;Die Geschwindigkeit des Oberfräsenmotors fällt mitten im Auftrag auf die Mindestdrehzahl Ⓜ️&lt;/h3&gt;&#10;&lt;p&gt;Dieses Problem war ebenfalls reproduzierbar und hatte zwei Ursachen:&lt;/p&gt;&#10;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/emergency.jpg" alt="Bild: Notschalter-Detailansicht" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Der Not-Aus-Schalter hatte einen geringen Auslöseweg, so dass kurze Kontaktprellungen möglich waren. Der Schalter ist auf dem Maschinentisch montiert und konnte durch Maschinenvibrationen ausgelöst werden. Ich habe dies behoben, indem ich die Position des Mikroschalters im Gehäuse so verändert habe, dass der Schalter nicht vorzeitig ausgelöst wird.&lt;/li&gt;&#10;&lt;li&gt;Auf der Breakout-Platine, die das analoge &lt;code&gt;0-10V&lt;/code&gt;-Signal aus dem Pulsbreitenbefehl der CNC erzeugt, war ein falscher Operationsverstärkertyp montiert (nicht RTR). Unter noch unbekannten Umständen (vielleicht Kontaktprellen des Notschalters?) kam es bei diesem Teil zu einem &amp;ldquo;&lt;a href="https://en.wikipedia.org/wiki/Latch-up" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Latch-up&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&amp;rdquo;, so dass die Geschwindigkeit des Oberfräsenmotors auf die niedrigste Einstellung fiel.&#10;Ein neues Signal-Breakout-Board wurde montiert und das Problem war damit behoben.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="velocityerror"&gt;CNC Meldung: &amp;ldquo;The Velocity was higher than max!&amp;rdquo; ⚠️&lt;/h3&gt;&#10;&lt;p&gt;Dieser Fehler trat bei einigen Gelegenheiten auf. Sie waren alle unangenehm. Einmal habe ich meine Maschine zu schnell bewegen lassen (gleichzeitig &lt;code&gt;240mm/s&lt;/code&gt; auf XY, &lt;code&gt;110mm/s&lt;/code&gt; auf Z), was dazu führte, dass sie quietschte und eine Menge Schritte verlor, die sich in den Zentimeterbereich summierten.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/stepfrequency_old.jpg" alt="Bild: Übertaktete Maschinenkinematik, die zu Problemen führte" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Ein anderes Mal, als ich weniger hohe (aber im Nachhinein immer noch zu hohe) Geschwindigkeitswerte eingegeben hatte, machte ich einen Fehler, indem ich Eilgang &amp;ldquo;G00 Xxx Yyy Zzz&amp;rdquo; für alle Achsen gleichzeitig befahl, was dazu führte, dass die Maschine beim Abbremsen Schritte verlor und auf der Z-Achse an den mechanischen Endanschlag stieß. Glücklicherweise war es die obere Anschlag, so dass weder die Spindel noch die Maschine bzw. Maschinenbett beschädigt wurden. Nur die Schrittmotorkupplung rutschte durch. Uff.&lt;/p&gt;&#10;&lt;p&gt;Der Grund dafür: Die maximale Impulsfrequenz für &lt;em&gt;kombinierte Achsenbewegungen&lt;/em&gt; beträgt bei meinem Controller &lt;code&gt;125kHz&lt;/code&gt;. Ich dachte, das sei pro Achse. Das ist &lt;em&gt;falsch&lt;/em&gt;. Ich habe das mit dem Hersteller der numerischen Steuerung abgeklärt. Ich musste die Geschwindigkeitswerte der Achsen neu einstellen, um &lt;em&gt;kombiniert&lt;/em&gt; unter &lt;code&gt;125kHz&lt;/code&gt; zu bleiben.&lt;/p&gt;&#10;&lt;p&gt;Um neue Werte zu finden, habe ich mir meine bisherigen Aufträge angesehen. Ich verliere mehr Zeit bei schnellen Bewegungen der Z-Achse als bei den anderen beiden Achsen. Deshalb habe ich das Hauptaugenmerk auf die Z-Achse gelegt, um sie schnell und mit hoher Beschleunigung zu fahren, während ich die Werte für die X- und Y-Achse reduziert habe. Dabei ist zu beachten, dass die Z-Achse aufgrund ihres kürzeren Kugelumlaufgewindes auf meiner Maschine die doppelte Auflösung hat, so dass die Werte verdoppeln müssen, um sie mit den anderen Achsen vergleichen zu können.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/stepfrequency_new.jpg" alt="Bild: Abgestimmte Maschinenkinematik zur Behebung des Problems" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Dies alles geschah nach der Verbesserung der Fertigungsqualität, die ich &lt;a href="https://blog.schallbert.de/cut-dibond-tests/#machine-vibrations"&gt;hier&lt;/a&gt; dokumentiert habe. Diese Werte liefern also nachweislich gute Ergebnisse und werden von mir nicht mehr leichtfertig verändert.&lt;/p&gt;&#10;&lt;h3 id="kollision-der-maschine-mit-dem-vakuumtisch-"&gt;Kollision der Maschine mit dem Vakuumtisch 💥&lt;/h3&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/vacuumtable_cut.jpg" alt="Bild: 6mm Frässpuren in meinem brandneuen Vakuumtisch" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Nun, das hat mich wirklich verärgert. Ich hatte den Tisch noch nicht einmal zwei Wochen, und schon jetzt hatte ich ihn beschädigt. Das Schlimmste war, dass ich nicht verstand, warum.&lt;/p&gt;&#10;&lt;p&gt;Alles, was ich wollte, war &lt;code&gt;18mm&lt;/code&gt; Birke Multiplex zu fräsen. Ich ließ den Schruppfräser den Umriss erstellen, sah mich aber mit einem Problem konfrontiert, das mich dazu brachte, den Not-Aus zu drücken, als der Vorgang bereits abgeschlossen war (beim Zurückfahren zu XY0 wäre der Fräser auf ein Hindernis gestoßen). Ich korrigierte den Pfad und setzte die Maschine zurück. Ich wechselte das Werkzeug zum Schlichten und startete den Auftrag.&lt;/p&gt;&#10;&lt;p&gt;Als ich merkte, dass die Maschine ungewöhnliche Geräusche von sich gab, betätigte ich den Not-Aus. Aber bei über &lt;code&gt;4000mm/min&lt;/code&gt; zum Schlichten war ich nicht schnell genug, um zu verhindern, dass die Maschine durch den Vakuumtisch fräst.&lt;/p&gt;&#10;&lt;p&gt;Ich schaute mir den Arbeitsversatz für die Z-Achse im Variablenspeicher für &lt;code&gt;G92&lt;/code&gt; an. Er war korrekt. Ich suchte in den flüchtigen Variablen der CNC. Alle stimmten mit meinen Erwartungen überein. Dann begann ich, in den Logdateien der Maschine zu suchen. Glücklicherweise habe ich das obige Bild direkt nach diesem Vorfall gemacht, so dass es nicht schwer war, die richtigen Protokollzeilen herauszufinden.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/edinglog.jpg" alt="Bild: Logdatei mit Werkzeuglängenmessungen" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Man kann erkennen, dass die Werkzeuglänge sowohl für den Schrupp- als auch für den Standardfräser gemessen wurde. Der Standardfräser ragt um etwa 3,4 mm weiter heraus. Das ist genau die Tiefe, die mir jetzt auf meinem Vakuumtisch fehlte.&lt;/p&gt;&#10;&lt;p&gt;Dennoch hatte ich keine Ahnung, warum die Maschine die aktualisierte Werkzeuglänge nicht berücksichtigte. Also habe ich mir das Makro für den Werkzeugwechsel angesehen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/macro_rootcause.jpg" alt="Bild: Makro mit Werkzeuglängenmessroutine" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Man kan sehen, dass Variable &lt;code&gt;#3501&lt;/code&gt; speichert, ob bereits eine Werkzeuglänge gemessen wurde. Wenn dies der Fall ist, kann einfach die neue Werkzeuglänge gemessen und die Differenz zwischen den beiden Werten als Z-Achsen-Korrektur gespeichert werden. Dann wird das Programm mit dem neuen Werkzeug fortgesetzt.&lt;/p&gt;&#10;&lt;p&gt;Das Problem ist, dass die Variable &lt;code&gt;#3501&lt;/code&gt; flüchtig ist, wie ein Blick in das Handbuch der Steuerung zeigt. Und es scheint, dass flüchtige Variablen nicht nur zurückgesetzt werden, wenn die Anwendung geschlossen wird, sondern auch, wenn der Not-Aus gedrückt wird.&lt;/p&gt;&#10;&lt;p&gt;Ausgehend von meinen vorherigen Aussagen hatte ich das folgende Problem: Das Drücken des Not-Aus löschte den Wert dieser Variablen, behielt aber die ursprüngliche Z0-Höhenmessung bei, die ich ganz am Anfang vor dem Einsatz des Schruppwerkzeugs vorgenommen hatte. Anstatt also die Höhenkorrektur mit dem neuen Werkzeug zu aktualisieren, um der neuen Werkzeuglänge Rechnung zu tragen, dachte das Makro, dass dies das erste verwendete Werkzeug sei &lt;em&gt;und speicherte&lt;/em&gt; einfach dessen Länge in der Variablen &lt;code&gt;#4501&lt;/code&gt; (weil man - logisch - keine Differenz nehmen kann, wenn man vor dem ersten Werkzeug kein Werkzeug vermessen hatte).&lt;/p&gt;&#10;&lt;p&gt;Das allein hätte den Vorfall gar nicht verursacht, wenn der neu eingesetzte Fräser nicht zufällig weiter aus der Spannzange herausgeragt hätte als der vorherige.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/1year_cnc/macro_solution.jpg" alt="Bild: Zwischenlösung war die Änderung des Makros" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Ich löste das Problem, indem ich dem Makro eine Meldung hinzufügte, wenn es nur die Werkzeuglänge speicherte, aber nicht den Versatz der Z-Achse änderte. Auf diese Weise habe ich zumindest einen Hinweis darauf, dass etwas schief gehen könnte.&lt;/p&gt;&#10;&lt;h2 id="schlussfolgerung"&gt;Schlussfolgerung&lt;/h2&gt;&#10;&lt;p&gt;Zusammenfassend kann ich sagen, dass ich die CNC weiterhin benutzen werde. Ich werde nach und nach weiter dazulernen. Und ich werde mein Wissen darüber vertiefen, wie Software mit Mechatronik interagiert, die physikalische Materie verändert, wie es &amp;lsquo;Zerspanobert&amp;rsquo; tut. Ich werde versuchen, aufzuschreiben, was ich gelernt habe, damit andere meinen Spuren folgen können, wenn sie wollen.&lt;/p&gt;&#10;&lt;p&gt;Ich hoffe, dass ich einen guten Kontakt zu anderen Bastlern, Herstellern und zu den Firmen, mit denen ich bisher zusammenarbeiten durfte, aufrechterhalten kann (und vielleicht noch einige weitere zu meiner Liste hinzufügen können werde).&lt;/p&gt;&#10;&lt;p&gt;Bis bald!&#10;&lt;em&gt;Schallbert&lt;/em&gt;&lt;/p&gt;&#10;</description></item><item><title>Spindel-Upgrade</title><link>https://blog.schallbert.de/projects/spindle-upgrade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/projects/spindle-upgrade/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/spindleupgrade/mafellvsspinogy-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: The new spindle mounted on Zerspanobert"&#10; title="Spindel-Upgrade" /&gt;&#10;&lt;h2 id="projekt-steckbrief"&gt;Projekt-Steckbrief&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Schwierigkeit: Experte 5/5&lt;/li&gt;&#10;&lt;li&gt;Kosten: ~2700€&lt;/li&gt;&#10;&lt;li&gt;Zeitaufwand: ~20h&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/bN8MKYr4dmZZd2Tmoga9Ny" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;CNC Spindel-Upgrade&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Entgegen meiner Aussage &lt;a href="https://blog.schallbert.de/portal-milling/#spindle-power"&gt;hier&lt;/a&gt; habe ich mich entschieden, eine Hochfrequenz-Spindel zu kaufen. Ich musste eine Menge lesen, planen, bauen und &lt;a href="https://blog.schallbert.de/testing-hardware/"&gt;testen&lt;/a&gt; bevor ich mit der neuen Spindel endlich &amp;ldquo;Späne machen&amp;rdquo; konnte.&lt;/p&gt;&#10;&lt;h2 id="gründe-für-die-investition"&gt;Gründe für die Investition&lt;/h2&gt;&#10;&lt;p&gt;Es gibt starke und schwache Argumente für solch ein Upgrade. Kurz gesagt waren meine Argumente eher schwach, also hätte ich bei meinem bewährten Oberfräsmotor (Universalmaschine) bleiben können, deren Möglichkeiten und Grenzen nach einem Jahr im Einsatz klar auf der Hand lagen. Letztendlich war es mehr eine emotionale als eine faktenbasierte Entscheidung.&lt;/p&gt;&#10;&lt;h3 id="starke-argumente-"&gt;Starke Argumente 🥰&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Mehr Leistung: &lt;a href="https://blog.schallbert.de/cnc-router-overload/"&gt;Dieses Problem&lt;/a&gt; sollte nun nicht erneut auftreten, denn die Spindel kann jetzt deutlich höhere Zustellungen und Geschwindigkeiten fahren. Daher reduziert sich die Herstellungszeit, vor allem bei Aufträgen, bei denen viel Material abgetragen werden muss.&lt;/li&gt;&#10;&lt;li&gt;Mehr Drehmoment bei niedrigen Drehzahlen: Mein Fräsmotor konnte bei Einsatz eines Planfräsers die Drehzahl kaum halten, zudem überhitzte er sehr schnell weil sein Lüfterrad nicht genügend Luftdurchfluss ermöglichte. Durch die Fremdkühlung ist das Problem jetzt behoben.&lt;/li&gt;&#10;&lt;li&gt;Vibrationen: Ich hoffe, dass mein &lt;a href="https://blog.schallbert.de/cnc-vibrates/"&gt;Vibrationsproblem&lt;/a&gt; durch die gesteigerte Steifigkeit der Spindelmontage nun gelöst ist; das wird sich aber erst noch zeigen müssen.&lt;/li&gt;&#10;&lt;li&gt;Höhere Präzision durch bessere Maschinenlager und höhere Stabilität der Halterung&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="schwache-argumente-"&gt;Schwache Argumente 🤔&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die Spindel ist deutlich leiser als mein vorheriger Fräsmotor.&lt;/li&gt;&#10;&lt;li&gt;Ich finde Drehstrom-Asynchronmotoren und ihr Betrieb über Frequenzumrichter (FU) super spannend.&lt;/li&gt;&#10;&lt;li&gt;Ich mag das schicke Aussehen der Spindel.&lt;/li&gt;&#10;&lt;li&gt;Ich habe mich über ein halbes Jahr lang mit den Leuten bei Spinogy unterhalten und verschiedene Lösungen diskutiert. Ich wollte sie am Ende nicht ohne Kauf zurücklassen.&lt;/li&gt;&#10;&lt;li&gt;Der Frequenzumrichter hat zusätzliche interne Sicherheitsmechanismen, die bei Auftreten eines Fehlers Beschädigung von Maschine bzw. Werkstück verhindern können&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="gegenargumente-"&gt;Gegenargumente 🤨&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Schlechte Kosten-Nutzen-Bilanz: Die Maschine ist etwas vielseitiger und schneller geworden, die Kosten aber sind deutlich gestiegen&lt;/li&gt;&#10;&lt;li&gt;Aufwärmzeit der Spindel sind nun &lt;code&gt;30 Minuten&lt;/code&gt;, eine echt lange Zeit wenn man die Maschine nicht im täglichen Einsatz hat&lt;/li&gt;&#10;&lt;li&gt;Langwierige Einarbeitung in das Fachgebiet wird benötigt. Über &lt;a href="https://assets.omron.eu/downloads/latest/manual/en/i570_mx2_users_manual_en.pdf?v=8" target="_blank" rel="noopener noreferrer" class="external-link"&gt;400 Seiten Frequenzumrichter-&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; &lt;a href="https://shop.spinogy.de/wp-content/uploads/2022/02/Operating-Manual-X22.pdf" target="_blank" rel="noopener noreferrer" class="external-link"&gt;und Spindel-Handbücher&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; waren zu lesen, Schaltpläne zu zeichnen und ein Schaltschrank aufzubauen.&lt;/li&gt;&#10;&lt;li&gt;Die Portalkonstruktion meiner CNC ist für leichte bis mittelschwere Zerspanungstätigkeiten gedacht. Wenn ich die Leistung der Spindel vollständig ausnutzen möchte, würde es die Maschine überlasten, insbesondere ihren Schwachpunkt, die Z-Achse.&lt;/li&gt;&#10;&lt;li&gt;Die Spindel wiegt das Dreifache verglichen mit dem Fräsmotor, den ich vorher im Einsatz hatte.&lt;/li&gt;&#10;&lt;li&gt;Die komplexere Ansteuerung per Frequenzumrichter fügt eine Menge potentieller Fehlerquellen hinzu.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Zusammenfassend kann ich sagen, dass die Spindel durch ihre hohe Leistungsfähigkeit nicht so richtig zum Rest des Systems passt und ihre Vorteile dadurch nicht zur Gänze ausspielen kann. Ich hoffe, dass ich die Kaufentscheidung nicht bald bereuen werde.&lt;/p&gt;&#10;&lt;h2 id="automatischer-werkzeugwechsel"&gt;Automatischer Werkzeugwechsel?&lt;/h2&gt;&#10;&lt;p&gt;Hätte ich einen gut laufenden Fachbetrieb, z.B. zur Herstellung von Produkten aus Holz, dann wäre ein Werkzeugwechsler sicher eine gute Investition.&lt;/p&gt;&#10;&lt;p&gt;Für die Prototypenherstellung hingegen trifft &lt;a href="https://blog.schallbert.de/portal-milling/#tool-changer"&gt;meine Hypothese hier&lt;/a&gt; noch immer zu. Ich benötige eine Menge verschiedener Fräser, da ich mit verschiedenen Materialien, Durchmessern und Typen experimentiere. Allein die Kosten für genügend Steilkegel-Werkzeughalter allein würden die der Spindel bereits übersteigen.&lt;/p&gt;&#10;&lt;p&gt;Stattdessen habe ich mir eine weitere Spindelmutter besorgt. Somit kann ich die Spannzangen meist in den Muttern belassen, was ein paar weitere Sekunden pro Wechselvorgang einspart.&lt;/p&gt;&#10;&lt;h2 id="kosten-"&gt;Kosten 💶&lt;/h2&gt;&#10;&lt;p&gt;Ich habe noch einige andere Entscheidungen getroffen um meinen nur gelegentlichen Betrieb der Maschine als Nebenerwerb zu berücksichtigen sowie die Kosten gering zu halten. Bei meiner Spindelkonfiguration habe ich die Option mit reduzierter Leistung gewählt und die Spezifikationen der Lager nicht erhöht (obwohl ich für kleine Fräser schon die &lt;code&gt;50.000U/min&lt;/code&gt; gebrauchen könnte), so dass die Maschine auf &lt;code&gt;30kU/min&lt;/code&gt; begrenzt ist. Ich habe Luftkühlung der wassergekühlten Variante vorgezogen und nicht in ein System zur kontinuierlichen Temperaturüberwachung investiert.&lt;/p&gt;&#10;&lt;p&gt;Dennoch betragen die Gesamtkosten des Systems mehr als das Doppelte der Spindelkosten. Obwohl der FU nicht allzu teuer ist, summieren sich abgeschirmte Motorkabel, Steckverbinder, Drehmomentschlüssel, Netzfilter, Spannzangen/Muttern, der Schaltkasten und viele zusätzliche Kleinteile ganz schön auf.&lt;/p&gt;&#10;&lt;h2 id="informationsphase"&gt;Informationsphase&lt;/h2&gt;&#10;&lt;p&gt;Um die neue Spindel zum Laufen zu bringen, musste ich ein komplettes Subsystem planen, bauen und konfigurieren das Spindelantrieb, Kühlung und Hilfsstromversorgung umfasst. Aufgrund der Komplexität des Projekts habe ich meine Arbeit in verschiedenen, aufeinander aufbauenden Phasen durchgeführt. Ich begann mit der Informationsphase, in der ich mir einige Fragen beantworten musste, die ich im Folgenden erläutere.&lt;/p&gt;&#10;&lt;h3 id="antrieb-mit-variabler-frequenz"&gt;Antrieb mit variabler Frequenz&lt;/h3&gt;&#10;&lt;p&gt;&lt;div class="media-wrapper right"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/spindleupgrade/switchbox.jpg" alt="Bild: Schaltkasten mit FU" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;Wie ich in &lt;a href="https://blog.schallbert.de/cnc-electronics/#vfd"&gt;diesem Artikel&lt;/a&gt; bereits schrieb, wird ein Frequenzumrichter zur Steuerung der Drehzahl einer HF-Spindel verwendet. Der Motor heißt so, weil er weit oberhalb der Netzfrequenz (in meinem Kontinent 50 Hz) arbeitet, um höhere Drehzahlen zu erreichen wie sie für meine Anwendungen oft erforderlich sind.&lt;/p&gt;&#10;&lt;p&gt;Um einige Fragen in der Tiefe beantworten zu können, telefonierte ich mit einem Experten von &lt;a href="https://industrial.omron.de/de/products/mx2" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Omron&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; (Hersteller von Frequenzumrichtern), Herrn Wagner.&lt;/p&gt;&#10;&lt;h3 id="uf-kennlinie-oder-sensorlose-vektorregelung"&gt;U/f-Kennlinie&amp;quot; oder &amp;ldquo;sensorlose Vektorregelung&amp;rdquo;?&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Wird die U/f-Kennlinie gewählt, reduziert der Frequenzumrichter die Spannung zusammen mit der Frequenz, solange der Motor unterhalb seiner Eckfrequenz arbeitet (die bei meiner Maschine 400 Hz beträgt). Das liegt daran, dass die Induktivität der Ständerwicklung mit niedrigerer Frequenz abnimmt. Das wiederum erhöht den Stromfluss durch den Stator, und damit steigen auch Drehmoment und Verlustleistung. Durch die Anwendung der U/f-Kennlinie wird der Strom und damit das Drehmoment letztlich konstant gehalten. Bei sehr langsamen Drehzahlen nimmt die Induktivität im Vergleich zum Statorwiderstand jedoch so sehr ab, dass das Drehmoment überproportional abfällt. Daher ist diese Option für den Betrieb im unteren Drehzahlbereich eine schlechte Wahl. An oder oberhalb der Eckfrequenz des Motors hingegen bleibt die Spannung stabil und nur die Frequenz wird erhöht, was das Drehmoment verringert.&lt;/li&gt;&#10;&lt;li&gt;Bei der &amp;ldquo;sensorlosen Vektorregelung&amp;rdquo; verwendet der FU ein mathematisches Modell des Motors den er antreibt. So können optimale Schaltzeiten für die Treiber erreicht werden und damit kann unabhängig von der Motordrehzahl immer das Nenndrehmoment (oder sogar mehr) zur Verfügung gestellt werden. Dies ist besonders nützlich für Anwendungen, die einen Schweranlauf erfordern wie z. B. Aufzüge usw. Das Modell des Motors wird zumeist über eine automatische Kalibrierroutine ermittelt, wobei die Antriebsmaschine mit dem FU verbunden sein muss.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Hier ist ein Link zu einem &lt;a href="https://www.youtube.com/watch?v=qEM9VRSfXUo" target="_blank" rel="noopener noreferrer" class="external-link"&gt;youtube-Video&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, in dem die beiden Optionen bei niedrigen Drehzahlen verglichen werden. &lt;a href="https://www.youtube.com/watch?v=tWpChgsAIN4" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Ein weiteres Video&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zeigt, wie der FU bei großer Last sogar mehr als das Nenndrehmoment des Motors zur Verfügung stellen kann.&lt;/p&gt;&#10;&lt;p&gt;Da die meisten der von mir verwendeten Schaftfräser eine Drehzahl von &lt;code&gt;15000 U/min&lt;/code&gt; oder mehr erfordern, werde ich die Nachteile der U/f-Kennlinie wahrscheinlich nicht spüren. Außerdem ist bei meinem FU die Option &amp;ldquo;sensorlose Vektorregelung&amp;rdquo; nur bis &lt;code&gt;400 Hz&lt;/code&gt; verfügbar, so dass ich nur 80 % des Drehzahlbereichs der Spindel nutzen könnte. Daher entscheide ich mich für die U/f-Kennlinie.&lt;/p&gt;&#10;&lt;h3 id="auslauf-bremswiderstand-oder-energierückgewinnungssystem"&gt;Auslauf, Bremswiderstand oder Energierückgewinnungssystem?&lt;/h3&gt;&#10;&lt;p&gt;Zum Abbremsen des Motors kann der Frequenzumrichter mit verschiedenen Optionen konfiguriert werden. Wenn der Motor per Standardeinstellung im Freilauf ausläuft, kann es lange dauern, bis die Spindel bei voller Drehzahl zum Stillstand kommt.&lt;/p&gt;&#10;&lt;p&gt;Wenn ein Bremswiderstand konfiguriert wird wie ich es bei meiner Anwendung mache, benötigt das Abbremsen nur zwei Sekunden. Ich habe außerdem eine Gleichstrombremse konfiguriert, sodass die Welle vollständig zum Stillstand gebracht wird.&lt;/p&gt;&#10;&lt;p&gt;Für leistungsstärkere Maschinen oder Anwendungen, bei denen große Massen bewegt werden, kann ein Energierückgewinnungssystem sinnvoll sein. Es wird an den Zwischenkreis des FU angeschlossen und ist in der Lage, die durch die überschüssige Bewegungsenergie des Motors erzeugte Leistung ins Netz zurückzuspeisen. Um diese Funktion zu nutzen, ist ein zusätzliches Gerät erforderlich und die Kompatibilität des FU-Zwischenkreises mit diesem Einspeisewandler muss sichergestellt werden. Die hohen Systemkosten zahlen sich nur aus, wenn große Energiemengen zurückgewonnen werden können.&lt;/p&gt;&#10;&lt;h3 id="welche-modulationsfrequenz-bzw-taktfrequenz-sollte-ich-verwenden"&gt;Welche Modulationsfrequenz bzw. Taktfrequenz sollte ich verwenden?&lt;/h3&gt;&#10;&lt;p&gt;Die Takt-/Modulations-/Trägerfrequenz ist die Häufigkeit, mit der die Leistungstransistoren im FU schalten, um eine sinusähnliche Ausgangsspannung für den Motor zu liefern. Bei meinem FU kann sie in einem Bereich von &lt;code&gt;2-15kHz&lt;/code&gt; konfiguriert werden.&lt;/p&gt;&#10;&lt;p&gt;Um eine optimale Frequenz zu wählen, muss ein Gleichgewicht zwischen mehreren Faktoren gefunden werden:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die Schaltverluste der Transistoren steigen bei höheren Frequenzen.&lt;/li&gt;&#10;&lt;li&gt;Die Durchlassverluste von Transistoren nehmen bei niedrigeren Frequenzen zu.&lt;/li&gt;&#10;&lt;li&gt;Das &lt;a href="https://en.wikipedia.org/wiki/Equal-loudness_contour" target="_blank" rel="noopener noreferrer" class="external-link"&gt;menschliche Ohr ist besonders empfindlich&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; im Bereich von &lt;code&gt;2-5kHz&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Resonanzfrequenzen des Motorsystems sollten vermieden werden.&lt;/li&gt;&#10;&lt;li&gt;Elektromagnetische Störaussendungen nehmen bei höheren Frequenzen zu.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Wenn der Motorhersteller eine Empfehlung für die Modulationsfrequenz abgibt, sollten diese natürlich befolgt werden. Ich habe mit verschiedenen Werten herumgespielt und mich für &lt;code&gt;5kHz&lt;/code&gt; als guten Kompromiss zwischen den oben genannten Faktoren entschieden. Ich hatte auch den Eindruck, dass dieser Wert bei meiner Maschine besser klang als 6 oder 4 kHz.&lt;/p&gt;&#10;&lt;h3 id="kann-ich-die-luftkühlung-in-abhängigkeit-von-der-spindeltemperatur-steuern"&gt;Kann ich die Luftkühlung in Abhängigkeit von der Spindeltemperatur steuern?&lt;/h3&gt;&#10;&lt;p&gt;Ja, das ist möglich. Alles, was dafür benötigt wird ist ein kontinuierlicher (nicht schaltender) Temperatursensor, z. B. ein &lt;code&gt;PT100&lt;/code&gt; oder ein anderes Thermoelement, ein Messwertgeber und ein freier Analogeingang am Frequenzumrichter. Dieser wird so konfiguriert, dass er über eine Fensterfunktion einen der freien digitalen Ausgänge ansteuert, der wiederum ein Relais schaltet, an das der Lüfter angeschlossen werden muss.&lt;/p&gt;&#10;&lt;p&gt;Meine Spindel ist leider mit einem schaltenden Thermistor ausgestattet, der über einen Temperaturalarm-Eingang mit dem FU verbunden ist. So kann er das System bei Überhitzung abschalten. Er ist aber nicht für eine kontinuierliche Temperaturüberwachung/-steuerung des Lüfters geeignet.&lt;/p&gt;&#10;&lt;h3 id="reicht-eine-spannung-von-18-v-aus-um-an-einem-24-v-digitaleingang-high-signalpegel-zu-erkennen"&gt;Reicht eine Spannung von 18 V aus, um an einem 24 V-Digitaleingang &amp;ldquo;High&amp;rdquo;-Signalpegel zu erkennen?&lt;/h3&gt;&#10;&lt;p&gt;Ja, bei meinem FU konnte ich eine niedrigere Spannung als die angestrebten 24 V an einen Logikeingang anlegen und trotzdem wurde der Pegel &lt;code&gt;HIGH&lt;/code&gt; erkannt.&lt;/p&gt;&#10;&lt;h3 id="kann-ich-den-logischen-masseanschluss-des-fu-ohne-probleme-an-die-masse-meiner-gleichstromversorgung-anschließen"&gt;Kann ich den logischen Masseanschluss des FU ohne Probleme an die Masse meiner Gleichstromversorgung anschließen?&lt;/h3&gt;&#10;&lt;p&gt;Ja. Muss man sogar. Der &amp;lsquo;Run&amp;rsquo;-Ausgang meiner CNC ist potenzialfrei. So musste ich die positive Steuerspannung des FU auf den Kontakt legen und dessen Ausgang mit dem &amp;lsquo;Run&amp;rsquo;-Eingang des FU verbinden. Der Stromkreis ist aber nur dann geschlossen, wenn im FU-Schaltschrank Logik-Masse und DC-Masse verbunden werden. Auch die analoge Ausgangsspannung meiner CNC zur Steuerung der Spindeldrehzahl muss dieselbe Erdungsreferenz wie der FU verwenden, also ist sie ebenfalls mit der logischen Masse des FU verbunden. Der Schaltplan zeigt diesen Sachverhalt an der &lt;a href="https://blog.schallbert.de/projects/spindle-upgrade/#die-planungsphase"&gt;Masseverbindung von T1&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="was-muss-ich-hinsichtlich-der-elektromagnetischen-verträglichkeit-beachten"&gt;Was muss ich hinsichtlich der elektromagnetischen Verträglichkeit beachten?&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Netzfilter zwischen Netzschalter und FU verwenden (Das ist in Deutschland sogar Vorschrift).&lt;/li&gt;&#10;&lt;li&gt;Abgeschirmte Kabel für den angeschlossenen Motor verwenden.&lt;/li&gt;&#10;&lt;li&gt;Die Motoranschlussleitung so kurz wie möglich halten.&lt;/li&gt;&#10;&lt;li&gt;Müssen doch lange Leitungen verwenden (&amp;gt;10m), HF-Rauschfilter bzw. Drossel einbauen.&lt;/li&gt;&#10;&lt;li&gt;Abschirmung zusammen mit den Schutzerdungsleitungen des Motors an die Schutzerdungsplatte des FU anschließen.&lt;/li&gt;&#10;&lt;li&gt;Sicherstellen, dass die Abschirmung einen leitenden Kontakt zu den Kabelsteckern herstellt.&lt;/li&gt;&#10;&lt;li&gt;Durchgangsprüfung nach DIN VDE 0701-0702 durchführen.&lt;/li&gt;&#10;&lt;li&gt;Vergewissern, dass der Schaltkasten über eine zentrale Schutzerdungsklemme verfügt, an die jedes Gerät innerhalb des Schaltkastens angeschlossen wird.&lt;/li&gt;&#10;&lt;li&gt;Vergewissern, dass die Schutzerde der Netzversorgung ebenfalls an diese Klemme angeschlossen ist.&lt;/li&gt;&#10;&lt;li&gt;Bei der Verkabelung des Schaltkastens die Motorzuleitung so weit wie möglich von den Signalleitungen entfernt verlegen.&lt;/li&gt;&#10;&lt;li&gt;Zur Reduktion elektromagnetischer Störabstrahlung sind Schaltkastengehäuse aus Metall solchen aus Kunststoff vorzuziehen. Zumindest ist eine metallische Trägerplatte zu verwenden, auf der alle Komponenten montiert werden.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="spindel"&gt;Spindel&lt;/h3&gt;&#10;&lt;p&gt;Um die passende Spindel für Ihre Maschine und Anwendung auszuwählen, gibt es - unabhängig vom Motortyp - einige Punkte zu beachten.&lt;/p&gt;&#10;&lt;h3 id="leistung"&gt;Leistung&lt;/h3&gt;&#10;&lt;p&gt;Die Spindelleistung ist vielleicht weniger wichtig als gedacht. Hier mache ich ein paar Beispiele zur Orientierung.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;=400W&lt;/code&gt; HF-Spindel oder &lt;code&gt;&amp;lt;=800W&lt;/code&gt; Oberfräsenmotor: Für eine Hobby-Maschine, die nicht unbedingt mit hohen Vorschüben betrieben werden kann. Bei schwerer zu schneidenden Materialien wie Aluminium oder HPL reicht eine geringe oder mittlere Schnitttiefe pro Durchgang aus. Der Maschinenrahmen wiegt weniger als 60 kg und ist für sein Gewicht relativ groß, z.B. bei einer Arbeitsfläche von &lt;code&gt;&amp;gt;0,5 m²&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;=700W&lt;/code&gt; HF-Spindel oder &lt;code&gt;&amp;lt;=1200W&lt;/code&gt; Oberfräsenmotor: Die Maschine wiegt mehr oder ist steifer als die oben genannte Option. Häufig werden Fräser mit einem Durchmesser um die 6mm verwendet oder es muss viel mit Planfräsern gearbeitet werden. Die Z-Achse der Maschine ist kräftig ausgelegt und man hat das Gefühl, dass die Maschine bei &lt;code&gt;3000mm/min&lt;/code&gt;, &lt;code&gt;Z+6mm&lt;/code&gt; und einem 6mm Fräser locker mit Hartholz zurechtkommt.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;1,1kW/1,5kW&lt;/code&gt; HF-Spindel: Eine kompakte, schwerere Maschine (ca. 500x500mm Verfahrweg bei 100kg Gewicht), die Aluminium oder Holz mit höheren Vorschubgeschwindigkeiten schneiden soll. Bei der Bearbeitung von Holz verwenden Sie häufig Schruppfräser, um Zeit zu sparen. Die Maschine kann höhere Beschleunigungen und schnelle Bewegungen bewältigen (z.B. &lt;code&gt;1000mm/s²&lt;/code&gt; und &lt;code&gt;300mm/s&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;gt;=2,2kW&lt;/code&gt;: Sie haben den Hobbybereich verlassen - wahrscheinlich für immer - sowohl mit Ihrer Maschine als auch mit dem Auftragsbestand, der sich auf Ihrem Schreibtisch angesammelt hat. Sie haben eine Werkstatt, eine professionelle Staubabsaugung und eine schwerere Maschine, der Sie zutrauen, den ganzen Tag lang ohne intensive Überwachung zu laufen. Vielleicht betrachten Sie diesen Blog als &amp;ldquo;nicht anspruchsvoll genug&amp;rdquo; und machen sich auf zu neuen Ufern, wo man Ihnen als Profi wirklich helfen kann.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="gewicht"&gt;Gewicht&lt;/h3&gt;&#10;&lt;p&gt;Das Gewicht hängt von der Leistung ab. Ein 800-Watt-Motor für eine Oberfräse kann einschließlich Halterung unter 2 kg wiegen, während eine 2,2-kW-HF-Spindel mit automatischem Werkzeugwechsel ohne Werkzeughalter 6,5 kg oder mehr auf die Waage bringt. Auch Halterung und Leitungen werden tendenziell größer.&#10;Ein hohes Spindelgewicht kann sich vor allem bei leichten Maschinen negativ auswirken. Im Extremfall kann sich die Z-Achse nach unten bewegen, wenn die Schrittmotortreiber inaktiv sind. Die Maschinenbeschleunigung, insbesondere an der Portalbewegungsachse, muss möglicherweise reduziert werden, damit keine Schritte verloren gehen. Es ist zu bedenken, dass schwerere Spindeln in der Regel voluminöser sind, so dass sich die Schnittkräfte aufgrund einer größeren Hebelwirkung ungünstig auf die Z-Achse auswirken können.&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/spindleupgrade/mafellvsspinogy.jpg" alt="Bild: Vergleich von Routermotor und HF-Spindel" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&lt;/p&gt;&#10;&lt;h3 id="2-polige-oder-4-polige-ausführung"&gt;2-polige oder 4-polige Ausführung?&lt;/h3&gt;&#10;&lt;p&gt;Wird insbesondere bei niedrigen Drehzahlen ein hohes Drehmoment benötigt, sollten Sie sich für eine 4-polige Ausführung entscheiden. Dann wird allerdings die doppelte Frequenz benötigt, um die gleiche Drehzahl wie bei einem 2-poligen Motor zu erreichen.&#10;Wird die Maschine häufig mit hohen Drehzahlen betrieben, sollte stattdessen eine 2-polige Spindel Anwendung finden.&lt;/p&gt;&#10;&lt;h3 id="wasser--oder-luftgekühlt"&gt;Wasser- oder luftgekühlt?&lt;/h3&gt;&#10;&lt;p&gt;Auch dies ist eher eine Frage der Kosten und der Professionalität als alles andere. Natürlich funktioniert die Selbstkühlung durch einen auf der Welle fest montierten Lüfter gut. Eine Fremdkühlung per Lüfter ist etwas teurer, aber auch leiser. Ihr Hauptvorteil besteht darin, dass die Spindel unabhängig von ihrer Drehzahl nicht zu warm wird.&lt;/p&gt;&#10;&lt;p&gt;Eine Wasserkühlung führt die Wärme nochmal deutlich effizienter aus dem Motor ab, und die hohe Wärmekapazität des Wassers führt zu homogenen Temperaturen in der gesamten Spindel. Sie dämpft die Vibrationen und ist die leiseste Kühlungslösung von allen. Andererseits ist das System viel teurer, komplexer, benötigt mehr Platz für Pumpe, Kühler und Ausgleichsbehälter usw. und muss öfter gewartet werden.&lt;/p&gt;&#10;&lt;h2 id="die-planungsphase"&gt;Die Planungsphase&lt;/h2&gt;&#10;&lt;p&gt;Nachdem die Handbücher aller bestellten Teile überflogen waren, konnte ich einen schematischen Schaltplan für das Spindel-Subsystem zeichnen.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/spindleupgrade/vfd_circuit_plans_1.jpg" alt="Bild: Schaltplan FU-Subsystem" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Oben ist der Frequenzumrichter mit seinen Klemmen zu sehen. &lt;code&gt;X1&lt;/code&gt; ist der Netzstromeingang mit dem Trennschalter &lt;code&gt;S2&lt;/code&gt;. &lt;code&gt;X2&lt;/code&gt; verbindet die Spindel mit dem FU und &lt;code&gt;X3&lt;/code&gt; ist der Signalanschluss für die CNC. Rechts unten befindet sich die Gleichstromversorgung &lt;code&gt;T1&lt;/code&gt;, die die Luftkühlung versorgt und die logische Spannungsschiene bereitstellt. Die Temperatur des Spindelmotors &lt;code&gt;M1&lt;/code&gt; wird durch den Thermistor &lt;code&gt;R3&lt;/code&gt; überwacht (hier habe ich vergessen, die Beschriftung hinzuzufügen). Der Spindelkühlmotor &lt;code&gt;M2&lt;/code&gt; wird durch ein Zeitrelais gesteuert, das wiederum durch das &amp;ldquo;RUN&amp;rdquo;-Signal gesteuert wird. Ein digitaler Mehrzweckausgang ist mit einer roten LED &lt;code&gt;D1&lt;/code&gt; verbunden, die so konfiguriert ist, dass sie aufleuchtet, wenn eine Überlastwarnung vorliegt.&lt;/p&gt;&#10;&lt;p&gt;Der Schaltplan ist ziemlich einfach gehalten. Deshalb habe ich keine Zeit in saubere Zeichnungen investiert. Um es noch authentischer aussehen zu lassen, habe ich etwas ☕ auf das Papier verschüttet.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/spindleupgrade/vfd_circuit_plans_3.jpg" alt="Bild: Anschlussbelegung der Spindel" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Dies ist die Pinbelegung des Spindelsteckers &lt;code&gt;X2&lt;/code&gt; und des entsprechenden Anschlusses am FU. Sie war mehrmals nützlich, als ich dem abgeschirmten Motorkabel (orangefarben, siehe Bannerbild oben) Steckverbinder hinzufügte sowie während der Geräteprüfung.&lt;/p&gt;&#10;&lt;p&gt;Ich notiere mir stets das erforderliche Anzugsdrehmoment für jede Schraube, einschließlich der für die Klemmen, und lege die benötigten Werkzeuge vor Baubeginn bereit.&lt;/p&gt;&#10;&lt;h2 id="die-bauphase"&gt;Die Bauphase&lt;/h2&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&lt;iframe src="https://makertube.net/videos/embed/u8gDBQnsdxYFEZfFwk6jfU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Schaltschrankbau für den Umrichter der Spindel&lt;/span&gt;&#10; &lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="inbetriebnahme"&gt;Inbetriebnahme&lt;/h2&gt;&#10;&lt;p&gt;Vor Inbetriebnahme war der &lt;a href="https://blog.schallbert.de/testing-hardware/#test-plan"&gt;Testplan&lt;/a&gt; abzuarbeiten. Danach war der Spindel-Fettverteilungslauf gemäß Anweisungen des Herstellers zu starten.&#10;Schließlich kalibrierte ich den Analogausgang &amp;ldquo;0-10V&amp;rdquo; in der CNC-Software, um die Frequenz des Frequenzumrichters mit der Drehzahl der Spindel abzugleichen. Beispiel: &lt;code&gt;S10000&lt;/code&gt; sollte &lt;code&gt;3,33V&lt;/code&gt; am Ausgang erzeugen und den FU mit einer Frequenz von etwa &lt;code&gt;175Hz&lt;/code&gt; laufen lassen, um den Schlupf zu berücksichtigen.&lt;/p&gt;&#10;&lt;p&gt;Um zu sehen, dass das System wie vorgesehen funktioniert, habe ich ein paar Testläufe gemacht: 8mm PMMA, Vollnut, einmaliger Durchlauf in &lt;code&gt;Z+=8mm&lt;/code&gt;, &lt;code&gt;4mm&lt;/code&gt; Einschneider (poliert) Hartmetallfräser bei &lt;code&gt;S=26kUPM&lt;/code&gt; und &lt;code&gt;F=3000mm/min&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="media-wrapper center"&gt;&#10; &lt;figure class="media-frame"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/spindleupgrade/spindle_commisioning_initjob.jpg" alt="Bild: Spindel mit einem Werkstück aus PMMA" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="die-analysephase"&gt;Die Analysephase&lt;/h2&gt;&#10;&lt;p&gt;Diese Phase wird später folgen, vielleicht ein Jahr nach der Arbeit mit der neuen Spindel. Ich werde mir Folgendes ansehen:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Hat sich die Investition gelohnt (etwa 8x teurer als ein Oberfräsenmotor)?&lt;/li&gt;&#10;&lt;li&gt;Habe ich die zusätzlichen Möglichkeiten (höhere Leistung und mehr Drehzahl) genutzt?&lt;/li&gt;&#10;&lt;li&gt;Erzielt sie spürbar bessere Ergebnisse?&lt;/li&gt;&#10;&lt;li&gt;Ist sie zuverlässiger und wartungsärmer als mein bisheriger Motor?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Aber was ich schon jetzt sagen kann: Ich habe viel gelernt. Es hat Spaß gemacht, das System zu entwerfen, zu verkabeln und einzurichten. Und es war aufregend zu sehen, dass es tatsächlich so funktioniert, wie ich es mir vorgestellt habe 🙂.&lt;/p&gt;&#10;</description></item></channel></rss>