Fräse

Bestand: Portalmaschine, ca. 500 × 500 × 200, mit Schrittmotoren und Endschaltern, von ISEL, ohne Stecker. „Flachbetteinheit E18?“ — Ein Link dazu. Vorhandene Hardware für Schrittmotorsteuerung inklusive Box.

Foto 2024 mit Steuerung

Aller Anfang 06/2022

Auftrag: Beides zusammenbringen; notwendige Kabel und Stecker beschaffen; am besten mit MACH4 in Betrieb nehmen.

Dokumentation:

Da sich die passenden M23-Kupplungen nur mit schier endlosen Lieferzeiten liefern lassen (30 Wochen!!) wurden diese kurzerhand durch SubD-Buchsen in ISEL-Belegung ersetzt. Vorläufig gehen die Schalter auf Masse. Die Endschalter öffnen beim Erreichen des Endes! Nur die Z-Achse hat eine Bremse (Elektromagnet). Die SubD-Buchsen befinden sich in einfachen 3D-gedruckten Adaptern.

  1. Motorspule 1A
  2. Motorspule 1B
  3. Motorspule 2A
  4. Motorspule 2B
  5. Bremse (Isel: +24 V)
  6. Bremse
  7. Endschalter motorfern ES2
  8. 0 V, gemeinsamer Anschluss der Endschalter
  9. Endschalter motornah (Referenz) ES1

Wieder zurück 10/2024

Nachdem sich eine Reihe von Maschinenbauern daran abgeeichelt und alles nur verschlimmbessert hat (viele nutzlose 3D-Druckteile) steht das Problem nun wieder vor mir. Die Box ist weg. Es soll zu einer Holzfräse werden. (Doch nicht etwa für Schwibbogen-Zubehör?) Mit einer benutzbaren CNC-Steuerung.

MACH4 oder auch jede andere kostenpflichtige(!) Steueungsoberfläche für Windows ist vom Tisch. Juhu! Es soll nur G-Code fressen können.
Das extra gekaufte Steuerungsgerät CSMIO/IP-S (600 € oder mehr) ist ebenfalls für die Katz! Na endlich! Der Ethernetanschluss macht eh' nur Probleme.
Inzwischen kenne ich mich etwas grbl aus. Beim benachbarten Maschinenbau ist es auf einem Arduino Uno im Einsatz bei einer kleineren Demo-Fräse. Nutzlose Arduinos liegen massenhaft als Fehlkauf herum.

Schlachtplan

Weiter

grbl kennenlernen: Das ist eine Open-Spource-Lösung für ATmega328 und passt dass es pufft und kracht geradeso in die 30 freien KByte Flash des Controllers hinein (aber nur mit avr-gcc 5.3.0), wobei der Uno 2 KByte für seinen seriellen Catarina-Urlader 0,5 KByte für den unbenannten Urlader wegschnappt. Es ist die Ausgangssoftware für alle 3D-Drucker. grbl verarbeitet G-Code, der vom PC über die serielle Schnittstelle „eingeströmt“ (per XON/XOFF-Protokoll gedrosselt) kommt, kann Geraden- und Kreisinterpolation machen sowie Geradenstücke nahtlos zusammensetzen. Die Ausgabe sind STEP- und DIR-Signale für die gängigen chinesischen (Mikro-)Schrittmotor-Endstufen. Mit beachtlichen 30 kHz Schrittfrequenz. (Meine alte machte nur 8 kHz, auf einem ATmega8, aber dafür auch Mehrfachschritte einer Mikroschritt-Endstufe.) Ist für genau 3 Achsen und 3 Endschalter — sowie 1 PWM-Ausgang zur Geschwindigkeitsvorgabe der Werkzeugspindel. Kommandos zur Handbedienung (Jog) sind ebenfalls implementiert aber dürftig dokumentiert. Einigermaßen verständlicher C-Quelltext. Leider überhaupt kein C++, dadurch unschön strukturiert: Alles im globalen Namensraum.

