开源改变世界!!

Wifi-以太网版本 #51

推推 grbl 1年前 (2023-01-26) 129次浏览
关闭
arkypita 打开了这个问题 2017 年 6 月 11 日 · 26条评论
关闭

Wifi-以太网版本#51

arkypita 打开了这个问题 2017 年 6 月 11 日 · 26条评论

注释

Wifi-以太网版本 #51
所有者
阿尔基皮塔 评论了 2017 年 6 月 11 日  

应用户要求@mkeyno我想添加通过 WiFi 以太网连接的功能。
我开发了一个带有 tcp-ip 连接的版本,但我无法测试它,因为我的 arduino 板没有以太网适配器。

有人可以测试它并提供一些反馈吗?

下载链接:https ://github.com/arkypita/LaserGRBL/releases/tag/v2.6.10

Wifi-以太网版本 #51 arkypita 提到了这个问题 2017 年 6 月 11 日
22个任务
Wifi-以太网版本 #51
所有者作者

@mkeyno请提供一些反馈

Wifi-以太网版本 #51
凯诺 评论了 2017 年 6 月 16 日  

@arkypita 非常感谢您的关心,很抱歉迟到了,我进行了一些测试以检查是否有稳定的 websocket 链接,但是会话日志和我的 esp 日志没有报告任何 websocket 链接,我也尝试阅读您的代码任何 websocket 连接,但没有找到相似的(如果有请纠正我)
我可能总结了几个我用于 wifi 桥的假设
1)在 ESP 端我使用了异步 websocket 服务器,它是握手和 html 升级发生在192.xxx.xxx.xx/ws ,所以第一步你websocket 客户端应在该链接上发送请求并建立 websocket 链接
2) ESP rx, tx pin 直接连接到 Arduino uno tx, rx pin
3) 在 ESP 循环函数中,如果有来自 Arduino 的串行数据,它将被发送到已建立的 websocket 链接

#include <ESPAsyncWebServer.h>
     AsyncWebServer server(80);
     AsyncWebSocket WS("/ws");

....
void loop ( void )
 {
 SerialEvent();
 if(NewLine && (millis()-serialTS)>50){  WS.text(inputString); inputString = ""; serialTS=millis();NewLine=false;}    
if(INFO) {if( (millis()-Last_query)>210 ) {Serial.print('?'); Last_query=millis();}} // send ? char to GRBL
}
  1. 如果有来自 wifi 网桥的数据,它将打印到串口

以下是会话日志,如果需要更多数据或测试,请告诉我
`

6/15/2017 10:10:53 PM SetStatus 机器状态 [连接]
6/15/2017 10:10:53 PM OpenCom System.InvalidOperationException:端口已打开
6/15/2017 10:10:53 PM OpenCom 在 LaserGRBL .ComWrapper.Ethernet.Open()
6/15/2017 10:10:53 PM OpenCom at LaserGRBL.GrblCore.OpenCom() 6/15/2017 10:10:53
PM SetStatus 机器状态 [断开连接]
6/15/2017 10:10:55 PM SetStatus Machine status [Connecting]
6/15/2017 10:10:55 PM OpenCom System.InvalidOperationException: Port already opened
6/15/2017 10:10:55 PM OpenCom at LaserGRBL.ComWrapper.Ethernet。 Open()
6/15/2017 10:10:55 PM OpenCom at LaserGRBL.GrblCore.OpenCom()
6/15/2017 10:10:55 PM SetStatus 机器状态 [断开连接]
6/15/2017 10:11:00 PM SetStatus Machine status [Connecting]
6/15/2017 10:11:00 PM OpenCom Open 192.168.4.1:80
6/15/2017 10:11:00 PM SendImmediate 立即发送命令[24]
6/15/2017 10:11:34 PM SetStatus 机器状态 [断开连接]
`

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 6 月 16 日  

你好@mkeyno谢谢你的回复

网络套接字?HTML?所以你在 ESP 中实现了一种网络服务器?为什么?对我来说,使用 http 和 html 通过 tcp-ip 传输串行协议似乎很奇怪!

好吧好吧…我已经阅读了https://github.com/LaserWeb/LaserWeb3-ESP8266
所以,这就是 LaserWeb 与 ESP8266 交谈的方式…好吧。

对我来说,最简单的方法是在 ESP8266 上实现一个 TcpListener 并将读写重定向到 rx-tx pin。我在 LaserGRBL 中实现的只是一个连接到端口并发送-接收数据的 TcpClient。(这是最简单直观的方法,我真的不明白他们为什么决定使用 websocket)。

