开源改变世界!!

grbl自定义 GCode 命令

推推 grbl 3年前 (2022-06-11) 758次浏览 0个评论

Protoneer 评论 on 9 Mar 2021  

请描述您希望实现的功能
我正在尝试设置拾取和放置机器。但它需要特殊的机器特定 gCode 命令。
示例:M115

openPNP 使用它来检测机器类型并配置应用程序。

为什么你认为这会改进 Grbl_ESP32?
Grbl_ESP32 在引脚分配方面已经非常可配置。
能够使用自定义命令扩展 vanilla GRBL 将使其超级可扩展。
这也可以用来代替宏,对吧?

这个功能会出现在很多用户面前吗?
这绝对是针对定制机器的

grbl自定义 GCode 命令 Protoneer 添加了 增强 标签 on 9 Mar 2021
grbl自定义 GCode 命令
所有者

婚戒 评论 on 10 Mar 2021

我们尽可能使用 LinuxCNC 定义的 gcode。这是基于 NIST 标准,并且经过深思熟虑的定义模态组。

Marlin 的列表一团糟,似乎任何人都可以在不遵循任何标准的情况下添加命令。我不想仅仅因为它们对一个人很重要而添加命令(这里不是在谈论你)。

我们可以为人们创建一种简单的方法来添加 G 或 M 代码以供自己使用。Grbl_ESP32 将解析 gcode 并查看它不知道的命令。然后它会将其传递给自定义文件以进行处理。

grbl自定义 GCode 命令
作者

Protoneer 评论 on 10 Mar 2021

我们尽可能使用 LinuxCNC 定义的 gcode。这是基于 NIST 标准,并且经过深思熟虑的定义模态组。

Marlin 的列表一团糟,似乎任何人都可以在不遵循任何标准的情况下添加命令。我不想仅仅因为它们对一个人很重要而添加命令(这里不是在谈论你)。

我完全同意这种说法。这实际上就是为什么人们更喜欢 GRBL 而不是其他实现的原因。

我也不想改变。

grbl自定义 GCode 命令
作者

Protoneer 评论 on 10 Mar 2021

我们可以为人们创建一种简单的方法来添加 G 或 M 代码以供自己使用。Grbl_ESP32 将解析 gcode 并查看它不知道的命令。然后它会将其传递给自定义文件以进行处理。

这正是我想做的,就像 custom_code_template.cpp 它会挂在 gcode 处理器的末端。

就我而言,我想控制 5-100 个螺线管/执行器。它与 M62 命令相同,但 IO 更多。

grbl自定义 GCode 命令

我也想借此机会添加自定义 G 代码,因为我想添加代码来发起 http 请求。有一种结构化的方式来添加额外的文件而不修改原始代码会很棒。
在 ESP32 中拥有 WiFi 是与 Arduino 相比的另一个巨大优势。

grbl自定义 GCode 命令
作者

Protoneer 评论 on 10 Mar 2021

我也想借此机会添加自定义 G 代码,因为我想添加代码来发起 http 请求。有一种结构化的方式来添加额外的文件而不修改原始代码会很棒。
在 ESP32 中拥有 WiFi 是与 Arduino 相比的另一个巨大优势。

有趣…. 那是什么样的 http 请求呢?

完全同意这需要在一个单独的层上保持原始代码到位。

grbl自定义 GCode 命令

好吧,我想添加由 grbl 控制的基于 Tasmota 的设备(基于 ESP8266 的硬件的社区固件)。简单示例:使用便宜的 Tasmota 电源插头打开/关闭主轴。这将使高压完全远离我的设置。我更喜欢这个而不是使用继电器。https://github.com/arendst/Tasmota
我的手机上的“工作完成”通知也很好。但是,使用来自 G-Code 的 http 调用肯定有更大的潜力。

grbl自定义 GCode 命令

