aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/hall_filament_width_sensor.py
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/extras/hall_filament_width_sensor.py')
-rw-r--r--klippy/extras/hall_filament_width_sensor.py181
1 files changed, 98 insertions, 83 deletions
diff --git a/klippy/extras/hall_filament_width_sensor.py b/klippy/extras/hall_filament_width_sensor.py
index 865e49af..75fea987 100644
--- a/klippy/extras/hall_filament_width_sensor.py
+++ b/klippy/extras/hall_filament_width_sensor.py
@@ -9,34 +9,35 @@ ADC_REPORT_TIME = 0.500
ADC_SAMPLE_TIME = 0.03
ADC_SAMPLE_COUNT = 15
+
class HallFilamentWidthSensor:
def __init__(self, config):
self.printer = config.get_printer()
self.reactor = self.printer.get_reactor()
- self.pin1 = config.get('adc1')
- self.pin2 = config.get('adc2')
- self.dia1=config.getfloat('Cal_dia1', 1.5)
- self.dia2=config.getfloat('Cal_dia2', 2.0)
- self.rawdia1=config.getint('Raw_dia1', 9500)
- self.rawdia2=config.getint('Raw_dia2', 10500)
- self.MEASUREMENT_INTERVAL_MM=config.getint('measurement_interval',10)
+ self.pin1 = config.get("adc1")
+ self.pin2 = config.get("adc2")
+ self.dia1 = config.getfloat("Cal_dia1", 1.5)
+ self.dia2 = config.getfloat("Cal_dia2", 2.0)
+ self.rawdia1 = config.getint("Raw_dia1", 9500)
+ self.rawdia2 = config.getint("Raw_dia2", 10500)
+ self.MEASUREMENT_INTERVAL_MM = config.getint("measurement_interval", 10)
self.nominal_filament_dia = config.getfloat(
- 'default_nominal_filament_diameter', above=1)
- self.measurement_delay = config.getfloat('measurement_delay', above=0.)
- self.measurement_max_difference = config.getfloat('max_difference', 0.2)
- self.max_diameter = (self.nominal_filament_dia
- + self.measurement_max_difference)
- self.min_diameter = (self.nominal_filament_dia
- - self.measurement_max_difference)
- self.diameter =self.nominal_filament_dia
- self.is_active =config.getboolean('enable', False)
- self.runout_dia_min=config.getfloat('min_diameter', 1.0)
- self.runout_dia_max=config.getfloat('max_diameter', self.max_diameter)
- self.is_log =config.getboolean('logging', False)
+ "default_nominal_filament_diameter", above=1
+ )
+ self.measurement_delay = config.getfloat("measurement_delay", above=0.0)
+ self.measurement_max_difference = config.getfloat("max_difference", 0.2)
+ self.max_diameter = self.nominal_filament_dia + self.measurement_max_difference
+ self.min_diameter = self.nominal_filament_dia - self.measurement_max_difference
+ self.diameter = self.nominal_filament_dia
+ self.is_active = config.getboolean("enable", False)
+ self.runout_dia_min = config.getfloat("min_diameter", 1.0)
+ self.runout_dia_max = config.getfloat("max_diameter", self.max_diameter)
+ self.is_log = config.getboolean("logging", False)
# Use the current diameter instead of nominal while the first
# measurement isn't in place
self.use_current_dia_while_delay = config.getboolean(
- 'use_current_dia_while_delay', False)
+ "use_current_dia_while_delay", False
+ )
# filament array [position, filamentWidth]
self.filament_array = []
self.lastFilamentWidthReading = 0
@@ -47,41 +48,38 @@ class HallFilamentWidthSensor:
self.toolhead = self.ppins = self.mcu_adc = None
self.printer.register_event_handler("klippy:ready", self.handle_ready)
# Start adc
- self.ppins = self.printer.lookup_object('pins')
- self.mcu_adc = self.ppins.setup_pin('adc', self.pin1)
+ self.ppins = self.printer.lookup_object("pins")
+ self.mcu_adc = self.ppins.setup_pin("adc", self.pin1)
self.mcu_adc.setup_adc_sample(ADC_SAMPLE_TIME, ADC_SAMPLE_COUNT)
self.mcu_adc.setup_adc_callback(ADC_REPORT_TIME, self.adc_callback)
- self.mcu_adc2 = self.ppins.setup_pin('adc', self.pin2)
+ self.mcu_adc2 = self.ppins.setup_pin("adc", self.pin2)
self.mcu_adc2.setup_adc_sample(ADC_SAMPLE_TIME, ADC_SAMPLE_COUNT)
self.mcu_adc2.setup_adc_callback(ADC_REPORT_TIME, self.adc2_callback)
# extrude factor updating
self.extrude_factor_update_timer = self.reactor.register_timer(
- self.extrude_factor_update_event)
+ self.extrude_factor_update_event
+ )
# Register commands
- self.gcode = self.printer.lookup_object('gcode')
- self.gcode.register_command('QUERY_FILAMENT_WIDTH', self.cmd_M407)
- self.gcode.register_command('RESET_FILAMENT_WIDTH_SENSOR',
- self.cmd_ClearFilamentArray)
- self.gcode.register_command('DISABLE_FILAMENT_WIDTH_SENSOR',
- self.cmd_M406)
- self.gcode.register_command('ENABLE_FILAMENT_WIDTH_SENSOR',
- self.cmd_M405)
- self.gcode.register_command('QUERY_RAW_FILAMENT_WIDTH',
- self.cmd_Get_Raw_Values)
- self.gcode.register_command('ENABLE_FILAMENT_WIDTH_LOG',
- self.cmd_log_enable)
- self.gcode.register_command('DISABLE_FILAMENT_WIDTH_LOG',
- self.cmd_log_disable)
+ self.gcode = self.printer.lookup_object("gcode")
+ self.gcode.register_command("QUERY_FILAMENT_WIDTH", self.cmd_M407)
+ self.gcode.register_command(
+ "RESET_FILAMENT_WIDTH_SENSOR", self.cmd_ClearFilamentArray
+ )
+ self.gcode.register_command("DISABLE_FILAMENT_WIDTH_SENSOR", self.cmd_M406)
+ self.gcode.register_command("ENABLE_FILAMENT_WIDTH_SENSOR", self.cmd_M405)
+ self.gcode.register_command("QUERY_RAW_FILAMENT_WIDTH", self.cmd_Get_Raw_Values)
+ self.gcode.register_command("ENABLE_FILAMENT_WIDTH_LOG", self.cmd_log_enable)
+ self.gcode.register_command("DISABLE_FILAMENT_WIDTH_LOG", self.cmd_log_disable)
self.runout_helper = filament_switch_sensor.RunoutHelper(config)
+
# Initialization
def handle_ready(self):
# Load printer objects
- self.toolhead = self.printer.lookup_object('toolhead')
+ self.toolhead = self.printer.lookup_object("toolhead")
# Start extrude factor update timer
- self.reactor.update_timer(self.extrude_factor_update_timer,
- self.reactor.NOW)
+ self.reactor.update_timer(self.extrude_factor_update_timer, self.reactor.NOW)
def adc_callback(self, read_time, read_value):
# read sensor value
@@ -91,32 +89,39 @@ class HallFilamentWidthSensor:
# read sensor value
self.lastFilamentWidthReading2 = round(read_value * 10000)
# calculate diameter
- diameter_new = round((self.dia2 - self.dia1)/
- (self.rawdia2-self.rawdia1)*
- ((self.lastFilamentWidthReading+self.lastFilamentWidthReading2)
- -self.rawdia1)+self.dia1,2)
- self.diameter=(5.0 * self.diameter + diameter_new)/6
+ diameter_new = round(
+ (self.dia2 - self.dia1)
+ / (self.rawdia2 - self.rawdia1)
+ * (
+ (self.lastFilamentWidthReading + self.lastFilamentWidthReading2)
+ - self.rawdia1
+ )
+ + self.dia1,
+ 2,
+ )
+ self.diameter = (5.0 * self.diameter + diameter_new) / 6
def update_filament_array(self, last_epos):
# Fill array
if len(self.filament_array) > 0:
# Get last reading position in array & calculate next
# reading position
- next_reading_position = (self.filament_array[-1][0] +
- self.MEASUREMENT_INTERVAL_MM)
- if next_reading_position <= (last_epos + self.measurement_delay):
- self.filament_array.append([last_epos + self.measurement_delay,
- self.diameter])
- if self.is_log:
- self.gcode.respond_info("Filament width:%.3f" %
- ( self.diameter ))
+ next_reading_position = (
+ self.filament_array[-1][0] + self.MEASUREMENT_INTERVAL_MM
+ )
+ if next_reading_position <= (last_epos + self.measurement_delay):
+ self.filament_array.append(
+ [last_epos + self.measurement_delay, self.diameter]
+ )
+ if self.is_log:
+ self.gcode.respond_info("Filament width:%.3f" % (self.diameter))
else:
# add first item to array
- self.filament_array.append([self.measurement_delay + last_epos,
- self.diameter])
- self.firstExtruderUpdatePosition = (self.measurement_delay
- + last_epos)
+ self.filament_array.append(
+ [self.measurement_delay + last_epos, self.diameter]
+ )
+ self.firstExtruderUpdatePosition = self.measurement_delay + last_epos
def extrude_factor_update_event(self, eventtime):
# Update extrude factor
@@ -125,8 +130,9 @@ class HallFilamentWidthSensor:
# Update filament array for lastFilamentWidthReading
self.update_filament_array(last_epos)
# Check runout
- self.runout_helper.note_filament_present(eventtime,
- self.runout_dia_min <= self.diameter <= self.runout_dia_max)
+ self.runout_helper.note_filament_present(
+ eventtime, self.runout_dia_min <= self.diameter <= self.runout_dia_max
+ )
# Does filament exists
if self.diameter > 0.5:
if len(self.filament_array) > 0:
@@ -137,16 +143,18 @@ class HallFilamentWidthSensor:
item = self.filament_array.pop(0)
self.filament_width = item[1]
else:
- if ((self.use_current_dia_while_delay)
- and (self.firstExtruderUpdatePosition
- == pending_position)):
+ if (self.use_current_dia_while_delay) and (
+ self.firstExtruderUpdatePosition == pending_position
+ ):
self.filament_width = self.diameter
- elif self.firstExtruderUpdatePosition == pending_position:
+ elif self.firstExtruderUpdatePosition == pending_position:
self.filament_width = self.nominal_filament_dia
- if ((self.filament_width <= self.max_diameter)
- and (self.filament_width >= self.min_diameter)):
- percentage = round(self.nominal_filament_dia**2
- / self.filament_width**2 * 100)
+ if (self.filament_width <= self.max_diameter) and (
+ self.filament_width >= self.min_diameter
+ ):
+ percentage = round(
+ self.nominal_filament_dia**2 / self.filament_width**2 * 100
+ )
self.gcode.run_script("M221 S" + str(percentage))
else:
self.gcode.run_script("M221 S100")
@@ -162,8 +170,7 @@ class HallFilamentWidthSensor:
def cmd_M407(self, gcmd):
response = ""
if self.diameter > 0:
- response += ("Filament dia (measured mm): "
- + str(self.diameter))
+ response += "Filament dia (measured mm): " + str(self.diameter)
else:
response += "Filament NOT present"
gcmd.respond_info(response)
@@ -181,8 +188,9 @@ class HallFilamentWidthSensor:
else:
self.is_active = True
# Start extrude factor update timer
- self.reactor.update_timer(self.extrude_factor_update_timer,
- self.reactor.NOW)
+ self.reactor.update_timer(
+ self.extrude_factor_update_timer, self.reactor.NOW
+ )
gcmd.respond_info(response)
def cmd_M406(self, gcmd):
@@ -192,8 +200,9 @@ class HallFilamentWidthSensor:
else:
self.is_active = False
# Stop extrude factor update timer
- self.reactor.update_timer(self.extrude_factor_update_timer,
- self.reactor.NEVER)
+ self.reactor.update_timer(
+ self.extrude_factor_update_timer, self.reactor.NEVER
+ )
# Clear filament array
self.filament_array = []
# Set extrude multiplier to 100%
@@ -202,19 +211,24 @@ class HallFilamentWidthSensor:
def cmd_Get_Raw_Values(self, gcmd):
response = "ADC1="
- response += (" "+str(self.lastFilamentWidthReading))
- response += (" ADC2="+str(self.lastFilamentWidthReading2))
- response += (" RAW="+
- str(self.lastFilamentWidthReading
- +self.lastFilamentWidthReading2))
+ response += " " + str(self.lastFilamentWidthReading)
+ response += " ADC2=" + str(self.lastFilamentWidthReading2)
+ response += " RAW=" + str(
+ self.lastFilamentWidthReading + self.lastFilamentWidthReading2
+ )
gcmd.respond_info(response)
+
def get_status(self, eventtime):
status = self.runout_helper.get_status(eventtime)
- status.update({'Diameter': self.diameter,
- 'Raw':(self.lastFilamentWidthReading+
- self.lastFilamentWidthReading2),
- 'is_active':self.is_active})
+ status.update(
+ {
+ "Diameter": self.diameter,
+ "Raw": (self.lastFilamentWidthReading + self.lastFilamentWidthReading2),
+ "is_active": self.is_active,
+ }
+ )
return status
+
def cmd_log_enable(self, gcmd):
self.is_log = True
gcmd.respond_info("Filament width logging Turned On")
@@ -223,5 +237,6 @@ class HallFilamentWidthSensor:
self.is_log = False
gcmd.respond_info("Filament width logging Turned Off")
+
def load_config(config):
return HallFilamentWidthSensor(config)