但是我可以实现一种与“LaserWeb ESP8266”兼容的包装器。现在我已经虚拟化了管理通信的 LaserGRBL 部分,所以我可以轻松添加一个新的包装器。

幸运的是,我必须有一个 ESP8266 模块,所以当我有时间时,我可以使用 LaserWeb 提供的代码对其进行编程并进行测试。

你必须等几个星期,我现在很忙!

Wifi-以太网版本 #51

当然亲爱的@arkypita,我可能会添加可靠的链接,我们需要实时协议,例如 websocket,否则 tcp 链接将阻塞流数据,websockt 易于安装在 web 平台或 .net 平台上,这就是大多数人选择 websocket 的原因

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 6 月 24 日  

你好@mkeyno
我成功地按照https://github.com/LaserWeb/LaserWeb3-ESP8266 中的说明对我的 ESP8266 进行了编程(下载库、电路板、替换 WifiManager.h、arduino 草图和成功的编程)

我使用这个模式进行编程:

Wifi-以太网版本 #51

The right button, when pressed, connects the RESET pin to the ground and when it is released, connects the RESET pin to the VCC through a pull-up resistor. The left button, when pressed, connect GPIO0 to the ground. Using this two buttons you can do all the tasks you need with the ESP8266:

Working on normal mode - Both buttons are released.
Resetting the ESP8266 - Press the reset button and release.
Start in flash mode - Press both buttons, release the reset button and then release the GPIO0 button.

就像在 .gif 图像中一样,我可以连接到 Emblaser2 网络,使用默认 IP 地址联系 ESP,配置我的网络并将 ESP 连接为我的 LAN 的一部分,现在我可以 ping 路由器 DHCP 分配的地址 (192.168.1.170) .

我也已经将 ESP 连接到 arduino,就像在这个模式中一样,arduino 上加载了 Grbl v1.1。

Wifi-以太网版本 #51

LaserWeb3 和 LaserWeb4 都无法连接到 ESP,我一直卡在这个问题上。

LW4 控制台说;

 Connecting Machine @ ESP8266,192.168.1.170
 Server error: unexpected server response (404)
 Machine disconnected
 Machine disconnected

如果我在 192.168.1.170 上打开浏览器,我有一个 404 页面,其中未找到:/

你能帮助我吗?使用 laserweb 的 WiFi 网桥是确保我编写的代码 100% 兼容的唯一方法。

Wifi-以太网版本 #51
所有者作者

已解决:我必须使用端口 81

现在我有其他类型的问题,但我想我可以解决它们

Wifi-以太网版本 #51
所有者作者

@mkeyno我知道了!

Wifi-以太网版本 #51
所有者作者

Wifi-以太网版本 #51

@mkeyno
你在 ESP 和 arduino 之间使用什么串行速度?
我正在使用 115200,但我遇到了很多通信错误,比如步进电机引起的电噪声(但我没有使用步进电机!)

Wifi-以太网版本 #51
凯诺 评论了 2017 年 6 月 25 日  

做得好 @arkypita 你能告诉我你程序中的 websocket 方法吗?您是否使用重新连接 websocket 客户端来使链接稳健?
laserweb 中的 ESP websocket 服务器很旧,使用同步服务器,而异步服务器更快更可靠,我个人使用 250K 进行串行传输,没有错误或丢失数据,但我不确定 GRBL 是否可以处理这样的速度或即使它会增强雕刻功能,我正在设计带有 ESP 的新 PCB 作为 Arduino GRBL 的链接,让我用我的 ESP 模块检查您的新更新并在这里报告,
感谢您的关注

Wifi-以太网版本 #51
所有者作者

测试版:https
://github.com/arkypita/LaserGRBL/releases/download/v2.6.12/setup.exe 源码:https ://github.com/arkypita/LaserGRBL/tree/LaserWebESP8266

所有关于 ESP 的代码都在这个文件中:https ://github.com/arkypita/LaserGRBL/blob/LaserWebESP8266/LaserGRBL/ComWrapper/LaserWebESP8266.cs

我使用了websocket-sharp实现,因为微软只在 .NET framework 4 中实现了 websocket,我喜欢使用 framework 3.5,因为 framework 4 与 Windows XP 不兼容。

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 6 月 25 日  

现在我已经在 ESP 和 Arduino 之间使用 9600baud 进行了测试,但我仍然遇到与 3 条消息之前相同的问题。

