Skip to main content

Es ist schon ein Weilchern her

das ich meine CNC Fräsmaschine gebaut habe. Ganz am Anfang war mein Ziel eine Machine zu bauen die komplett selbst hergestellt ist, das bedeutet also alle mechanische Bauteile aus standard Halbzeugen, in meinem Fall Stahlplatten, selbst herstellen mit den mir zur Verfügung stehenden Maschinen. Dann wollte ich die Antriebe aus gewöhnlichen DC Motoren mit angekoppelter Positionsgebern aufbauen um einen Servoantrieb zu erhalten. Auch die Steuerung der Servos, des Interpolators und des Positionsintegrators wollte ich komplett in einem kleinen! ATMega mit gerade einmal 4096 Byte Arbeitspeicher implementieren.

Das habe ich 2014 fertiggestellt und das Resultat ist auf der Seite "Meine CNC Fräsmaschine" zu sehen.

Neue technologische Basis, Corona machts möglich...

Die letzten Jahre hat die Maschine dann im Keller verbracht und Patina angesetzt.
Schade eigentlich -- obwohl Patina bei Oldtimern sogar wertsteigernd wirken kann. 

Da Corona meine Betätigung außer Haus ziemlich einschränkte, dachte ich irgentwann darüber nach das alte Projekt wieder auszugraben und auf die Höhe der Zeit zu bringen. Deshalb überlegte ich mir eine neuere Architektur auf Microcontroller-Basis, habe mich dann aber daran erinnerte wie die vielen Nebenbaustellen bei der Entwicklung auf dem Atmel Microcontroller mir doch sehr viel an Aufwand besorgt hatten.

  • Wo die Programme speichern?
  • Wie das Benutzerinterface anzeigen?
  • Wie den knappen Arbeitsspeicher aufteilen?
  • Wie die geringe Performance optimal nutzen?

Sicherlich spielen bei neueren Mikroprozessoren die letzten beiden Themen für eine CNC nicht mehr die Hauptrolle, Entwicklung auf einer Plattform ohne Betriebsystem macht den Prozess jedoch viel schwieriger.

Da ich bereits mehrere Projekte auf der Linuxplatform mit einem Raspberry Pi umgesetzt hatte, war mir der kleine Zwerg schon ein bischen ans Herz gewachsen und ich begann die ersten Ideen gedanklich auf diesem System zu projektieren. Die vier obigen Herausforderungen bestehen auf dieser Plattform überhaupt nicht, es gibt aber eine neue.

  • Brauche ich ein echtzeit Unix oder reicht ein normales Raspian?

Um das heraus zu finden entschloss ich mich zu einem Versuch mit einer Achse. Sollte es möglich sein eine Achse vernünftig anzusteuern, dann kann ich entscheiden ob die weitere Umsetzung der Steuerung Sinn macht. Von Vorteil war für die Linuxvariante auch, daß aller bestehender Kode aus dem alten Projekt in C geschrieben war und weiterverwendet werden konnte.

Die alte Maschinenhardware sollte komplett weiterbenutzt werden, außer den beiden defekten Achsenkodern die ich ersetzen musste. Durch eine Unachtsamkeit meinerseits habe ich aus Versehen die drei Enkoder gleichzeitig mit einer 12V Spannungsversorgung verbunden, die beiden EnDat vertragen jedoch nur 5V und haben deshalb das Zeitliche gesegnet.
Vorteilhaft ist durch die drei neuen Enkoder die Einheitlichkeit aller Achsmeßsysteme, statt wie vorher EnDat und ein SSI gemixt zu verwenden.

 

Los gehts

Für die ersten Tests habe ich eine Achseinheit aus der Maschine demontiert um die neuen Enkoder provisorisch anzuflanschen. Die Enkoder sind mit einem Bauteil zum Spielausgleich und zur Kraftentkopplung an die Achswelle angeschlossen.

Das silbrige Teil im Bild ist der ROQ 425 Absolutgeber von Heidenhain, hiermit werden die Positionswerte -- oder besser die Rotationswerte -- der Achse ermittelt. Das geschieht bei diesem Modell absolut, was für mich ein entscheidendes Kriterium beim Kauf war.
Wird ein Enkoder verwendet der lediglich inkremental Werte liefert stellt das im laufenden Betrieb zwar keinerlei Unterschied dar, nur nach einer Trennung der Netzspannung verliert die Maschine jegliche Information über ihre aktuelle Position. Wird die Maschine mit einem solchen Geber neu gestartet ist eine Referenzfahrt nötig.
Mit einem Absolutgeber ist das völlig anders. Sofort nach dem Einschalten steht die letzte Position wieder zur Verfügung und die Maschine braucht nicht referenziert zu werden.

Der DC Antriebsmotor ist mit einem Zahnriemen an die Gewindestange angekoppelt. Hierbei handelt es sich um einen Getriebemotor der im Modellbau eingesetzt wird. Der Motor wird mit einer Niederspannung von 12V betrieben.

Das Lesen der Enkoderwerte

Der nächste Schritt war jetzte die Entwicklung der Servologik um eine geregelte Achse zu erhaltenn die auf definierte Positionen fahren kann.
Der Drehgeber und der Motor bilden mit einer in C programmierten Steuerung dabei das Servomodul.

Um die Daten aus dem Heidenhain Geber ROQ 525 auszulesen habe ich die Hardwareempfehlung von Heidenhain befolgt und mit den vorgegebenen RS485 Treibern auf einem Breadboard die Schaltung verdrahtet.
Die Heidenhaingeber konnte ich günstig über Ebay beziehen, lediglich die "fachmännisch" per Seitenschneidet abgeschnittenen Kabelenden mußte ich mit einem Kabel und Stecker wieder in Ordnung bringen.
Immerhin waren die Geber wegen der unsachgemäß abgeschnittenen Kabel äußerst günstig.

Auf dem Breadboard werkeln hier zwei LTC1485 ICs, die die CL Schnittstelle zur Datenübertragung zum/vom Geber bilden. Um die Signalpegel des Raspberry mit 3,3V Signalen zu bedienen wurde ein entsprechender Pegelwandler nachgeschaltet.

Ursprünglich hatte ich auch die Leistungselektronik für die Ansteuerung der Motoren in Eigenregie entwickelt und mir eine Platine mit den entsprechenden Treibern aufgebaut.
Aber diesmal wollte ich lieber eine Baugruppe zukaufen die diesen Part übernimmt, auch um später bei defekten die einzelne Module einfach tauschen zu können.

Mir sind bei der Recherche im Internet dabei die Kontroller von Pololu aufgefallen die sehr schöne konfigurierbar und mittels verschiedenster Kanäle ansteuerbar sind. Die Variante 24v12 mit der ein DC Motor angesteuert werden kann wurde dann mein Favorit. Der Baustein wird per USB angesteuert und über ausreichende geschirmte Anschlußleitungen angeschlossen.
Günstige Kabel sollten bei dieser Anwendung, wegen der auftretenden hohen Frequenzen, nicht werwendet werden.

In einem Schaltkasten ist hier die erste Achse noch provisorisch angeschlossen.
Zu sehen ist die Elektronik für die Kommunikation mit den Drehgebern, rechts die drei Treiberbausteine um die Motoren zu steuern. Der Raspberry PI der als das Rechenkern der Steuerung fungiert ist seitlich angeordnet.

Mit diesem Aufbau wurden die ersten Tests durchgeführt.

Erster Test mit der Linux Steuerung auf dem Raspberry

Hier wird der erste Bewegungsversuch gezeigt.
Zu sehen ist wie die Achse mit einer geregelten Geschwindigkeitsvorsteuerung bewegt werden.

Das hier ablaufende Programm steigert kontinuierlich die geregelte Geschwindigkeit bis zu einem definierten Maximalwert, dann fällt die Geschwindigkeit wieder auf Null ab.
Jetzt dreht sich die Bewegungsrichtung und der gleiche Zyklus läuft in die andere Richtung nochmals ab.

Das Ergebnis des ersten Bewegungsversuchs war schon ganz vielversprechend. Die Achsreglung ließ sich auf dem Raspberry unter Linux wie zu erwarten realisieren.
Nur gilt das auch für eine Positionsreglung die drei Achsen simultan bewegt?

Um das herauszufinden war jedoch erst noch etwas vorarbeit nötig. Die Ansteuerelektronik auf dem Breadboard mußte um zwei Achsen erweitert werden. Zwei weitere Achskontroller mußten installiert und angeschlossen werden und auch die Software mußte die Kontroller bedienen.

Im Bild ist das Breadboard zu erkennen auf dem alle SSI Kreise voll aufgebaut sind.
Ursprünglich wurden die Kontroller lediglich per RS232 an den Raspberry angebunden. Später sollte sich erweisen daß die Antriebskontroller für so starke Störungen sorgen daß die Datenübertragung von den Achsenkodern und den Kontrollern guter Schirmung bedarf.

In der aktuellen Ausbaustufe ist die Datenübertragung umgestellt worden auf USB Bus, da hier die Schirmung, bei entsprechend guten Kabeln, kein Problem mehr darstellt.

 

Migration der CNC Steuerung und Neuentwicklungen

Nachdem nun die vorarbeiten der Elektrik und Sensorik abgeschlossen waren, war der Jetzt folgende Schritt die Migration des früheren Microkontrollerkodes auf Linux. Zusätzlich dazu mußte ebenfalls eine neue Ansteuerung des Benutzerinterfaces implementiert und Designt werden, da der Mikrokontroller lediglich per Terminal angebunden war.
Mit Linux habe ich dabei bewußt auf XWindows verzichtet und mir vorgenommen auf der Konsole per Graphikmapping die nötigen Liniengrafiken einzublenden.

Um hierbei auch die neuen Möglichkeiten unter Linux auszunutzen habe ich alle Anzeige und Verarbeitungsbereiche in eigenständige Tasks ausgelagert.
Es gibt jetzt

  • einen Anzeige Task
  • einen EVA Task
  • einen RS Task
  • einen Peripherie Task

