开源改变世界!!

比按钮少的 I/O 端口 #763

推推 grbl 2年前 (2022-10-17) 131次浏览 0个评论

关闭
JensHauser 打开了这个问题 2021 年 2 月 11 日 · 7 条评论
关闭

I/O 端口比按钮少#763

JensHauser 打开了这个问题 on 11 Feb 2021 · 7 条评论

注释

比按钮少的 I/O 端口 #763
贡献者

延斯豪瑟 评论 2021 年 2 月 11 日

是否有可能将 2 个宏/功能添加到 1 个按钮?

我想到的方法:

  • 单按,双按按钮
  • 短按,长按按键

“保持”和“恢复”将是我想放在一个按钮上的第一个按钮。

比按钮少的 I/O 端口 #763
所有者

婚戒 评论 2021 年 2 月 11 日

不,但是使用自定义代码,您可以使用逻辑来控制“宏”。

它将检查状态并应用操作。如果(状态=保持)然后恢复。

比按钮少的 I/O 端口 #763
贡献者作者

延斯豪瑟 评论 2021 年 2 月 12 日

谢谢

比按钮少的 I/O 端口 #763
贡献者作者

延斯豪瑟 评论 2021 年 2 月 12 日

好的,有了 user_defined_macro 的骨架。
按下按钮时调用 grbl_sendf 函数并在 Web 界面中打印一条消息

4axis_xyxz.h

#pragma once
#define MACHINE_NAME            "MACHINE_ESP32 Jens XYZA"
#define CUSTOM_CODE_FILENAME    "Custom/4axis_xyxz.cpp"

#ifdef N_AXIS
    #undef N_AXIS
#endif

#define N_AXIS 3
#define SPINDLE_TYPE SpindleType::RELAY
#define SPINDLE_OUTPUT_PIN      GPIO_NUM_32

// Das 2. Relais
#define COOLANT_FLOOD_PIN       GPIO_NUM_2
#define STEPPERS_DISABLE_PIN    GPIO_NUM_13 //ok

#define X_STEP_PIN              GPIO_NUM_12
#define X_DIRECTION_PIN         GPIO_NUM_14
#define X_LIMIT_PIN             GPIO_NUM_17

#define Y_STEP_PIN              GPIO_NUM_26
#define Y_DIRECTION_PIN         GPIO_NUM_15
#define Y_LIMIT_PIN             GPIO_NUM_4

#define Z_STEP_PIN              GPIO_NUM_27
#define Z_DIRECTION_PIN         GPIO_NUM_33
#define Z_LIMIT_PIN             GPIO_NUM_16

#define LIMIT_MASK          B111

#define PROBE_PIN               GPIO_NUM_35 //ok
#define CONTROL_RESET_PIN       GPIO_NUM_34  // needs external pullup
#define CONTROL_CYCLE_START_PIN GPIO_NUM_39  // needs external pullup
#define MACRO_BUTTON_0_PIN      GPIO_NUM_36

// wrap prototypes
#ifndef FourAxis_xyxz_h
    #define FourAxis_xyxz_h

    void user_defined_macro(uint8_t index);
#endif

4axis_xyxz.cpp

#include <unistd.h>
#include "../Machines/4axis_xyxz.h"

#define DEBUG // do I want debug messages? yes/no

#if defined(MACRO_BUTTON_0_PIN)
void user_defined_macro(uint8_t index) {
	#ifdef DEBUG
		grbl_sendf (CLIENT_ALL, "Macro button #%d pressed. State=%d \r\n", index, sys.state);
	#endif

	if (index == 0) { // Macro Button 1 pressed
		switch (sys.state) {
			case State::Cycle:
				// Set "cycle mode"
				break;

			case State::Hold:
                                // Set "hold mode"
				break;

			default:
				break;
		}
	}
}
#endif

问题,请寻求帮助
(1)
快速按钮有时意味着消息翻倍。我想这是一个去抖动的问题。
根据消息来源,通过#define ENABLE_SOFTWARE_DEBOUNCE 去抖动不适用于此按钮。在从该函数返回之前等待几毫秒会很有帮助。如果这是一个可行的解决方案,该怎么做?

<Idle|MPos:0.000,0.000,0.000|FS:0,0|WCO:-205.000,205.000,-55.000>
Macro button #0 pressed. State=0 
Macro button #0 pressed. State=0 
<Idle|MPos:0.000,0.000,0.000|FS:0,0|Ov:100,100,100>
<Idle|MPos:0.000,0.000,0.000|FS:0,0>
<Idle|MPos:0.000,0.000,0.000|FS:0,0>
<Idle|MPos:0.000,0.000,0.000|FS:0,0>

(2)
在 wiki 页面中,我读到带有常规 G 代码的 char[] 似乎是错误的方法,因为状态需要是“空闲”。
如何设置“保持”和“恢复”状态?在 Atari 或其他文件中,我找不到示例。

非常感谢你的帮助

