两个GRBL连接Mega2560和迪文屏,以及通过迪文屏触摸控制命令驱动两个GRBL的代码

时间: 2024-04-30 21:18:14 浏览: 10
以下是通过迪文屏触摸控制命令驱动两个GRBL的代码: ```C++ #include <SoftwareSerial.h> #include <Adafruit_GFX.h> #include <Adafruit_ILI9341.h> #include <TouchScreen.h> #define TFT_CS 10 #define TFT_DC 9 #define TFT_RST 8 #define TS_CS 7 #define BAUDRATE 115200 // GRBL 1 SoftwareSerial grbl1Serial(2, 3); // RX, TX bool grbl1Connected = false; // GRBL 2 SoftwareSerial grbl2Serial(4, 5); // RX, TX bool grbl2Connected = false; // Touchscreen TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); // Display Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); // Button struct Button { int x; int y; int width; int height; String text; uint16_t color; bool pressed; }; // Buttons Button btn1 = { 10, 10, 80, 40, "GRBL 1", ILI9341_RED, false }; Button btn2 = { 100, 10, 80, 40, "GRBL 2", ILI9341_GREEN, false }; Button btnHome = { 220, 10, 80, 40, "Home", ILI9341_BLUE, false }; Button btnReset = { 220, 80, 80, 40, "Reset", ILI9341_YELLOW, false }; Button btnStop = { 220, 150, 80, 40, "Stop", ILI9341_PURPLE, false }; Button btnXPlus = { 10, 80, 40, 40, "+X", ILI9341_CYAN, false }; Button btnXMinus = { 60, 80, 40, 40, "-X", ILI9341_CYAN, false }; Button btnYPlus = { 110, 80, 40, 40, "+Y", ILI9341_CYAN, false }; Button btnYMinus = { 160, 80, 40, 40, "-Y", ILI9341_CYAN, false }; Button btnZPlus = { 210, 80, 40, 40, "+Z", ILI9341_CYAN, false }; Button btnZMinus = { 260, 80, 40, 40, "-Z", ILI9341_CYAN, false }; void setup() { Serial.begin(BAUDRATE); grbl1Serial.begin(BAUDRATE); grbl2Serial.begin(BAUDRATE); tft.begin(); tft.setRotation(1); pinMode(TS_CS, OUTPUT); ts.begin(); } void loop() { // Check if GRBL 1 is connected if (!grbl1Connected) { grbl1Serial.write("\r\n\r\n"); delay(1000); while (grbl1Serial.available()) { char c = grbl1Serial.read(); if (c == '\n') { grbl1Connected = true; break; } } } // Check if GRBL 2 is connected if (!grbl2Connected) { grbl2Serial.write("\r\n\r\n"); delay(1000); while (grbl2Serial.available()) { char c = grbl2Serial.read(); if (c == '\n') { grbl2Connected = true; break; } } } // Check for button press TSPoint p = ts.getPoint(); pinMode(TS_CS, OUTPUT); digitalWrite(TS_CS, LOW); if (p.z > ts.pressureThreshhold) { int x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); int y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); if (btn1.x <= x && x <= btn1.x + btn1.width && btn1.y <= y && y <= btn1.y + btn1.height) { btn1.pressed = true; } else if (btn2.x <= x && x <= btn2.x + btn2.width && btn2.y <= y && y <= btn2.y + btn2.height) { btn2.pressed = true; } else if (btnHome.x <= x && x <= btnHome.x + btnHome.width && btnHome.y <= y && y <= btnHome.y + btnHome.height) { if (btn1.pressed) { grbl1Serial.write("$H\n"); } else if (btn2.pressed) { grbl2Serial.write("$H\n"); } } else if (btnReset.x <= x && x <= btnReset.x + btnReset.width && btnReset.y <= y && y <= btnReset.y + btnReset.height) { if (btn1.pressed) { grbl1Serial.write(String((char)0x18) + "\n"); } else if (btn2.pressed) { grbl2Serial.write(String((char)0x18) + "\n"); } } else if (btnStop.x <= x && x <= btnStop.x + btnStop.width && btnStop.y <= y && y <= btnStop.y + btnStop.height) { if (btn1.pressed) { grbl1Serial.write(String((char)0x85) + "\n"); } else if (btn2.pressed) { grbl2Serial.write(String((char)0x85) + "\n"); } } else if (btnXPlus.x <= x && x <= btnXPlus.x + btnXPlus.width && btnXPlus.y <= y && y <= btnXPlus.y + btnXPlus.height) { if (btn1.pressed) { grbl1Serial.write("G91 G0 X10\n"); } else if (btn2.pressed) { grbl2Serial.write("G91 G0 X10\n"); } } else if (btnXMinus.x <= x && x <= btnXMinus.x + btnXMinus.width && btnXMinus.y <= y && y <= btnXMinus.y + btnXMinus.height) { if (btn1.pressed) { grbl1Serial.write("G91 G0 X-10\n"); } else if (btn2.pressed) { grbl2Serial.write("G91 G0 X-10\n"); } } else if (btnYPlus.x <= x && x <= btnYPlus.x + btnYPlus.width && btnYPlus.y <= y && y <= btnYPlus.y + btnYPlus.height) { if (btn1.pressed) { grbl1Serial.write("G91 G0 Y10\n"); } else if (btn2.pressed) { grbl2Serial.write("G91 G0 Y10\n"); } } else if (btnYMinus.x <= x && x <= btnYMinus.x + btnYMinus.width && btnYMinus.y <= y && y <= btnYMinus.y + btnYMinus.height) { if (btn1.pressed) { grbl1Serial.write("G91 G0 Y-10\n"); } else if (btn2.pressed) { grbl2Serial.write("G91 G0 Y-10\n"); } } else if (btnZPlus.x <= x && x <= btnZPlus.x + btnZPlus.width && btnZPlus.y <= y && y <= btnZPlus.y + btnZPlus.height) { if (btn1.pressed) { grbl1Serial.write("G91 G0 Z10\n"); } else if (btn2.pressed) { grbl2Serial.write("G91 G0 Z10\n"); } } else if (btnZMinus.x <= x && x <= btnZMinus.x + btnZMinus.width && btnZMinus.y <= y && y <= btnZMinus.y + btnZMinus.height) { if (btn1.pressed) { grbl1Serial.write("G91 G0 Z-10\n"); } else if (btn2.pressed) { grbl2Serial.write("G91 G0 Z-10\n"); } } } else { if (btn1.pressed) { btn1.pressed = false; } else if (btn2.pressed) { btn2.pressed = false; } } // Draw buttons tft.fillScreen(ILI9341_BLACK); tft.drawRect(btn1.x, btn1.y, btn1.width, btn1.height, btn1.color); tft.setCursor(btn1.x + 10, btn1.y + btn1.height / 2 - 4); tft.print(btn1.text); tft.drawRect(btn2.x, btn2.y, btn2.width, btn2.height, btn2.color); tft.setCursor(btn2.x + 10, btn2.y + btn2.height / 2 - 4); tft.print(btn2.text); tft.drawRect(btnHome.x, btnHome.y, btnHome.width, btnHome.height, btnHome.color); tft.setCursor(btnHome.x + 10, btnHome.y + btnHome.height / 2 - 4); tft.print(btnHome.text); tft.drawRect(btnReset.x, btnReset.y, btnReset.width, btnReset.height, btnReset.color); tft.setCursor(btnReset.x + 10, btnReset.y + btnReset.height / 2 - 4); tft.print(btnReset.text); tft.drawRect(btnStop.x, btnStop.y, btnStop.width, btnStop.height, btnStop.color); tft.setCursor(btnStop.x + 10, btnStop.y + btnStop.height / 2 - 4); tft.print(btnStop.text); tft.drawRect(btnXPlus.x, btnXPlus.y, btnXPlus.width, btnXPlus.height, btnXPlus.color); tft.setCursor(btnXPlus.x + 10, btnXPlus.y + btnXPlus.height / 2 - 4); tft.print(btnXPlus.text); tft.drawRect(btnXMinus.x, btnXMinus.y, btnXMinus.width, btnXMinus.height, btnXMinus.color); tft.setCursor(btnXMinus.x + 10, btnXMinus.y + btnXMinus.height / 2 - 4); tft.print(btnXMinus.text); tft.drawRect(btnYPlus.x, btnYPlus.y, btnYPlus.width, btnYPlus.height, btnYPlus.color); tft.setCursor(btnYPlus.x + 10, btnYPlus.y + btnYPlus.height / 2 - 4); tft.print(btnYPlus.text); tft.drawRect(btnYMinus.x, btnYMinus.y, btnYMinus.width, btnYMinus.height, btnYMinus.color); tft.setCursor(btnYMinus.x + 10, btnYMinus.y + btnYMinus.height / 2 - 4); tft.print(btnYMinus.text); tft.drawRect(btnZPlus.x, btnZPlus.y, btnZPlus.width, btnZPlus.height, btnZPlus.color); tft.setCursor(btnZPlus.x + 10, btnZPlus.y + btnZPlus.height / 2 - 4); tft.print(btnZPlus.text); tft.drawRect(btnZMinus.x, btnZMinus.y, btnZMinus.width, btnZMinus.height, btnZMinus.color); tft.setCursor(btnZMinus.x + 10, btnZMinus.y + btnZMinus.height / 2 - 4); tft.print(btnZMinus.text); // Read from GRBL 1 while (grbl1Serial.available()) { char c = grbl1Serial.read(); Serial.write(c); } // Read from GRBL 2 while (grbl2Serial.available()) { char c = grbl2Serial.read(); Serial.write(c); } } ``` 该代码使用了 Adafruit_GFX 库和 Adafruit_ILI9341 库来控制迪文屏,使用了 TouchScreen 库来获取触摸屏输入,使用了 SoftwareSerial 库来实现与两个 GRBL 的通信。 在 setup() 函数中,所有的串口都被初始化,并且迪文屏和触摸屏被设置为正常工作。 在 loop() 函数中,首先检查两个 GRBL 是否连接。如果未连接,则发送一些字符来检查它们是否回应。如果回应,则认为它们已连接。 然后,检查触摸屏是否有按钮按下。如果是,则根据按下的按钮发送相应的 G-code 命令到 GRBL。如果不是,则检查之前是否有按钮按下,如果是,则将其重置为未按下状态。最后,绘制所有按钮并检查 GRBL 的串口是否有数据,如果有,则将其打印到串口监视器上。 这是一个基本的代码示例,可以根据实际情况进行修改和扩展。

