Sonntag, 1. November 2026

Stepcraft CNC mit Raspberry PI steuern

Motivation

Wie in diesem Blogpost (Wow, 12 Jahre her) schon beschrieben, verwende ich LinuxCNC, um meine Stepcraft Fräse zu betreiben.

Mittlerweile habe ich meine D1-420 durch eine D3-840 ersetzt, um etwas größere Dinge auch fräsen zu können.

Nun ergeben sich aber zwei Probleme:

  • Die D3-840 verwendet Achtelschrittbetrieb und kann die Achsen viel schneller bewegen, damit steigt die Anforderung an den "Schritterzeuger"
  • PCs mit eingebauter Parallelschnittstelle sind mittlerweile nicht mehr zu bekommen, bzw. schlicht aufgrund ihres Alters unzuverlässig.
  • Neuere Versionen von LinuxCNC funktionieren tendenziell schlechter mit (sehr) alter Hardware, gleichzeitig will ich ab und zu auch mal im Internet was nachschauen oder brauche eine ssh-Verbindung zu meinem Server. Mit sehr alten LinuxCNC-Versionen gibt es da Sicherheits-Probleme hinsichtlich der Zertifikate und verwendeten Verschlüsselungsmethoden; 
Daher hatte ich schon beim Erwerb der D3-840 den Plan, die Steuerung auf Raspberry Pi umzustellen. Im November 2025 konnte man einen 16GB PI für 200 Euro erwerben.

Direkte Verwendung der GPIO-Pins

Mein erster Ansatz war die direkte Verwendung der GPIO-Pins des Raspberry Pis, um die notwendigen Signale auf dem Parallelport auszugeben.

Ganz direkt geht das aber natürlich nicht, weil die GPIO-Signale des Pis auf 3V laufen, die TTL-Signale einer Parallelport-Schnittstelle aber mit 5V funktionieren. Also habe ich mir einen Parallel Port Hat zugelegt, der die Signale eben entsprechend umsetzen sollte.

Nur ist dieser Hat halt nicht für die Verwendung mit Stepcraft ausgelegt, es kam zu Problemen mit der Spannungsversorgung (Pi konnte nicht mehr starten, wenn die Fräse schon eingeschalten war). Das konnte ich dann zwar durch das Durchtrennen einer Signalleitung beheben und somit schon die Fräse etwas bewegen, aber nach jeweils kurzer Zeit war die Steuerung nicht mehr möglich bzw. sehr unzuverlässig, was auch nicht verwunderlich ist, schließlich ist ein Pi auch kein guter Echtzeit-Signalgeber.

Also musste ich diesen sehr einfachen Ansatz (der HAT kostet nur 30 € plus Versand) aufgeben.

Verwendung der Mesa 7c81 

Die 7c81 ist speziell für den Raspberry Pi ausgelegt, man kann den Pi direkt oben drauf montieren, und die GPIO-Steckerleiste mit dem Eingang der Karte verbinden. Mein Verbindungskabel war leider recht breit, sodass keine Abstandshalter mehr ordentlich Platz fanden.

Um den PI kühl zu halten, habe ich noch einen Armor Lite V5 Kühler oben draufgepackt und so sieht das ganze Paket dann aus:

In diesem Schritt geholfen haben dieser Thread im linuxcnc - Forum und dieses Video auf YouTube.

Bei der ganzen Bastelei habe ich es irgendwann geschafft, den SD-Kartenhalter vom Pi abzureißen, da kann ich nur empfehlen, besser aufzupassen, als ich es getan habe.

Ich war relativ rasch in der Lage, das 7c81 mittels SPI anzusprechen, sodass Befehle wie

cnc@stepberry:~$ mesaflash --device 7c81 --spi --addr /dev/spidev0.0 --readhmid 

zu brauchbarem Output führten.

Recht rasch musste ich dann aber erkennen, dass die Firmware-Pakete, die Mesa für den 7c81 anbietet, keine für Stepcrafts brauchbare Konfiguration anbieten.

Also habe ich mit mithilfe dieses Videos auf Youtube angesehen, wie man denn eine benutzerdefinierte Firmware für Mesakarten anfertigen kann. Das ist insofern nochmal eine besondere Herausforderung, weil die Entwicklungsumgebung dafür offenbar auch schon veraltet ist und für Windows als Oracle Virtual Box Image angeboten wird. Erst später habe ich erkannt, dass ich es vermutlich nativ unter Linux viel leichter gehabt hätte.

Letztlich habe ich dann aber das PIN_5ABOBx3D_57.vhd - File kopiert nach PIN_Stepcraft.vhd und für den P1 Ausgang des 7c81 so konfiguriert:

 

Nach erfolgreichem Übersetzungsvorgang durfte ich eine Datei namens TopGCSPIHostMot2.bit empfangen und sie noch in stepcraft.bin (Zur freien Verwendung, Haftung ausgeschlossen) umbenennen. 

Diese Datei wird nun (zunächst temporär, daher --fallback, später dann ohne diesen Parameter) mittels:

sudo mesaflash --device 7c81 --spi --addr /dev/spidev0.0 --fallback --write stepcraft.bin

sudo mesaflash --device 7c81 --spi --addr /dev/spidev0.0 --fallback --reload

auf die Mesakarte geschrieben und aktiviert. Das sieht im Terminal so aus:


Wenn ich danach mit

cnc@stepberry:~$ mesaflash --device 7c81 --spi --addr /dev/spidev0.0 --readhmid 

die Pin-Belegung auslese, kommt:

 IO Connections for P1+Serial -> 7C81_0
Pin#          I/O   Pri. func    Sec. func        Chan     Sec. Pin func   Sec. Pin Dir

