Contact me: hankecnc@gmail.com

config.h 是否支持状态灯引脚? #628

推推 grbl 3年前 (2023-01-22) 191次浏览

关闭
DasWookie 打开了这个问题 2015 年 3 月 20 日 · 9条评论
关闭

config.h 是否支持状态灯引脚?#628

DasWookie 打开了这个问题 2015 年 3 月 20 日 · 9条评论

注释

config.h 是否支持状态灯引脚? #628

这也许可以在我看不到的地方做,但我粗略地看了看却无济于事……如何将状态灯连接到 grbl 以获得绿色/黄色/红色灯塔?

我希望能够设置一个引脚,然后可以定义电压(或者可能是多个引脚,而不是我们有很多备用!),然后设置灯塔可以用来显示机器当前状态的各种状态电压。 .. 无论是绿色 – 正在运行,黄色 – 循环完成或等待交互(工具更换、保持、门、空闲等)和红色(警报、限制、big-badda-boom)。

config.h 是否支持状态灯引脚? #628

是的,我有,我搜索出来了。

2015-03-20 8:07 GMT+01:00,DasWookie notifications@github.com

这也许可以在我看不到的地方做,但我
粗略地看了看却无济于事……如何将状态灯连接到 grbl 以
获得绿色/黄色/红色灯塔?

我希望能够设置一个引脚,然后可以
定义电压(或者可能是多个引脚,而不是我们有很多备用!),然后设置
灯塔可以用来显示
机器当前状态的各种状态电压。 .. 无论是绿色 – 正在运行,黄色 – 循环完成或
等待交互(工具更换、保持、门、空闲等)和红色
(警报、限制、big-badda-boom)。


直接回复此邮件或在 GitHub 上查看:
#628

config.h 是否支持状态灯引脚? #628

代码是这样的,需要插在
void protocol_execute_runtime()
{
uint8_t rt_exec = sys.execute; 之后 // 复制以避免
多次调用volatile

这是代码:

#ifdef signal_tower
static uint8_t state=-1;
if(state!=sys.state) {
if(state==-1) { // 初始化
signal_tower(init);
}
state=sys.state;

if  (state==STATE_ALARM) signal_tower(red);
else if(state==STATE_CYCLE) signal_tower(green);
else signal_tower(yellow);

}
#endif

将 signal_tower 的定义放置在 cpu_map.h 上,
我使用 lm324 解码引脚输出,但如果你使用引脚,只需将
DDR 放置到初始化和
输出引脚高/低的个别颜色。

#define SIGNAL_TOWER_BIT 3
#define SIGNAL_TOWER_PORT PORTB
#define SIGNAL_TOWER_DDR DDRB
#define signal_tower(x) signal_tower_##x()
#define signal_tower_green() (
SIGNAL_TOWER_DDR |= (1<<SIGNAL_TOWER_BIT),
SIGNAL_TOWER_PORT &=(1<<SIGNAL_TOWER_BIT)
)
#define signal_tower_red() (
SIGNAL_TOWER_DDR |= (1<<SIGNAL_TOWER_BIT),
SIGNAL_TOWER_PORT |= (1<<SIGNAL_TOWER_BIT)
)
#define signal_tower_yellow() (
SIGNAL_TOWER_DDR &=
(1<<SIGNAL_TOWER_BIT),
SIGNAL_TOWER_PORT &=(1<<SIGNAL_TOWER_BIT)
)
#define signal_tower_blue() (
SIGNAL_TOWER_DDR &=
(1<<SIGNAL_TOWER_BIT),
SIGNAL_TOWER_PORT |= (1<<SIGNAL_TOWER_BIT)
)
#define signal_tower_init() signal_tower_red()

2015-03-20 11:17 GMT+01:00, Cri S phone.cri@gmail.com :

是的,我有,我搜索出来了。

2015-03-20 8:07 GMT+01:00,DasWookie notifications@github.com

这也许可以在我看不到的地方做,但我
粗略地看了看却无济于事……如何将状态灯连接到 grbl

获得绿色/黄色/红色灯塔?

我希望能够设置一个引脚,然后可以
定义电压(或者可能是多个引脚,而不是我们有很多备用!),然后
设置
灯塔可以用来显示 机器当前状态
的各种状态电压。
.. 无论是绿色 – 正在运行,黄色 – 循环完成

等待交互(工具更换、保持、门、空闲等)和红色
(警报、限制、big-badda-boom)。


直接回复此邮件或在 GitHub 上查看:
#628

config.h 是否支持状态灯引脚? #628
成员

@DasWookie: Grbl 中没有这样的功能。它有意采用极简主义以避免软件膨胀,因此它可以专注于重要的事情。如果需要,添加起来相当简单。作为@cri-s如前所述,您可以在 protocol_realtime_execute() 中设置 LED,大多数状态机更改都发生在此处。

config.h 是否支持状态灯引脚? #628
作者

我担心软件膨胀!有这么多用户,每个人都有自己的特殊需求。状态灯似乎是人们可能想要的东西之一,考虑到这么多专业的 CNC 都有它们,而且 Grbl 中的许多变化似乎是为了尝试在那里保持平价……一个例子是门功能。

除了运算放大器之外,我的另一个想法是使用移位寄存器来控制灯,这需要使用 3 个而不是单个引脚输出来控制多个灯/状态消息。我的期望是在 cpu_map.h 和/或 config.h 中看到类似于支持它的东西,以及 report.c 中塔的相应代码……或者可能在某种 signal_tower.h 和 signal_tower.c 集合中文件。

我并不反对编写自己的实现代码并为 Grbl 的后续版本修补我的分支……我希望它可以在主线中得到支持。

config.h 是否支持状态灯引脚? #628
成员

@DasWookie:安全门功能是原始设备制造商向欧盟运送机器所需要的东西,所以这是一个关键的东西。另一方面,LED 并不是关键特性。的确,它的实现相当惰性且很小,但是 Arduino Uno 上的标准构建的 Grbl 没有支持它的引脚。我将其添加到待办事项列表中,但不能保证它会成功。

config.h 是否支持状态灯引脚? #628

我知道这是从 2015 年开始的,但我也在寻找此功能。在我的例子中,我为 arduino uno 设计了一个新的基于螺丝的防护罩,并且非常喜欢工作警报 LED 指示灯的功能。考虑到许多商用 CNC 机器都有这样的状态灯,我也有点惊讶,至少没有将其添加为一个选项。

在我的新板上,我将一个 LED 连接到模拟引脚 4,因为它似乎在文档中被列为未使用并且可以配置为输出。

我可以理解这可能不是关键功能,而且 uno 在 328p 上的程序空间有限,但我不会考虑这种膨胀。然而,由于空间如此有限,我想此时任何东西都可以被认为是臃肿的。

我仍然希望这将被添加到上游开发中,并且可以通过快速评论/取消评论来启用。

上面的代码建议可能足以让我可以一起破解一些可行的东西,但我更熟悉 IDE 中的 aruino c 代码。我什至不确定此时 cpu_map.h 的 A4 值需要是多少。如果有人有更多代码建议,请告诉我。在我的例子中,当警报被触发时,我只需要一个琥珀色的 LED 灯来点亮,而不是一个带有 3 盏灯的整个 LED 灯塔。

这是我对任何感兴趣的人的盾牌:
https ://github.com/RabbitMountain/GRBL-CNDY-SHIELD

config.h 是否支持状态灯引脚? #628

@cri-s,根据您上面的代码示例,我似乎有部分工作的模拟 4 LED 代码。但是,当没有警报状态处于活动状态时,LED 不会关闭。你能帮我吗?我对这个端口操作代码有点不适应。我不是一个程序员。感谢您的任何帮助,您可以提供。 @chamnit, 也欢迎您提供任何帮助。

这是我的部分工作代码:

void protocol_exec_rt_system()
{

///////////////////////
// 报警 LED 代码:
#ifdef signal_light
static uint8_t state=-1;
if(state!=sys.state) {
if(state==-1) { // 初始化
signal_light(init);
}
state=sys.state;

如果(状态==STATE_ALARM)signal_light(开);
else if(state==STATE_CYCLE) signal_light(off);
否则信号灯(关闭);
}
#endif
///////////////////////

uint8_t rt_exec;// 临时变量以避免多次调用 volatile。
rt_exec = sys_rt_exec_alarm; // 复制易失性 sys_rt_exec_alarm。
if (rt_exec) { // 仅当任何位标志为真时才进入

和:

// Define flood and mist coolant enable output pins.
#define COOLANT_FLOOD_DDR   DDRC
#define COOLANT_FLOOD_PORT  PORTC
#define COOLANT_FLOOD_BIT   3  // Uno Analog Pin 3
//#define COOLANT_MIST_DDR   DDRC
//#define COOLANT_MIST_PORT  PORTC
//#define COOLANT_MIST_BIT   4  // Uno Analog Pin 4

//////////////////    
// Define ALARM LED OUTPUT
#define SIGNAL_LIGHT_DDR   DDRC
#define SIGNAL_LIGHT_PORT  PORTC
#define SIGNAL_LIGHT_BIT   4  // Uno Analog Pin 4

#define signal_light(on) (SIGNAL_LIGHT_DDR |= (1<<SIGNAL_LIGHT_BIT),SIGNAL_LIGHT_PORT |= (1<<SIGNAL_LIGHT_BIT))
#define signal_light_init() signal_light(off) (SIGNAL_LIGHT_DDR |= (1<<SIGNAL_LIGHT_BIT),SIGNAL_LIGHT_PORT |= (0<<SIGNAL_LIGHT_BIT))
/////////////////

config.h 是否支持状态灯引脚? #628

对此进行了更多修改,我似乎得出结论,该代码中的 protocol.c 文件或 cpu_map.h 文件部分存在错误。当 cpu_map.h 中未定义关闭状态时,我可以使用此代码让 LED 打开 A4,但是当我去定义关闭状态时,代码似乎默认为 LED 最后编程的任何状态(在这种情况下)。

这会导致 LED 在状态更改时无法更改。我可以让 LED 在我们处于警报状态时持续点亮,或者无论状态如何都持续点亮,但不会按预期改变。我觉得我可能无意中将 LED 编程为永远保持亮起并且无法改变。也许类似于使用 = 而不是 ==。但如前所述,我不熟悉这种形式的 C 编程,只熟悉通过 IDE 和各种库的抽象简化的 arduino 编码。

任何帮助,将不胜感激。

void protocol_exec_rt_system()
{

uint8_t rt_exec;// 临时变量以避免多次调用 volatile。

////////////////////////

// 报警 LED 代码:
#ifdef signal_light
static uint8_t state=-1;
如果(状态!= sys.state){
signal_light(init);
if(state==-1) { // 初始化
}
state=sys.state;

如果(状态==STATE_ALARM)signal_light(开);
else if (state==STATE_CYCLE) signal_light(off);
否则信号灯(关闭);
}
#endif
///////////////////////

rt_exec = sys_rt_exec_alarm; // 复制易失性 sys_rt_exec_alarm。

//定义洪水和喷雾冷却剂启用输出引脚。
#define COOLANT_FLOOD_DDR DDRC
#define COOLANT_FLOOD_PORT PORTC
#define COOLANT_FLOOD_BIT 3 // Uno 模拟引脚 3
//#define COOLANT_MIST_DDR DDRC
//#define COOLANT_MIST_PORT PORTC
//#define COOLANT_MIST_BIT 4 // Uno 模拟引脚 4

//////////////////    
// Define ALARM LED OUTPUT
#define SIGNAL_LIGHT_DDR   DDRC
#define SIGNAL_LIGHT_PORT  PORTC
#define SIGNAL_LIGHT_BIT   4  // Uno Analog Pin 4
 
#define signal_light(x) signal_light_##x()

// #define signal_light(on) (SIGNAL_LIGHT_DDR |= (1<<SIGNAL_LIGHT_BIT), SIGNAL_LIGHT_PORT &= (1<<SIGNAL_LIGHT_BIT), SIGNAL_LIGHT_PORT |= (1<<SIGNAL_LIGHT_BIT) )
// #define signal_light_init() signal_light(off)
#define signal_light_init() signal_light(off)
#define signal_light(on) (SIGNAL_LIGHT_DDR |= (1<<SIGNAL_LIGHT_BIT), SIGNAL_LIGHT_PORT |= (1<<SIGNAL_LIGHT_BIT) )
// #define signal_light(off)
////// ////////////

config.h 是否支持状态灯引脚? #628

经过多次修改代码后,我似乎已经解决了自己的问题。最后我不得不去掉示例代码中编写的宏。学习一点 C/C# 编程中的位设置也没有坏处。无论如何,我仍然不是一个伟大的程序员,但我现在稍微好一点了。最后,KISS 方法帮助简化了代码,使我既了解代码在状态机中的作用,又能按预期工作。

所以……走我!好极了!:)

这是工作的简化代码:

对于 cpu_map.h 文件:

//定义洪水和喷雾冷却剂启用输出引脚。
#define COOLANT_FLOOD_DDR DDRC
#define COOLANT_FLOOD_PORT PORTC
#define COOLANT_FLOOD_BIT 3 // Uno 模拟引脚 3
//#define COOLANT_MIST_DDR DDRC
//#define COOLANT_MIST_PORT PORTC
//#define COOLANT_MIST_BIT 4 // Uno 模拟引脚 4

/////////////////
// 定义报警 LED 输出
#define SIGNAL_LIGHT_DDR DDRC
#define SIGNAL_LIGHT_PORT PORTC
#define SIGNAL_LIGHT_BIT 4 // Uno 模拟引脚 4

#define signal_light_init signal_light_off
#define signal_light_on (SIGNAL_LIGHT_DDR |= SIGNAL_LIGHT_PORT |= (1<<SIGNAL_LIGHT_BIT) )
#define signal_light_off (SIGNAL_LIGHT_DDR |= SIGNAL_LIGHT_PORT &= ~(1<<SIGNAL_LIGHT_BIT) )
////////////// ///////

对于 protocol.c 文件:

// 在需要时执行运行时命令。此功能主要作为 Grbl 的状态
机运行 // 并控制 Grbl 必须提供的各种实时功能。
// 注意:除非你确切地知道你在做什么,否则不要改变它!
void protocol_exec_rt_system()
{

uint8_t rt_exec;// 临时变量以避免多次调用 volatile。
rt_exec = sys_rt_exec_alarm; // 复制易失性 sys_rt_exec_alarm。

//////////////////////
// 定义报警 LED 输出
signal_light_init;//初始化 LED 处于关闭状态
if (sys.state==STATE_ALARM) {signal_light_on;}
else if (sys.state!=STATE_ALARM) {signal_light_off;}
// else {signal_light_off;}
///////// //////////////

这个被引用了2021 年 8 月 9 日
打开
喜欢 (0)