相关推荐

最新推荐

recommend-type

nanodlp grbl 控制方案

GRBL 在nanodlp光固化系统中的应用与设置办法,可联系本人寻求更多资源
recommend-type

grbl设置教程.docx

grbl v1.1 lasergrbl代码设置 中文版 简单易懂 带你玩转grbl ArduinoUNO Grbl基本操作指令
recommend-type

python自学教程-04-自定义JavaScript.ev4.rar

python自学教程-04-自定义JavaScript.ev4.rar
recommend-type

严蔚敏数据结构全套C语言实现

严蔚敏数据结构全套C语言实现
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】增量式PID的simulink仿真实现

# 2.1 Simulink仿真环境简介 Simulink是MATLAB中用于建模、仿真和分析动态系统的图形化环境。它提供了一个直观的用户界面,允许用户使用块和连接线来创建系统模型。Simulink模型由以下元素组成: - **子系统:**将复杂系统分解成更小的、可管理的模块。 - **块:**代表系统中的组件,如传感器、执行器和控制器。 - **连接线:**表示信号在块之间的流动。 Simulink仿真环境提供了广泛的块库,涵盖了各种工程学科,包括控制系统、电子和机械工程。它还支持用户自定义块的创建,以满足特定仿真需求。 # 2. Simulink仿真环境的搭建和建模 ### 2.
recommend-type

训练集和测试集的准确率都99%,但是预测效果不好

即使训练集和测试集的准确率都很高,但是在实际的预测中表现不佳,可能会有以下几个原因: 1. 数据质量问题:模型训练和测试的数据可能存在问题,比如数据标签错误、数据集采样不均衡、数据集中存在异常值等问题,这些问题可能会导致模型在实际预测中表现不佳。 2. 特征工程问题:模型的特征工程可能存在问题,导致模型无法很好地捕捉数据的特征,从而影响预测效果。 3. 模型选择问题:模型的选择可能不合适,比如选择的模型太简单,无法很好地拟合数据,或者选择的模型太复杂,导致过拟合等问题。 4. 超参数调整问题:模型的超参数可能没有调整到最佳状态,需要进行调整。 针对以上可能的原因,可以采取相应的措施进
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依