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
This commit is contained in:
AndrewEllis93 2021-09-04 18:16:27 -04:00 committed by GitHub
parent 59c3ede646
commit e0ab0b4fa2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 134634 additions and 1 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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>
![5015 Fan Mount](Images/5015_mount_isolated.png)
## <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>
![5015 Triple](Images/5015_triple.png)
![5015 Quad Installed](Images/5015_quad_installed.png)

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

View File

@ -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.
![Single_MGN9G_Carriage](Images/Single_MGN9H_Carriage.png)
![Single_MGN9G_Carriage_Built](Images/Single_MGN9H_Carriage_Built.png)

File diff suppressed because it is too large Load Diff

View File

@ -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:|