Commit a2d5cd5d authored by kliment's avatar kliment

Merge pull request #122 from kliment/master

Merge fixes added to master into experimental
parents a2d08fd7 d9193e44
......@@ -23,7 +23,8 @@ Download the following, and install in this order:
## Mac OS X Lion
1. Ensure that the active Python is the system version. (`brew uninstall python` or other appropriate incantations)
2. Download an install [wxPython version 2.9-Carbon](http://wxpython.org/download.php#unstable) (the Cocoa version doesn't work)
2. Download an install [wxPython2.8-osx-unicode] matching to your python version (most likely 2.7 on Lion,
check with: python --version) from: http://wxpython.org/download.php#stable
3. Download and unpack pyserial from http://pypi.python.org/packages/source/p/pyserial/pyserial-2.5.tar.gz
4. In a terminal, change to the folder you unzipped to, then type in: `sudo python setup.py install`
......
......@@ -2,7 +2,7 @@
#Interactive RepRap e axis calibration program
#(C) Nathan Zadoks 2011
#Licensed under CC-BY-SA or GPLv2 and higher - Pick your poison.
t= 60 #Time to wait for extrusion
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
......@@ -11,6 +11,8 @@ 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:
......@@ -42,6 +44,37 @@ 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
......@@ -83,39 +116,36 @@ print "Length extruded: %3d mm"%n
print
print "Serial port: %s"%(port if port else 'auto')
#Connect to printer
w("Connecting to printer..")
p=None
try:
p=printcore(port,115200)
except:
print 'Error.'
raise
while not p.online:
time.sleep(1)
w('.')
print " connected."
def sendcb(self,l):
if l=='G92 E0':
self.hot=True
w("Heating extruder up..")
setattr(p,'hot',False)
p.sendcb=sendcb
p.send_now('M109 S%03d'%temp)
while not p.hot:
time.sleep(1)
w('.')
print " ready."
#Calibration loop
while n!=m:
p.send_now("G92 E0") #Reset e axis
p.send_now("G1 E%d F100"%int(n)) #Extrude length of filament
wait(t,'Extruding.. ')
m=float_input("How many millimeters of filament were extruded? ")
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!
p.disconnect()
#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()
......@@ -72,7 +72,7 @@ class printcore():
"""This function acts on messages from the firmware
"""
self.clear=True
time.sleep(0.5)
time.sleep(1.0)
self.send_now("M105")
while(True):
if(not self.printer or not self.printer.isOpen):
......
......@@ -2,7 +2,9 @@
import cmd, printcore, sys
import glob, os, time
import sys, subprocess
import math
from math import sqrt
if os.name=="nt":
try:
import _winreg
......@@ -22,51 +24,50 @@ def dosify(name):
return os.path.split(name)[1].split(".")[0][:8]+".g"
def measurements(g):
Xcur=0.0
Ycur=0.0
Zcur=0.0
Xmin=1000000
Ymin=1000000
Zmin=1000000
Xmax=-1000000
Ymax=-1000000
Zmax=-1000000
Xtot=0
Ytot=0
Ztot=0
for i in g:
if "X" in i and ("G1" in i or "G0" in i):
try:
Xcur = float(i.split("X")[1].split(" ")[0])
if Xcur<Xmin and Xcur>5.0: Xmin=Xcur
if Xcur>Xmax: Xmax=Xcur
except:
pass
if "Y" in i and ("G1" in i or "G0" in i):
try:
Ycur = float(i.split("Y")[1].split(" ")[0])
if Ycur<Ymin and Ycur>5.0: Ymin=Ycur
if Ycur>Ymax: Ymax=Ycur
except:
pass
if "Z" in i and ("G1" in i or "G0" in i):
try:
Zcur = float(i.split("Z")[1].split(" ")[0])
if Zcur<Zmin: Zmin=Zcur
if Zcur>Zmax: Zmax=Zcur
except:
pass
Xtot = Xmax - Xmin
Ytot = Ymax - Ymin
Ztot = Zmax - Zmin
return (Xtot,Ytot,Ztot,Xmin,Xmax,Ymin,Ymax,Zmin,Zmax)
Xcur=0.0
Ycur=0.0
Zcur=0.0
Xmin=1000000
Ymin=1000000
Zmin=1000000
Xmax=-1000000
Ymax=-1000000
Zmax=-1000000
Xtot=0
Ytot=0
Ztot=0
for i in g:
if "X" in i and ("G1" in i or "G0" in i):
try:
Xcur = float(i.split("X")[1].split(" ")[0])
if Xcur<Xmin and Xcur>5.0: Xmin=Xcur
if Xcur>Xmax: Xmax=Xcur
except:
pass
if "Y" in i and ("G1" in i or "G0" in i):
try:
Ycur = float(i.split("Y")[1].split(" ")[0])
if Ycur<Ymin and Ycur>5.0: Ymin=Ycur
if Ycur>Ymax: Ymax=Ycur
except:
pass
if "Z" in i and ("G1" in i or "G0" in i):
try:
Zcur = float(i.split("Z")[1].split(" ")[0])
if Zcur<Zmin: Zmin=Zcur
if Zcur>Zmax: Zmax=Zcur
except:
pass
Xtot = Xmax - Xmin
Ytot = Ymax - Ymin
Ztot = Zmax - Zmin
return (Xtot,Ytot,Ztot,Xmin,Xmax,Ymin,Ymax,Zmin,Zmax)
def totalelength(g):
tot=0
......@@ -86,59 +87,77 @@ def get_coordinate_value(axis, parts):
if (axis in i):
return float(i[1:])
return None
def hypot3d(X1, Y1, Z1, X2=0.0, Y2=0.0, Z2=0.0):
return math.hypot(X2-X1, math.hypot(Y2-Y1, Z2-Z1))
def estimate_duration(g):
extra_cost_per_movement = 0.02
total_duration = 0.0
feedrate = 0.0
avg_feedrate = 0.0
last_feedrate = 0.0
X_last_position = 0.0
Y_last_position = 0.0
Z_last_position = 0.0
lastx = lasty = lastz = laste = lastf = 0.0
x = y = z = e = f = 0.0
currenttravel = 0.0
totaltravel = 0.0
moveduration = 0.0
totalduration = 0.0
acceleration = 1500.0 #mm/s/s ASSUMING THE DEFAULT FROM SPRINTER !!!!
layerduration = 0.0
layerbeginduration = 0.0
#TODO:
# get device caps from firmware: max speed, acceleration/axis (including extruder)
# calculate the maximum move duration accounting for above ;)
print ".... estimating ...."
for i in g:
i=i.split(";")[0]
if "G1" in i and ("X" in i or "Y" in i or "F" in i or "E" in i):
#if "G1" in i and ("X" in i or "Y" in i or "Z" in i or "F" in i or "E" in i):
parts = i.split(" ")
X = get_coordinate_value("X", parts[1:])
Y = get_coordinate_value("Y", parts[1:])
#Z = get_coordinate_value("Z", parts[1:])
F = get_coordinate_value("F", parts[1:])
E = get_coordinate_value("E", parts[1:])
if "G4" in i or "G1" in i:
if "G4" in i:
parts = i.split(" ")
moveduration = get_coordinate_value("P", parts[1:])
if moveduration is None:
continue
else:
moveduration /= 1000.0
if "G1" in i:
parts = i.split(" ")
x = get_coordinate_value("X", parts[1:])
if x is None: x=lastx
y = get_coordinate_value("Y", parts[1:])
if y is None: y=lasty
z = get_coordinate_value("Z", parts[1:])
if z is None: z=lastz
e = get_coordinate_value("E", parts[1:])
if e is None: e=laste
f = get_coordinate_value("F", parts[1:])
if f is None: f=lastf
else: f /= 60.0 # mm/s vs mm/m
# given last feedrate and current feedrate calculate the distance needed to achieve current feedrate.
# if travel is longer than req'd distance, then subtract distance to achieve full speed, and add the time it took to get there.
# then calculate the time taken to complete the remaining distance
currenttravel = hypot3d(x, y, z, lastx, lasty, lastz)
distance = 2* ((lastf+f) * (f-lastf) * 0.5 ) / acceleration #2x because we have to accelerate and decelerate
if distance <= currenttravel:
moveduration = 2 * distance / ( lastf + f )
currenttravel -= distance
moveduration += currenttravel/f
else:
moveduration = math.sqrt( 2 * distance / acceleration )
if (F is not None):
feedrate = (last_feedrate + (F / 60.0))/2.0
distance = 0
if (X is None and Y is None and E is not None):
distance = abs(E)
elif (X is not None and Y is None):
distance = X - X_last_position
X_last_position = X
elif (X is None and Y is not None):
distance = Y - Y_last_position
Y_last_position = Y
elif (X is not None and Y is not None):
X_distance = X - X_last_position
Y_distance = Y - Y_last_position
distance = sqrt(X_distance * X_distance + Y_distance * Y_distance)
X_last_position = X
Y_last_position = Y
#if (Z is not None):
# Z_distance = Z - Z_last_position
# if not(distance == 0.0):
# distance = sqrt(Z_distance * Z_distance + distance * distance )
# else:
# distance = Z_distance
# Z_last_position = Z
totalduration += moveduration
if z > lastz:
print "layer z: ", lastz, " will take: ", time.strftime('%H:%M:%S', time.gmtime(totalduration-layerbeginduration))
layerbeginduration = totalduration
lastx = x
lasty = y
lastz = z
laste = e
lastf = f
print "Total Duration: " #, time.strftime('%H:%M:%S', time.gmtime(totalduration))
return time.strftime('%H:%M:%S', time.gmtime(totalduration))
if (feedrate == 0.0 or distance == 0.0): continue
time_for_move = distance / feedrate
total_duration += time_for_move + extra_cost_per_movement
if (F is not None): feedrate = F / 60.0
return time.strftime('%H:%M:%S', time.gmtime(total_duration/60.0))
class Settings:
#def _temperature_alias(self): return {"pla":210,"abs":230,"off":0}
#def _temperature_validate(self,v):
......
......@@ -403,7 +403,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
self.serialport.Clear()
self.serialport.AppendItems(portslist)
try:
if self.settings.port in scan:
if os.path.exists(self.settings.port):
self.serialport.SetValue(self.settings.port)
elif len(portslist)>0:
self.serialport.SetValue(portslist[0])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment