开源改变世界!!

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

推推 grbl 2年前 (2023-01-23) 187次浏览

打开
DBSDBS 开启了这个issue 2015 年 12 月 22 日 · 28条评论
打开

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上)#869

DBSDBS 开启了这个issue 2015 年 12 月 22 日 · 28条评论

注释

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

你好,

是否可以在 Arduino Uno 上控制 X、Y 电机 + 伺服(用于投影仪的快门)?

M03 Sxx / M04 Sxx 做一些动作,但是可以正确使用它们吗?

提前致谢。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

你好,

您可以尝试使用名为 grbl-servo 的 grbl:https
://github.com/robottini/grbl-servo M4 无法运行,因为引脚 13 未连接到伺服(并且不能!)。
您可以修改 spindle_contol.c 文件中的所有内容(修改定时器的预分频器)

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

非常感谢你垫。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

尝试对其进行测试,因为它似乎不起作用(伺服移动但不总是使用相同的 gcode 进行相同的运动)。对我来说,预分频器为 1024 的 pwm 频率太高了。最终频率为16Mhz/1024=15khz。要控制伺服系统,我们需要 1/20ms=50Hz。
有人可以帮助我/我们吗?

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869
贡献者

@mat60PWM 的公式是
fPWM = fCPU / (PRESCALER * (1+TOP))
fPWM = 16,000,000 / (1024 * (1+255)) = 61Hz 为使 UNO
降低频率,您可以打开相位校正 PWM将它除以 2。

我不确定你需要什么来驱动伺服,如果你能告诉我你到底是什么,我可以让你知道如何配置定时器。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

@EliteEng,

我想用伺服驱动打印机的 DLP 投影仪的快门。

由于我的设置的限制,它应该转动 120 度左右。

当然,每次快门都在同一个位置上是个好主意,而不是随机的。

感谢所有的想法。我会等待更多的意见/修改。


意思是当我测试它时……伺服只用第一个“M3 Sxx”命令移动。随着“S”值接近预览值,舵机处于嗡嗡声状态,什么都不做。退出此状态是使用“M3 Sxx”,但使用大/小“S”的 2-3 倍。

“M5”不起作用。(当然 M4 也是 :)

我不懂“C”语言,我很难找出预览描述的更改必须在“spindle_control.c”中的何处进行…

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

@EliteEng,

感谢您的答复。所以PWM频率是好的。

我遇到的主要问题是解决了。
事实上这是一个硬件问题。伺服器由 arduino 的 usb 提供(步进驱动器也是如此)。现在 arduino 由 12V 2A 外部电源供电并且可以工作。

代码还是有问题。SXX 命令必须在 15(最小值)和 32(最大值)之间,如果您发送 80,它会起作用……
我会尝试修改它……

注意:M5 适合我

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

@mat60留意 Arduino 上稳压器的温度。它是一个线性稳压器,因此在 12V 的 Vin 和 5V 的 Vout 下,它必须以热量的形式耗散 58% 的输入功率。如果您使用输出电压更接近 7-8V 的稳压电源,它的运行效率会更高。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

好的。

一切都适用于 spindle_contol.c 文件。为我犯下的所有错误感到抱歉。

您必须输入您将在 gcode 中发送的最小和最大速度。这是在 config.h 文件中:

#define SPINDLE_MAX_RPM 100.0 // 最大主轴转速。该值等于 PWM 上的 100% 占空比。
#define SPINDLE_MIN_RPM 0.0 // 最小主轴转速。该值等于 PWM 的 (1/256) 占空比。

