<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Product on Schallberts Blog</title><link>https://blog.schallbert.de/tags/product/</link><description>Recent content in Product on Schallberts Blog</description><generator>Hugo</generator><language>de</language><lastBuildDate>Mon, 08 Sep 2025</lastBuildDate><atom:link href="https://blog.schallbert.de/tags/product/index.xml" rel="self" type="application/rss+xml"/><item><title>passtdas - ein Hilfsprogramm für die CNC</title><link>https://blog.schallbert.de/passtdas/</link><pubDate>Mon, 08 Sep 2025</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/passtdas/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-09-08-passtdas-thumb.avif"&#10; class="post-cover"&#10; alt="Image: Visualizazion of how passtdas analyzes and determines workpiece edges"&#10; title="passtdas - ein Hilfsprogramm für die CNC" /&gt;&#10;&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;&#10;&lt;p&gt;Ein Bekannter von mir schrieb mich an. Er betreibt eine CNC-Portalfräsmaschine als Hobby so wie ich und fertigt oft Einzelstücke. Die dabei entstehenden Reste sind aber teils zu schade zum Wegwerfen. Für eine bestmögliche Materialausnutzung probiert er, diese Reste als Rohlinge für weitere Projekte zu verwenden.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Weißt du, wie ich an der Maschine herausfinden kann, ob mein Frästeil auf den Rohling passt?&amp;rdquo; - Anonym&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Schnell ist es passiert: Den Maßen zufolge passt das Werkstück so gerade auf den Rohling. Setzt man den Nullpunkt nur leicht falsch, so fährt der Fräser über die Werkstückgrenzen hinaus und man kann das Werkstück wegwerfen.&lt;/p&gt;&#10;&lt;h2 id="die-lösung"&gt;Die Lösung&lt;/h2&gt;&#10;&lt;p&gt;Es wäre doch toll, wenn die Maschine vor Beginn des Fräsvorganges die Kontur des Werkstückes abfahren würde, oder? So könnte man unkompliziert herausfinden, ob sich der Rohling wirklich komplett innerhalb der Werkstückgrenze befindet.&lt;/p&gt;&#10;&lt;p&gt;Da ich auf Anhieb keine schnelle Lösung online finden kann, denke ich an selbstgeschriebene Software für die Umsetzung. Daher mache ich mich an die Arbeit.&lt;/p&gt;&#10;&lt;p&gt;TODO: ADD VIDEO LINK&lt;/p&gt;&#10;&lt;h2 id="die-software"&gt;Die Software&lt;/h2&gt;&#10;&lt;p&gt;Für einen schnellen Prototypen wähle ich die Hochsprache &lt;a href="https://www.python.org/downloads/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;python&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Warum? Ich beherrsche &lt;em&gt;python&lt;/em&gt; recht gut, Bibliotheken für die erforderlichen geometrischen Berechnungen sind verfügbar, und das geschriebene Programm lässt sich leicht in eine all-in-one-Datei kompilieren.&lt;/p&gt;&#10;&lt;p&gt;Das Programm soll Maschineninstruktionen (G-Code) lesen und die Fräspfade analysieren. Die Stellen, an denen im Fräsprogramm die maximalen und minimalen &lt;code&gt;X- und Y-Werte&lt;/code&gt; angefahren werden, sollen abgespeichert und selbst als Bewegungskommando in einer Pfaddatei ausgegeben werden.&lt;/p&gt;&#10;&lt;p&gt;Lädt man dieses Programm auf die Maschine, so wird ein so ermittelter &amp;ldquo;Extremwert&amp;rdquo; angefahren und die Z-Achse von Sicherheits- auf Messhöhe abgesenkt. Anschließend wird das Programm pausiert, sodass der Bediener Anpassungen der Werkstückposition vornehmen kann. Erst durch Einabe eines weiteren Startbefehls wird der nächste Extremwert angefahren usw.&lt;/p&gt;&#10;&lt;p&gt;Dieses Programm wird &lt;em&gt;passtdas&lt;/em&gt; heißen.&lt;/p&gt;&#10;&lt;h3 id="programmart"&gt;Programmart&lt;/h3&gt;&#10;&lt;p&gt;Ich entscheide mich für ein Konsolenprogramm mit wenigen Parametern:&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;Shortcut&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Parameter name&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Description&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;code&gt;-f&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--file&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;The source file to be analyzed. Required.&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;&lt;code&gt;-s&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--zsafety&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Safety height the machine will do flyovers with. Optional.&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;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--zprobe&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Probe height the machine will pinpoint to. Optional.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Die beiden Höhenparameter bekommen Default-Werte, sodass sie nicht immer mit angegeben werden müssen.&lt;/p&gt;&#10;&lt;h3 id="eingabe"&gt;Eingabe&lt;/h3&gt;&#10;&lt;p&gt;&lt;em&gt;passtdas&lt;/em&gt; liest Dateien ein und durchsucht sie zeilenweise nach Bewegungsbefehlen &lt;code&gt;G00, G01, G02, G03&lt;/code&gt;. Während die Auswertung für lineare Bewegungen wie &lt;code&gt;G00, G01&lt;/code&gt; einfach ist - Lineare Bewegungen lassen sich durch Punkt-zu-Punkt-Verbindungen ausdrücken, deren Extremwerte nicht zwischen den Punkten liegen können - kann das für Kreissegmente durchaus herausfordernd sein.&lt;/p&gt;&#10;&lt;p&gt;Die Höheninformation auf der Z-Achse wird ebenfalls mitgelesen und gespeichert. So kann die Zerspanungstechnikerin schnell prüfen, ob die maximale Frästiefe mit der Gewünschten übereinstimmt.&lt;/p&gt;&#10;&lt;p&gt;Befinden sich in der G-Code-Datei keine oder falsch formulierte Anweisungen, so gibt das &lt;em&gt;passtdas&lt;/em&gt; entsprechende Fehlermeldungen aus und bricht die Analyse ab.&lt;/p&gt;&#10;&lt;h3 id="definition-kreissegmente"&gt;Definition Kreissegmente&lt;/h3&gt;&#10;&lt;p&gt;Zum Hintergrund: Im G-Code können Kreissegmente auf zwei Arten definiert werden.&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:#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;G00 X5.660 Y-0.000 Z10.000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G02 X-5.660 Y0.000 R5.660 F1600&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kommando:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Fahre einen Kreisbogen im Uhrzeigersinn ab dem Punkt &lt;code&gt;X5.66 Y0&lt;/code&gt; mit Radius &lt;code&gt;5.66mm&lt;/code&gt; bis zum Punkt &lt;code&gt;X-5.66 Y0&lt;/code&gt; mit Vorschub &lt;code&gt;1600mm/min&lt;/code&gt; auf Höhe &lt;code&gt;10mm&lt;/code&gt;.&amp;rdquo;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Zeichnet man diese Kommandos, entsteht ein hängender Halbkreis. Kreise können mittels dreier Punkte definiert werden. Doch nur zwei Punkte sind gegeben. Der dritte Punkt muss mit Hilfe von Anfangs- und Endpunkt aus dem ebenfalls angegebenen Kreisradius berechnet werden.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-09-08-arcr.avif" alt="Image: drawing an arc using given radius, start- and endpoint"&gt;&lt;/figure&gt;&#10;&lt;p&gt;&lt;em&gt;Aufgabe: Finde heraus, wo dieser Kreis seine Extremwerte in XY hat.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Aber auch so kann ein Kreissegment definiert sein:&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:#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;G00 X-2.5696 Y5.0431&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G03 X-4.6258 Y3.2616 Z-0.5000 I2.5696 J-5.0431&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kommando:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Fahre einen Kreisbogen gegen den Uhrzeigersinn ab dem Punkt &lt;code&gt;X-2.56 Y5.04&lt;/code&gt; mit Mittelpunktkoordinaten &lt;code&gt;I2.56 J-5.04&lt;/code&gt; bis zum Punkt &lt;code&gt;X-4.62 Y3.26&lt;/code&gt;.&amp;rdquo;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Zeichnet man diese Kommandos, entsteht ein kurzes Kreissegment im oberen linken Quadranten. Hier sind zwar drei Punkte (Start- und Endpunkt sowie Kreismittelpunkt) gegeben. Doch auch hier kann es mitunter schwierig werden, herauszufinden, ob irgendwo auf dem Kreisbogen ein Extremwert angefahren wird.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-09-08-arcij.avif" alt="Image: drawing an arc using center point, start- and endpoint"&gt;&lt;/figure&gt;&#10;&lt;p&gt;&lt;em&gt;Aufgabe: Finde heraus, wo dieser Kreis seine Extremwerte in XY hat.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h3 id="extremwerte-von-kreissegmenten-berechnen"&gt;Extremwerte von Kreissegmenten berechnen&lt;/h3&gt;&#10;&lt;p&gt;Ein Kreissegment kann je nach Spanne bis zu vier zusätzliche Extremwerte haben: &lt;code&gt;X+, Y+, X-, Y-&lt;/code&gt;. Bei einem Vollkreis sind dies stets die Koordinatenschnittpunkte vom Radius aus gesehen.&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_extremes_from_arc&lt;/span&gt;(arc, coordinates):&#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; x_plus_radius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [center_x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; radius, center_y, xyz[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y_plus_radius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [center_x, center_y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; radius, xyz[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x_minus_radius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [center_x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius, center_y, xyz[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y_minus_radius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [center_x, center_y &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius, xyz[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; extremevalue_order &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [x_plus_radius, y_plus_radius, x_minus_radius, y_minus_radius]&#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; (arc[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; arc[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;&amp;lt;&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:#75715e"&gt;# crossing the 0° line (x-axis), handle overflow with nested if below&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arc[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;360&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &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;for&lt;/span&gt; crossing_angle &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;721&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;90&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; crossing_angle &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(int(arc[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]), int(arc[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &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; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; int(crossing_angle &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;90&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; i &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(extremevalue_order[i])&#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;Sind Kreismittelpunkt sowie Kreisradius bekannt, kann aus den Anfangs- und Endpunkten der überstrichene Winkel bestimmt werden. Hierdurch wird nun klar, ob Kreisanfangspunkt und/oder -Endpunkt selbst Extremwerte darstellen, oder ob durch Überstreichen eines Koordinatennullpunktes zusätzliche Extremwerte entstehen. Genau dies tut das obige Codebeispiel.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-09-08-arcext.avif" alt="Image: Possible coordinate extreme values of an arc segment"&gt;&lt;/figure&gt;&#10;&lt;h3 id="datentabelle"&gt;Datentabelle&lt;/h3&gt;&#10;&lt;p&gt;Alle möglichen Extremwerte (zwei bei einer Linie, bis zu vier bei einem Kreissegment) werden nun in einer Datentabelle gesammelt. Sobald jede G-Codezeile ausgewertet und die Liste damit komplett ist, werden die Maximal- und Minimalwerte für jede Achse aus dieser Liste bestimmt.&lt;/p&gt;&#10;&lt;p&gt;So entstehen schließlich vier &lt;code&gt;XYZ&lt;/code&gt;-Koordinaten, welche für jede Raumrichtung die maximale Ausdehnung des Werkstückes beschreibt.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-09-08-ext.avif" alt="Image: Visual example of an extreme value dataset for a simple geometry"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Parallel durchsucht das Programm alle Befehle an die Z-Achse und merkt sich die maximale Eintauchtiefe.&lt;/p&gt;&#10;&lt;h3 id="ausgabe"&gt;Ausgabe&lt;/h3&gt;&#10;&lt;p&gt;Das Kommandozeilenprogramm verfügt über keine visuelle Ausgabe. Daher beschränke ich mich auf die Erstellung eines Simulationsprogramms für die Fräsmaschine, in dem die Werkstückausdehnung angefahren wird und bei jedem Punkt pausiert:&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;G90&#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 coordinate zero&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MSG &lt;span style="color:#e6db74"&gt;&amp;#34;Zmin of this job: -1.0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 Z40&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 X0 Y0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G01 Z15 F1200&#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;MSG &lt;span style="color:#e6db74"&gt;&amp;#34;PathPreview: Hit START to go to Ymin: [&amp;#39;0.0&amp;#39;, &amp;#39;-5.66&amp;#39;]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M00&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 Z40&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 X0.0 Y-5.66&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G01 Z15 F1200&#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;MSG &lt;span style="color:#e6db74"&gt;&amp;#34;PathPreview: Hit START to go to Xmin: [&amp;#39;-5.66&amp;#39;, &amp;#39;0.0&amp;#39;]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M00&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 Z40&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 X-5.66 Y0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G01 Z15 F1200&#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;MSG &lt;span style="color:#e6db74"&gt;&amp;#34;PathPreview: Hit START to go to Ymax: [&amp;#39;0.0&amp;#39;, &amp;#39;5.66&amp;#39;]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M00&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 Z40&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 X0.0 Y5.66&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G01 Z15 F1200&#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;MSG &lt;span style="color:#e6db74"&gt;&amp;#34;PathPreview: Hit START to go to Xmax: [&amp;#39;5.66&amp;#39;, &amp;#39;0.0&amp;#39;]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M00&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 Z40&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G00 X5.66 Y0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G01 Z15 F1200&#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;Obiges Beispiel fährt die Extremwerte eines Kreises mit &lt;code&gt;r=5.66mm&lt;/code&gt; ab. Dabei fährt es stets eine Sicherheitshöhe von &lt;code&gt;Z40&lt;/code&gt; zum Überstreichen der Punkte an und bewegt die Z-Achse bei Ankunft langsam mit &lt;code&gt;F1200&lt;/code&gt; auf die Zielhöhe von &lt;code&gt;Z15&lt;/code&gt;. Wichtig dabei ist, dass der Nullpunkt in &lt;code&gt;Z&lt;/code&gt; vorher korrekt vermessen wurde - sonst kommt es möglicherweise zur Kollision mit dem Werkstück.&lt;/p&gt;&#10;&lt;h2 id="test-und-verifikation"&gt;Test und Verifikation&lt;/h2&gt;&#10;&lt;p&gt;Um zu sehen ob das Programm auch wie erwartet funktioniert habe ich drei Testdateien erstellt:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Unit tests: Prüft einzelne Funktionen im Programm, z.B. ob Linien- und Kreissegmente korrekt erkannt werden&lt;/li&gt;&#10;&lt;li&gt;integration tests: Testen, ob Funktionen im Verbund korrekt funktionieren, z.B. die richtige Berechnung von Extremwerten anhand von Eingabewerten&lt;/li&gt;&#10;&lt;li&gt;End to end tests: Diese Tests prüfen über die gesamte Funktionskette, z.B. ob falsch formatierte Eingabedateien erkannt werden&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-09-08-unittest.avif" alt="Image: Test result summary for passtdas"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Zum Schluss erstelle ich mehrere Testdateien mit dem Programm und fahre die daraus erzeugten Extremwerte mit meiner CNC an.&lt;/p&gt;&#10;&lt;h2 id="open-source-software"&gt;Open-source software&lt;/h2&gt;&#10;&lt;p&gt;Der Quellcode für &lt;em&gt;passtdas&lt;/em&gt; steht kostenlos auf &lt;a href="https://github.com/Schallbert/passtdas" target="_blank" rel="noopener noreferrer" class="external-link"&gt;GitHub&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zur Verfügung, muss allerdings durch Python interpretiert werden.&lt;/p&gt;&#10;&lt;p&gt;Ich baue ein Endanwenderfreundliches und leicht zu bedienendes Programm daraus, sobald genügend Leute den Wunsch dafür geäußert haben.&lt;/p&gt;&#10;</description></item><item><title>Klingenbutler</title><link>https://blog.schallbert.de/klingenbutler/</link><pubDate>Mon, 14 Oct 2024</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/klingenbutler/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_klingenbutler-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: First prototype of Klingenbutler"&#10; title="Klingenbutler" /&gt;&#10;&lt;h2 id="warum-klingenbutler"&gt;Warum Klingenbutler?&lt;/h2&gt;&#10;&lt;p&gt;Nachdem das Problem der fehlenden Ablage für feste Shampoos in meiner Dusche gelöst hatte - daraus entstand der &lt;a href="https://blog.schallbert.de/seifenbutler-pilot-run/"&gt;Seifenbutler&lt;/a&gt; - fielen mir dort herumfliegende Rasierer mehr und mehr störend auf.&lt;/p&gt;&#10;&lt;p&gt;Liegen sie unten auf dem Rand der Dusche, bildet sich um sie herum eine Lache. Dort entstehen dann besonders viele Kalkflecken und die Reinigung geht schlechter von der Hand. Legt man die auf die Armaturen, fallen sie früher oder später herunter und werden beschädigt. Selbiges gilt für die wackelige Ablage auf dem Rand der Duschkabine.&lt;/p&gt;&#10;&lt;p&gt;Es liegt nahe, die Klemmmechanik des Seifenbutler wiederzuverwenden. Somit muss nur der &amp;ldquo;vordere Teil&amp;rdquo; neu designt werden und schon erhalte ich eine formschöne Ablage für Rasierer - den &lt;em&gt;Klingenbutler&lt;/em&gt;.&lt;/p&gt;&#10;&lt;h2 id="das-design"&gt;Das Design&lt;/h2&gt;&#10;&lt;p&gt;Ich mag die runde Formgebung des Seifenbutler und möchte den Klingenbutler ähnlich gestalten. Die Rasierer sollen allerdings nicht allzu leicht versehentlich berührt werden können. Daher entschließe ich mich, sie möglichst &amp;ldquo;innen&amp;rdquo; anzubringen. Hierfür erstelle ich einen Ring mit Öffnung, der wiederum drei Einkerbungen für Rasierer besitzt. Die Radien der Einkerbungen gestalte ich so, dass alle mir zur Verfügung stehenden Nassrasierer dort hineinpassen und sogar Zahnbürsten sich ohne Kontakt der Borsten zum Klingenbutler einhängen lassen.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_klingenbutlercad.jpg" alt="Image: CAD drawing of Klingenbutler V1.0"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Die Öffnung (in der Zeichnung links) gestalte ich für Ober- und Unterschale so, dass die Oberschale in allen möglichen geschlossenen Positionen stets die Unterschale überdeckt. Damit vermeide ich überstehende Kanten bei besonders großen oder kleinen Duschstangendurchmessern.&lt;/p&gt;&#10;&lt;h3 id="einrasten-der-rasierer"&gt;Einrasten der Rasierer&lt;/h3&gt;&#10;&lt;p&gt;Schwieriger war schon die Planung von Rasthilfen, sodass die Rasierer sich nicht von allein lösen können. Hier entschied ich mich beim ersten Entwurf für eine Kerbe in Form eines &lt;a href="https://en.wikipedia.org/wiki/Tetrahedron" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Doppeltetraeders&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Im Bild oben ist die Kerbe mit &amp;ldquo;drain&amp;rdquo; beschriftet. Sie besitzt auf ca. &lt;code&gt;15mm&lt;/code&gt; Länge ein Gefälle von &lt;code&gt;3mm&lt;/code&gt;, lässt Spritzwasser ablaufen und ermöglicht eine schnelle Trocknung der Rasierer.&lt;/p&gt;&#10;&lt;h3 id="g2-kurven"&gt;G2-Kurven&lt;/h3&gt;&#10;&lt;p&gt;&lt;figure class="media-frame media-frame--left"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_twodifferentradii.jpg" alt="Image: two different radii joined. There is a visible kink due to differences in slope at that point."&gt;&lt;/figure&gt;&#10;Als ich einen meiner Entwürfe kurz vor Einstieg in die Fertigung einem Bekannten von mir zeigte - er ist 3D-Designer von Beruf - fiel ihm sofort auf, dass ich keinen fließenden Übergang zweier Kurvenradien vorgesehen hatte. Er meinte, dass in solchen Fällen &amp;ldquo;G2-Kurven&amp;rdquo; im CAD eingesetzt werden und das Modell so viel harmonischere Übergänge bekäme.&lt;/p&gt;&#10;&lt;p&gt;Im Fachjargon scheint man dabei von &lt;a href="https://en.wikipedia.org/wiki/Smoothness#Geometric_continuity" target="_blank" rel="noopener noreferrer" class="external-link"&gt;geometrischer Stetigkeit&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zu sprechen. Sogleich fragte ich die Softwarefirma hinter meinem CAD-Werkzeug, ob sie &lt;a href="https://hobbyline.info/forum/index.php?thread/822-wie-mache-ich/&amp;amp;postID=11565#post11565" target="_blank" rel="noopener noreferrer" class="external-link"&gt;so etwas ebenfalls unterstütze&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und siehe da - es gibt das Werkzeug &lt;em&gt;tangentenstetige Verbindung erzeugen&lt;/em&gt;. Von nun an werde ich dieses Werkzeug verwenden, wenn ich Radien miteinander verbinde.&lt;/p&gt;&#10;&lt;p&gt;Das Werkzeug erzeugt eine &lt;a href="https://en.wikipedia.org/wiki/B%C3%A9zier_curve" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Bezier-Kurve&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, deren Endpunkte tangential an die beiden Kreissegmente anschließen und die Knickstelle auf diese Weise beseitigen.&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="media-frame media-frame--left"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_twodifferentradiig2.jpg" alt="Image: radii joined with tangential continuity using a Bezier Curve"&gt;&lt;/figure&gt;&#10;Diese Herangehensweise hat außer der gefälligeren Optik sogar noch einen Vorteil in der Fertigung: Beim Abfahren von Knickstellen muss die CNC-Maschine plötzliche Richtungsänderungen durchführen, ähnlich wie bei verbundenen Liniensegmenten, die in einem Winkel aufeinandertreffen. Somit muss abgebremst und im neuen Kurvenradius beschleunigt werden. Durch Verwendung tangentenstetiger Verbindungen hingegen werden Beschleunigungsspitzen deutlich abgemildert und die Maschine läuft mit gleichmäßigerer Geschwindigkeit durch.&lt;/p&gt;&#10;&lt;p&gt;Hat man wie mit dem &lt;em&gt;Klingenbutler&lt;/em&gt; Projekte mit vielen &amp;ldquo;Knickstellen&amp;rdquo; in der Zeichnung, so kommen hier schnell ein paar Sekunden Fertigungszeit pro Teil zusammen, die leicht einzusparen sind - dazu vielleicht später mal mehr.&lt;/p&gt;&#10;&lt;h3 id="erster-prototyp---version-10"&gt;Erster Prototyp - Version 1.0&lt;/h3&gt;&#10;&lt;p&gt;Die Fertigung trat ich mit meinem &amp;ldquo;klassischen&amp;rdquo; Prototypenmaterial an: gegossenes PMMA (Acrylglas) mit &lt;code&gt;5mm&lt;/code&gt; Stärke in opak weiß. Verwendet man einigermaßen passende Parameter, so verhält sich das Material äußerst gutmütig. Gleichzeitig legt das Material schonungslos alle Fehler offen: Hier eine Fase etwas zu weit, dort leichte Rattermarken durch Herausbeschleunigen der Maschine aus einer Ecke, im Boden des Gewindes gefangene Späne - All das tritt die etwas lichtdurchlässige Materialkomposition und starke Reflexionen an Materialkanten stark hervor.&#10;Daher ist dieses Material hervorragend geeignet, Design- und Fertigung von Produkten zu verbessern.&lt;/p&gt;&#10;&lt;p&gt;Durch meine Erfahrungen mit dem Seifenbutler gingen Niederhalten während der Fertigung und Zusammenbau des Klingenbutler problemlos vonstatten. Zahnbürsten und Rasierer sind von nun an an einem festen Platz in der Dusche zu finden 🙂.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_firstproto.jpg" alt="Image: First prototype of Klingenbutler V1.0"&gt;&lt;/figure&gt;&#10;&lt;h2 id="version-11---fertigung-in-bambus"&gt;Version 1.1 - Fertigung in Bambus&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure class="media-frame media-frame--right"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_bambus.jpg" alt="Image: First time Bamboo on my CNC"&gt;&lt;/figure&gt;&#10;Eigentlich will ich ja weg von Kunststoff. Die Produktion meiner Seifenbutler habe ich im Laufe des Jahres zwar bereits auf &amp;ldquo;greencast&amp;rdquo; Acrylglas umgestellt - also PMMA, das selbst aus 100% recycelter Ware besteht - aber besser wäre ja noch, gar keinen Kunststoff einzusetzen.&lt;/p&gt;&#10;&lt;p&gt;Dafür ließ ich mir ein paar Muster &amp;ldquo;Moso-Bambus&amp;rdquo; kommen: Stäbchen-Leimholz in drei Schichten kreuzverleimt, ähnlich wie Sperrholz, knapp &lt;code&gt;7.5mm&lt;/code&gt; stark. Für die Fertigung in Bambus legte ich die Passtoleranzen etwas großzügiger aus (&lt;code&gt;0.1mm&lt;/code&gt; Untermaß )und wandelte metrische Gewinde im Plan schlicht in einfache Bohrungen für Holzschrauben um.&lt;/p&gt;&#10;&lt;h3 id="unnötiges-weglassen"&gt;Unnötiges weglassen&lt;/h3&gt;&#10;&lt;p&gt;Beim Zusammenbau des ersten Prototypen wurde mir klar, dass das dritte Bajonett überflüssig geworden war. Zusammen mit ein paar kleineren, weiteren Änderungen entwickelte ich Version 1.1:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Dritte Verschraubung im Rastkreis weglassen&lt;/li&gt;&#10;&lt;li&gt;Rastnasen/Ablaufrinne: Durchgängige Gravur ohne Stoppen bei &amp;ldquo;Schlüsselloch&amp;rdquo;&lt;/li&gt;&#10;&lt;li&gt;Bajonett: Innenseiten auf Rückseite anfasen und so die Oberfläche durchbrechen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="drehzahl-und-vorschub"&gt;Drehzahl und Vorschub&lt;/h3&gt;&#10;&lt;p&gt;Für das Vollnutfräsen nutze ich einen DLC-beschichteten (Diamond-like-carbon) &lt;code&gt;4mm&lt;/code&gt; Zweizahnfräser ohne Drall mit &lt;code&gt;12mm&lt;/code&gt; Schneidenlänge. Ich betreibe ihn bei &lt;code&gt;S30000U/min&lt;/code&gt; mit einem Vorschub von&lt;code&gt;F3000mm/min&lt;/code&gt;. Ich gehe direkt in die volle Materialtiefe mit &lt;code&gt;Z+ 7.5mm&lt;/code&gt; und fahre Bohrungen und Materialrampen mit &lt;code&gt;20°&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Fasen bringe ich mittels eines &lt;code&gt;90°&lt;/code&gt; Gravurfräser, dreischneidig, Durchmesser &lt;code&gt;10mm&lt;/code&gt; an. Ihn betreibe ich mit &lt;code&gt;F5000mm/min&lt;/code&gt; bei &lt;code&gt;S15000U/min&lt;/code&gt; und einem Mittenabstand von &lt;code&gt;2mm&lt;/code&gt;, was bei einer glatten Kante mit &lt;code&gt;0.5mm&lt;/code&gt; Breite schon bedeutet, dass er &lt;code&gt;2.5mm&lt;/code&gt; Luft &amp;ldquo;nach unten&amp;rdquo; in Z-Richtung benötigt.&lt;/p&gt;&#10;&lt;p&gt;Für Bohrungen, Taschen und kleine Aussparungen verwende ich einen hinterschliffenen &lt;code&gt;2mm&lt;/code&gt; Zweischneider Fischschwanz mit &lt;code&gt;15°&lt;/code&gt; Drall und &lt;code&gt;20mm&lt;/code&gt; Schneidenlänge. Ihn betreibe ich mit vorsichtigen &lt;code&gt;1700mm/min&lt;/code&gt; bei &lt;code&gt;S30000U/min&lt;/code&gt; und einer Tiefenzustellung von nur &lt;code&gt;Z+1.5mm&lt;/code&gt;. Auch hier tauche ich mit &lt;code&gt;20°&lt;/code&gt; ins Material ein.&lt;/p&gt;&#10;&lt;h3 id="fertigung"&gt;Fertigung&lt;/h3&gt;&#10;&lt;p&gt;Das Arbeiten im mir bis Dato noch völlig unbekannten Material &amp;ldquo;Bambus&amp;rdquo; ging überraschend leicht von der Hand. Dank meiner noch neuen und sehr scharfen Fräser waren keinerlei Ausrisse zu beklagen und das Material selbst hatte ebenfalls kaum Defekte oder Schadstellen.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center media-frame--video"&gt;&#10; &lt;div class="media-video"&gt;&lt;iframe&#10; src="https://makertube.net/videos/embed/ayYr653wLVLzVpmiMkhyz8"&#10; title="Klingenbutler CNC-fräsen"&#10; loading="lazy"&#10; allow="autoplay; fullscreen; picture-in-picture"&#10; allowfullscreen&#10; style="width: 100%; height: auto; min-height: 315px; aspect-ratio: 16/9;"&#10; &gt;&lt;/iframe&gt;&lt;/div&gt;&#10; &lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;Klingenbutler CNC-fräsen&lt;/span&gt;&lt;a href="https://makertube.net/videos/embed/ayYr653wLVLzVpmiMkhyz8" class="attr-link" target="_blank" rel="noopener noreferrer"&gt;↗&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;p&gt;Bei der Bearbeitung entstanden recht feine Späne, die ein wenig an Staub von der Verarbeitung von MDF-Platten erinnern. Ich bin mir noch nicht sicher, ob ich mit der Drehzahl weiter heruntergehen sollte oder ob dies an den geraden Schneiden des Fräsers liegt. Dieser muss Späne beim Fräsen in der Vollnut unter Umständen mehrere Umdrehungen lang mit sich führen, bevor er sie in der Nut hinter sich lassen kann.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_klingenbutler.jpg" alt="Image: Klingenbutler V1.1 Bamboo edition"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Bohrungen jedenfalls sind mit diesem Fräser und unveränderten Parametern nicht zu empfehlen. Sämtliche Bohrlöcher haben verkohlte Ränder, was auf viel zu hohe Drehzahlen schließen lässt. Zudem habe in einem Stück gebohrt, anstatt den Fräser mehrfach zurückzuziehen. Nehmen wir den Dreisatz zur Hilfe: Beim Vorschub von &lt;code&gt;FZ+2000mm/min&lt;/code&gt;, &lt;code&gt;S30000/U/min&lt;/code&gt; und &lt;code&gt;Z7.5mm&lt;/code&gt; führt der Fräser &lt;code&gt;112.5&lt;/code&gt; Umdrehungen im Bohrloch aus, reiben die Schneiden also 225 mal sinnlos an der Wand des Bohrloches entlang - abtragen tut ja nur die Zentrumsschneide unten. Zudem werden die Späne ja nicht ausgeworfen sondern die ganze Zeit über mitgeführt.&lt;/p&gt;&#10;&lt;p&gt;Für den nächsten Prototypen werde ich Bohrlöcher also entweder mit Rückzügen und drastisch reduzierter Drehzahl fertigen oder schlicht einen kleineren Fräser verwenden.&lt;/p&gt;&#10;&lt;h3 id="ergebnis"&gt;Ergebnis&lt;/h3&gt;&#10;&lt;p&gt;&lt;figure class="media-frame media-frame--right"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-10-14_bambusdetail.jpg" alt="Image: Klingenbutler detail view (underside)"&gt;&lt;/figure&gt;&#10;Das kann sich sehen lassen. Ich habe die Fase zum Kantenbrechen aus der Fertigung in Acrylglas übernommen. Sie fällt mit &lt;code&gt;0.5mm&lt;/code&gt; sehr schmal aus. Trotzdem zeigt sich auch im Detail ein sehr sauberes Bild. Ober- und Unterschale des Klingenbutler lassen sich weich gegeneinander verschieben und auch der Klemmer, mein Sorgenkind noch &lt;a href="https://makertube.net/w/64TS5d5cp2eNqf8SSPvY77" target="_blank" rel="noopener noreferrer" class="external-link"&gt;aus diesem Video&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; ließ sich ohne Ausrisse fräsen.&lt;/p&gt;&#10;&lt;p&gt;Der Zusammenbau geht problemlos vonstatten und auch die Holzschrauben lassen sich leicht in die vorgebohrten Löcher eindrehen. Der Klingenbutler aus Bambus hält an der Duschstange sogar noch besser als sein Pendant aus Acrylglas - der raueren Oberfläche und höheren Materialstärke sei dank.&lt;/p&gt;&#10;&lt;p&gt;Bleibt abzuwarten, ob das Material auch im Feuchtraum langlebig genug ist. Für Schneidbretter in der Küche wird es ja noch immer gern verwendet.&lt;/p&gt;&#10;&lt;h2 id="ausblick"&gt;Ausblick&lt;/h2&gt;&#10;&lt;p&gt;Die Verwendung von Bambus hat mich sehr motiviert hinterlassen: Ein toller Werkstoff. Hart und fest aber dabei leicht, gut maschinell zu bearbeiten, formstabil und kaum Materialdefekte: So wünscht man sich das Arbeiten mit Naturmaterialien!&lt;/p&gt;&#10;&lt;p&gt;Dieser Prototyp landet nun zum Dauertest bei uns in der Dusche. In der Zwischenzeit verfeinere ich das Design weiter.&lt;/p&gt;&#10;&lt;h3 id="version-12"&gt;Version 1.2&lt;/h3&gt;&#10;&lt;p&gt;Für V1.2 habe ich folgende kleine Verbesserungen in Planung:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Bohrungen: Kleineren Fräser wählen (zu Lasten der Zykluszeit)&lt;/li&gt;&#10;&lt;li&gt;Befestigung: Ausschnitt fräsen, sodass das Rändelrad nicht mehr übersteht&lt;/li&gt;&#10;&lt;li&gt;Aussparung innen an der Oberschale ist überflüssig&lt;/li&gt;&#10;&lt;li&gt;Unterschiedliche Radien mit G2-Kurven übergehen lassen&lt;/li&gt;&#10;&lt;li&gt;Rastnasen durch harmonischere, runde Ablaufrinne ersetzen&lt;/li&gt;&#10;&lt;li&gt;Maserung ausrichten: Alle Teile &amp;ldquo;senkrecht&amp;rdquo; fertigen&lt;/li&gt;&#10;&lt;li&gt;Die Klemmer nun in der ersten Aufspannung fräsen und um &lt;code&gt;0.04mm&lt;/code&gt; aufdicken&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Auch hier ist das Ziel, mittels stetiger Verbesserung hin zu einem guten Produkt zu kommen.&lt;/p&gt;&#10;</description></item><item><title>Seifenbutler - Nullserie!</title><link>https://blog.schallbert.de/seifenbutler-pilot-run/</link><pubDate>Thu, 08 Feb 2024</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/seifenbutler-pilot-run/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-08-seifenbutler-white.jpg"&#10; class="post-cover"&#10; alt="Image: Seifenbutler ready for sale"&#10; title="Seifenbutler - Nullserie!" /&gt;&#10;&lt;p&gt;Jetzt ist mein Hardware-Projekt &lt;a href="https://blog.schallbert.de/projects/move-blog-to-own-server/"&gt;Seifenbutler&lt;/a&gt; abgeschlossen. Nach langer Entwicklungszeit habe ich einige Exemplare in weiß, schwarz, transparent und opalweiß hergestellt und sie in einem ersten &lt;a href="https://mopemaster.com/produkt/seifenbutler-seifenhalter-dusche/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Online-Shop&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; platzieren lassen können.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-08-seifenbutler-collection.jpg" alt="Image: Seifenbutler in three different colours"&gt;&lt;/figure&gt;&#10;&lt;h2 id="wie-bestimme-ich-den-verkaufspreis"&gt;Wie bestimme ich den Verkaufspreis?&lt;/h2&gt;&#10;&lt;p&gt;Da ich hochwertige Materialien verwende und die Fertigungs- sowie Montagezeit lang ausfällt, habe ich bei der Preisgestaltung nicht so viel Luft nach unten. Andererseits kann ich für einen Gebrauchsgegenstand wie den Seifenbutler keine Mondpreise aufrufen - es sei denn, ich verwendete edle Hölzer oder andere, ausgefallene oder aufwendig zu bearbeitende Materialien. Für solche Kalkulationen gibt es eine Menge Material online. Ich habe mich dafür an einem &lt;a href="https://www.youtube.com/watch?v=mxwggzhe_hs" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Youtube-Video des Kanals &amp;ldquo;Cutting It Close&amp;rdquo;&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; orientiert.&lt;/p&gt;&#10;&lt;p&gt;Meine Preisberechnung setzt sich aus folgenden Posten zusammen:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Endpreis = Materialpreis&#10; + Maschinenzeit (Investition, Verschleiß, Werkzeuge, Verbrauchsmaterialien)&#10; + Fertigungs- und Montagezeit &#10; + Verpackungskosten &#10; + Gebühren (Porto, Zahlungsdienstleister, Shops)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wie zu erkennen ist, habe ich meine eigene Zeit für die Produktentwicklung da überhaupt nicht eingerechnet - müsste ich dies tun, so würden ganz locker noch einmal der Gegenwert zu &lt;code&gt;250h&lt;/code&gt; Arbeitszeit hinzukommen.&lt;/p&gt;&#10;&lt;h3 id="materialpreise"&gt;Materialpreise&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Stand Ende 2023&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Ok, dann listen wir mal schnell die Auslagen pro Teil auf:&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;Sückzahl&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Artikel&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Preis/Einheit&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Verwendete Einheit&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Endpreis&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;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PMMA 5mm XT&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;90€/m²&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2,70€&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;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rändel M4 A2 22mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7,54€/25St&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,04&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,30€&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;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Scheibe M4 A2 12mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,94€/100St&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;0,01€&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;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Stift M4 A2 12mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6,70€/50St&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,02&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,13€&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;5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Schraube M4 A2 8mm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;12,40€/200St&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,025&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0,31€&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;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Materialpreis/Teil&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3,45€&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="maschinenzeit"&gt;Maschinenzeit&lt;/h3&gt;&#10;&lt;p&gt;Die Maschinenzeit setze ich für dieses Projekt mit &lt;code&gt;100€/h&lt;/code&gt; an. Der Löwenanteil sind hierbei Investitions-, Wartungs-, sowie Verschleißkosten der Maschine mit &lt;code&gt;50€/h&lt;/code&gt; plus meiner eigenen Arbeitszeit, die ich einfach mal mit &lt;code&gt;30€/h&lt;/code&gt; ansetze.&lt;/p&gt;&#10;&lt;p&gt;Die Werkzeugkosten liegt mit ca. &lt;code&gt;15€/h&lt;/code&gt; recht hoch, da ich vier verschiedene Werkzeuge, allesamt mit kleinem Durchmesser und damit entsprechen hohem Verschleiß benutzen muss.&lt;/p&gt;&#10;&lt;p&gt;Verbrauchsmaterialien sind Vakuumvliese, Positionierstifte, Schnittschutzhandschuhe und Klebeband. Letzeres benötige ich für die Fixierung der kleinen Frästeile sowie der Spirale. Ihr Anteil an den Maschinenzeitkosten liegt bei etwa &lt;code&gt;5€/h&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Die Maschinenzeit beträgt momentan &lt;code&gt;8min/Teil&lt;/code&gt;. Somit beläuft sich Posten &lt;code&gt;Maschinenzeit&lt;/code&gt; auf &lt;code&gt;13,30€/Stück&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h3 id="montagezeit"&gt;Montagezeit&lt;/h3&gt;&#10;&lt;p&gt;Für die Montage eines Seifenhalters benötige ich etwa 5 Minuten. Lege ich einen Stundensatz von &lt;code&gt;30€&lt;/code&gt; zugrunde, so komme ich hier auf &lt;code&gt;2,50€/Stück&lt;/code&gt;.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2024-02-08-seifenbutler-assembly.jpg" alt="Image: Seifenbutler ready to assemble"&gt;&lt;/figure&gt;&#10;&lt;h3 id="verpackungskosten-und-materialeinkauf"&gt;Verpackungskosten und Materialeinkauf&lt;/h3&gt;&#10;&lt;p&gt;Ich verpacke die Seifenhalter in einfache DIN A6-Briefumschläge, nachdem ich sie sorgfältig in Packpapier eingewickelt habe. Die Kosten belaufen sich hier auf lediglich &lt;code&gt;0,20€/Stück&lt;/code&gt;. Rechne ich nun jedoch meine Arbeitszeit für Verpackung und Versandaufkleber mit ein, liegen wir bereits bei &lt;code&gt;0,90€/Stück&lt;/code&gt;. Hinzu kommen Aufwendungen für Porto beim Materialeinkauf und Kosten für Papier und Druck der Bedienungsanleitung, die ich mit weiteren &lt;code&gt;0,50€/Stück&lt;/code&gt; berechne - hier schlagen die geringen gefertigten Mengen voll durch.&lt;/p&gt;&#10;&lt;h3 id="gebühren"&gt;Gebühren&lt;/h3&gt;&#10;&lt;p&gt;Gebühren fallen z.B. für Versand- und Zahlungsdienstleister an. Hier variieren die Preise je nach Anbieter, sodass ich einen Versandaufschlag von &lt;code&gt;3,50€&lt;/code&gt; (Versand per Großbrief) einplane - dieser entfällt bei Verkäufen &amp;ldquo;an der Theke&amp;rdquo;.&lt;/p&gt;&#10;&lt;h2 id="der-gesamtpreis"&gt;Der Gesamtpreis&lt;/h2&gt;&#10;&lt;p&gt;Summiere ich alle Posten zusammen, so müsste ich einen Ladenpreis von &lt;code&gt;20,15€&lt;/code&gt; (bei Barzahlung) für die unverpackte Ware und &lt;code&gt;24,75€&lt;/code&gt; im Versandfalle mit bargeldloser Zahlung aufrufen. Und dann wäre in der Firma noch immer kein Cent Gewinn gemacht.&lt;/p&gt;&#10;&lt;p&gt;Ich bin mir nicht sicher, ob sich der Seifenbutler für solche Preise verkaufen lässt. Wenn man sich aber ehrlich macht und am Ende nicht draufzahlen will, sind solche Rechnungen zumindest überschlagsweise unumgänglich.&lt;/p&gt;&#10;&lt;h2 id="der-angenommene-kaufmann-mit-ladengeschäft"&gt;Der angenommene Kaufmann mit Ladengeschäft&lt;/h2&gt;&#10;&lt;p&gt;Wäre ich nun Kaufmann&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;, so müsste ich noch Mehrwertsteuer aufschlagen und würde auch die Entwicklungskosten irgendwie amortisiert sehen wollen. Ich bin mir auch nicht sicher, ob ich &amp;ldquo;als Kaufmann&amp;rdquo; mit einem Stundensatz von 30€ durch die Tür käme.&lt;/p&gt;&#10;&lt;p&gt;Puh. Rechnet man jetzt noch Dinge wie Ladenmiete, Kosten für Lagerfläche, Werkstattmiete, Strom, Abfallentsorgung, Mitgliedschaft beim &amp;ldquo;Grünen Punkt&amp;rdquo; nach Verpackungsgesetz, Beiträge für IHK, Berufsgenossenschaft sowie Steuern und Abgaben mit ein, so muss selbst bei einem weiteren Preisaufschlag von 20% schon ein ganzer Haufen Seifenhalter verkauft werden, um am Ende nicht ärmer dazustehen als vorher!&lt;/p&gt;&#10;&lt;p&gt;Nehmen wir mal an, ich kann mich in eine Werkstatt einmieten und einen winzigen Laden eröffnen.&lt;/p&gt;&#10;&lt;h3 id="ein-fiktiver-laden"&gt;Ein fiktiver Laden&lt;/h3&gt;&#10;&lt;p&gt;Überschlagen wir mal kurz mit ein paar angenommenen Werten:&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;Posten&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Preis/Einheit&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Verwendet&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Endpreis&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;Laden&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16€/m² u. Monat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;40m²&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;640€&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;Lagerfläche&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4€/m² u. Monat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8m²&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32€&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;Werkstatt&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8€/m² u. Monat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30m²&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;240€&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;Nebenkosten&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;pro Monat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;200€&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;Abgaben&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IHK / BG / Vers.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;125€&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;Gebühren&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;20€/Monat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;60€&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;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Summe&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1297€&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;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Personal&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1600€&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Und würde ich in diesem Laden nun nochmal für 20h/Woche jemanden für den Verkauf anstellen, entstünden hier überschlagsweise 1600€ an Kosten.&lt;/p&gt;&#10;&lt;h3 id="summa-summarum"&gt;Summa summarum&lt;/h3&gt;&#10;&lt;p&gt;Ok, fassen wir zusammen: Ich gehe mit einem Aufschlag von 20% auf die Herstellungskosten ins Rennen. Als angenommener Kaufmann müsste ich allerdings Mehrwertsteuer abführen, die ich erneut aufzuschlagen hätte.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Ladenpreis = Herstellungspreis &#10; + Deckungsbeitrag (20%)&#10; + Mehrwertsteuer (19%)&#10; = (1,2 * 20,15€) * 1,19 = 28,77€&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oha, damit liegen wir schon bei fast dreißig Euro pro Teil.&lt;/p&gt;&#10;&lt;p&gt;Wie viele Seifenbutler müssen also pro Monat über die Ladentheke gehen, bevor ich als Kaufmann mit Ladengeschäft Gewinn machen würde?&#10;Der Deckungsbeitrag liegt bei &lt;code&gt;4,03€&lt;/code&gt; (20% des Herstellungspreises). Wenn ich jetzt die durch Produktion und Verkauf erzeugten Kosten durch diesen Betrag teile, erhalte ich meine Mindestverkaufsmenge: &lt;code&gt;719 Stück/Monat&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Wie viele Wochenstunden müsste ich nun also mindestens an meiner CNC-Fräse stehen bzw. Seifenbutler zusammenbauen und verpacken?&#10;Nehme ich die Werte von oben, so liege ich bei insgesamt &lt;code&gt;8 + 5 + 2 = 15min/Teil&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Bei der Mindestverkaufsmenge würde mir das eine Wochenarbeitszeit von etwa &lt;code&gt;45h&lt;/code&gt; bescheren!&#10;Ach, 60h pro Woche gehen doch auch locker, oder?! Somit könnte ich 960 Stück pro Monat herstellen - und angenommen, sie verkaufen sich hervorragend, erzielte ich &lt;code&gt;971€&lt;/code&gt; extra zur Amortisation der Entwicklungskosten (Überschlag 250h*30€ = 7.500€). Knaller!&lt;/p&gt;&#10;&lt;p&gt;Ich würde dann mit der Unternehmung nach nur acht Monaten (mit je 60h/Woche, ist klar) in die Gewinnzone marschieren. Oh, oder muss man etwa noch Steuern entrichten? Und wann war noch gleich meine Maschine abbezahlt?&lt;/p&gt;&#10;&lt;h2 id="fazit-zur-wirtschaftlichkeit"&gt;Fazit zur Wirtschaftlichkeit&lt;/h2&gt;&#10;&lt;p&gt;Mir ist klar, dass die Rechnung nicht so einfach zu machen ist. Einige Parameter lassen sich nicht beliebig und linear hoch- oder herunterskalieren und z.B. die Maschinenkosten kann ich gar nicht realistisch abschätzen, weil mir schlicht Erfahrungswerte im Dauerbetrieb fehlen, Stichwort Abnutzung.&lt;/p&gt;&#10;&lt;p&gt;Dennoch genügt mir die meinerseits zu erbringende Arbeitszeit um festzuhalten:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Das wird nix. Nettes Projekt, lohnt sich aber nicht.&lt;/strong&gt; Jedenfalls nicht aus Eigenmitteln und allein in Eigenregie. Es bleibt bei einer Nullserie und bei meiner Freude über ein gelungenes, funktionales Produkt.&lt;/p&gt;&#10;&lt;p&gt;Glücklicherweise ist das alles hier &amp;ldquo;nur mein Hobby&amp;rdquo;, sodass ich die desaströse Bilanz nicht gezwungen bin zu ziehen 😉&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;Obacht. Meine Berufung ist nicht Händler oder Kaufmann, sondern das Ingenieur-dasein. Daher habe ich nur sehr rudimentäre Kenntnis von Betriebswirtschaft (dieses eine Semester damals im Studium eben, wo niemand so recht zuhören mochte). Alle meine Ausführungen hier sind Überschlagsrechnungen. Sie sollten also mit großer Vorsicht genossen werden. Ich freue mich allerdings sehr über Korrekturzuschriften und konstruktive Kritik!&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>QR-codengrave V1.1 / V1.2</title><link>https://blog.schallbert.de/qr-codengrave1-1/</link><pubDate>Sun, 12 Feb 2023</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/qr-codengrave1-1/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-02-12_qr-codengrave-thumb.jpg"&#10; class="post-cover"&#10; alt="Image: Splash screen of QR-codengrave V1.1"&#10; title="QR-codengrave V1.1 / V1.2" /&gt;&#10;&lt;h2 id="kurze-fakten-des-updates"&gt;Kurze Fakten des Updates&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Schnellerer Gravuralgorithmus und -Pfadoptimierung&lt;/li&gt;&#10;&lt;li&gt;Diverse Bugfixes&lt;/li&gt;&#10;&lt;li&gt;Bedienbarkeit verbessert&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="demo-video"&gt;Demo Video&lt;/h2&gt;&#10;&lt;figure class="media-frame media-frame--center media-frame--video"&gt;&#10; &lt;div class="media-video"&gt;&lt;iframe&#10; src="https://makertube.net/videos/embed/jFD7nxftVHjUy6LKPCFE3N"&#10; title="QR-codengrave Quick Demo"&#10; loading="lazy"&#10; allow="autoplay; fullscreen; picture-in-picture"&#10; allowfullscreen&#10; style="width: 100%; height: auto; min-height: 315px; aspect-ratio: 16/9;"&#10; &gt;&lt;/iframe&gt;&lt;/div&gt;&#10; &lt;figcaption class="media-caption"&gt;&#10; &lt;span class="caption-text"&gt;QR-codengrave Quick Demo&lt;/span&gt;&lt;a href="https://makertube.net/videos/embed/jFD7nxftVHjUy6LKPCFE3N" class="attr-link" target="_blank" rel="noopener noreferrer"&gt;↗&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;h2 id="version-11"&gt;Version 1.1&lt;/h2&gt;&#10;&lt;h3 id="algoritmusoptimierung"&gt;Algoritmusoptimierung&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Die Zeilen des QR-Codes werden nun horizontal eingelesen&lt;/li&gt;&#10;&lt;li&gt;Die Ausgabe der Pfade verläuft nun &amp;ldquo;rechts nach links&amp;rdquo;, danach &amp;ldquo;links nach rechts&amp;rdquo; und reduziert damit Maschinenbewegungen&lt;/li&gt;&#10;&lt;li&gt;Linien werden Punkten vorgezogen, da sie schneller gefertigt werden können&lt;/li&gt;&#10;&lt;li&gt;Linien werden nun vertikal und horizontal berechnet, die längere Linie bekommt den Vorzug&lt;/li&gt;&#10;&lt;li&gt;Eilgänge werden nun per XY-Vektor gefahren und nicht mehr nur eindimensional, was Zeit spart&lt;/li&gt;&#10;&lt;li&gt;Der neue Pfadalgorithmus benötigt 20% weniger Maschinenzeit&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2023-02-12_qr-codengrave_algo.jpg" alt="Image: Algorithm comparison 1.0 vs. 1.1"&gt;&lt;/figure&gt;&#10;&lt;h3 id="bugfixes"&gt;Bugfixes&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Bei nicht vorliegendem Datensatz &lt;code&gt;Persistence.dat&lt;/code&gt; wird das Startbild nicht angezeigt (&lt;code&gt;qruwu.jpg&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;Crash bei Klick auf &lt;code&gt;Stop Draw&lt;/code&gt; wenn zuvor keine Zeichnung angefragt wurde&lt;/li&gt;&#10;&lt;li&gt;Crash bei Hinzufügen eines Werkzeuges bei leerer Werkzeugliste&lt;/li&gt;&#10;&lt;li&gt;Wird das Programm ohne Werkzeugauswahl gestartet, ist das dropdown-Menü gesperrt&lt;/li&gt;&#10;&lt;li&gt;Fehler in der QR-Code Größenschätzung&lt;/li&gt;&#10;&lt;li&gt;Fehler in der Blockbreitenberechnung bei Verwendung von V-Fräsern&lt;/li&gt;&#10;&lt;li&gt;Das gegenwärtig ausgewählte Werkzeug wird bei Start der Anwendung nicht im Dropdown-Feld angezeigt&lt;/li&gt;&#10;&lt;li&gt;QR-codes können größer dargestellt werden der Anzeigebereich&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="bedienbarkeit"&gt;Bedienbarkeit&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Default Werkzeugname geändert von &lt;code&gt;name&lt;/code&gt; nach &lt;code&gt;default&lt;/code&gt; zur besseren Verständlichkeit&lt;/li&gt;&#10;&lt;li&gt;Fräser mit geraden Schneiden (also kein V-cut) ist jetzt das Standardwerkzeug&lt;/li&gt;&#10;&lt;li&gt;Erstellen eines Offsets für den XY-Nullpunkt ist jetzt intuitiver gelöst (Y- nach unten, X+ nach Rechts)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="version-12"&gt;Version 1.2&lt;/h2&gt;&#10;&lt;p&gt;Kleine Änderungen zu 1.1, am Wichtigsten die Behebung eines Bugs, bei dem die Aufforderung zum Werkzeugwechsel verloren gehen kann. Außerdem werden die Winkel von V-Fräsern jetzt bei Berechnung von Pixelbreite und Größe der QR-Codes mit einbezogen.&lt;/p&gt;&#10;&lt;h3 id="bugfixes-1"&gt;Bugfixes&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Werkzeugauswahl &lt;code&gt;Tx&lt;/code&gt; und Werkzeugwechselkommando &lt;code&gt;M06&lt;/code&gt; befinden sich nun in derselben Zeile G-Code wie üblich und können so wie gewünscht Makros auslösen.&lt;/li&gt;&#10;&lt;li&gt;Das beim letzten Speichern verwendete Werkzeug wird nicht angezeigt, stattdessen das erste Werkzeug der Liste&lt;/li&gt;&#10;&lt;li&gt;Programmabsturz wenn versucht wird, den Jobstatus zu aktualisieren obwohl keine Gravurparameter vorliegen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="bedienbarkeit-1"&gt;Bedienbarkeit&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Versionsnummer als Kommentar in G-code hinzugefügt&lt;/li&gt;&#10;&lt;li&gt;Prefix &lt;code&gt;qr_&lt;/code&gt; der Zieldatei im Datei-Speichern-Dialog hinzugefügt&lt;/li&gt;&#10;&lt;li&gt;Genauigkeit der Maschinenzeitabschätzung verbessert&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;Der aktuelle Release ist &lt;a href="https://github.com/Schallbert/QR-codengrave/releases" 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; zum Download verfügbar. Das Programm ist für die private Anwendung sowie Schulungszwecke kostenlos. Für weitere Informationen und Projektdokumentation stehen die &lt;a href="https://github.com/Schallbert/QR-codengrave" target="_blank" rel="noopener noreferrer" class="external-link"&gt;readme&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; sowie eine &lt;a href="https://blog.schallbert.de/projects/qr-codengrave/"&gt;Projektseite&lt;/a&gt; zur freien Verfügung.&lt;/p&gt;&#10;&lt;h2 id="upgrade-von-einer-früheren-version"&gt;Upgrade von einer früheren Version&lt;/h2&gt;&#10;&lt;p&gt;Es wird empfohlen, die Persistenzdatei von der alten Version in die neue Version zu übernehmen. Auf diese Weise werden gespeicherte Werkzeuglisten, Gravurparameter und XY-Offsets portiert. Und so geht&amp;rsquo;s:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Wechseln Sie in den Ordner, wo sich das QR-codengrave Programm befindet. Anschließend navigieren Sie zu &lt;code&gt;src/assets&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Kopieren Sie die Datei &lt;code&gt;Persistence.dat&lt;/code&gt; in einen temporären Ordner oder z.B. auf Ihren Desktop.&lt;/li&gt;&#10;&lt;li&gt;Entfernen Sie die alte Version durch Löschen des QR-codengrave Ordners.&lt;/li&gt;&#10;&lt;li&gt;Laden Sie die letzte Version herunter und verschieben Sie sie zur gewünschten Position auf Ihrem Rechner.&lt;/li&gt;&#10;&lt;li&gt;Verschieben Sie nun die vorab zwischengespeicherte &lt;code&gt;Persistence.dat&lt;/code&gt; in den &lt;code&gt;src/assets&lt;/code&gt; Ordner des aktualisierten Programms.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item></channel></rss>