开源改变世界

Arduino Leonardo 上的 Grbl? #111

推推 grbl 3年前 (2023-01-21) 112次浏览
关闭
chamnit 打开了这个问题 2012 年 7 月 24 日 · 32条评论
关闭

Arduino Leonardo 上的 Grbl?#111

chamnit 打开了这个问题 2012 年 7 月 24 日 · 32条评论

注释

Arduino Leonardo 上的 Grbl? #111
成员

刚刚注意到 Arduino Leonardo 已经发布。因此,我想开始讨论这将对 Grbl 带来哪些变化。主要区别在于 Leonardo 基于 Atmega32U4 芯片,而不是带有 AtmegaXU2 或 FTDI USB 转串口芯片的 Atmega328p。这是两者之间差异的简短列表。

  • 更多 SRAM 内存从 2K 到 2.5K。这可能意味着从现在的 16-18 到 20-25 个加速规划器块。或者更大的接收流缓冲区等。使用内存增加的最佳方式是什么?
  • (可能)还有 4 个数字 I/O 引脚。显然这些可能无法访问,因为它们已被映射到 ICSP 标头和另一个终止。还没有玩过,但想知道这是否可以很容易地被劫持使用。也许是第四轴?
  • 更多计时器!如果我理解正确的话,Leonardo 有一个 8 位、两个 16 位和一个 10 位板载高速定时器,而不是两个 8 位定时器和一个 16 位定时器。不确定这对 Grbl 意味着什么。在这里接受一些想法。
  • 全速 USB / 无串行芯片。这意味着主处理器现在正在处理所有通信。我想 Grbl 需要在其代码库中包含很多这样的驱动程序来支持这一点,但我可能是错的。这也意味着 Grbl 使用的基本串行接口可能已经过时。可以肯定的是,这可能会影响 Grbl 通信和 GUI 交互的方式。
  • 串行和 USB 通信的分离:这意味着数字 I/O 引脚不再绑定到 D0 和 D1,而是通过虚拟化软件执行,除非明确编译。这意味着可能有额外的两个数字 I/O 引脚可用于 4 轴或其他。
  • 重置异常:当通过串行接口连接时,草图不会像以前的 Arduino 那样自动重置,而是程序继续运行。此外,在对 Leonardo 进行硬重置后,设备会与主机完全断开连接,必须重新建立连接。不确定这将如何影响第 3 方 GUI,但可能需要进行一些思考和测试以了解其具体工作原理。
Arduino Leonardo 上的 Grbl? #111

我认为那部分额外内存将用于 usb 缓冲区

我将 USB 和 st 库用于我的 stm32 端口,我只是保持一切相同,并且从 usb tx/rx 中断读取/写入与 uart 使用的相同缓冲区。

数据往往会成块出现,但我认为使用外部 usb 芯片时也是如此,它们都与 usb 数据包大小和 1ms 间隔有关

Arduino Leonardo 上的 Grbl? #111
成员作者

很高兴听到移植应该相对简单。我不熟悉 USB 到串口转换过程的工作原理。我知道数据包延迟会导致 XON/XOFF 流量控制出现问题,如果转换器无法以某种方式管理的话。

我很好奇这会占用多少处理器时间,甚至有必要使用 USB 转串口功能。我想如果一切都集成到一个闪存中,我们可以自由破解这段代码,使其更适合 Grbl,而不是包罗万象。您知道 USB 缓冲区需要多少内存吗?

Arduino Leonardo 上的 Grbl? #111

我试过将它移植到莱昂纳多身上,但卡在了连续剧上。我需要找出 usb 串口是如何处理的。

您上面没有提到的另一个问题是当前的 le​​onardo 引导加载程序负责处理 USB 串行内容,但它的大小也约为 4k – 因此它限制了程序的可用空间。

grbl 可以通过引导加载程序下载还是需要外部程序员将其加载到微型计算机上?

Arduino Leonardo 上的 Grbl? #111
成员作者