在我的例子中 M3SXX,XX 必须在 0 到 100 之间。你可以根据需要修改这个值(如果你想以度为单位工作,则为 0 到 180 …)
然后你在 spindle_contol.c 中参数化伺服的硬件限制文件。在我的例子
中 #define RC_SERVO_SHORT 6 // Timer ticks for 0.6ms pulse duration (9 for 0.6ms)
#define RC_SERVO_LONG 34 // Timer ticks for 2.5 ms pulse duration (39 for 2.5ms)
为了知道上限和下限,您可以修改代码行 109 的末尾(只是为了测试


current_pwm = floor(rpm);
OCR_REGISTER = current_pwm;
#别的
//current_pwm = floor(rpm_(RC_SERVO_RANGE/SPINDLE_RPM_RANGE) + RC_SERVO_SHORT);
current_pwm = floor(rpm);
OCR_REGISTER = current_pwm;

我希望这很清楚。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

圣诞快乐的人们,

@mat60,

所以我做了很多测试,但实际上结果是一样的。

我变了:

  • 在“spindle_control.c”中:

#define RC_SERVO_SHORT 15 – 从 4 到 15
#define RC_SERVO_LONG 39 – 从 32 到 39
#define RC_SERVO_INVERT 1 – 使用 // 并取消注释

  • 在“config.h”中:

#define SPINDLE_MAX_RPM 100 – 从 100 到 256

我收到的最大信息是找出如何以 90 度驱动伺服。和谐。
GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

初始状态在左下方。
低于 M3 S32(和 M5)的值将伺服驱动到顶部。
M3 S1000 的值驱动舵机水平向左。

M3 S50 和 M3 S1000 之间的值将伺服器移动到某个位置 – 可能与千值对应。

每个值 > M3 S1000 都不会移动伺服超过 M3 S1000。

更接近的 S 值什么都不做——例如,如果我已经将伺服移动到 M3 S30,发送 M3 S50 什么都不做!

可能我对此一无所知,但直到现在我对 Arduino(Uno、Mega、RAMPS 等)没有任何问题。

我会尝试使用所有结果,但我仍然对这个 PWM 感到困惑。

问候

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

你确定要编译好的文件吗?您是否在 arduino IDE 中使用 GRBL 作为示例?
如果你不修改库并重新启动 Arduino IDE,它不起作用……
我认为你的问题来自这里……
你可以测试它:在 spindle_control 文件中犯一个大错误。第 26 行你写
#include“grbabc.h”(或你想要的……)你保存你重新启动 arduino IDE ……
尝试编译它以检查。你一定是搞错了。

告诉我怎么了…

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

我有 2 个包含 GRBL 文件的文件夹:

  • 我解压缩 ZIP 文件的文件夹;
  • “C:\Users……\Documents\Arduino\libraries”中的文件夹,在 Arduino IDE 的库中导入 GRBL 后出现;

我犯了你在第一个文件夹的 spindle_control 中向我展示的“错误”并尝试编译 – 没有错误。然后我在第二个文件夹中做了同样的事情 – 再次没有错误。

可能是我错过了什么

提前致谢

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

你有两个(或更多)GRBL 库,比如 GRBL(经典)和 GRBL Servo 吗?
在您的计算机中搜索所有主轴控制文件并找到合适的…

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

@mat60

非常感谢你 !!!

我真的有 2 * GRBL 库的…我删除了不需要的,一切正常!

再次感谢!!!

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

很高兴你让它工作了。但是我想指出,您的解决方案可能并非在所有情况下都有效。原因是因为 RC 伺服不使用与传统相同类型的 PWM。RC 伺服系统真正使用 PPM 或脉冲位置调制。正如您所发现的,许多 RC 伺服系统在标准 PWM 上工作得相当好,但有些则不能。原因是因为 RC PWM(真正的 PPM)应该具有相同的帧速率,只是高端脉冲宽度不同。例如,1.5 毫秒的“开”信号命令中性伺服位置,1 毫秒和 2 毫秒是伺服的极限位置。“关闭”时间会发生变化,以使总帧速率等于 50 Hz 或 20 毫秒。如前所述,许多伺服系统都可以接受标准 PWM,但有些伺服系统,尤其是较旧的伺服系统将无法正常工作。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869
贡献者

好的,这对 Mega 很容易做到,但对 UNO 很难做到。
如果有人想要帮助在 Mega 上启动和运行伺服系统,请告诉我。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

我只想补充一点,grbl-servo 为我们工作,用它来驱动带 uCNC_controller
的记号笔这个问题@DBSDBS有(库文件夹中有两个冲突的 grbl.h)也咬了我们。
希望看到这个 mod 进入主线 grbl。

这里还有一些不错的清晰评论@EliteEng 关于预分频器,如果需要的话 #328

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

@chamnitgrbl 伺服支持的官方状态是什么?我正在使用 robotini 的 repo 中的 grbl-servo,但它基于 0.9i(我们已经在 0.9j 上)并且它似乎是对主轴代码的快速破解。我正在考虑将它移植到最新版本(可能移植到 trunk / master 分支),并通过官方配置和自己的代码(不触及主轴代码)使其得到适当的支持。但我首先要问的是现在是否已经完成了任何事情,以及您是否愿意接受代码以供审查(用于进入官方树)。

也许使用引脚 9 或 10(你可以通过加入一些端点来释放引脚),因此使用 timer1。你怎么认为?我仍在阅读代码以了解这是否会造成任何附带影响。由于驱动伺服的分辨率,Timer1 是可取的。

此外,由于伺服支持最终可以与所有其他功能并行工作,我认为这不是像 robotini 那样劫持主轴代码的最佳选择(因为 M03 和 M05 可能同时用于主轴本身时间)。伺服器可能有不同的 gcode。我知道在 3d 打印机世界中也有一些定义(它是用于设置角度的 M280 和用于设置微秒的 M340)。也许一些配置选项可以选择禁用主轴并将 M03 和 M05 操作映射到特定位置的伺服器,以供那些无法更改生成 gcode 的软件并希望通过主轴开/关动作控制伺服器的人使用。你怎么认为?

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869
成员

@token47:不可否认,由于 328p Arduino 处理器的内存和闪存限制以及即将推出的 v1.0,我一直非常自私地囤积我可以获得的任何闪存和内存。当它完成时,我会更愿意接受拉取请求,尤其是在 Grbl-Mega 回购中,那里对 Mega2560 没有这样的限制。

Timer1 由 328p 上的步进算法使用。所以不要去那里。

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

亲爱的会员,

请帮我!
我是非常新的用户,具有基本的语言技能。我想使用带有常用外围设备的 grbl 伺服:两个步进电机(X、Y 轴)和一个 rc 伺服(Z 轴 = 头部移动)。
我读了这篇文章,但没有清除设置。我的 rc servo 是一个简单的塔式 pro sg90(180 度)。

如何配置 spindle_control.c 文件以使其正常工作?
之间的联系是什么:
定义 RC_SERVO_SHORT 15 // 定时器滴答 0.6 毫秒脉冲持续时间(9 代表 0.6 毫秒)
定义 RC_SERVO_LONG 32 // 定时器滴答 2.5 毫秒脉冲持续时间(39 代表 2.5 毫秒)

和伺服占空比?

M03参数可以给什么值?
我的 arduino 开发板是 uno r3。

谢谢!

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

@token47是的,请!为 grbl 1.1 添加伺服支持!我和这里的许多其他人在同一个地方:我可以让我的设置 (CoreXY Plotter) 与 robottini 0.9 版本一起工作,但我真的很想使用 1.1。
因为我不需要主轴支持,所以我尝试将它的 robottinis quick hack 移植到 1.1,但无法编译(我不了解 C,并且 spindle_control 文件从 0.9 到 1.1 发生了很大变化) .

如果您或其他人可以将伺服控制添加到 GRBL 1.1,我将永远感激 :)

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869
最小顶点 评论了 2017 年 5 月 31 日  