Die Impolementierung der Grundlegenden Funktionen und die Darstellung eines minimalen UI konnte somit in Angriff genommen werden.

 

Das Benutzerinterface ist einer Maschine aus den 80er Jahren nachempfunden die ich als Jugendlicher zu programmieren gelernt hatte. Die ACIERA F45 war die weltweit erste HSC Fräsmaschine die es gab, die Anlage war von der Geschwindigkeit her der Porsche unter den Fräsmaschinen.

Das Benutzerinterface der Schweizer Maschine war auf einem Textterminal (VT320) dargestellt, Grafiken wurden auf einem zweiten Monitor angezeigt.
Das wollte ich allerdings so nicht mehr nachbauen und habe mich für ein überlappendes Design entschieden.
Auf den Bildern ist der NC Editor mit dem eingegebenen ISO Kode zu sehen und auch die Grafische Split-Screen Ansicht der Bearbeitungspfade des gerade laufenden NC Programms.

Die Implementierung des Benutzerinterfaces ging recht schnell von statten, mit dem Anzeige Task war das auch recht elegant umzusetzen.
Die Migration der PID Reglerkaskaden für die Positionsreglung hingegen hat mir einiges Kopfzerbrechen beschert. Der Unterschied zwischen einem preemptiven Scheduler und einem Mikrokontroller Echtzeitsystem ist dann halt doch ein meilenweiter Unterschied und etwas ganz anderes.
Allerdings stellt das Betriebsystem mir, im Gegensatz zum Mikrokontroller, den Luxus eines Dateisystems zur Verfügung. Das brauchte ich in der neuen Version der Steuerung zum Glück nicht mehr selbst implementieren.

Fertigstellen der endgültigen Platine

Da der CNC Integrator und das Benutzerinterface waren jetzt auf einem passablen Stand angekommen, darum wollte ich mich jetzt der bislang provisorischen Ansteuerelektronik zuwenden.

Wie schon erwähnt, die Maschine ist ein Nachbau einer Maschine aus den 80er Jahren. Zu dieser Zeit wurden elektronische Schaltungen gerne in Wirewraptechnik bearbeitet. Dabei werden auf einer Lochplatine die Bauteile angeordnet und mit Wirewrap werden Pins zu Pins verbunden. Diese Technik wurde auch bereits im AGC (Apollo Guidance Computer) des Lunar Lander Moduls der Apollo Missionen verwendet.
Die Vorteile liegen auf der Hand.

  • Man kommt sehr schnell zu einem Ergebnis!
  • Die Verbindungen sind qualitativ sogar besser als gelötete Verbindungen.
  • Änderungen sind leicht möglich, da ein Pin genauso schnell gewrapped wie entwrapped ist.
  • Bis 10MHz Frequenzgang kann die Verbindungsart problemlos angewendet werden, erst danach nehmen die Störungen überhand.
  • Debugging an den Pins mit einem Logikanalysator ist ganz einfach möglich, da jeder Pin einen stehenden Pfosten zum wrappen besitzt.

Nachdem die Schaltung gewrapped war habe ich mir dann alle Signalverläufe mit meinem Logikanalysator angesehen um sicherzustellen daß auch jeder Sensor richtig ausgelesen wurde und die richtigen Antworten liefert. Hierbei stellte sich das einzige Problem heraus das ein nicht Echtzeitkernel wie der vom Raspian Linux hat. Die zyklisch stattfinden Auslesung der Positionswerte schlägt bei jedem zuschlagen der präempiven Umschaltung fehl. Dieser Umstand kann Softwaretechnisch auch leider nicht direkt begegnet werden.

Zum sicherstellen der sicheren Positionsübertragung und um diesen Umstand in den Griff zu bekommen, wurde eine Fehlerkorrektur implementiert die den aufgetretenen Lesefehler erkennen und auch korrigieren kann.

 

Die fertig aufgebaute Platine mit angedocktem Raspberry Pi

Die fertige Maschine

Die fertige Maschine mit einer HSC Spindel für Fräsdrehzahlen bis 20000 U/min. Die HSC Spindel ist Wassergekühlt um die Lautstärke während dem Betrieb zu reduzieren.
Die Spindel kann per Programmkode angesteuert werden.

M3einschalten
M5ausschalten
SnnnnDrehzahl einstellen von 9000-20000 U/min

Die Frässpindel ist per MODBUS an die CNC angekoppelt und wird auch Drehzahlüberwacht. Wird z.B. in einem ISO Programm die Anweisung M3 S9000 programmiert, die Spindel kommt aber nicht auf die vorgegebene Drehzahl innerhalb der vorgegebenen Zeit wird ein Fehler ausgegeben und der Programmlauf stoppt mit NOTHALT.

 

Ein Beispiel einer Fräsarbeit.
Ein Schlüsselanhänger mit Porsche Logo.

Das ist ein Beispiel einer 3D Fräsaufgabe.
Ein Seilrad aus Aluminium das für einen Flaschenzug verwendet wird.