感谢您试一试!我还没有拿起莱昂纳多,也不确定他们是如何管理串行 USB 的。很高兴知道它在引导加载程序中。这并不能真正让我们直接控制它,因为它确实如此。

Grbl 可以通过引导加载程序或外部编程器进行闪存。使用引导加载程序方法,之后您可以立即返回使用 Arduino IDE,而无需重新刷新引导加载程序。我们这样做是因为这会吸引新用户尝试 Grbl。使用外部编程器进行闪存确实有助于消除短暂的“启动”延迟,这种延迟会使 Grbl 在此期间容易受到电子噪声的影响。

Arduino Leonardo 上的 Grbl? #111

我一直在尝试让 grbl 在也是 Atmega32u4 的 teensy 上运行,我通过使用 pjrc 串行库http://www.pjrc.com/teensy/usb_serial.html使串行工作非常容易,我可以通信使用 grbl 并转储设置,但是当我尝试发送任何 G 代码时它似乎挂起。我怀疑这是一个定时器中断问题,但我还没有尝试调试它。
重写序列号以使用 USB 是微不足道的,它可以等到连接终端后再在设置过程中走得太远。我将分叉 grbl 代码并发布我的补丁。

好吧我放弃了,没有简单的方法来调试它挂在哪里,所以我只买了一个 Uno :)

Arduino Leonardo 上的 Grbl? #111
贡献者

大家好!

今晚我花了一些时间搞砸了这个并且已经走得很远了!这是我的分支:https ://github.com/tmpvar/grbl/commits/atmega32u4-support

基本上我已经开始将LUFA作为依赖项进行集成,这会增加大约 4k 的闪存大小(没什么大不了的吧?)

我在上述分支上使用了adafruit 的 atmega32u4 分线板。除了实际的步进运动之外,一切似乎都处于工作状态。发送G1 X100锁定设备。经过一些跟踪和调试后,我将根范围缩小到这些行。如果我将它们注释掉,设备不会冻结……但它也不起作用!

我的理解是 LUFA 不使用中断进行通信,这使实现者可以自由使用所有中断。在我们的案例中,我认为这是一个问题。也许强迫 grblUSB_Task()和朋友进入中断可以解决这个问题。我会尽快尝试,我只是想在完全失去动力之前分享!

Arduino Leonardo 上的 Grbl? #111

你好!我一直在尝试将这一行的查询拼凑起来,以便在我自己的基于 32u4 的电路板上使用。tmpvar 先生似乎取得了不错的进展,但上面的内容听起来有点像遇到了障碍。这会被视为不便还是绝对的阻碍?

如果是前者,我会热衷于更深入地挖掘,但如果知道它很棘手,我不想浪费时间。

哦,还有这里所做的所有工作的超级粉丝。GRBL 非常优秀,你们都应该得到最高的赞扬。

Arduino Leonardo 上的 Grbl? #111
贡献者

@rdpowers我当然认为值得深入挖掘。我记得这个线程(或另一个?)还有更多内容,相当于“不可能”,但老实说,我认为这取决于管理 32u4 上的 USB 接口需要多少时间。

我猜想那里有更多的“东西”需要处理,而不仅仅是与 uno 上 usb 和 atmega328p 之间的串行芯片通信。如果您有任何发现,请告诉我们!

Arduino Leonardo 上的 Grbl? #111

@tmpvar我想我已经解决了你的问题 :)

原来32u4没有Timer2!这里的行是问题所在:https ://github.com/grbl/grbl/blob/edge/stepper.c#L151-152

几行之后的 sei() 看起来是问题所在,但这只是因为那是不存在的 Timer2 ISR 最终第一次触发的时候。

我猜测当 Timer2 中断被触发时(错误地并且即使它被定义)它触发了 ISR(BADISR_vect),它在未处理时重置微。这是一个完整的猜测,我可能会稍后检查它是否是这种情况。

改为使用 Timer3 似乎效果很好。虽然我还没有完全让我的设备工作(也没有检查时间没有从根本上改变和破坏东西),但步进器移动并且似乎没有任何东西最终损坏 – 只需要调整以使事情完全排序然后合并到当前grbl 的版本。
https://github.com/rdpowers/grbl/tree/atmega32u4-support