P1-01/DB25-01   0   IOPort       None           
P1-02/DB25-14   1   IOPort       None           
P1-03/DB25-02   2   IOPort       StepGen          0        Dir/Table2      (Out)
P1-04/DB25-15   3   IOPort       None           
P1-05/DB25-03   4   IOPort       StepGen          0        Step/Table1     (Out)
P1-06/DB25-16   5   IOPort       None           
P1-07/DB25-04   6   IOPort       StepGen          1        Dir/Table2      (Out)
P1-08/DB25-17   7   IOPort       PWM              0        PWM             (Out)
P1-09/DB25-05   8   IOPort       StepGen          1        Step/Table1     (Out)
P1-11/DB25-06   9   IOPort       StepGen          2        Dir/Table2      (Out)
P1-13/DB25-07  10   IOPort       StepGen          2        Step/Table1     (Out)
P1-15/DB25-08  11   IOPort       StepGen          3        Dir/Table2      (Out)
P1-17/DB25-09  12   IOPort       StepGen          3        Step/Table1     (Out)
P1-19/DB25-10  13   IOPort       None           
P1-21/DB25-11  14   IOPort       None           
P1-23/DB25-12  15   IOPort       None           
P1-25/DB25-13  16   IOPort       None           
P5 3,6         17   IOPort       None           
P6 3,6         18   IOPort       None           


Danach musste ich PNCConf ausführen und die Konfiguration für Linux CNC erstellen. Nur leider kennt PNCConf natürlich meine benutzerdefinierte Konfiguration nicht.

Außerdem kennt es den Pi5 nicht, da muss man dann im .hal-File statt

loadrt hm2_rpspi...

loadrt hm2_spix...

hinschreiben, damit LinuxCNC überhaupt startet.

Da mit PNCConf kein Blumentopf zu gewinnen war, habe ich die .hal - Datei schlussendlich selber angepasst und durch Versuch und Irrtum herausgefunden, welchen DB25-Pins die einzelnen hm2_7c81.0.gpio.0XX Pins entsprechen:

  • gpio.000 ist wohl Pin 1 (Relais 1, benütze ich, um die Sperrluft einzuschalten)
  • gpio.013 entspricht Pin 10 (Werkzeuglängensensor)
  • gpio.014 entspricht Pin 11 (Not-Aus)
  • gpio.015 entspricht Pin 12 (Endschalter für X/Y/Z)

Nachdem alle Signale korrekt konfiguriert waren, habe ich für die Achsen sogar das Signal kontrolliert (mit einem Logic Pirate). Anschließend habe ich meine Stepcraft D1-420 angeschlossen.

Die gute Nachricht: Es funktioniert prinzipiell, die Achsen lassen sich bewegen, Not-Aus hat Funktion, der Längensensor spricht an.

Aber: Beim Fahren kommt es immer wieder zu "Stottern", man sieht wie die Bewegung der Achse unterbrochen wird. Zunächst dachte ich, der Grund könnte sein, dass auch die 7c81 keine 5V TTL-Signale erzeugt. Die Eingänge sind zwar 5V-tolerant, an den Ausgängen werden aber nur LVTTL Signale erzeugt. Da aber bei TTL und LVTTL ab 2.4V ein "high" Signal gilt, sollte es eigentlich klappen.

Ich habe daher Maßnahmen ergriffen: 

  • Stärkeres 5V Netzteil, das direkt an das 7c81 angeschlossen wird und den Pi mitversorgt.
  • Kürzeres Signalkabel vom Mesa Board zur Fräse 
  • Einen MESA 7i77ISOL galvanic isolator bestellt, um Fräse und Steuerung komplett zu trennen und so hoffentlich kein Rauschen mehr zu haben. Bei der Signalkontrolle mit dem Logic Pirate ist mir nämlich manchmal bei der fallenden Flanke auf dem Takt-Signal ein kurzer Anstieg auf benachbarten Leitungen (darunter auch die Richtungsleitung) aufgefallen

Das stärkere Netzteil und kürzere Signalkabel haben dann seine Wirkung gezeigt. Der galvanic isolator ist nicht ohne weiteres verwendbar, weil der (logischerweise) auf beiden Seiten eine Spannungsversorgung braucht und Stepcraft auf dem Haupt-Stecker aber nirgends die 5V bereitstellt.

Ein letztes Problem stellte dann noch die Steuerung der Frässpindel dar. Für diese muss ja über Parallelport Pin 17 ein PWM Signal geschickt werden, welches dann über  Sub-D-15-Pin 7 an die Steuereinheit weitergeschickt wird. Das hatte ich bei der Custom Firmware mitbedacht, entsprechend groß war meine Enttäuschung, dass die Spindel keinen Mucks tat.

Erst dachte ich wieder an die Spannungslevels (LTTL vs. TTL), aber der wahre Grund war viel banaler: Man muss ja nicht nur das PWM Signal anlegen, sondern auf "Relais 1" (Pin 1 Parallelport bzw. Sub-D-15-Pin 13 auch noch eine 1, damit sich die Spindel dreht.

Eine kurze Anpassung der .hal - Datei, sodass das PWM-Signal korrekt skaliert und die Spindel auch die maximale Drehzahl (20.000 rpm) erreichen kann und schon war das Projekt abgeschlossen.

Leider bleibt immer noch eine Kleinigkeit: Wenn man den Notaus drückt oder die Spindel stoppt, wird der Bildschirm des Raspberry Pi kurz schwarz, begleitet von einer Fehlermeldung in LinuxCNC, dass es ein Problem bei der SPI-Kommunikation gibt. Das hat aber anscheinend keine negativen Auswirkungen, also belasse ich es einmal so. Der Einbau eines Optokopplers wird vielleicht Inhalt eines weiteren Posts.