printrun-src/calibrateextruder.py

changeset 15
0bbb006204fc
child 45
c82943fb205f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/printrun-src/calibrateextruder.py	Fri Jun 03 09:16:07 2016 +0200
@@ -0,0 +1,168 @@
+#!/usr/bin/env python
+# This file is part of the Printrun suite.
+#
+# Printrun is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Printrun is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Printrun.  If not, see <http://www.gnu.org/licenses/>.
+
+# Interactive RepRap e axis calibration program
+# (C) Nathan Zadoks 2011
+
+s = 300  # Extrusion speed (mm/min)
+n = 100  # Default length to extrude
+m = 0  # User-entered measured extrusion length
+k = 300  # Default amount of steps per mm
+port = '/dev/ttyUSB0'  # Default serial port to connect to printer
+temp = 210  # Default extrusion temperature
+
+tempmax = 250  # Maximum extrusion temperature
+
+t = int(n * 60) / s  # Time to wait for extrusion
+
+try:
+    from printdummy import printcore
+except ImportError:
+    from printcore import printcore
+
+import time
+import getopt
+import sys
+import os
+
+def float_input(prompt=''):
+    f = None
+    while f is None:
+        s = raw_input(prompt)
+        try:
+            f = float(s)
+        except ValueError:
+            sys.stderr.write("Not a valid floating-point number.\n")
+            sys.stderr.flush()
+    return f
+def wait(t, m=''):
+    sys.stdout.write(m + '[' + (' ' * t) + ']\r' + m + '[')
+    sys.stdout.flush()
+    for i in range(t):
+        for s in ['|\b', '/\b', '-\b', '\\\b', '|']:
+            sys.stdout.write(s)
+            sys.stdout.flush()
+            time.sleep(1.0 / 5)
+    print
+def w(s):
+    sys.stdout.write(s)
+    sys.stdout.flush()
+
+
+def heatup(p, temp, s = 0):
+    curtemp = gettemp(p)
+    p.send_now('M109 S%03d' % temp)
+    p.temp = 0
+    if not s: w("Heating extruder up..")
+    f = False
+    while curtemp <= (temp - 1):
+        p.send_now('M105')
+        time.sleep(0.5)
+        if not f:
+            time.sleep(1.5)
+            f = True
+        curtemp = gettemp(p)
+        if curtemp: w(u"\rHeating extruder up.. %3d \xb0C" % curtemp)
+    if s: print
+    else: print "\nReady."
+
+def gettemp(p):
+    try: p.logl
+    except: setattr(p, 'logl', 0)
+    try: p.temp
+    except: setattr(p, 'temp', 0)
+    for n in range(p.logl, len(p.log)):
+        line = p.log[n]
+        if 'T:' in line:
+            try:
+                setattr(p, 'temp', int(line.split('T:')[1].split()[0]))
+            except: print line
+    p.logl = len(p.log)
+    return p.temp
+if not os.path.exists(port):
+    port = 0
+
+# Parse options
+help = u"""
+%s [ -l DISTANCE ] [ -s STEPS ] [ -t TEMP ] [ -p PORT ]
+        -l      --length        Length of filament to extrude for each calibration step (default: %d mm)
+        -s      --steps         Initial amount of steps to use (default: %d steps)
+        -t      --temp          Extrusion temperature in degrees Celsius (default: %d \xb0C, max %d \xb0C)
+        -p      --port          Serial port the printer is connected to (default: %s)
+        -h      --help          This cruft.
+"""[1:-1].encode('utf-8') % (sys.argv[0], n, k, temp, tempmax, port if port else 'auto')
+try:
+    opts, args = getopt.getopt(sys.argv[1:], "hl:s:t:p:", ["help", "length=", "steps=", "temp=", "port="])
+except getopt.GetoptError, err:
+    print str(err)
+    print help
+    sys.exit(2)
+for o, a in opts:
+    if o in ('-h', '--help'):
+        print help
+        sys.exit()
+    elif o in ('-l', '--length'):
+        n = float(a)
+    elif o in ('-s', '--steps'):
+        k = int(a)
+    elif o in ('-t', '--temp'):
+        temp = int(a)
+        if temp >= tempmax:
+            print (u'%d \xb0C? Are you insane?'.encode('utf-8') % temp) + (" That's over nine thousand!" if temp > 9000 else '')
+            sys.exit(255)
+    elif o in ('-p', '--port'):
+        port = a
+
+# Show initial parameters
+print "Initial parameters"
+print "Steps per mm:    %3d steps" % k
+print "Length extruded: %3d mm" % n
+print
+print "Serial port:     %s" % (port if port else 'auto')
+
+p = None
+try:
+    # Connect to printer
+    w("Connecting to printer..")
+    try:
+        p = printcore(port, 115200)
+    except:
+        print 'Error.'
+        raise
+    while not p.online:
+        time.sleep(1)
+        w('.')
+    print " connected."
+
+    heatup(p, temp)
+
+    # Calibration loop
+    while n != m:
+        heatup(p, temp, True)
+        p.send_now("G92 E0")  # Reset e axis
+        p.send_now("G1 E%d F%d" % (n, s))  # Extrude length of filament
+        wait(t, 'Extruding.. ')
+        m = float_input("How many millimeters of filament were extruded? ")
+        if m == 0: continue
+        if n != m:
+            k = (n / m) * k
+            p.send_now("M92 E%d" % int(round(k)))  # Set new step count
+            print "Steps per mm:    %3d steps" % k  # Tell user
+    print 'Calibration completed.'  # Yay!
+except KeyboardInterrupt:
+    pass
+finally:
+    if p: p.disconnect()

mercurial