对于不能很好地适应已建立的语言框架的扩展,一种常用的方法是“智能注释”,即将新语法包装在注释中。然而,在 GRBL 世界中,这会受到以下事实的影响:一些发件人撕掉评论并且不将它们发送到 GRBL。

另一个可能效果更好的解决方案是发明一个 M 代码。机器/控制器特定的 M 代码有很多 GCode 的先例;事实上,有人可能会争辩说它们是为此目的而设计的。

但是仍然存在一些问题:

  1. 添加 M 代码是 Marlin 所做的事情,并且 GRBL 社区对做任何有 Marlin 气味的事情都有很大的抵抗力
  2. 无论做什么都必须符合 GRBL 行长度限制 – 因此 http: 请求的 URL 需要很短
grbl自定义 GCode 命令
所有者

婚戒 评论 2021 年 3 月 11 日

@MitchBradley是正确的。“因为 Marlin 这样做”证明改变对 Grbl 社区没有帮助。

这意味着添加命令的通用方法是更好的方法。

我有一些基本的代码工作。

Grbl_ESP32 应该如何响应 M115?

应该支持 EXTENDED_CAPABILITIES_REPORT 吗?应该怎么看?

Cap:EEPROM:1
Cap:AUTOREPORT_TEMP:1
Cap:PROGRESS:0
Cap
:AUTOLEVEL:1 Cap:Z_PROBE:1
Cap:SOFTWARE_POWER:0
Cap:TOGGLE_LIGHTS:0
Cap:EMERGENCY_PARSER:1

grbl自定义 GCode 命令

@bdring,我在下面的 openPNP 论坛上引用了一段关于它的更多背景信息……

至少 M115 应该重新运行 FIRMWARE_NAME: XXXX 和 FIRMWARE_VERSION: X.XXX

FIRMWARE_NAME:GRBL_ESP32 FIRMWARE_VERSION:1.3 [20210101]

https://groups.google.com/g/openpnp/c/VzSW0rScx2c/m/T5fshkY-BQAJ?pli=1

没有真正的标准(据我所知),只有约定。有这个
https://reprap.org/wiki/M115_Keywords

但似乎没有人真正坚持或维护它。

这些是已知的响应:
FIRMWARE_NAME:Smoothieware, FIRMWARE_URL:http%3A//smoothieware.org, X-SOURCE_CODE_URL:https%3A//github.com/markmaker/Smoothieware/tree/feature/best-for-pnp, FIRMWARE_VERSION:feature /best-for-pnp-c82d0b45, X-FIRMWARE_BUILD_DATE:Oct 22 2020 21:21:58, X-SYSTEM_CLOCK:120MHz, X-AXES:5, X-PAXES:5, X-GRBL_MODE:0, X-CNC: 0, X-MSD:1

FIRMWARE_NAME: RepRapFirmware for Duet 3 MB6HC FIRMWARE_VERSION: 3.2-RC1+1 ELECTRONICS: Duet 3 MB6HC v1.01 或更高版本 FIRMWARE_DATE: 2020-12-23

FIRMWARE_NAME:TinyG, FIRMWARE_URL:https%3A//github.com/synthetos/TinyG, FIRMWARE_VERSION:0.97, FIRMWARE_BUILD:440.21, HARDWARE_PLATFORM:1.00, HARDWARE_VERSION:8.00

注意:由于“:”用作分隔符,因此不能在值内使用它。因此将它们编码为“%3A”。

我想你明白了。问题和解决方案使用了一些基本属性,例如 FIRMWARE_NAME 和 FIRMWARE_VERSION。除此之外,你很自由​​。如果有重要的编译时定义或配置选项,通过自定义属性传达这些信息会很酷(告诉我如何解释)。作为示例,问题和解决方案解释了 Smoothie 上的 X-AXES 和 X-PAXES 属性,如此处所述,加上 X-GRBL_MODE,因为它会影响归位命令。

不要忘记也实现 M114 ;-)