这一刻我想不通:

  • 如果我失去了一些缓冲区的字符溢出(但我不认为)以及在哪里(在 websocket 客户端服务器之间或在 ESP 和 arduino 之间?)
  • 如果是电气问题(噪音,…)
  • 如果我有水平问题(ESP 在 3.3v arduino ad 5v 下工作,可能没有太大的电压来正确读取数据?)

也许您可以帮我测试一下您的硬件是否更稳定,这样我们就可以了解是硬件问题还是 LaserGRBL SW 问题。

Wifi-以太网版本 #51
所有者作者

@mkeyno
请使用v2.6.13测试
Websocket URL 必须采用“ws://ip:port/path”格式(即 ws://192.168.1.120:80/ws)

Wifi-以太网版本 #51
凯诺 评论了 2017 年 6 月 28 日  

@arkypitav2.6.13 没有 wifi 连接,但是我看到你真的使用异步 websocket,它比同步版本更稳定,正如之前的讨论,客户端必须重新连接路由到服务器端,websocket c# 有这样的功能吗?
我也尝试实现 GRBL repo 建议的 流式传输方法,因为 ESP 需要知道成功传输了多少行
也许它很好,尽管您的软件要求 ESP 当前状态以保持传输稳定,ESP 或您的软件应该检查传输状态(软件流控)

TTL 不是问题,因为只要灌电流和拉电流不超过 10、12 mA,ESP 就可以处理 5 vcc,我对 ESP Rx 引脚使用简单的分压器,但简单的电阻器也可以正常工作

Wifi-以太网版本 #51
所有者作者

你也可以和我分享你的ESP代码吗?
我认为我从 LW 回购中使用的代码不太好。我在其中发现了一些错误。

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 6 月 28 日  

@arkypitav2.6.13 没有 wifi 连接

@mkeyno转到菜单“grbl->设置”你会发现一个配置框来选择LaserWebESP8266协议(websocket)

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 6 月 28 日  

我还实现了一种“通过 websocket 的 grbl 模拟器”(模拟 ESP Websocket 服务器和 Arduino 响应)。模拟器可从“?-> grbl 模拟器”获得,并以 ws://127.0.0.1:81/ 收听

当然,使用模拟器一切正常:-)

Wifi-以太网版本 #51
凯诺 评论了 2017 年 6 月 29 日  

@arkypita请检查数据文件夹中的 html 文件,我设计了该网页,以便用户可以更改 GRBL 设置以及 wifi 网桥,我的计划是使用文件阅读器 javascrip上传文件,然后根据 GRBL advance将代码发送到 ESP stream 方法,在 ESP 中将接收到的数据打印到Arduino 串口

else if(cammand=="RAW") {if(!STARTING) {Serial.print(value); CODE="CNC@"; serialTS=millis(); }}

并在 websocket 链接上发送 GRBL 响应

SerialEvent();
 if(NewLine && (millis()-serialTS)>50){  WS.text(MainWSclinet,CODE+inputString); inputString = ""; serialTS=millis();NewLine=false;}    
Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 6 月 29 日  

@mkeyno感谢您的分享。我需要一点时间来理解你的 wifi-bridge 的代码,因为它非常复杂(有很多功能,不仅仅是基本的流媒体)。

你试过2.6.13版本吗?现在应该可以通过 WebSocket 进行通信了。

必须在设置中启用 ESP8266 协议,然后才能配置为简单的 URL。

Wifi-以太网版本 #51

Wifi-以太网版本 #51

如果我将它与我的 ESP8266 一起使用,用LaserWeb3-ESP8266代码编程,我可以连接成功,我也可以流式传输一些 GCode,但是流式传输过程很慢,打嗝,grbl 响应给出错误(如上一张图片)突出显示一些整个行程中的数据丢失。

Wifi-以太网版本 #51

我非常想知道 LaserGRBL v2.6.13 是否连接到您的 ESP8266 或者它是否没有连接,以及流式传输行为是否正确或者是否存在与我相同的问题。

LaserGRBL从第一个版本开始就实现了建议的字符计数流协议(如 stream.py)。

在 LaserGRBL 方面,我使用 USBSerial 和 WebSocket 协议的字符计数,因为它的实现是在外部并且独立于所选的通信通道。

Wifi-以太网版本 #51

@arkypita我使用 ws://192.168.4.1/ws 地址连接到 ESP,websocket 链接稳定,但是我的 ESP 没有连接到 GRBL,所以它无法响应,因此我无法发送 gcode 数据流,你能创建测试版本吗所以我可以不受任何限制地将cnc数据传输到ESP并检查流链接的可靠性,

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 6 月 30 日  

@arkypita我使用 ws://192.168.4.1/ws 地址连接到 ESP,websocket 链接稳定

