- Последнее редактирование модератором:
Причина: Отредактирован скетч + добавлен архив
Причина: Отредактирован скетч + добавлен архив
Последнее редактирование модератором:
Доброго времени суток товарищи! )
т.к. могу постить только в этот раздел, уж извините.
Может кому сгодится или кому станет интересно и будут идеи и тема получит развитие...
Недавно купил сей станочек и затянуло, не понравилось, что нет доступных портов для подключения чего либо. решил обойти это ограничение с помощью своего костыля.
Подключил станок через локальную сеть, с помощью esp32(должно работать и на wemos если чуток код подправить), настроил второй UART и на esp написал простенький парсер протокола, который обрабатывает мои комманды. Тем самым я уже не привязан к плате станка и через интерфейс Candle или Gcode могу рулить еспэхой(шаговики, моторыб сожи и т.д. и т.п.).
т.к. могу постить только в этот раздел, уж извините.
Может кому сгодится или кому станет интересно и будут идеи и тема получит развитие...
Недавно купил сей станочек и затянуло, не понравилось, что нет доступных портов для подключения чего либо. решил обойти это ограничение с помощью своего костыля.
Подключил станок через локальную сеть, с помощью esp32(должно работать и на wemos если чуток код подправить), настроил второй UART и на esp написал простенький парсер протокола, который обрабатывает мои комманды. Тем самым я уже не привязан к плате станка и через интерфейс Candle или Gcode могу рулить еспэхой(шаговики, моторыб сожи и т.д. и т.п.).
C++:
#include <HardwareSerial.h>
HardwareSerial PortCNC(2);
//#include <ESP8266WiFi.h>
#include "WiFi.h"
//how many clients should be able to telnet to this ESP8266
#define MAX_SRV_CLIENTS 1
const char* ssid = "SWEET_HOME";
const char* password = "123123123123";
IPAddress ip(192, 168, 10, 99);
IPAddress gateway(192, 168, 10, 1);
IPAddress subnet(255, 255, 255, 0);
WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS];
//String messCandl = "";
boolean protokol = true;
float X = 0;
float Y = 0;
float Z = 0;
unsigned long getCoordinateTime = 0;
void setup() {
Serial.begin(115200);
PortCNC.begin(115200, SERIAL_8N1, 16, 17);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);
Serial.print("\nConnecting to "); Serial.println(ssid);
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++ < 20) {
delay(500);
}
if (i == 21) {
Serial.print("Could not connect to"); Serial.println(ssid);
while (1) {
delay(500);
}
}
//start UART and the server
server.begin();
server.setNoDelay(true);
Serial.print("Ready! Use 'telnet ");
Serial.print(WiFi.localIP());
Serial.println(" 23' to connect");
}
void loop() {
uint8_t i;
//check if there are any new clients
if (server.hasClient() ) {
for (i = 0; i < MAX_SRV_CLIENTS; i++) {
//find free/disconnected spot
if (!serverClients[i] || !serverClients[i].connected() ) {
if (serverClients[i]) {
serverClients[i].stop();
}
serverClients[i] = server.available();
Serial.print("New client: "); Serial.print(i);
break;
}
}
//no free/disconnected spot so reject
if (i == MAX_SRV_CLIENTS) {
WiFiClient serverClient = server.available();
serverClient.stop();
Serial.println("Connection rejected ");
}
}
//check clients for data
if (serverClients[0] && serverClients[0].connected() ) {
if (serverClients[0].available()) {
//get data from the telnet client and push it to the UART
if (serverClients[0].available()) {
size_t len = serverClients[0].available();
uint8_t sbuf[len];
serverClients[0].readBytes(sbuf, len);
if (protokol) {//отключение пакетов от Candle
PortCNC.write(sbuf, len);
}
parsCANDY(sbuf, len);//парсинг буфера TCP порта
}
}
}
//check UART for data
if (PortCNC.available()) {
size_t len = PortCNC.available();
uint8_t sbuf[len];
PortCNC.readBytes(sbuf, len);
//push UART data to all connected telnet clients
for (i = 0; i < MAX_SRV_CLIENTS; i++) {
if (serverClients[i] && serverClients[i].connected()) {
serverClients[i].write(sbuf, len);
parsCNC(sbuf, len);//парсинг UART от 3018
}
}
}
//обновляем координаты когда Candle отрезан (40ms)
if (!protokol) {
if (millis() - getCoordinateTime > 40) {
PortCNC.println("?");
getCoordinateTime = millis();
}
}
}
//парсинг UART от 3018
String messUART = "";
boolean otladkaCNC = false;
void parsCNC(uint8_t inpt[], int len) {
for (int i = 0; i < len; i++) {
if (inpt[i] != 10 && inpt[i] != 13)messUART += char(inpt[i]);//отрезаем спецсимволы
if (inpt[i] == 13) {//находим конец пакета
if (otladkaCNC) {//включение\отключение отладки
Serial.print("FromCNC:");
Serial.println(messUART);
}
//парсим XYZ
if (messUART.startsWith("<Idle|MPos:")) {
int startX = messUART.indexOf(':');
int sepX = messUART.indexOf(',');
X = messUART.substring(startX + 1, sepX).toFloat();
int sepY = messUART.indexOf(',', sepX + 1);
Y = messUART.substring(sepX + 1, sepY).toFloat();
int sepZ = messUART.indexOf('|', sepY + 1);
Z = messUART.substring(sepY + 1, sepZ).toFloat();
}
messUART = "";
}
}
}
boolean otladkaCandle = false;
void parsCANDY(uint8_t inpt[], int len) {
String messCandl = "";
for (int i = 0; i < len; i++) {
if (inpt[i] != 10 && inpt[i] != 13)messCandl += char(inpt[i]);//отрезаем спецсимволы
if (inpt[i] == 13) {//находим конец пакета
if (otladkaCandle) {//включение\отключение отладки
Serial.print("FromCandle:");
Serial.println(messCandl);
}
//Парсим комманды с консоли Candle, при отрезанном Candle комманды парсятся, машинные координаты так же работают, переменные float XYZ
if (messCandl == "M100")protokol = false;//отрезаем Candle
if (messCandl == "M101")protokol = true;//подключаем, нужно $X
if (messCandl == "CNC")otladkaCNC = !otladkaCNC;//содержание пакетов в отладочный порт
if (messCandl == "CNDL")otladkaCandle = !otladkaCandle;//содержание пакетов в отладочный порт
//пример
if (messCandl == "T6") {
if (X == 10)PortCNC.println("X0");
if (X == 0)PortCNC.println("X10");
}
messCandl = "";
}
}
}