你能告诉我们更多关于你的 Grbl 端口的信息吗?
_标记

grbl自定义 GCode 命令

@MitchBradley是正确的。“因为 Marlin 这样做”证明改变对 Grbl 社区没有帮助。

这意味着添加命令的通用方法是更好的方法。

绝对同意通用方法。我的想法是它将在机器 cpp 中定义/链接或实现。

这样每台机器都可以像上面的 SMOOTHIE 示例一样添加额外的位。

grbl自定义 GCode 命令

应该支持 EXTENDED_CAPABILITIES_REPORT 吗?应该怎么看?

Cap:EEPROM:1
Cap:AUTOREPORT_TEMP:1
Cap:PROGRESS:0
Cap
:AUTOLEVEL:1 Cap:Z_PROBE:1
Cap:SOFTWARE_POWER:0
Cap:TOGGLE_LIGHTS:0
Cap:EMERGENCY_PARSER:1

对于 openPNP,我认为它不需要基本设置

grbl自定义 GCode 命令
所有者

婚戒 评论 2021 年 3 月 11 日

它似乎工作正常。M115 是一个非常简单的命令。您必须非常了解 Grbl 才能添加复杂的。可能也有限制。用户当心。

Grbl 1.3a ['$' for help]
m115
FIRMWARE_NAME:Grbl_ESP32, FIRMWARE_VERSION:1.3a, FIRMWARE_BUILD:20210308
ok

我让它向所有客户发送响应。这类似于探测命令。除了“OK”之外,没有太多的 gcode 发送响应

它位于 devt 的一个名为UserDefinedGcode的分支上

grbl自定义 GCode 命令

惊人的东西!感谢那!!!

grbl自定义 GCode 命令

建议:添加 G-Codes 的框架不仅应该允许添加一些功能,还应该允许将 grbl 置于某些状态,例如将机器置于警报模式。
在我的示例中:如果此 http 请求失败,则 http 请求切换运行主轴“打开”的电源插头应导致警报模式。

grbl自定义 GCode 命令
作者

Protoneer 评论 2021 年 3 月 11 日  

@bdring …

我正在尝试编译测试分支(UserDefineGcode),但它说找不到文件。

Custom/user_gcode_example.cpp 的替代方案:[]C:\Users\IT\AppData\Local\Temp\arduino_build_368994\sketch\src\CustomCode.cpp:7:34:致命错误:Custom/user_gcode_example.cpp:没有这样的文件或目录

ResolveLibrary(自定义/user_gcode_example.cpp)

当我注释掉…

#define CUSTOM_CODE_FILENAME “自定义/user_gcode_example.cpp”

在 test_drive.h 中它再次编译。

grbl自定义 GCode 命令

尝试编译具有相同结果的 Simple_OLED 分支,但仅针对 oled_basic.cpp 文件。

这可能是 Windows 路径问题吗?

grbl自定义 GCode 命令
所有者

婚戒 评论 2021 年 3 月 11 日

这时候使用自定义文件夹时必须使用PlatformIO进行编译。自定义文件夹不在src文件夹下,防止文件夹内所有文件自动编译。这可能会导致问题,特别是如果某些文件包含相同的函数名称,例如machine_init()

grbl自定义 GCode 命令
所有者

婚戒 评论 2021 年 3 月 11 日

@joedirium有更好的方法来处理替代 I/O。与 I2S 输出类似,您可以创建一个新的 I/O 类,然后任何功能都可以在不更改现有代码的情况下使用它。它将添加另一个像这样的输出选项。

#define SPINDLE_OUTPUT_PIN   GPIO_13 
// or
#define SPINDLE_OUTPUT_PIN   I2SO(12)
// or
#define SPINDLE_OUTPUT_PIN   Tasmota(3)

话虽如此,我对这些设备一无所知,我没有。这不是我对自己工作感兴趣的事情。

grbl自定义 GCode 命令