好的,很好!

你能创建测试版本吗,这样我就可以不受任何限制地将 cnc 数据传输到 ESP 并检查流链接的可靠性,

当 arduino/grbl 未连接时,我有 2 个不同的限制阻止流式传输文件的能力

  1. 我需要从 grbl 发送的“空闲”状态。如果没有收到空闲的 LaserGRBL,则保持“连接”状态并阻止发送任何命令。
  2. 发送命令时,LaserGRBL 需要接收“ok”以减少挂起命令和释放字符计数。如果未收到“ok”,LaserGRBL 在 128 个字符后停止发送命令

我很容易删除这两个测试。没关系,或者你更喜欢我只删除第一张支票,然后你从 ESP 发回“ok”?

Wifi-以太网版本 #51
所有者作者

我找到了所有问题的原因!

这是因为我发送“\r\n”作为线路终止,因为 grbl 标准只需要“\n”。
似乎直接串行更宽容,但 ESP 存在问题。我正在更正我的代码,最后我们有一个 ESP8266 就绪版本!

Wifi-以太网版本 #51

做得好@arkypita,你检查过我的库了吗?您对 ESP 中的控制流机制有何看法

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 7 月 3 日  

你检查我的库了吗?

是的,没有。我已尝试加载您的代码,但找不到将 ESP 连接到我的网络的方法,因此我继续使用为 LaserWeb 提供的代码进行开发

您对 ESP 中的控制流机制有何看法

Grbl 只有 128 个宽字符命令缓冲区。因为经典的弧形移动 (G2 X0.000 Y0.000 I0.000 J0.000) 大约有 30 个字符宽,所以您不能排队超过 4-5 个移动命令。

当一系列很多小动作排队时,这可能会导致一些瓶颈。当运动的执行时间小于串行传输时间时,可能会发生一些缓慢的情况。缓冲区可以提供帮助(将 chars-long exec-fast 命令与 chars-short exec-slow 命令进行平均),但如果缓冲区太小则作用不大。

做一些数学运算,每个命令字符的传输需要 10 位(ASCII 码 8 位 + 1 位起始位 + 1 位停止位)所以 30 个字符需要 300 位。对于 115’200 的波特率,这意味着每秒 384 个 30 个字符的不同命令的带宽。(每个命令传输大约 2-3 毫秒)。

该速度足以满足几乎所有矢量雕刻需求,尤其是低功率激光,但如您所知,在使用中等功率激光雕刻高速光栅图像时可能会出现问题。#38

所有这些都是由于串行通道速度和协议 – gcode – 不适用于光栅图像传输的限制。

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 7 月 3 日  

添加 ESP8266 后,所有这些限制仍然有效,因为串口的使用并未完全被 WiFi 取代,并且 grbl 缓冲区大小仍然保持不变。

然而,可能发生的情况是 WiFi 的干扰或速度减慢可能会中断与 ESP8266 的通信。在这些情况下,利用 ESP 内存在雕刻机一侧拥有更大的缓冲区听起来可能很明智。

Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 7 月 3 日  

ESP 的一个好的代码应该异步接收来自流媒体程序的任何字符并放入它自己的“大缓冲区”。显然,流媒体必须知道“大缓冲区”的大小并使用此限制而不是 128 个字符的限制。尽可能快地将命令从 PC 传输到 ESP。

ESP 中的另一个异步作业必须实现“128 个字符计数”机制,将命令排队到 grbl(不从其知识中删除)并检查 grbl 响应(正常或错误)以从其队列中删除该命令并“释放”计数128,并将响应传回流光(实现相同的字符计数,但使用“大缓冲区”大小)。

这在高级编程语言中很容易做到,你可以在高级编程语言中管理列表、队列、字符串等对象,但在纯 arduino c/c++ 中就没那么容易了

由于 WiFi 速度通常高于串行速度,在我看来,所有这些复杂性并不是真正的优势。所以我建议 ESP 只做 wifi-serial 桥接,没有任何缓冲或“智能”

Wifi-以太网版本 #51 arkypita 添加了 增强 标签 2017 年 7 月 3 日
Wifi-以太网版本 #51
所有者作者
阿尔基皮塔 评论了 2017 年 7 月 5 日  

我还为 ESP8266 创建了一个 TelnetToSerial 实现来摆脱 WebSocket 的需求,这对于实现目标来说确实是不必要的,所以现在 LaserGRBL 可以轻松地通过 WebSocket 或通过 Telnet 连接到它自己的 ESP。

https://github.com/arkypita/ESP8266-SerialTelnet