嗨,我刚刚测试了 cprezzi 的 grbl-servo,它运行良好。它是 grbl 1.1f,现在我可以连接 laser web 4。这是下载链接https://github.com/cprezzi/grbl-servo

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

cprezzi 的代码看起来很干净,带有#define启用伺服支持的选项。是否有兴趣通过 PR 将此支持纳入主线?

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

我只知道它如何与我的 cnc 和 servo 一起工作,

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

@MinSoeVertex你能告诉我们你在 LaserWeb4 中使用什么设置来通过 Grbl-servo 控制伺服吗?如何为 Tool_on 和 Tool_off 位置设置所需的角度?

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

好的,这对 Mega 很容易做到,但对 UNO 很难做到。
如果有人想要帮助在 Mega 上启动和运行伺服系统,请告诉我。

我有伺服第一次工作会但现在不工作?你帮忙
….,,,..////谢谢

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

我用第二个arduino板上的简单代码解决了这个问题

https://github.com/shmuliko/stepper2servo

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

好的。

一切都适用于 spindle_contol.c 文件。为我犯下的所有错误感到抱歉。

您必须输入您将在 gcode 中发送的最小和最大速度。这是在 config.h 文件中:

#define SPINDLE_MAX_RPM 100.0 // 最大主轴转速。该值等于 PWM 上的 100% 占空比。
#define SPINDLE_MIN_RPM 0.0 // 最小主轴转速。该值等于 PWM 的 (1/256) 占空比。

在我的例子中 M3SXX,XX 必须在 0 到 100 之间。你可以根据需要修改这个值(如果你想以度为单位工作,则为 0 到 180 …)
然后你在 spindle_contol.c 中参数化伺服的硬件限制文件。在我的例子
中 #define RC_SERVO_SHORT 6 // Timer ticks for 0.6ms pulse duration (9 for 0.6ms)
#define RC_SERVO_LONG 34 // Timer ticks for 2.5 ms pulse duration (39 for 2.5ms)
为了知道上限和下限,您可以修改代码行 109 的末尾(只是为了测试


current_pwm = floor(rpm);
OCR_REGISTER = current_pwm;
#别的
//current_pwm = floor(rpm_(RC_SERVO_RANGE/SPINDLE_RPM_RANGE) + RC_SERVO_SHORT);
current_pwm = floor(rpm);
OCR_REGISTER = current_pwm;

我希望这很清楚。

我没有在使用 Arduino Mega2560 和 GRBL 固件的 Ramps 1.4 上获得任何 PWM 输出,我想知道你从哪个输出引脚获得 PWM 输出并且你是否更改了代码。等待您的回复。谢谢

GRBL + X、Y 电机 + 伺服(在 Arduino Uno 上) #869

好的,这对 Mega 很容易做到,但对 UNO 很难做到。
如果有人想要帮助在 Mega 上启动和运行伺服系统,请告诉我。

我有伺服第一次工作会但现在不工作?你帮忙
….,,,..////谢谢

请告诉你如何在 Ramps 1.4 Mega 上运行伺服?GRBL 运行的输出引脚和 G 代码是什么?

喜欢 (0)