Re: Arduino GRBL Companion - Автономный контроллер для GRBL
Добавлено: 18 янв 2019, 21:25
На русском языке.Только hex . прошивать через USBasp. Не ту прошивку вроде положил исправляю
Статьи, обзоры, цены на станки и комплектующие.
https://www.cnc-club.ru/forum/
Код: Выделить всё
void execute_file(String &fname) {
current_line = skip = skip_page = 0;
int8_t pos_start = 0;
int8_t pos_end = 0;
char feed[10];
char temp[40];
feed_dig = feed_safe;
if (EEPROM.read(EEPROM_START) == 1) {
exec_mode = EXEC_PLAY;
} else if (EEPROM.read(EEPROM_START) == 0) {
exec_mode = EXEC_PAUSE;
}
Serial.flush();
pp_menu = 0;
exec_screen();
buttons_screen();
process_keys();
File text = SD.open(fname, O_READ); // открытие файла
if (text) {
while (text.available()) {
process_keys();
if (exec_mode == EXEC_EXIT) {
text.close();
exit;
}
current_line++;
memset(buff, 0, sizeof(buff));
readcnt = text.readBytesUntil(0x0A, buff, sizeof(buff)); // Читаем строку до перевода строки
if (readcnt > 0) {
buff[readcnt] = 0;
pos_start = 0;
for (int8_t pe = 0; pe < sizeof(buff); pe++) { // Ищем букву F как начало команды FEED RATE
if ((buff[pe] == 0x46)) {
pos_start = pe;
break;
}
}
if (pos_start > 0) { // если нашли - ищем конец команды
for (int8_t pe = pos_start + 1; pe < sizeof(buff); pe++) {
if ((buff[pe] > 0x39) || (buff[pe] == 0)) {
pos_end = pe;
break;
}
}
strncpy(feed, buff + pos_start + 1, pos_end - pos_start); // выделяем значение FEED
feed_dig = strtol(feed, 0, 0); // конвертируем значение FEED в число
if (feed_dig > feed_safe) feed_dig = feed_safe; // сравниваем значение FEED с безопасным
ltoa(feed_dig, feed, 10);
for (int8_t pe = 0; pe < 10; pe++) {
if (feed[pe] == 0) {
pos_end = pe - 1;
break;
}
}
strncpy(buff + pos_start + 1, feed, pos_end); // заменяем значение FEED безопасным
}
for (int8_t pe = 0; pe < sizeof(buff); pe++) {
if (buff[pe] == 0x0D) {
buff[pe] = 0x0A;
buff[pe + 1] = 0x00;
break;
}
if (buff[pe] == 0x0A) {
buff[pe + 1] = 0x00;
break;
}
}
Serial.print(buff); // Выдаем строку в порт
Serial.flush();
memset(temp, 0, sizeof(temp));
strncpy(temp, buff, sizeof(temp));
for (int8_t pe = 0; pe < sizeof(temp); pe++) {
if ((temp[pe] == 0x0D) || (temp[pe] == 0x0A)) {
temp[pe] = 0x00;
break;
}
}
if (exec_mode == EXEC_STEP) { // если пошаговое исполнение печатаем команду на экран
tft.setTextSize(1);
tft.setCursor(0, (skip + 3)* CHAR_HEIGHT);
printTFTString((char*)empty_line); tft.println();
printTFTString((char*)empty_line); tft.println();
tft.setCursor(0, (skip + 3)* CHAR_HEIGHT);
tft.setTextColor(YELLOW, BLACK);
tft.print(buff);
skip++;
}
Serial.flush();
}
while (Serial.available() == 0) { // ждем ответа от GRBL
encRead(); if ((encClick) && (exec_mode == EXEC_PLAY)) {
pp_menu = 2;
exec_mode = EXEC_PAUSE;
process_keys();
}
if (exec_mode == EXEC_EXIT) break;
}
while (Serial.available() > 0) { // если пришел ответ от GRBL
memset(buff, 0, sizeof(buff));
readcnt = Serial.readBytesUntil(0x0A, buff, sizeof(buff));
if (readcnt > 0) {
buff[readcnt] = 0;
if (strncmp(buff, "error", 5) == 0) { // смотрим ошибку и печатаем на экран
delay(10);
Serial.flush();
tft.setTextSize(1);
tft.setCursor(0, (skip + 3)* CHAR_HEIGHT);
printTFTString((char*)empty_line);
printTFTString((char*)empty_line);
printTFTString((char*)empty_line);
tft.setCursor(0, (skip + 3)* CHAR_HEIGHT);
tft.setTextColor(RED, BLACK);
tft.print(current_line);
printTFTString((char*)trail);
tft.println(temp);
tft.print(buff);
memset(temp, 0, sizeof(temp));
if (EEPROM.read(EEPROM_PAUSE) == 1) exec_mode = EXEC_PAUSE;
skip++;
}
if ((strncmp(buff, "ok", 2) == 0)) { // от GRBL пришло сообщение о нормальном исполнении
delay(10);
Serial.flush();
}
}
encRead();
if ((encClick) && (exec_mode == EXEC_PLAY)) { // обработка клика энкодера
pp_menu = 2;
exec_mode = EXEC_PAUSE;
OK_KEY = encClick = false;
process_keys();
}
if (exec_mode == EXEC_EXIT) break;
}
exec_screen();
if (skip > (MAX_DISPLAY_LINES - 5))skip = 0;
}
}
text.close();
}
И никаких комментариев не последовалоDdimon писал(а): Здравствуйте , я не могу разобраться в части кода выполнения УП буфер заполняется одной строкой или несколько целых строк , можно попросить этот кусочек скетча с подробными комментариями. И работа со строками для меня тёмный лес а тоже хотелось бы понять как происходит подмена скорости и она не работает если строка начинается с F.
Добрый день. У меня такиеже проблемы ((( подскажи пожалуйста как их решить.druksel писал(а):уважаемый Технокот, вы данную разработку забросили?? попробовал повторить - но имеются вопросы.
при старте данного девайса не всегда удается получить одинаковые скорости обмена между ардуинками.
ардушка с вашей прошивкой похоже работает на 57600. а ардуха с ГРБЛ - на 115200.
есть ли в вашей прошивке возможность жестко установить скорость обмена между ардуинками?
с уважением, Андрей.
Если посмотреть раздел Setup скетча - там инициализация 115200, либо неправильно выбрана модель ардуины при компиляции, либо с переходом на свежую версию ice есть глюк в библиотекахLucyfire999 писал(а):Добрый день. У меня такиеже проблемы ((( подскажи пожалуйста как их решить.druksel писал(а):уважаемый Технокот, вы данную разработку забросили?? попробовал повторить - но имеются вопросы.
при старте данного девайса не всегда удается получить одинаковые скорости обмена между ардуинками.
ардушка с вашей прошивкой похоже работает на 57600. а ардуха с ГРБЛ - на 115200.
есть ли в вашей прошивке возможность жестко установить скорость обмена между ардуинками?
с уважением, Андрей.
Какой именно Nextion, и можно ли посмотреть что у Вас получилось?maks9744 писал(а):контролер на grbl в качестве дисплея использовать сенсорный дисплей Nextion