Alternative Firmware für den 3DTouch Autolevelling Sensor
Die alternative Firmware wird von mir für den Eigengebrauch des Anwenders zur Verfügung gestellt, die Hardware muss weiterhin vom Hersteller bezogen werden. Die ursprüngliche Funktion des Sensors (Ansteuerung per Servo-Signal) geht bei Aufspielen der Alternativ-Firmware unwiderruflich verloren!!!
Die alternative Firmware aufzuspielen ist kein Kinderspiel, bitte nur in Angriff nehmen, wenn "SMD", "0402" und "Feinleitertechnik" für den geneigten Nachbauer keine böhmischen Dörfer sind.
Anwendung auf eigene Gefahr
Der 3DTouch Sensor, funktional und optisch sehr an das Original BLTouch des koreanischen Startupunternehmens ANTCLABS angelehnt, ist dafür gedacht, die Bodenplatte eines 3D-Druckers auszumessen um eine eventuelle Schieflage der Platte per Höhenkorrektur beim Drucken auszugleichen. Der Hersteller bzw. ANTCLABS bietet Anleitungen für die Adaption des Sensors an verschiedene 3D-Drucker sowie Patch -Anleitungen um die 3D-Drucker-Software für den Gebrauch des Sensors zu aktualisieren.
GRBL V1.x in der Standardversion für CNC Fräsen bietet leider keine Unterstützung für den 3DTouch Sensor. Um dennoch nichtleitende Oberflächen auch mit einer durch GRBL befeuerten CNC Fräse abtasten zu können, habe ich die Schaltung analysiert und eine alternative Firmware erstellt, die ohne das Servosignal zur Ansteuerung den gewünschten Effekt bietet – Abtastung einer nichtleitenden Oberfläche mit der CNC-Fräse.
(Das Schaltbild des von mir untersuchten 3DTouch Sensors habe ich auf Wunsch der Erfinderin des original BLTouch, Paris Kyung-yeon Lee, entfernt)
Im Wesentlichen reduziert sich der Einsatz des 3DTouch für GRBL auf das Abtasten über den eingebauten Hall-Effekt-Sensor und die Erzeugung des "Probe"-Impulses bei Berührung der Oberfläche. Die Ansteuerung des Sensors über das Servo-Signal, wie das bei den 3D-Druckern realisiert ist, entfällt komplett, der Taststift wird abhängig vom Probe-Signal zurückgezogen oder ausgefahren. Das Ganze erfolgt in der neuen Firmware zeitgesteuert.
Nach Erkennen einer Berührung am Taststift wird dieser sofort eingezogen, die LED blitzt kurz auf, zeitgleich wird das ZPROBE-Signal Richtung GRBL für 200 ms aktiviert. Nach etwa 500 ms wird der Taststift wieder ausgefahren und kann den nächsten Kontakt melden. Die Abtastbewegung des Fräskopfes darf nicht zu schnell sein, sie muss an diese Zeiten angepasst werden. Langsamer abtasten ist problemlos möglich.
Der initiale Selbsttest des originalen 3DTouch wurde nachempfunden, nach PowerOn wird der Stift mehrfach ausgefahren und eingezogen. Bei Erkennen eines Fehlers (der Taststift ist blockiert und bewegt sich nicht wie erwartet), blinkt die rote LED am Sensor. Tritt dieser Fall ein, wird durch Betätigen des Taststiftes mit der Hand ein erneuter Selbsttestdurchgang angestoßen. Erst wenn bei jeder durch den Selbsttest implizierten Bewegung des Taststiftes der Hall-Sensor einen Impuls erzeugt, wird die Funktion freigegeben, die LED leuchtet zweimal kurz auf und der Taststift bewegt sich in die untere Position, bereit mit der Abtastung zu beginnen.
Die alternative Firmware wird von mir für den Eigengebrauch des Anwenders zur Verfügung gestellt
Die Hardware muss weiterhin vom Hersteller bezogen werden
Die ursprüngliche Funktion des Sensors geht beim Aufspielen der Alternativ-Firmware unwiderruflich verloren!!! (der originale Code kann nicht ausgelesen werden)
Verwendung auf eigene Gefahr
Um die Firmware des 3DTouch zu ändern bzw. neu aufzuspielen, muss der AtTiny13, der auf dem 3DTouch (in der mir vorliegenden Version) aufgelötet ist, zuerst dazu überredet werden, sich programmieren zu lassen.
Hierbei ist es nicht ausreichend, einen HVSP-Programmer zur Hand zu haben, es muss zusätzlich vorher das Lockbit des AtTiny rückgesetzt werden, denn mit gesetztem Lockbit lassen sich die Fuses mit einem HV Serial Programmer zwar auslesen, aber nicht ändern.
Hinweis
“Lockbit zurücksetzen” impliziert vollständiges Löschen des Flashinhalts.
-> Achtung, es gibt keinen Weg zurück zur Originalfirmware!
Die Hardware für die HV-Programmierung eines AtTiny13 ist recht übersichtlich aufgebaut, es existieren mehrere Beschreibungen im Netz.
Ich bin mit der Anleitung von Wayne Holder ins Rennen gegangen, zu finden auf Wayne's Tinkering Page.
Schaltung von Waynes Fuse Resetter
Als Programmer-Arduino habe ich einen Arduino Nano V3 Nachbau verwendet, diesen auf ein kleines Steckbrett gesetzt und lediglich einen BC109C als Schalttransistor für die 12V Spannung sowie zwei Widerstände (R5 und R6) mit je 1k zusätzlich spendiert, wie von Wayne vorgeschlagen. Die anderen Datenleitungen habe ich ohne Serienwiderstände verbunden.
(Click auf das Bild für größere Darstellung)
Das Programm zum Löschen des Lockbit stammt ursprünglich von Krzysztof Adamski, zu finden auf „electronics.stackexchange“ (writing-fuse-bits-with-hv-programmer-doesnt-work - der Link auf sein Github Repository findet sich am Ende seiner eigenen Antwort). Es muss leicht angepasst werden, die verwendeten Pins sind gegenüber der Schaltung von Wayne vertauscht, aber das ist marginal, man darf es nur nicht vergessen.
Update
Ich habe die Fuse Werte an meine Wünsche angepasst und die Pinzuweisung passend geändert. Diese geänderte Version des Programms stelle ich zur Verfügung.
Nachdem das Lockbit rückgesetzt war, können mit der Software von Wayne die gewünschten Fuses gesetzt werden. Ein normaler ISP-Programmer – ich verwende hierfür den „mySmartUSB light“ – funktioniert nach Löschen des Lockbit ebenfalls wieder wie gewohnt.
Die LED des 3DTouch ist am zum normalen IO-Port degradierten RESET-Pin (Pin 1) angeschlossen. Die Verwendung des RESET-Pin als IO-Port funktioniert nur, wenn das Fuse Bit „RSTDISBL“ gesetzt ist. Ist dieses Bit aber gesetzt, kann kein ISP-Programmer verwendet werden, denn der verwendet den RESET-Pin um den AtTiny in den Programmiermodus zu versetzen.
Die LED muss also zum Umprogrammieren des AtTiny an einem anderen Pin angeschlossen werden. Hierfür bietet sich der freigewordene Pin 5 an, wo ursprünglich das jetzt nicht mehr benötigte Servo-Signal an den 3DTouch geführt wird. Die Leitung von Pin 1 zur LED liegt gut zugänglich am Rand der Leiterplatte, kann also leicht mit einem Cutter getrennt werden (siehe Bild, rote Markierungen). Eine dünne Kupferlack-Leitung von der LED zu Pin 5 ist ebenfalls leicht anzulöten (siehe Bild, gelbe Markierung).
Dieser Draht darf nicht zu dick sein und muss möglichst knapp am AtTiny entlang geführt werden, um nicht mit dem Gehäuseteil für die Schraube zu tangieren, das die Einbuchtung der Platine komplett ausfüllt. Über die Oberseite des AtTiny kann der Draht nicht geführt werden, da hier die Führung des Taststiftes fast anliegt.
Der Anschluss „Servo“ (mit „S“ auf der Leiterplatte gekennzeichnet) wird nicht mehr nach außen geführt, der Signalausgang ZERO („Z“) Richtung GRBL-Controller wird stattdessen auf der dritten Leitung des ehemaligen Servo-Kabels geführt, das zweipolige Kabel kann entfallen.
Ebenfalls Probleme machen offenbar die Spannungseinbrüche, die durch das Schalten der Spule impliziert werden, die H-Brücke aus MOSFETs wird von den Signalen des Programmierers angesteuert. Die Spule muss also von der Schaltung mindestens einpolig getrennt werden, damit der Programmieradapter den Chip erkennt.
Update
Im Nachhinein ist das eine Fehleinschätzung meinerseits, denn nachdem ich, wie weiter unten beschrieben, die Möglichkeit geschaffen habe, den µC auch im geschlossenen
Gehäuse zu programmieren, hat sich herausgestellt, dass das Problem beim Programmieren offenbar durch den Ausgang des Halleffekt-Sensors impliziert wurde.
Wird darauf geachtet, dass der Taststift während des Programmiervorgangs ausgefahren bleibt, läuft alles wie erwartet und problemfrei.
Es ist durchaus kein Fehler, den Sensor beim Programmieren mit einer zusätzlichen Spannungsversorgung auszustatten.
Da sich die Möglichkeiten für Feedback am 3DTouch auf die einzelne LED und den von der Spule bewegten Tastpin beschränken, diese beiden Elemente aber zum Programmieren unter Umständen nicht angeschlossen sein dürfen (siehe weiter oben), habe ich die Programmentwicklung auf einem Arduino Nano V3 durchgeführt und erst als alles wunschgemäß implementiert war, einen einmaligen Test auf dem 3DTouch durchgeführt.
Als das funktionierte, wurden alle zusätzlich angelöteten Leitungen entfernt, die LED final mit Pin 5 verbunden und das Gehäuse wieder geschlossen.
Bei der Hantierung am geöffneten 3DTouch muss mit äußerster Vorsicht zu Werke gegangen werden, denn die beiden Anschlüsse der Spule brechen leicht ab. Beim außenliegenden Anschluss der Spule ist das nicht so schlimm, da könnte man einfach eine Windung abwickeln aber wenn der innenliegende Anschluss abreißt, muss die Spule neu gewickelt werden. Das musste ich zum Glück nicht ausprobieren.
Der erste Wurf in Sachen alternative Firmware hat zwar funktioniert, mich aber nicht vollkommen überzeugt. Die weitere Programmentwicklung auf dem Arduino Nano verlief dann etwas schleppend, da die direkte Interaktion des über die Spule bewegten Taststiftes mit dem Hall-Sensor fehlte.
Weitere Änderungen an der Firmware müssen also auf der Zielhardware durchgeführt werden.
Ich habe deshalb für die weitere Programmentwicklung die kurzen Enden des Kupferlackdrahtes der Spule mit zwei Verlängerungen aus HF-Litze versehen. Die Verbindungen zwischen CuL-Draht und Litze sind mit Schrumpfschlauch überzogen, der sich prima nach unten ins Gehäuse zwischen die dort sichtbaren Streben klemmen lässt. Mechanische Einflüsse auf die empfindlichen Spulenanschlüsse sind somit nicht mehr zu befürchten und die Platine lässt sich jetzt sehr einfach und unkompliziert vom Gehäuse abheben, die Litzen wurden entsprechend lang ausgeführt.
Der im Bild sichtbare Orange Draht an Pin 2 des AtTiny ist ein zusätzlicher Anschluss für die HV-Programmierung. Diesen Draht habe ich durch eine Kerbe im Gehäuse nach außen geführt, für eine weitere Durchkontaktierung war kein Platz mehr zu finden. Im weiteren Verlauf der Programmentwicklung wurde er nicht mehr benötigt und entfernt.
Hier ein Blick auf die festgeklemmten Schrumpfschlauch-Verbindungen bei abgehobener Platine:
Damit das Feedback des Taststiftes über den Hall-Sensor funktioniert, muss die Platine normal eingebaut, also plan und passend auf das Gehäuseunterteil aufgelegt sein.
Um auch bei auf das Gehäuseunterteil aufgelegter Platine die Firmware aufspielen zu können, habe ich an einer passenden Stelle auf der Ober- und Unterseite der Platine zwei Kupferflächen freigestellt und mit einem 0,6 mm Bohrer eine neue Durchkontaktierung erzeugt. Der RESET-Anschluss des AtTiny13A wird hiermit auf die Unterseite der Platine geführt. Die Verbindung der freigestellten Kupferfläche mit Pin 1 des µC erfolgt durch einen Klecks Lötzinn.
Tipp: Wer keinen 0,6 mm dünnen Draht zur Hand hat, nimmt ein Reststück eines Widerstands und streckt dieses Stück Draht mittels zweier Zangen. Durch Strecken wird der Draht exakt gerade und vor allem dünner. Gegebenenfalls muss zwei oder mehrfach gestreckt werden. - Strecken: Man nimmt den Draht mit je einer Zange am linken und rechten Ende und zieht sehr stark, ggf. so lange, bis eine Seite des Drahtes abreißt.
Im Bild oben ist die Durchkontaktierung ROT markiert, GELB zeigt den Umriss der Verbindung zwischen Reset-Anschluss des AtTiny und dem neuen Via.
Unten die Durchkontaktierung auf der Unterseite:
Alle anderen für das ICSP notwendigen Signale des AtTiny sind ohnehin auf der Platinenunterseite zugänglich, teilweise über den Stecker für GRBL, teilweise an jetzt freien Pins und im Fall von MISO am Pin 1 des Halleffekt-Sensors. Somit kann die Firmware im Wechsel neu programmiert und sofort - ohne Änderungen am Aufbau - getestet werden. Dabei muss unbedingt darauf geachtet werden, dass der Taststift in der unteren Stellung, also herausgefahren, steht, damit der OpenCollector-Ausgang des Hall-Sensors auf HIGH-Potential liegt und der hier angeschlossene Eingang des AtTiny vom Programmer bedient werden kann.
Die Sourcen der alternativen Firmware für den 3DTouch Sensor stelle ich zum Download als ZIP-Datei zur Verfügung.
Hinweis
Die für die Programmierung des AtTiny13 notwendige Erweiterung der Arduino IDE ist
der von James Sleeman entwickelte Core, der sich einfach über den in der IDE integrierten Boardverwalter installieren lässt.
Für den angedachten Einsatzfall - Abtasten einer nicht leitenden Oberfläche zum Ausgleich von Unebenheiten mit einer CNC-Fräse - empfiehlt es sich, den Sensor, nicht wie bei den 3D-Druckern üblich, irgendwo seitlich der Druckdüse, sondern genau im Zentrum der Frässpindel zu platzieren. Dazu ist ein passender Adapter zu finden, der das Einspannen im Spannfutter der Fräse ermöglicht.
Für einen ersten Test mit der neuen Firmware an der Fräse habe ich eine M3 Schraube durch eines der am Sensor vorhandenen Löcher gesteckt, verschraubt und mit einem Schrumpfschlauch überzogen, damit sie in das 3,14 mm Futter an meiner Spindel passt.
Alsdann wurde eine ziemlich schief abgesägte Scheibe Kirschholz unter dem Sensor platziert und OpenCNCPilot angeworfen, eine Heightmap 20 x 20 mm erzeugt und das Probing gestartet.
Zuerst eine kurze Sequenz vom Einschalten. Die LED wird eingeschaltet, der Taststift wird zweimal hoch und runter bewegt, die LED blitzt zweimal kurz auf, dann ist der Sensor einsatzbereit.
3DTouch - Einschalt-Sequenz (Click auf das Bild führt zu Vimeo)
Hier noch der zweimillionste Film über den 3DTouch im Einsatz, diesmal aber beim Kontur abtasten auf einer CNC-Fräse, deren Controller mit der ungepatchten Standard-Generierung von GRBL 1.1 arbeitet.
3DTouch - Abtastung (Click auf das Bild führt zu Vimeo)
Die Oberfläche der Holzscheibe ist ziemlich schräg, aber immer noch fast glatt. Man sieht jedoch schon hier, dass nach dem Tasten der Stift recht schnell wieder in der unteren Position ankommt (eine halbe Sekunde ist nicht wirklich lang) und zu diesem Zeitpunkt der Sensor fast schon die Oberfläche der Holzscheibe berührt. Das passiert, weil durch die Schräge der Oberfläche der Abstand beim ”bergauf” fahren kleiner wird.
Würde man mit diesen Einstellungen beispielsweise eine stärker konvex oder konkav gekrümmte Oberfläche abtasten, würde der Taststift unweigerlich schon beim horizontalen Verfahren zum nächsten Tastpunkt die Oberfläche berühren, was zu falschen Messungen führt.
Abhilfe bringt entweder eine prinzipiell deutlich größere Ausgangshöhe bevor mit dem Absenken begonnen wird, oder eine adaptive Ausgangshöhe, die sich beispielsweise der Tendenz der letzten beiden (oder mehr) Tastpunkte anpasst.
Mit diesem Setup habe ich einige Zeit problemlos meine nichtleitenden Oberflächen abtasten können. Irgendwann habe ich aber nicht aufgepasst, vergessen die Probe -Leitung Richtung GRBL anzuschließen und der Taststift ist unsanft ins Werkstück gefahren. Dabei ist offenbar der Magnet am oberen Ende des Taststiftes zerbröselt, denn der Stift muss jetzt in eine bestimmte Richtung gedreht werden, damit das Probesignal korrekt und zuverlässig gemeldet wird.
Ich habe also einen zweiten 3DTouch umgebaut.