非常感谢您让我走上正轨!

Arduino Leonardo 上的 Grbl? #111

让我们使用 Timer0 而不是 Timer3——原来 32u4 上的 Timer3 是 16 位的,溢出 0xFFFF 比溢出 0xFF 花费更多的时间。之后好好工作!

Arduino Leonardo 上的 Grbl? #111

仅供参考,我已经将我的 Leonardo/32u4 分支支持到当前版本的 grbl – 0.8c。你可以在这里找到它:
https ://github.com/rdpowers/grbl/tree/atmega32u4-support-8c

由于 LUFA 依赖性,它已接近最大尺寸,我不得不删除几个功能以使其适合微型,包括冷却液、主轴控制和归位。可以通过移除 Catalina 引导加载程序并使用专门的编程器来重新安装它们……留给读者练习。

尚未在实际机器上进行测试,但似乎可以做所有正确的事情。

32u4 确实是一个糟糕的目标选择,鉴于程序内存的限制,我怀疑我会继续努力跟上 :(

仍然很乐意回答任何问题。希望其他人发现这很有用!:)

Arduino Leonardo 上的 Grbl? #111
成员作者

@rdpowers: 甜的!感谢您对此进行尝试。我一直很好奇支持莱昂纳多需要什么。用户提出的主要潜在问题之一是 USB 处理及其如何影响步进脉冲和其他实时操作。例如,如果您收到任何抖动或跳过的步骤。很难测试这种类型的东西。

另一个是涉及的空间,你似乎已经弄清楚了。我们为 328p 版本所做的其中一件事是去除我们不需要的非常大块的 Arduino 库,只保留我们所做的事情。在大多数情况下,我们最终重写了其中的大部分,以在大小和速度上都更有效率。Leonardo 也可以这样做,但我认为这可能不值得付出努力,因为 Uno 和 Leonardo 之间的成本差异很小。

Arduino Leonardo 上的 Grbl? #111

我认为从技术上讲,您可以通过 USB将相当高的波特率注入这些东西。我的一个朋友说她
很舒服地超过 115200 =) 不记得引用的确切波特率,但我
肯定认为我听错了。

但是,是的,那个引导加载程序有点棘手。我想知道有多少
引导加载程序可以被剥离……
在 2013 年 1 月 6 日凌晨 1:08,“Sonny Jeon” notifications@github.com写道:

@rdpowers https://github.com/rdpowers:太棒了!感谢您
对此进行尝试。我一直很好奇支持
莱昂纳多需要什么。用户提出的主要潜在问题之一是
USB 处理及其如何影响步进脉冲和其他
实时操作。例如,如果您收到任何抖动或跳过的步骤。
很难测试这种类型的东西。

另一个是涉及的空间,你似乎已经弄清楚了。
我们为 328p 版本所做的其中一件事是去除我们不需要的非常
大块的 Arduino 库,只保留
我们所做的事情。在大多数情况下,我们最终重写了其中的大部分,
以在大小和速度上都更有效率。Leonardo也可以
这样做,但我认为这可能不值得
付出努力,因为 Uno 和 Leonardo 之间的成本差异很小。


直接回复此电子邮件或在 GitHub 上查看它 https://github.com/ /issues/111 #issuecomment-18750595

Arduino Leonardo 上的 Grbl? #111

@chamnit, 是的,确实很难测试抖动或跳过的步骤。我得到的最好的答案是轶事;我运行上面提到的 0.8a 版本已经有一段时间了,结果还算合理。这只是一台做小工作的小机器,但它们表现得很好,看起来运行平稳。它的运行速度也不是那么快,这对两个部门都有帮助。

我对 AT 芯片不是很了解。我想我只是希望有朝一日可以使用具有类似架构的更大版本的 32u4,然后这可能会更有价值。它至少可以帮助防止有人整理连续剧(再次感谢@tmpvar,很棒的东西!)和一些小问题,比如支持哪些定时器。