Die Bremse der Z-Achse macht deutlich hörbare Klickgeräusche und hat folgende gemessene Eigenschaften:

Daher ist es am besten, die Bremse mit einer Stromkontrolle zu betreiben, um die Eigenerwärmung der Z-Achse zu minimieren.

Der Freigabeeingang der Schrittmotortreiber ist ein Disable-Eingang! Ohne Beschaltung schluckt dieser 0,5 A bei 24 V (bei maximal eingestelltem Schrittmotor-Spulenstrom). Mit 5 V 30 mA.

Schlachtplan:

grbl und Synchronisation: Ein Armutszeugnis!

Gegrübelt habe ich einige Zeit, wie beim aktuellen Firmware-Stand das Streaming von g-code vonstatten gehen soll, ohne Pufferüberläufe. Ich bin davon ausgegangen, dass man der Fräse einfach mit

copy /b gcodefile.gcode com9
die abzuarbeitenden Schritte aus dem CAM-Postprozessor überträgt und sich eine wie-auch-immer-geartete Synchronisationslogik um die Drosselung der Übertragung kümmert, damit keine Pufferüberläufe auftreten.

Da gcode 7-Bit-ASCII ist, bietet sich zur Synchronisation das XON/XOFF-Protokoll an.

Unter Windows lässt sich XON/XOFF zur Synchronisation zwar aktivieren, die Wirkung verpufft jedoch durch den relativ großen Puffer des USB-Seriell-Konverters. Das heißt, ehe XOFF beim Empfänger ankommt müssen sämtliche noch gepufferten Sendedaten raus, oder es wird erst nach einer Zeitüberschreitung gesendet, da der Konverter vermeiden will, lauter 1-Byte-Pakete zu senden. Dabei bietet USB selbst einen Synchronisierungsmechanismus an: Bei USB drohen schlicht keine Pufferüberläufe: Kann ein USB-Device keine Daten entgegennehmen, antwortet es auf das OUT-Paket mit NAK. Und kann der USB-Host keine Daten entgegennehmen, sendet er keine IN-Tokens.

Gängige, zumeist in Python geschriebene „G-Code-Sender“ gehen den folgenden oder ähnlichen Umweg:

Das hat zur Folge, dass die Maschine, je nach USB-Seriell-Konverter, gelegentlich auf Geschwindigkeit 0 herunterfährt oder hängen bleibt. Ein Irrweg!

Die richtige Lösung ist demnach XON/XOFF auf dem USB-Seriell-Konverter! Leider sieht der CDC-Standard (IMHO) keine Lösung dafür vor. Daher fallen Arduino-Uno-Nachbauten aus China mit generischem USB-Seriell-Konverter-Chip heraus. Hinreichend originale Unos mit ATmega16U2 als USB-Seriell-Konverter lassen sich jedoch umprogrammieren, um XON/XOFF permanent zu aktivieren.

ATmega16U4-Firmware ohne LUFA!!! Drei Geräte: HID, WebUSB, CDC. Mit LandingPage. Zurzeit nur CDC. Also ohne LandingPage. Für HID fehlt eh' noch ein Endpoint.

Das Problem mit dem avrdude löste sich durch Anwendung des altmodischen avr-size -C: Der ATmega16U4 hat ja nur ein halbes Kilobyte RAM und war schlicht zu voll! Und modernere avr-size bemerken das nicht, weil sie keine Füllgradausgabe haben: Benutzerunfreundlichkeit von GNU-Software at its best!

Das XON/XOFF-Protokoll funktioniert nun endlich korrekt, und das sogar mit 2 MBaud. Entscheidend war (1) die Empfangs-ISR mit Tail-Chaining auszustatten und (2) das XOFF nicht via Interrupt sondern direkt aus der Empfangs-ISR zu senden.

Bedienoberfläche

Herrjemine, bevor ich irgendwas brauchbares in die Finger bekomme, lieber gleich als Webanwendung programmieren.

Äpp

Verbleibende Bugs

Zurzeit hängt es noch an folgenden Punkten:

Siehe auch: