diff options
author | test3210-d <60291791+test3210-d@users.noreply.github.com> | 2020-02-04 14:15:30 +0200 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2020-02-14 13:14:34 -0500 |
commit | 9a65a4569b487d0196526924d5873f37b8ab66ba (patch) | |
tree | ad708dcee50b652f110450cf561cd9ea9b4dede3 /klippy | |
parent | 049d8c2a946eff986ce76d803d2c7ae8842e3c7b (diff) | |
download | kutter-9a65a4569b487d0196526924d5873f37b8ab66ba.tar.gz kutter-9a65a4569b487d0196526924d5873f37b8ab66ba.tar.xz kutter-9a65a4569b487d0196526924d5873f37b8ab66ba.zip |
hall_filament_width_sensor: Add new filament sensor
Signed-off-by: Denis Ignatenko <deniss979@gmail.com>
Diffstat (limited to 'klippy')
-rw-r--r-- | klippy/extras/hall_filament_width_sensor.py | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/klippy/extras/hall_filament_width_sensor.py b/klippy/extras/hall_filament_width_sensor.py new file mode 100644 index 00000000..fc3ca6f6 --- /dev/null +++ b/klippy/extras/hall_filament_width_sensor.py @@ -0,0 +1,180 @@ +# Support for filament width sensor +# +# Copyright (C) 2019 Mustafa YILDIZ <mydiz@hotmail.com> +# +# This file may be distributed under the terms of the GNU GPLv3 license. + +ADC_REPORT_TIME = 0.500 +ADC_SAMPLE_TIME = 0.001 +ADC_SAMPLE_COUNT = 5 + +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.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) + # filament array [position, filamentWidth] + self.filament_array = [] + self.lastFilamentWidthReading = 0 + # printer objects + 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.mcu_adc.setup_minmax(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.setup_minmax(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) + # 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) + # Initialization + def handle_ready(self): + # Load printer objects + self.toolhead = self.printer.lookup_object('toolhead') + + # Start extrude factor update timer + self.reactor.update_timer(self.extrude_factor_update_timer, + self.reactor.NOW) + + def adc_callback(self, read_time, read_value): + # read sensor value + self.lastFilamentWidthReading = round(read_value * 10000) + + def adc2_callback(self, read_time, read_value): + # read sensor value + self.lastFilamentWidthReading2 = round(read_value * 10000) + + 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 + + self.diameter = round((self.dia2 - self.dia1)/ + (self.rawdia2-self.rawdia1)* + ((self.lastFilamentWidthReading+self.lastFilamentWidthReading2) + -self.rawdia1)+self.dia1,2) + 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]) + else: + # add first item to array + self.filament_array.append([self.measurement_delay + last_epos, + self.diameter]) + + def extrude_factor_update_event(self, eventtime): + # Update extrude factor + pos = self.toolhead.get_position() + last_epos = pos[3] + # Update filament array for lastFilamentWidthReading + self.update_filament_array(last_epos) + # Does filament exists + if self.lastFilamentWidthReading > 0.5: + if len(self.filament_array) > 0: + # Get first position in filament array + pending_position = self.filament_array[0][0] + if pending_position <= last_epos: + # Get first item in filament_array queue + item = self.filament_array.pop(0) + filament_width = item[1] + if ((filament_width <= self.max_diameter) + and (filament_width >= self.min_diameter)): + percentage = round(self.nominal_filament_dia**2 + / filament_width**2 * 100) + self.gcode.run_script("M221 S" + str(percentage)) + else: + self.gcode.run_script("M221 S100") + else: + self.gcode.run_script("M221 S100") + self.filament_array = [] + return eventtime + 1 + + def cmd_M407(self, params): + response = "" + if self.lastFilamentWidthReading > 0: + response += ("Filament dia (measured mm): " + + str(self.diameter)) + else: + response += "Filament NOT present" + self.gcode.respond(response) + + def cmd_ClearFilamentArray(self, params): + self.filament_array = [] + self.gcode.respond("Filament width measurements cleared!") + # Set extrude multiplier to 100% + self.gcode.run_script_from_command("M221 S100") + + def cmd_M405(self, params): + response = "Filament width sensor Turned On" + if self.is_active: + response = "Filament width sensor is already On" + else: + self.is_active = True + # Start extrude factor update timer + self.reactor.update_timer(self.extrude_factor_update_timer, + self.reactor.NOW) + self.gcode.respond(response) + + def cmd_M406(self, params): + response = "Filament width sensor Turned Off" + if not self.is_active: + response = "Filament width sensor is already Off" + else: + self.is_active = False + # Stop extrude factor update timer + self.reactor.update_timer(self.extrude_factor_update_timer, + self.reactor.NEVER) + # Clear filament array + self.filament_array = [] + # Set extrude multiplier to 100% + self.gcode.run_script_from_command("M221 S100") + self.gcode.respond(response) + + def cmd_Get_Raw_Values(self, params): + response = "ADC1=" + response += (" "+str(self.lastFilamentWidthReading)) + response += (" ADC2="+str(self.lastFilamentWidthReading2)) + response += (" RAW="+ + str(self.lastFilamentWidthReading + +self.lastFilamentWidthReading2)) + self.gcode.respond(response) + def get_status(self, eventtime): + return {'Diameter': self.diameter, + 'Raw':(self.lastFilamentWidthReading+ + self.lastFilamentWidthReading2), + 'is_active':self.is_active} + +def load_config(config): + return HallFilamentWidthSensor(config) |