@kitizz:我还没有真正做过任何测试,但在这个设置中,你几乎只是忽略了波特 – 有太多的变量并且不知道哪个部分正在以什么速度抽象……我已经打孔了从 250000 到 9600 的一切,并且能够与 32u4 通信就好了。我使用在 115200 连接的客户端,因为这似乎是合理的,但是,除了感觉之外,没有任何其他支持。当我有一个更大的工作负载小 G0,G1 命令时,它似乎仍然不会影响操作的流畅性,但这可能更多地与 grbl 内的有效缓冲和机器速度有关,而不是传输速率。或不。耸肩:)

Arduino Leonardo 上的 Grbl? #111

你是如何测试USB速度的?虚拟串口的波特率设置对32u4没有任何意义。无论是 9600 还是 250000,它都会以相同的速度运行。

Arduino Leonardo 上的 Grbl? #111

@cody82:我没有测试速度,但我假设在我用来流式传输 G 代码的脚本或程序中设置速度会影响信息在管道上的速率,但那里和之间的多个软件层微意味着我不太清楚任何东西在那里结束的速度有多快。

Wireshark 的 Linux 版本支持 usb 监控,所以可能有一些方法可以判断,但由于它对我有限的铣削没有不利影响,我不太倾向于追逐它。

Arduino Leonardo 上的 Grbl? #111
贡献者

我的实验是简单地测试是否可以在 32u4 上运行 grbl。LUFA 可能不是最好的选择,因为我们已经越来越接近 32k 的限制。我敢打赌我们可以把它压扁,类似于@chamnit提到过,但不会丢失默认构建中的功能。

@rdpowers惊人的!你的代码在哪里?

@chamnit我看到使用支持 usb 的 avr 的好处是缺少辅助芯片来执行 usb 操作,对于像我这样的人来说,这将允许使用不一定基于 arduino 的自定义控制器。不过我同意,这不是一个重要的优先事项。

几天前我在一次会议上还看到了另一件事,其中一个人闪现了 atmega8,它在 arduino 上进行 usb 通信以注册为操纵杆。虽然我知道这是可能的,但我从未见过。有dfu程序员真的很容易!虽然它不是立即适用的,但对于完全用完他们的 arduino 空间的人来说,它可能是一个选择。有趣的是,arduino uno 类板上实际上有两个处理器。

Arduino Leonardo 上的 Grbl? #111

仅供参考 teensy2 http://www.pjrc.com/store/teensy.html也是 32U4,非常便宜。我尝试了一段时间让 GRBL 在上面运行,但遇到了计时器问题。这个端口应该可以帮助我解决这个问题。

Arduino Leonardo 上的 Grbl? #111

为什么这个问题还没有解决就关闭了?

Arduino Leonardo 上的 Grbl? #111
成员作者

@prusnak:目前还没有正式支持莱昂纳多的计划。这就是为什么这个问题被关闭了。

Arduino Leonardo 上的 Grbl? #111

@chamnit很公平。从讨论中不清楚,这就是我感到困惑的原因。

Arduino Leonardo 上的 Grbl? #111

好吧,今晚很晚了。看来关于GRBL在LEONARDO上运行的问题完美解决了。也许我应该给grbl – 0.8ca尝试提到的@rdpowers.

Arduino Leonardo 上的 Grbl? #111

我上传了一个从grbl-atmega32u4-support-8c编译的 HEX 文件。此外,还需要一个虚拟USB驱动程序,谁可以在这里下载一个。

Arduino Leonardo 上的 Grbl? #111

我能够通过以下方式编译和上传分支@rdpowers对 Arduino Yun 来说没有问题。在 OSX 上,不需要虚拟 USB 驱动程序。

值得注意的是,必须删除一些功能 – 特别是归位。我会看看是否有可能包括归位,因为它是一个非常重要的功能(至少对我而言)。

Arduino Leonardo 上的 Grbl? #111

嘿大家。我真的希望我能早点找到这个线程……

