- Последнее редактирование модератором:
Причина:  Отредактирован скетч + добавлен архив
Причина:  Отредактирован скетч + добавлен архив
Последнее редактирование модератором:  
Доброго времени суток товарищи! )
т.к. могу постить только в этот раздел, уж извините.
Может кому сгодится или кому станет интересно и будут идеи и тема получит развитие...
Недавно купил сей станочек и затянуло, не понравилось, что нет доступных портов для подключения чего либо. решил обойти это ограничение с помощью своего костыля.
Подключил станок через локальную сеть, с помощью 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 = "";
    }
  }
} 
 
 
  
 
 
 

