Nomar记录一段历史
使用 RAMPS 板控制更多风扇

我在 Marlin 上使用 RAMPS 1.4。使用 Marlin,您可以使用M106 P<fan index>命令控制大量M106 P<fan index> 。我想 RAMPS 控制一些额外的风扇,独立于层风扇。 RAMPS 1.4 上是否有可用的引脚来做到这一点?否则,我可以设置 RAMPS 板以向单独的 Arduino 发送命令吗?如果这样更容易的话,我也有 Octoprint。

你看过 https://reprap.org/wiki/File:Arduinomegapololushieldschematic.png 吗?
您可以使用`M106 P 控制多达 3 个风扇`,请参阅下面的答案。

1个回答

Marlin来源中,您可以找到可以使用的风扇,即使您不是编码员,它也应该是可行的。从那里你可以找到如何设置风扇的引脚,前提是有空闲的未使用和暴露的引脚(这样你就不会直接焊接到微处理器上)。首先找出可能有多少粉丝。

Marlin_main.cpp开始并搜索106 (或 Marlin GitHub 网站上的106 )将引导您找到M106命令的执行来源。下面显示了M106M107的片段。 M107存在的原因稍后变得清晰。

#if FAN_COUNT > 0

/**
* M106:设置风扇速度
*
* S<int> 速度在 0-255 之间
* P<index> 风扇索引,如果有多个风扇
*
* 启用 EXTRA_FAN_SPEED:
*
* T<int> 恢复/使用/设置临时速度:
* 1 = T2 后恢复原速度
* 2 = 使用 T3-255 设置的临时速度
* 3-255 = 设置与 T2 一起使用的速度
*/
内联 void gcode_M106() {
const uint8_t p = parser.byteval('P');
如果 (p < FAN_COUNT) {
#如果启用(EXTRA_FAN_SPEED)
const int16_t t = parser.intval('T');
如果 (t > 0) {
开关 (t) {
案例1:
fanSpeeds[p] = old_fanSpeeds[p];
打破;
案例2:
old_fanSpeeds[p] = fanSpeeds[p];
fanSpeeds[p] = new_fanSpeeds[p];
打破;
默认:
new_fanSpeeds[p] = MIN(t, 255);
打破;
}
返回;
}
#endif // EXTRA_FAN_SPEED
const uint16_t s = parser.ushortval('S', 255);
风扇速度[p] = MIN(s, 255U);
}
}

/**
* M107:风扇关闭
*/
内联无效 gcode_M107() {
const uint16_t p = parser.ushortval('P');
如果 (p < FAN_COUNT) fanSpeeds[p] = 0;
}

#endif // FAN_COUNT > 0

查看这段代码,引起您注意的第一件事(实际上是第一行, #if FAN_COUNT > 0已经暗示了这一点)是常量FAN_COUNT 。显然,该软件知道定义了多少粉丝!有趣!它怎么知道!这段代码在处理M107命令后结束(行#endif // FAN_COUNT > 0 ),因此显示在这里。

通过查找FAN_COUNT的设置方式(使用在 GitHub 上搜索 Marlin 存储库)继续搜索,会找到文件Conditionals_post.h 。一个有趣的部分是:

/**
* 最多 3 个 PWM 风扇
*/
#if HAS_FAN2
#define FAN_COUNT 3
#elif HAS_FAN1
#define FAN_COUNT 2
#elif HAS_FAN0
#define FAN_COUNT 1
#其他
#define FAN_COUNT 0
#endif

因此,根据HAS_FANx (其中 x 表示 0、1 或 2),您可以拥有多个风扇,总共最多 3 个!很酷,在这个过程中学到了一些东西。 :)

现在让我们搜索HAS_FANx ;在同一个文件中,您会发现:

// 其他粉丝
#define HAS_FAN0 (PIN_EXISTS(FAN))
#define HAS_FAN1 (PIN_EXISTS(FAN1) && CONTROLLER_FAN_PIN != FAN1_PIN && E0_AUTO_FAN_PIN != FAN1_PIN && E1_AUTO_FAN_PIN != FAN1_PIN && E2_AUTO_FAN_PIN != FAN1_PIN && E3_PIN!_F= FAN1_PIN && E3_PIN!_F
#define HAS_FAN2 (PIN_EXISTS(FAN2) && CONTROLLER_FAN_PIN != FAN2_PIN && E0_AUTO_FAN_PIN != FAN2_PIN && E1_AUTO_FAN_PIN != FAN2_PIN && E2_AUTO_FAN_PIN != FAN2_PIN && E3PIN_AUTO_F= FAN2_PIN && E3PIN_AUTO!_F=

现在我们正在进入清澈的水中!此代码提示FAN1_PINFAN2_PIN 。如果您查看引脚布局文件,例如, pins_RAMPS.h,您会看到需要定义的引脚常量,如果您选择“EFF”配置(Hotend、Fan0、Fan1),则实际上FAN1_PIN已设置,例如#define FAN1_PIN RAMPS_D8_PIN

剩下要做的是找到微控制器的未使用引脚并使用#define FAN2_PIN <a free pin number>设置FAN2_PIN

例如,引脚 4 不是使用的引脚编号(和模拟输出引脚)。不要忘记您选择的引脚不能直接运行风扇,它应该用于调度 MOSFET。

请注意,存在双外部风扇接头“Reprap Ramps1.4 RRD Fan Extender” ,这描述了使用 D6 和 D11 引脚。进一步调查导致 3D.SE 发布使用此风扇标题: “如何配置 Marlin 以启用带有双挤出机的自动风扇”

非常有趣!感谢您教如何钓鱼!我还在 pin_RAMPS.h 中看到引脚 4 可用于我不使用的灯丝跳动传感器或激光器。所以我也可以将它用于风扇(通过 MOSFET)。
@vega 不客气,很好,您使用帖子找到了一个未使用的引脚(从这里我不知道您的设置是什么样子以及使用了什么),只需将引脚配置为`#define FAN1_PIN`如果您总共运行 2 个风扇并使用 MOSFET,那么您就可以开始使用了!

随机文章