上周我一直在将 grbl0.9j 移植到 Leonardo/32u4,主要是因为我没有意识到它已经被尝试过……(是的,我确实搜索过,但显然不够努力。)并且在许多端口实际完成和工作的方式……我可以用“Grbl Controller”很好地控制它并获得移动轴反馈。而且我不必放弃任何功能,只需打开 GUI_REPORTING 即可。(0.9j 有 AMASS、Spindle PWM 和其他改进)是的,我重新映射了 Timer2 -> Timer4,并且我一直在使用 Teensy USB 库和库存引导加载程序。(没有丝瓜)

然而,在“清理”分配端口、引脚和定时器时,我遇到了 USB 中断向量优先级高于定时器中断的问题(显然这里众所周知)。我想知道是否有人想出解决方案,或尝试过以下任何一种方法:

  1. 轮询驱动的 USB 驱动程序——谁知道呢,可能会重写 USB/CDC 例程以进行轮询而不是中断驱动。那也可能是万劫不复的绝望深渊。
  2. 在 USB 向量中尽早重新启用中断——不知道这是否适用于 atmegas,但在大多数处理器上,您可以重新启用全局中断,同时屏蔽当前中断(以防止重新进入),然后重新启用最后的本地中断。这样,较低优先级的中断仍然会以轻微的延迟发生。
  3. 硬件中断升级 – 如果定时器输出信号被路由到 INT0 引脚,那么它将能够中断 USB 向量。事实上,OC0B 出现在该引脚上。也许我们可以使用一个(未连接的)引脚将中断“升级”为 INT0 – 假设我们可以使其成为输出,同时“输入”足以引起硬件中断。最坏的情况是,需要跨接两个引脚以将 OC4A 等定时器输出连接到 INT0。不过,可能会有额外的延迟周期,以及奇怪的同步问题。
  4. 忽略它。- 如果 USB 中断例程足够快,那么在慢速系统上抖动将最小 – 并且驱动步进器可能不是该设备的目的。(只是主轴/冷却液控制或类似的。)

我将查看“rdpowers/grbl”存储库,以防其中有任何有用的东西,但任何建议都很好。我太接近了。

Arduino Leonardo 上的 Grbl? #111

@unorthodox-engineers那么,您是否设法解决了中断优先级问题?你能分享你的修改吗?

Arduino Leonardo 上的 Grbl? #111

是的。结果证明问题不存在……USB 中断都发生在设置/握手阶段,一旦端点建立,一切都由 u32 的硬件 FIFO 缓冲区和轮询调用处理。里面其实很整洁。我可以确认莱昂纳多完全有能力以相当高的速度无故障地运行 grbl。

事实上,由于硬件级校验和/重传/流量控制,USB 链接在技术上优于串行链接或 UNO 上的 USB 转换器。(内置 XON/XOFF 的等价物)您可以直接进入堆栈,在 32u4 上,做各种有趣的事情。

虽然 Timer 和 GPIO 引脚有很多问题……几乎所有东西都被重新分配了,这让 GrblShields 变得毫无用处,我对此并不满意,我仍在寻求改进。

USB“HIDS”(硬件 ID)也存在问题,结果证明这是一个规模惊人的兔子洞。基本上,“USB Implementers Forum”(USB 等同于 MPAA)收取分发硬件 ID 的许可费。不出所料,通用串行端口没有“类 ID”。每个 USB 设备制造商都应该为获得 HID 支付 4000 美元,允许其他人使用您的 HID 是撤销您的密钥的合法理由。

从技术上讲,Arduino 上的 HID 仅获得 Arduino LLC 固件的许可。为了正确地做事,我们应该从 OpenMoko 获得一个“官方”grbl HID(由于许可故障,它拥有为数不多的可重新分配的 HID 块之一,并将 ID 提供给开源项目。)然后编写一个使用该 ID 的 Windows .inf 驱动程序。(是的,真的。这就是为什么每个该死的串行端口设备似乎都有自己的驱动程序文件,而 Cypress 芯片如此受欢迎。制造商别无选择。很高兴 Microsoft/Linux/Apple 忽略了规范并且不每个单独的 USB 闪存驱动器/鼠标/网络摄像头都需要一个。)

