使用 RAMPS 板控制更多风扇

3D打印 马林鱼 坡道-1.4 八字纹 打印风扇
2021-04-27 09:59:22

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

1个回答

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

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

#if FAN_COUNT > 0

  /**
   * M106:设置风扇速度
   *
   * S<int> 速度在 0-255 之间
   * P<index> 风扇索引,如果有多个风扇
   *
   * 启用 EXTRA_FAN_SPEED:
   *
   * T<int> 恢复/使用/设置临时速度:
   * 1 = T2 后恢复原速度
   * 2 = 使用 T3-255 设置的临时速度
   * 3-255 = 设置与 T2 一起使用的速度
   */
  内联无效 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);
      fanSpeeds[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引起您注意的第一件事(实际上是第一行,已经暗示了这一点)是 constant 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
#万一

因此,根据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 && E3PIN_AUTO_F= FAN1_PIN && E3PIN_AUTO_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,您会发现这是需要定义的引脚常量,FAN1_PIN如果您选择“EFF”配置(Hotend、Fan0、Fan1),例如#define FAN1_PIN RAMPS_D8_PIN.

什么是留给你做的是找到你的微控制器的未使用引脚并设置FAN2_PIN#define FAN2_PIN <a free pin number>

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

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