Bed fans, single MGN9H carriage, 15x15 drag chain end updates (#416)
* Bed fans initial commit * Fix readme formatting * Fix formatting * fix formatting * fix formatting * fix stl orientation * initial commit for single mgn9 carriage * modify readme * reorganize * reorganize * update readme * update readme * update readme * update readme * update readme * update readme * update readme * max_power warning * update readme * update readme * update readme * rename MGN9 to MGN9H * reorganize * rename * fix image * remove cycle_time * increase M3 tolerance * add photo * add image * add to mod table * add photo * add photo * Bed fans initial commit * Fix readme formatting * Fix formatting * fix formatting * fix formatting * fix stl orientation * initial commit for single mgn9 carriage * modify readme * reorganize * reorganize * update readme * update readme * update readme * update readme * update readme * update readme * update readme * max_power warning * update readme * update readme * update readme * rename MGN9 to MGN9H * reorganize * rename * fix image * remove cycle_time * increase M3 tolerance * add photo * add image * add to mod table * add photo * add photo * fix bug causing bed fans to not turn off with bed * set thresholds to integer values * Support TURN_OFF_HEATERS * Modify comments * Modify fast speed * Update readme * Update README.md * Update readme * update readme * update readme * update readme * update readme * update readme / photos * add photo * formatting * Update short Z joints CAD to remove the rest of v2.4 assembly * Reorder readme * update readme
|
After Width: | Height: | Size: 289 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 294 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 327 KiB |
|
|
@ -0,0 +1,135 @@
|
|||
############### Config options ##################
|
||||
|
||||
[gcode_macro bedfanvars]
|
||||
variable_threshold: 100 # If bed temp target is above this threshold, fans will be enabled. If temp is set to below this threshold, fans will be disabled.
|
||||
variable_innerfast: 0.5 # Fan speed once bed temp is reached
|
||||
variable_outerfast: 0.6
|
||||
variable_innerslow: 0.2 # Fan speed while bed is heating
|
||||
variable_outerslow: 0.2
|
||||
gcode:
|
||||
|
||||
########## Bed Fans #########
|
||||
|
||||
[fan_generic BedInner]
|
||||
pin: # Change me
|
||||
#cycle_time: 0.05
|
||||
kick_start_time: 0.5
|
||||
|
||||
[fan_generic BedOuter]
|
||||
pin: # Change me
|
||||
#cycle_time: 0.05
|
||||
kick_start_time: 0.5
|
||||
|
||||
########## Aliases #########
|
||||
|
||||
[gcode_macro BedFansSlow]
|
||||
gcode:
|
||||
# Vars
|
||||
{% set INNERSLOW = printer["gcode_macro bedfanvars"].innerslow|float %}
|
||||
{% set OUTERSLOW = printer["gcode_macro bedfanvars"].outerslow|float %}
|
||||
|
||||
SET_FAN_SPEED FAN=BedInner SPEED={INNERSLOW}
|
||||
SET_FAN_SPEED FAN=BedOuter SPEED={OUTERSLOW}
|
||||
|
||||
[gcode_macro BedFansFast]
|
||||
gcode:
|
||||
# Vars
|
||||
{% set INNERFAST = printer["gcode_macro bedfanvars"].innerfast|float %}
|
||||
{% set OUTERFAST = printer["gcode_macro bedfanvars"].outerfast|float %}
|
||||
|
||||
SET_FAN_SPEED FAN=BedInner SPEED={INNERFAST}
|
||||
SET_FAN_SPEED FAN=BedOuter SPEED={OUTERFAST}
|
||||
|
||||
[gcode_macro BedFansOff]
|
||||
gcode:
|
||||
SET_FAN_SPEED FAN=BedInner SPEED=0
|
||||
SET_FAN_SPEED FAN=BedOuter SPEED=0
|
||||
|
||||
############ Command overrides ############
|
||||
|
||||
# Override, set fan speeds to low and start monitoring loop.
|
||||
[gcode_macro SET_HEATER_TEMPERATURE]
|
||||
rename_existing: _SET_HEATER_TEMPERATURE
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set HEATER = params.HEATER|default("None") %}
|
||||
{% set TARGET = params.TARGET|default(0)|int %}
|
||||
# Vars
|
||||
{% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %}
|
||||
|
||||
{% if HEATER|lower == "extruder" %}
|
||||
M104 S{TARGET}
|
||||
{% elif HEATER|lower == "heater_bed" %}
|
||||
M99140 S{TARGET}
|
||||
{% else %}
|
||||
{action_respond_info("Heater %s not supported" % HEATER)}
|
||||
{% endif %}
|
||||
|
||||
# Set fans to low if heater_bed temp is requested above threshold temp, and kick off monitoring loop.
|
||||
{% if HEATER|lower == "heater_bed" %}
|
||||
{% if TARGET >= THRESHOLD %}
|
||||
BedFansSlow
|
||||
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=1
|
||||
{% else %}
|
||||
BedFansOff
|
||||
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=0 # Cancel bed fan loop if it's running
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
# Override M190 (Wait for Bed Temperature)
|
||||
# As a bonus, use TEMPERATURE_WAIT so we don't have to wait for PID to level off.
|
||||
[gcode_macro M190]
|
||||
rename_existing: M99190
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set S = params.S|int %}
|
||||
# Vars
|
||||
{% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %}
|
||||
|
||||
{% if S >= THRESHOLD %}
|
||||
BedFansSlow # >= Threshold temp: Low speed fans while heating
|
||||
{% else %}
|
||||
BedFansOff # < Threshold temp: Turn bed fans off
|
||||
{% endif %}
|
||||
|
||||
M140 {% for p in params
|
||||
%}{'%s%s' % (p, params[p])}{%
|
||||
endfor %} # Set bed temp
|
||||
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S|int} MAXIMUM={S|int + 5} # Wait for bed temp within 5 degrees
|
||||
|
||||
# Post-heating fan speeds
|
||||
{% if S >= THRESHOLD %}
|
||||
BedFansFast # >= Threshold temp: Higher speed fans after heating finished
|
||||
{% endif %}
|
||||
|
||||
# Replace M140 (Set Bed Temperature) to just be an alias of SET_HEATER_TEMPERATURE (which has associated bed fan logic if enabled)
|
||||
[gcode_macro M140]
|
||||
rename_existing: M99140
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set S = params.S|float %}
|
||||
|
||||
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={S}
|
||||
|
||||
# Replace TURN_OFF_HEATERS
|
||||
[gcode_macro TURN_OFF_HEATERS]
|
||||
rename_existing: _TURN_OFF_HEATERS
|
||||
gcode:
|
||||
BedFansOff
|
||||
_TURN_OFF_HEATERS
|
||||
|
||||
################ Monitoring loop #####################
|
||||
|
||||
# Turns bed fans to "fast" speed once target bed temp is reached.
|
||||
[delayed_gcode bedfanloop]
|
||||
gcode:
|
||||
# Vars
|
||||
{% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %}
|
||||
|
||||
{% if printer.heater_bed.target >= THRESHOLD %} # Continue only if target temp greater than threshold.
|
||||
{% if printer.heater_bed.temperature|int >= (printer.heater_bed.target|int - 1) %}
|
||||
BedFansFast # If within 1 degree of target temp: Higher speed fans
|
||||
{% else %}
|
||||
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=5 # If temp not reached yet: loop again
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
############### Config options ##################
|
||||
|
||||
[gcode_macro bedfanvars]
|
||||
variable_threshold: 100 # If bed temp target is above this threshold, fans will be enabled. If temp is set to below this threshold, fans will be disabled.
|
||||
variable_fast: 0.6 # Fan speed once bed temp is reached
|
||||
variable_slow: 0.2 # Fan speed while bed is heating
|
||||
gcode:
|
||||
|
||||
########## Bed Fans #########
|
||||
|
||||
[fan_generic BedFans]
|
||||
pin: # Change me
|
||||
#cycle_time: 0.05
|
||||
kick_start_time: 0.5
|
||||
|
||||
########## Aliases #########
|
||||
|
||||
[gcode_macro BedFansSlow]
|
||||
gcode:
|
||||
# Vars
|
||||
{% set SLOW = printer["gcode_macro bedfanvars"].slow|float %}
|
||||
|
||||
SET_FAN_SPEED FAN=BedFans SPEED={SLOW}
|
||||
|
||||
[gcode_macro BedFansFast]
|
||||
gcode:
|
||||
# Vars
|
||||
{% set FAST = printer["gcode_macro bedfanvars"].fast|float %}
|
||||
|
||||
SET_FAN_SPEED FAN=BedFans SPEED={FAST}
|
||||
|
||||
[gcode_macro BedFansOff]
|
||||
gcode:
|
||||
SET_FAN_SPEED FAN=BedFans SPEED=0
|
||||
|
||||
############ Command overrides ############
|
||||
|
||||
# Override, set fan speeds to low and start monitoring loop.
|
||||
[gcode_macro SET_HEATER_TEMPERATURE]
|
||||
rename_existing: _SET_HEATER_TEMPERATURE
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set HEATER = params.HEATER|default("None") %}
|
||||
{% set TARGET = params.TARGET|default(0)|int %}
|
||||
# Vars
|
||||
{% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %}
|
||||
|
||||
{% if HEATER|lower == "extruder" %}
|
||||
M104 S{TARGET}
|
||||
{% elif HEATER|lower == "heater_bed" %}
|
||||
M99140 S{TARGET}
|
||||
{% else %}
|
||||
{action_respond_info("Heater %s not supported" % HEATER)}
|
||||
{% endif %}
|
||||
|
||||
# Set fans to low if heater_bed temp is requested above threshold temp, and kick off monitoring loop.
|
||||
{% if HEATER|lower == "heater_bed" %}
|
||||
{% if TARGET >= THRESHOLD %}
|
||||
BedFansSlow
|
||||
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=1
|
||||
{% else %}
|
||||
BedFansOff
|
||||
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=0 # Cancel bed fan loop if it's running
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
# Override M190 (Wait for Bed Temperature)
|
||||
# As a bonus, use TEMPERATURE_WAIT so we don't have to wait for PID to level off.
|
||||
[gcode_macro M190]
|
||||
rename_existing: M99190
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set S = params.S|int %}
|
||||
# Vars
|
||||
{% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %}
|
||||
|
||||
{% if S >= THRESHOLD %}
|
||||
BedFansSlow # >= Threshold temp: Low speed fans while heating
|
||||
{% else %}
|
||||
BedFansOff # < Threshold temp: Turn bed fans off
|
||||
{% endif %}
|
||||
|
||||
M140 {% for p in params
|
||||
%}{'%s%s' % (p, params[p])}{%
|
||||
endfor %} # Set bed temp
|
||||
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S|int} MAXIMUM={S|int + 5} # Wait for bed temp within 5 degrees
|
||||
|
||||
# Post-heating fan speeds
|
||||
{% if S >= THRESHOLD %}
|
||||
BedFansFast # >= Threshold temp: Higher speed fans after heating finished
|
||||
{% endif %}
|
||||
|
||||
# Replace M140 (Set Bed Temperature) to just be an alias of SET_HEATER_TEMPERATURE (which has associated bed fan logic if enabled)
|
||||
[gcode_macro M140]
|
||||
rename_existing: M99140
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set S = params.S|float %}
|
||||
|
||||
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={S}
|
||||
|
||||
# Replace TURN_OFF_HEATERS
|
||||
[gcode_macro TURN_OFF_HEATERS]
|
||||
rename_existing: _TURN_OFF_HEATERS
|
||||
gcode:
|
||||
BedFansOff
|
||||
_TURN_OFF_HEATERS
|
||||
|
||||
################ Monitoring loop #####################
|
||||
|
||||
# Turns bed fans to "fast" speed once target bed temp is reached.
|
||||
[delayed_gcode bedfanloop]
|
||||
gcode:
|
||||
# Vars
|
||||
{% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %}
|
||||
|
||||
{% if printer.heater_bed.target >= THRESHOLD %} # Continue only if target temp greater than threshold.
|
||||
{% if printer.heater_bed.temperature|int >= (printer.heater_bed.target|int - 1) %}
|
||||
BedFansFast # If within 1 degree of target temp: Higher speed fans
|
||||
{% else %}
|
||||
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=5 # If temp not reached yet: loop again
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
## <b>Macros and Usage</b>
|
||||
|
||||
See <b>bedfans.cfg</b> or <b>bedfans-dualcontrol.cfg</b>* for klipper macros.
|
||||
|
||||
<b>1)</b> Place the .cfg file in the same directory as your printer.cfg file.
|
||||
|
||||
<b>2)</b> Add `[include bedfans.cfg]` to your printer.cfg.
|
||||
|
||||
<b>3)</b> Change `pin` for your fans in the second section. This is intentionally left blank so that it will error if you don't fill it in.
|
||||
|
||||
<b>4)</b> Configure the options in the first section:
|
||||
|
||||
* `variable_threshold` sets the target bed temperature at which your bed fans will activate.
|
||||
* `variable_slow` sets the "slow" fan speed for when the bed is heating to the target temp.
|
||||
* `variable_fast` sets the "fast" fan speed for when the bed is at temperature.
|
||||
* This may have to be lower than 100% fan speed, especially with quad fans.
|
||||
* If you get <i>"Heater heater_bed not heating at expected rate"</i> errors, then you have set this too high.
|
||||
|
||||
The macros will intercept bed heating commands, so you do <i>not</i> need to add anything to your other macros.
|
||||
|
||||
\* <i>Optionally allows for setting inner and outer fan speeds separately, for a quad fan configuration. I like to set my inner fans to be run slightly slower to try and keep the airflow somewhat even.</i>
|
||||
|
||||
## <b>5015 Fan Mount</b>
|
||||
|
||||
Bill of materials (per fan):
|
||||
- 1x 5015 fan
|
||||
- 1x M3x25
|
||||
- 1x M3x20
|
||||
- 1x M3 heat set insert
|
||||
- 1x M3x8 or M3x10 <i>(optional, I only mount with one screw)</i>
|
||||
|
||||