@bdring谢谢你的建议!听起来很有希望能够使用现有的 G 代码。
所以我试着看看我能不能做到这一点,但显然我的 C++ 技能远远不够。来自 Java 世界,我希望找到一个接口或抽象类来实现 I/O,但找不到。我迷失在所有这些#define 和#ifdef
For I2SO 我希望找到一个类,但实际上找到了这个

定义 I2SO(n) (I2S_OUT_PIN_BASE + n)

它看起来像一个带有偏移量的常数,而不像我的对象。
C++ 真的让我很困惑。
我对所有能够在像这样的复杂项目中处理这个问题的人表示敬意!

grbl自定义 GCode 命令

GRBL 最初是用纯 C 语言编写的,用于在内存有限的小型 AVR 处理器上运行,#defines 到处都是以节省内存。然后将 Grbl_Esp32 转换为 C++,以便它可以由 Arduino IDE 编译,但转换主要是“C 装扮成 C++”。我们正在将其中的一部分更改为适当的 C++ 以使用抽象类,但这需要时间。设置框架、主轴支持和电机的许多方面现在都使用类,但许多核心仍然在(修饰过的)普通 C 中。有一个分支 NewPinClass 将 IO 引脚带入 C++ 类折叠,但它还没有被部署。它在我们的发展优先事项清单中排名很高。但坦率地说,像这样的“小”功能请求总是让我们分心……

grbl自定义 GCode 命令

关于 Tasmota 情况的进一步思考:

  1. 无论我们想出什么,名字都不应该是“Tasmota”。该名称应反映网络协议,而不是实现它的特定固件。Tasmota 实现了多种通信协议,包括 MQTT、HTTP 和串行。除了 Tasmota 之外,还有其他实现这些协议的固件解决方案。因此,调用接口“Tasmota”
    同时过于具体且不够具体。
  2. Tasmota 最常使用的协议是 MQTT。因此,如果我们假设 MQTT 是主轴引脚更改的传输,那么名称将是“MQTT”的某种变体。但其中涉及到很多配置,包括如何指定 MQTT 代理地址、MQTT 订阅变量的名称是什么、服务的类别是什么等问题。
  3. 或者,可以使用 Tasmota 的 HTTP(REST 样式)接口——但这也有类似的配置要求。
  4. 新 Pin Class 框架的抽象接口将能够通过这样的接口表达简单的 pin 更改,但性能可能存在问题,因为看似简单的“pin 更改”实际上涉及对网络堆栈的深入研究. 再加上引脚更改(包括那些控制主轴的更改)通常需要从中断服务例程中完成(您无法在其中调用网络堆栈),并且最终会遇到一罐蠕虫。
    结论:这比表面上看起来要复杂得多。
grbl自定义 GCode 命令

这时候使用自定义文件夹时必须使用PlatformIO进行编译。自定义文件夹不在src文件夹下,防止文件夹内所有文件自动编译。这可能会导致问题,特别是如果某些文件包含相同的函数名称,例如machine_init()

@bdring….哈哈…我正在查看 VC 中的代码并在 Arduino 中编译它。

我已经切换到 PlatformIO,它更容易使用。

我已经用 openPNP 进行了测试,它正在接受 M115 结果!!!!?

grbl自定义 GCode 命令

结论:这比表面上看起来要复杂得多。

@MitchBradley 你在描述宇宙… ?

grbl自定义 GCode 命令
所有者

婚戒 评论 2021 年 3 月 12 日

@Protoneer

您还必须在每次编译之前“清理”。自动清理确实处理自定义文件夹。

grbl自定义 GCode 命令