比按钮少的 I/O 端口 #763 JensHauser 重新打开了这个 2021 年 2 月 12 日
比按钮少的 I/O 端口 #763
所有者

婚戒 评论 2021 年 2 月 12 日

你应该加入我们的 Discord 来做这样的事情。

https://discord.gg/ZbgjKvNVut

比按钮少的 I/O 端口 #763
贡献者作者

延斯豪瑟 评论 2021 年 2 月 12 日

现在可以工作了,感谢 Bart:

去抖问题更好地需要硬件解决方案,调整后的来源在这里

#include <unistd.h>
#include "../Machines/4axis_xyxz.h"

#define DEBUG // do I want debug messages? yes/no

#if defined(MACRO_BUTTON_0_PIN)
void user_defined_macro(uint8_t index) {
	#ifdef DEBUG
		grbl_sendf (CLIENT_ALL, "Macro button #%d pressed. State=%d \r\n", index, sys.state);
	#endif

	if (index == 0) { // Macro Button 1 pressed
		switch (sys.state) {
			case State::Cycle:
				// Set "cycle mode"
				sys_rt_exec_state.bit.feedHold = true;
				break;

			case State::Hold:
                                // Set "hold mode"
				sys_rt_exec_state.bit.cycleStart = true;
				break;

			default:
				break;
		}
	}
}
#endif
比按钮少的 I/O 端口 #763
贡献者作者

延斯豪瑟 评论 2021 年 2 月 13 日

效果更好,现在有 2 个宏按钮

整个功能由非阻塞软件去抖动备份。

#define DEBOUNCE_TIME_MACRO_1 300  // ms, my button is heavily bouncing. verified with oscilloscope

#include <stdint.h>
#include "src/Grbl.h"
#include "Machines/4axis_xyza.h"

uint32_t earlier = 0;

#if defined(MACRO_BUTTON_0_PIN) || defined(MACRO_BUTTON_1_PIN)
void user_defined_macro(uint8_t index) {
    uint32_t later, msPassedBy = 0;

    later      = millis();
    msPassedBy = later - earlier;

    if (msPassedBy >= DEBOUNCE_TIME_MACRO_1) {
        switch (index) {
            case 0:  // Macro button 1 (Hold/Cycle switch)

                switch (sys.state) {
                    case State::Hold:
                        grbl_sendf(CLIENT_ALL, "Macro button #%d pressed. New state \"Cyle start\"\r\n", index + 1);
                        sys_rt_exec_state.bit.cycleStart = true;
                        break;

                    case State::Cycle:
                        grbl_sendf(CLIENT_ALL, "Macro button #%d pressed. New state \"Hold\"\r\n", index + 1);
                        sys_rt_exec_state.bit.feedHold = true;
                        break;

                    default:
                        grbl_sendf(CLIENT_ALL, "Macro button #%d pressed. Works only in states \"Cycle\" or \"Hold\"\r\n", index + 1);
                        break;
                }
                break;

            case 1:  // Macro button 2 (Homing)
                if (sys.state == State::Idle) {
                    grbl_sendf(CLIENT_ALL, "Macro button #%d pressed. Homing, Y tool change position\r\n", index + 1);

                    grbl_sendf(CLIENT_ALL, "$H\r\n");
                    WebUI::inputBuffer.push("$H\r\n");  // Homing all axis

                    grbl_sendf(CLIENT_ALL, "G53 G0 Z-5\r\n");
                    WebUI::inputBuffer.push("G53 G0 Z-5\r\n");  // Move Z axis up (should already be there, just to be sure)

                    grbl_sendf(CLIENT_ALL, "G53 G0 X-5 Y-210 F1000\r\n");
                    WebUI::inputBuffer.push("G53 G0 X-5 Y-210 F1000\r\n");  // Move Y axis to the middle for tool change
                } else {
                    grbl_sendf(CLIENT_ALL, "Macro button #%d pressed. Works only in state \"Idle\"\r\n", index + 1);
                }
                break;

            default:
                break;
        }

        earlier = later;
    }
}
#endif

比按钮少的 I/O 端口 #763
 
添加标题文本添加粗体文本,<Ctrl+b>添加斜体文本,<Ctrl+i>
添加引号,<Ctrl+Shift+.>添加代码,<Ctrl+e>添加链接,<Ctrl+k>
添加项目符号列表,<Ctrl+Shift+8>添加编号列表,<Ctrl+Shift+7>添加任务列表,<Ctrl+Shift+l>
直接提及用户或团队引用问题、拉取请求或讨论

添加已保存的回复

请记住,对此存储库的贡献应遵循我们的 GitHub 社区指南
比按钮少的 I/O 端口 #763通过赞助他们 来表达 您对 bdring的支持。

 赞助

标签
还没有
项目

还没有

发展

没有分支或拉取请求

2名参与者
比按钮少的 I/O 端口 #763比按钮少的 I/O 端口 #763

喜欢 (0)

您必须 登录 才能发表评论!