|
||||
|
||||
## <b>FAQ</b>
|
||||
|
||||
#### How much difference does it make?
|
||||
* My chamber now reaches about 60-66C with a quad fan configuration, whereas it only reached roughly 48-50C previously. Chamber temp is also reached more quickly.
|
||||
|
||||
#### Can I push it further?
|
||||
|
||||
* Technically your bed heater is not being run at full power with the default configs, however I <i>do not recommend pushing it.</i> Since you can't control max power at runtime, your bed will run at too high of a power while heating, risking warping your bed.
|
||||
|
||||
* <i>I also do not recommend tinkering with your verify_heater (thermal runaway protection) settings.</i>
|
||||
|
||||
#### What power should I run my bed heater at?
|
||||
|
||||
* Recommended max_power is 0.4 watts per cm<sup>2</sup>:
|
||||
|
||||
```
|
||||
For example, for a 300 mm^2 bed:
|
||||
|
||||
30 cm * 30 cm = 900 cm^2.
|
||||
900 cm^2 * 0.4 Watts = 360 Watts max.
|
||||
If you have a 750 watt heater, that's 48% power, or 0.48 max_power.
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
#### Do I need to PID tune my bed again?
|
||||
|
||||
* I did not find it necessary. Bed heaters do not seem to be terribly sensitive to this.
|
||||
|
||||
#### My bed temperature dips when the fans kick on fully, is this normal?
|
||||
|
||||
* Yes, this is normal. It should recover within 60 seconds. If not, then your fan speeds are too high.
|
||||
|
||||
#### What brand fans should I use?
|
||||
|
||||
* I just used generic multi-pack fans. There is no need for anything fancy here.
|
||||
|
||||
#### Should I use single, dual or triple/quad fans?
|
||||
|
||||
* Triple/quad fans is more for <i>even</i> airflow than <i>raw</i> airflow. In fact you will likely not be able to run them at 100% without outrunning your bed heater. I personally prefer triple/quad fans to avoid any possibility of "tacoing" my bed due to uneven temperatures. Triple fans is probably the "sweet spot".
|
||||
|
||||
#### Is "dual control" necessary?
|
||||
|
||||
* Almost certainly not. I originally set it up that way because it was easier to wire in my particular case, so I took advantage of it. Triple fans with "single" control is probably the best balance of cost, complexity, and performance.
|
||||
|
||||
#### I insist on running quad fans at 100%, why am I having a bad time?
|
||||
|
||||
* No. Stop it. Bad.
|
||||
## <b>Images</b>
|
||||
|
||||
<i>(looks a bit tight since CAD is for a 250mm)</i>
|
||||

|
||||

|
||||
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
|
@ -0,0 +1,11 @@
|
|||
## <B>Single MGN9H Carriage</B>
|
||||
|
||||
Modified carriage to:
|
||||
* Remove the second MGN9 mount
|
||||
* Add optional toolhead X endstop (to allow for umbilical)
|
||||
|
||||
Make sure your switch lever is in the orientation shown to ensure it triggers properly against the XY joint.
|
||||
|
||||

|
||||
|
||||

|
||||
|
|
@ -95,9 +95,11 @@ like so:
|
|||
|eddie |[V1.8 12mm Z Mod](./eddie/V1.8_12mm_Z_Mod) |Add V1.8 option for 12mm Z rods |:x: |:heavy_check_mark: |:x: |:x:|
|
||||
|edwardyeeks |[Decontaminator Purge Bucket & Nozzle Scrubber](./edwardyeeks/Decontaminator_Purge_Bucket_&_Nozzle_Scrubber) |Removeable purge bucket with nozzle scrubber |:x: |:heavy_check_mark: |:heavy_check_mark: |:x:|
|
||||
| |[V2.4 Z Drive Motor Tensioner Mod](edwardyeeks/V2.4_z_drive_motor_tensioner_mod) |Braced motor tensioner for z drive |:x: |:x: |:heavy_check_mark: |:x:|
|
||||
| Ellis |[15x15 Drag Chain Ends](./Ellis/15x15_Drag_Chain_End) | 15x15 drag chain end pieces | :grey_question: | :grey_question: |:heavy_check_mark: |:x:|
|
||||
| Ellis |[15x15 Drag Chain Ends](./Ellis/15x15_Drag_Chain_End) | 15x15 drag chain end pieces | :grey_question: | :grey_question: |:heavy_check_mark: |:grey_question:|
|
||||
| |[Badge Retractor Mount](./Ellis/Badge_Retractor_Mount) | Extrusion mount for badge retractor to keep bowden tube out of the way. | :grey_question: | :grey_question: |:heavy_check_mark: |:x:|
|
||||
| |[Bed Fans](./Ellis/Bed_Fans) | Bed fan control macros and 5015 bed fan mounts | :x: | :x: |:heavy_check_mark: |:x:|
|
||||
| |[Short Z Joints](./Ellis/Short_Z_Joints) | Shorter Z joints for the v2.4 |:x: |:x: |:heavy_check_mark: |:x:|
|
||||
| |[Single MGN9H Carriage](./Ellis/Single_MGN9H_Carriage) | Single MGN9H toolhead carriage with umbilical (x endstop) support |:x: |:grey_question: |:heavy_check_mark: |:grey_question:|
|
||||
| ElPoPo | [Removable Doors](./ElPoPo/RemovableDoors) | New hinge to easily remove the door and have a wide opening V2.x | :x: | :x: | :heavy_check_mark: | :x:|
|
||||
| Empusas | [Power Skirt 2.x FN284-10-06](./Empusas/PowerSkirt_FN284-10-06) | Power Skirt for Schaffner FN284-10-06 V2.x | :x: | :x: | :heavy_check_mark: | :x:|
|
||||
| | [Mounts for Terminal Blocks NC933 SPL-62](./Empusas/Terminal_Blocks_NC933_SPL-62) | Mounts for Terminal Blocks NC933 and SPL-62 from AliExpress | :grey_question: | :grey_question: | :heavy_check_mark: | :grey_question:|
|
||||
|
|
|
|||