@MitchBradley你是对的。请仅将 Tasmota 视为示例。它有一个庞大的社区,但无论如何,一些通用的 HTTP 请求方法将涵盖这一点。我假设已经链接了一个 HTTP 请求库。
不确定解析器是否可以将 URL 作为 G 代码的参数读取。因此,具有 URL 支持的自定义 G 代码可能是更好的方法。(例如:Q99 http://test/power=on pauseonerror=1)。这样就不需要配置了。我知道管理配置、构建 UI、使值持久化、验证……
在现有 G 代码中进行替换以使其与专有命令兼容是一件令人讨厌的事情,但它很简单并且可以自动化。

MQTT 也可能有意义,但我不会尝试找到一个同时涵盖两者的解决方案。如果 HTTP 解决了,应该很容易以类似的方式添加 MQTT,添加 MQTT 库并进行一些更改。MQTT 应该更轻一些,但另一方面更具体。

我天真的想法是在任何电机运行时都不会进行主轴控制,因此得出结论认为此时 CPU 消耗或任何其他延迟不应该成为问题。但这只是一个黑盒假设。

grbl自定义 GCode 命令

@bdring

您还必须在每次编译之前“清理”。自动清理确实处理自定义文件夹。

谢谢!!!

接下来我在看M114。那是报告可用的轴和位置数据….

我有以下内容,这似乎可以正常工作。

grbl_sendf(CLIENT_SERIAL, “X:%f Y:%f\r\n”, gc_state.position[0], gc_state.position[1]);

结果:

Grbl 1.3a [‘$’ 寻求帮助]
g0x100
ok
ok
m114
X:100.000000 Y:0.000000
ok

grbl自定义 GCode 命令
所有者

婚戒 评论 2021 年 3 月 12 日

在 Discord 上讨论这类事情可能会更好。

grbl自定义 GCode 命令

whoim2 评论 2021 年 8 月 9 日  

@bdring

您还必须在每次编译之前“清理”。自动清理确实处理自定义文件夹。

谢谢!!!

接下来我在看M114。那是报告可用的轴和位置数据….

我有以下内容,这似乎可以正常工作。

grbl_sendf(CLIENT_SERIAL, “X:%f Y:%f\r\n”, gc_state.position[0], gc_state.position[1]);

结果:

Grbl 1.3a [‘$’ 寻求帮助]
g0x100
ok
ok
m114
X:100.000000 Y:0.000000
ok

您好,esp32grbl 和 openpnp 之间的过程是怎样的?我还没有完全组装好我的机器,但我正在寻找有关这方面的任何信息。如果你能简单地告诉我未来的问题,那将对我有很大帮助。

例如,在初始设置期间,我必须从 openpnp 中删除 M400 命令才能让机器开始移动。这会影响机器的实际性能吗?会不会有球队领先于真实动作的问题?谢谢!

grbl自定义 GCode 命令

M114 与现有的 grbl 命令“?”是多余的。? 比 M114 好得多,因为它可以立即作为单个字符处理,而不会污染串行输入缓冲区。M114 几乎不可能在发件人中正确处理。cncjs 尝试了许多不同的技术来从 Marlin 获取及时的位置报告,但从未找到一种能够在不导致 GCode 数据流中断的情况下生成及时报告的解决方案。Marlin 系统通常(通常)附有由 Marlin 内部更新的 LCD 显示器。此外,Marlin 最常用于工作时间很长的 3D 打印机,其中很少需要细粒度的位置报告。

Grbl_ESP32 开发人员不太可能接受试图将 Grbl 变成 Marlin 的补丁。这样的建议已经提出了很多次,并且一直被拒绝。在某些情况下,可以接受 Marlin 可能具有的有用功能,但语法通常需要类似于 NIST RS274 / LinuxCNC 而不是 Marlin 方言。

grbl自定义 GCode 命令

openpnp 允许您使用正则表达式微调命令发送和读取/处理。很可能,许多(如果不是全部)任务可以通过正确配置 openpnp 来解决特定固件(esp32 grbl)的功能和响应。openpnp 开发人员对 esp32grbl 支持感兴趣,并且愿意在需要时进行更改。
这是正确的,但只有到目前为止,openpnp 才能解决问题。

喜欢 (0)

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