如果我们得到一个 HID 并编译成唯一/随机的产品序列号,那么 grbl 设备就可以被操作系统明确识别。他们总是会被分配到相同的 COM 端口。您甚至可以添加检测连接和运行程序的 linux udev 条目。我认为这是一个可能值得麻烦的可靠性水平,但这仍然是一种努力。

我一直在(广泛!)与 Sungeun 沟通,他掌握了我开发的大部分代码,尤其是 USB 驱动程序,但因为我也做了很多其他更改(将步进器输出替换为 Galvos 的 DAC 代码等)在我们中至少有一个人无法访问这两个平台的情况下,将这些更改拖入其中有点困难。他只有 Unos,而我只有 Leonardos,这将难度级别提高到“困难”。另外,我的激光器坏了,所以我现在根本无法测试:-(

分支和发布很诱人,但这可能是引起分叉的好方法,我们已经有足够多的分叉了。

如果您迫切需要,请告诉我,我会把我的代码发给您。它需要针对您的平台进行更改(特别是如果您再次使用步进器)并且您可能需要调试一些功能,例如限位开关。至少在圣诞节之后我才会回到这个话题。

我们真正需要的是对两个平台都具有良好测试设置并且可以验证我们的构建的人。然后 Sungeun 和我可以破解代码,并在我们破坏另一个分支时得到通知。

Arduino Leonardo 上的 Grbl? #111

您肯定不想为开源项目拥有自己的 HID/VID。
驱动需要签名,也就是年费,起码要给Micro$oft。
即使在苹果上需要
签名,但因为它是很老的要求,所以有可能是免费的。
对于书呆子来说,无需登录即可运行 Win7-8 是可能的,而不是
真正的用户,
但 win10 不再允许这样做。
您可以使用 VID 十进制 5824(十六进制 0x16C0)和范围 VID
十进制 1000-1009
进行测试,但有此限制:
您使用这些 PID 的小工具不会离开您的办公桌,
如果遇到麻烦,您不会向我投诉具有重复的 PID
(例如,因为其他人没有遵循之前的规则)。

2015-11-28 1:43 GMT,Jeremy Lee notifications@github.com

是的。结果证明问题不存在……USB 中断都
发生在设置/握手阶段,一旦端点
建立,一切都由 u32 的硬件 FIFO 缓冲区和
轮询调用处理。里面其实很整洁。我可以确认
莱昂纳多完全有能力以相当高的速度无故障地运行 grbl

事实上,
由于硬件级校验和/重传
/流量控制,USB 链接在技术上优于串行链接或 UNO 上的 USB 转换器。(内置 XON/XOFF 的等价物)您可以直接
进入堆栈,在 32u4 上,做各种有趣的事情。

虽然 Timer 和 GPIO 引脚有很多问题……
几乎所有东西都被重新分配了,这让 GrblShields 变得毫无用处,我
对此并不满意,我仍在寻求改进。

USB“HIDS”(硬件 ID)也存在问题,结果证明这是
一个规模惊人的兔子洞。基本上,“USB Implementers
Forum”(USB 等同于 MPAA)收取分发
硬件 ID 的许可费。
毫不奇怪,通用串行端口没有“类 ID” 。每个 USB 设备制造商都应该为
获得 HID 支付 4000 美元,允许其他人使用您的 HID 是
撤销您的密钥的合法理由。

Technically, the HIDs on your Arduino are only licenced for the Arduino LLC
firmware. To do things properly, we should get an “Official” grbl HID from
OpenMoko (who, due to a licencing glitch, has one of the few re-assignable
HID blocks that exists, and gives out ID’s to open source projects.) and
then write a Windows .inf driver that uses that ID. (Yes, really. This is
why every damn serial port device seems to have it’s own driver files and
the Cypress chip is so popular. The makers have little choice. Just feel
glad that Microsoft/Linux/Apple ignored the spec and don’t require one for

喜欢 (0)