Arduino GRBL Companion - Автономный контроллер для GRBL

Контроллеры, драйверы, датчики, управляющие устройства.
udaff
Новичок
Сообщения: 4
Зарегистрирован: 20 июн 2019, 22:35
Репутация: 0
Настоящее имя: Денис
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение udaff »

Получилось) Наверное какая-то из библиотек обновилась. IDE 1.8.2. Удалил свои библиотеки, залил из шапки. Очистил eeprom на всякий. Залил скетч - и все стало ок.
Осталось только побороть "дребезг" энкодера.
Alex261153
Новичок
Сообщения: 7
Зарегистрирован: 14 апр 2019, 13:28
Репутация: 0
Настоящее имя: Alex
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение Alex261153 »

Я поставил три подтягивающих резистора, без них не пробовал. У меня энкодер ЕС11 без резисторов.
udaff
Новичок
Сообщения: 4
Зарегистрирован: 20 июн 2019, 22:35
Репутация: 0
Настоящее имя: Денис
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение udaff »

У меня ky-040 с резисторами и все равно ложные срабатывания есть. Подумываю насчет конденсаторов, как тут советовали
Alex261153
Новичок
Сообщения: 7
Зарегистрирован: 14 апр 2019, 13:28
Репутация: 0
Настоящее имя: Alex
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение Alex261153 »

Всем привет. Ктонибудь может добавить в меню перемещение включение лазера как маркер для точного перемещения в нужную точку. Как команда M3 S1. Спасибо.
Аватара пользователя
Yashcher
Новичок
Сообщения: 18
Зарегистрирован: 24 окт 2011, 23:26
Репутация: 0
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение Yashcher »

SAG74 писал(а):программу под три кнопки. Две меню вверх и вниз и третья выбор?
Схему подключения кнопок можно?
_Всё решают мелочи...
http://forum.easyelectronics.ru/viewtop ... =16&t=2097
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение solo »

подскажите пж
можно ли добавить такой функционал в прошивку
в ардуинке , которая по схеме DD1 есть свободные выводы ( А0-А7)
можно ли сделать так чтобы при приходе сигнала на вывод А0 начина выполняться автоматом программа "А0.NG" а когда программа выполнилась то об этом сигнализировать на выводе А4 и если есть возможность то аналогично сделать с другими свободными выводами . В принципе если бы появилась такая возможность то при использования для моих нужд можно было бы отказаться от дисплея
Аватара пользователя
Yashcher
Новичок
Сообщения: 18
Зарегистрирован: 24 окт 2011, 23:26
Репутация: 0
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение Yashcher »

Собрал! Но работает как то странно, можно запустить файл 11раз, потом говорит что файлов или флэшки нет. Приходится всё выключать и включать заново, тогда всё снова работает. Простое нажатие на кнопку резет не помогает. У кого подобное было? Или возможная причина?
_Всё решают мелочи...
http://forum.easyelectronics.ru/viewtop ... =16&t=2097
tecnocat
Опытный
Сообщения: 101
Зарегистрирован: 09 июн 2014, 08:07
Репутация: 39
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение tecnocat »

Yashcher писал(а):Собрал! Но работает как то странно, можно запустить файл 11раз, потом говорит что файлов или флэшки нет. Приходится всё выключать и включать заново, тогда всё снова работает. Простое нажатие на кнопку резет не помогает. У кого подобное было? Или возможная причина?
Возможная причина - нехватка памяти, не факт что везде корректно освобождается память
svm
Мастер
Сообщения: 367
Зарегистрирован: 23 ноя 2017, 12:56
Репутация: 75
Настоящее имя: Владимир Сергеев
Откуда: Бузулук
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение svm »

Что-то тема заглохла. Попробуем оживить.
На новогодние каникулы решил сделать небольшой фрезерок из скопившегося железа. Но оказалось что немного не рассчитал, и пришлось обратиться к братьям из поднебесной. А здесь в связи с новой болячкой, отправка товаров задерживается. Поэтому решил делать электронику из того что есть в наличии. А в наличии оказались только дисплеи Nokia LCD5110. По опыту работы с автономным лазерным гравером понял,что необходимость применения цветного графического дисплея, сомнительна. За неделю удалось на 90% адаптировать код автора к этому дисплею. Правда полностью проверить не удается, ввиду отсутствия механики. Если кому-то интересен этот вариант, и есть возможность проверить работоспособность в железе, подключайтесь. Для реализации нужна 328 атмега, дисплей, картридер и три кнопки.
svm
Мастер
Сообщения: 367
Зарегистрирован: 23 ноя 2017, 12:56
Репутация: 75
Настоящее имя: Владимир Сергеев
Откуда: Бузулук
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение svm »

Вот крайний вариант скетча. Немного упрощенный , но весь функционал вроде сохранен.

Код: Выделить всё

#include <avr/pgmspace.h>
#include <EEPROMex.h>
#include <SPI.h>
#include <SD.h>
#include <LCD5110_Basic.h>

LCD5110 Tablo( 5 , 6  , 7, 9 ,8);
//           SCK  MOSI DS CS RST 

#define __SDCS 10               // CS карты памяти (остальные 11,12,13 согласно назначению)

// Кнопки на землю с D2,D3,D4

extern uint8_t SmallFont[];

File root;
byte px,pz,j;
String MyStr = "";


#define MAX_DISPLAY_LINES 6
#define MAX_DISPLAY_FILES 5


#define MENU_DELAY 150
#define GRBL_RES_PIN 14

#define CHAR_HEIGHT 8
#define CHAR_WIDTH 6

#define CHAR_STOP	0x80 // 128 stop
#define CHAR_PLAY	0x81 // 129 play
#define CHAR_PAUSE	0x82 // 130 pause
#define CHAR_ARIGHT	0x83 // 131 ->
#define CHAR_ALEFT	0x84 // 132 <-
#define CHAR_AUP	0x85 // 133 up
#define CHAR_ADOWN	0x86 // 134 down
#define CHAR_MARK	0x87 // 135 mark
#define CHAR_STEP	0x88 // 136 step
#define CHAR_DRILL	0x89 // 137 drill
#define CHAR_ZLEFT	0x8A // 138 zero left
#define CHAR_ZRIGHT	0x8B // 139 zero right
#define CHAR_SLE	0x8C // 140 scale left empty
#define CHAR_SRE	0x8D // 141 scale right empty 
#define CHAR_SCE	0x8E // 142 scale center empty
#define CHAR_SLF	0x8F // 143 scale left full
#define CHAR_SRF	0x90 // 144 scale right full
#define CHAR_SCF	0x91 // 145 scale center full
#define CHAR_EPLAY	0x92 // 146 play empty

#define EXEC_PAUSE  0x0 // sleep
#define EXEC_PLAY   0x1 // send commands without pause
#define EXEC_STEP   0x2 // execute step by step
#define EXEC_EXIT   0x20 // exit from execute

#define EEPROM_FEED		0
#define EEPROM_START	8
#define EEPROM_PAUSE  9
#define EEPROM_UNLOCK	10

#define DEFAULT_FEED 1000
#define FEED_MAX 1250





bool MENU_KEY, OK_KEY, UP_KEY, DOWN_KEY, LOOP_TEMP, Init_sd = false;
int8_t filecount, pp_menu,ppold, skip_page, skip, exec_mode, readcnt;
long current_line;
String fname;
char buff[80];
long feed_dig = 0;
long feed_safe = 0;
unsigned long counter_line = 0;


const char acc0[] PROGMEM = "0 F0\0";
const char acc1[] PROGMEM = "0.01 F100\0";
const char acc2[] PROGMEM = "0.02 F100\0";
const char acc3[] PROGMEM = "0.03 F100\0";
const char acc4[] PROGMEM = "0.04 F100\0";
const char acc5[] PROGMEM = "0.05 F200\0";
const char acc6[] PROGMEM = "0.06 F200\0";
const char acc7[] PROGMEM = "0.07 F200\0";
const char acc8[] PROGMEM = "0.08 F200\0";
const char acc9[] PROGMEM = "0.09 F200\0";
const char acc10[] PROGMEM = "0.1 F400\0";
const char acc11[] PROGMEM = "0.2 F400\0";
const char acc12[] PROGMEM = "0.3 F400\0";
const char acc13[] PROGMEM = "0.4 F400\0";
const char acc14[] PROGMEM = "0.5 F400\0";
const char acc15[] PROGMEM = "1 F600\0";
const char acc16[] PROGMEM = "2 F600\0";
const char acc17[] PROGMEM = "3 F600\0";
const char acc18[] PROGMEM = "4 F600\0";
const char acc19[] PROGMEM = "5 F600\0";
const char acc20[] PROGMEM = "0 F1\0";
const char * const acc_table[] PROGMEM = {acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7, acc8, acc9, acc10, acc11, acc12, acc13, acc14, acc15, acc16, acc17, acc18, acc19, acc20 };

const char empty_line[] PROGMEM = "                          \n\0";
const char trail[] PROGMEM = " \0";
const char zero[] PROGMEM = " 0 \0";


const char init_error[] PROGMEM = "Init SD failed!\0";

const char text_start[] PROGMEM = " Start\0";
const char text_pause[] PROGMEM = " Pause\0";
const char text_step[] PROGMEM = " Step\0";
const char text_manual[] PROGMEM = " manual\0";
const char text_files[] PROGMEM = " files\0";
const char text_unlock[] PROGMEM = " unlok\0";
const char text_setup[] PROGMEM = " setup\0";
const char text_reset[] PROGMEM = " reset\0";
const char text_exit[] PROGMEM = " exit\0";
const char text_home[] PROGMEM = " home\0";

const char text_feedmax[] PROGMEM =   " Feed Max:\0";
const char text_autostart[] PROGMEM = " Auto Start:\0";
const char text_pauseerr[] PROGMEM =  " PauseOnERR:\0";
const char text_autounlk[] PROGMEM =  " AutoUnlock:\0";

const char text_done[] PROGMEM = "DONE\0";
const char text_next[] PROGMEM = " >>>\0";
const char text_line[] PROGMEM = "Line:\0";
const char text_stepsize[] PROGMEM = " STEP SIZE:\0";

const char cmd_unlock[] PROGMEM = "$X\n\0";
//const char cmd_position[] PROGMEM = "?\n\0";
//const char cmd_cyclestart[] PROGMEM = "~\n\0";
//const char cmd_feedhold[] PROGMEM = "!\n\0";
const char cmd_reset[] PROGMEM = {0x18, '\n', '\0'};
const char cmd_upz[] PROGMEM = "G0Z10F500\0";
const char cmd_zeroxy[] PROGMEM = "G1X0Y0F500\0";
const char cmd_absolute[] PROGMEM = "G90\0";
const char cmd_incremental[] PROGMEM = "G91\0";
const char cmd_seek[] PROGMEM = "G0\0";
const char cmd_linear[] PROGMEM = "G1\0";

const char axis0[] PROGMEM = " X\0";
const char axis1[] PROGMEM = " Y\0";
const char axis2[] PROGMEM = " Z\0";
const char axis3[] PROGMEM = " F\0";
const char * const axis_label[] PROGMEM = {axis0, axis1, axis2, axis3};

//encoder defines
#define encoder0PinA  2  // вниз
#define encoder0PinB  3  // вверх
#define encoder0PinC  4
int8_t encoder0Pos = 1;  // a counter for the dial
int8_t lastReportedPos = 1;   // change management
static boolean rotating = false;    // debounce management

// interrupt service routine vars
boolean A_set = false;
boolean B_set = false;
static boolean encClick = false;

//assistatnt procedures
void printSerialString(char *string) { //Вывод в GRBL из progmem
  while (pgm_read_byte(string) != '\0') {
    Serial.write(pgm_read_byte_near(string));
    string++;
  }
}

void MSG(char *string,byte px,byte pz) {     //*********** Вывод на экран из  progmem ********************
  while (pgm_read_byte(string) != '\0') {    //*********** c позиции px (0-78) в строку pz (0-5)
   MyStr=MyStr+char(pgm_read_byte_near(string));
   string++; Tablo.print(MyStr, px, pz*8);}//
   MyStr="";
   }
   
void str_print(char s, byte size){ //*************** Перемещение курсора по меню **********************
    unsigned char x;
    for (x = 0; x <= 5;x++){                 //Стирание первого столбца.
    Tablo.print (" ",0,x * 8);}              // -/-
    Tablo.print (">",0,s * 8);               // Вывод значка ">"
    }
    
void gauge(int8_t x,int8_t y,int8_t width,int8_t pos,int8_t scale){//Вывод слайдера

  pos = pos / 1.5;//scale;
  for (int8_t wdt = 0; wdt <= width; wdt++) {
    int8_t center = (width / 2);
    int8_t rpos = pos + center;
    if (pos < (0 - center)) {
      pos = 0 - center;
    };
    if (pos > center) {
      pos = center;
    };
    if (rpos < 0) {
      rpos = 0;
    }
    if (rpos > width) {
      rpos = width;
    }
    if ((wdt == 0) && (rpos > 0)) {
     Tablo.print ("0",wdt*2+x,y*8);                  // начало шкалы
    } else if ((wdt == 0) && (rpos == 0)) {
      Tablo.print (">",wdt*2+x,y*8);
      //display.write(CHAR_SLF);
    } else if ((wdt == width) && (rpos < width)) {
      Tablo.print ("0",wdt*2+x,y*8);                  // конец шкалы
      Tablo.print (" ",wdt*2+x+2,y*8);
    } else if ((wdt == width) && (rpos == width)) {
      Tablo.print ("S",wdt*2+x,y*8);
    } else if (wdt == center) {
      Tablo.print ("0",wdt*2+x,y*8);     //            по центру
    } else {
      if (pos > 0) {
        if (wdt < center) {
          Tablo.print ("J",wdt*2+x,y*8);//                 пустота слева от центра
        } else if ((wdt > center) && (wdt <= rpos)) {
          Tablo.print ("0",wdt*2+x,y*8);//                 заполнение справа от центра
        } else if (wdt > rpos) {
          Tablo.print ("J",wdt*2+x,y*8);//                 пустота справа от центра
        };
      } else if (pos < 0) {
        if (wdt > center) {
          Tablo.print ("J",wdt*2+x,y*8);
          } else if ((wdt < center) && (wdt >= rpos)) {
          Tablo.print ("0",wdt*2+x,y*8);//                  заполнение слева от центра
        } else if (wdt < rpos) {
          Tablo.print ("J",wdt*2+x,y*8);
        };
      } else Tablo.print ("J",wdt*2+x,y*8);
    }
  }
}

void main_screen(void){                //****************** Главный экран *******************************
encClick=0;
Tablo.clrScr();
MSG((char*)text_manual,1,0);
MSG((char*)text_files,1,1);
MSG((char*)text_unlock,1,2);
MSG((char*)text_setup,1,3);
MSG((char*)text_reset,1,4);
MSG((char*)text_exit,1,5);
delay(100);
}

void main_menu(void){                  //****************** Главное меню ********************************
  Serial.flush();
  MENU_KEY = false;
  main_screen();
  pp_menu = 0;//------------------
   lastReportedPos = encoder0Pos = 0;
  str_print(pp_menu, 2);
  do {
    read_keys();
    if (UP_KEY) {
      if (pp_menu > 0) {
        pp_menu--;
      } else {
        pp_menu = 5;
      }
      str_print(pp_menu, 2);
    };
    if (DOWN_KEY) {
      if (pp_menu < 5) {
        pp_menu++;
      } else {
        pp_menu = 0;
      }
      str_print(pp_menu, 2);
    };
    if (OK_KEY) {
      if (pp_menu == 0) {
        Tablo.clrScr();
        manual_menu();
      }
      if (pp_menu == 1) files_menu();
      if (pp_menu == 2) {
        current_line = 0;
        printSerialString((char*)cmd_unlock);
        break;
      }
      if (pp_menu == 3) {
        setup_menu();
      }
      if (pp_menu == 4) {
        current_line = 0;
        digitalWrite(GRBL_RES_PIN, HIGH);
        delay(200);
        digitalWrite(GRBL_RES_PIN, LOW);
        break;
      }
      if (pp_menu == 5) {
        Serial.flush();
        break;
      }
    };
    delay(MENU_DELAY);
  } while (!MENU_KEY);
  MENU_KEY = false;
  current_line = 0;
};

void setup_screen(void) {              //***************** Экран настроек *******************************
  Tablo.clrScr();
  MSG((char*)text_feedmax,0,0);
  Tablo.printNumI((EEPROM.readInt(EEPROM_FEED)),60,0);
  MSG((char*)text_autostart,0,1);
  Tablo.printNumI((EEPROM.read(EEPROM_START)),72,8);
  MSG((char*)text_pauseerr,0,2);
  Tablo.printNumI((EEPROM.read(EEPROM_PAUSE)),72,16);
  MSG((char*)text_autounlk,0,3);
  Tablo.printNumI((EEPROM.read(EEPROM_UNLOCK)),72,24);
  MSG((char*)text_exit,0,4);
 }
 
void setup_param(int8_t param) {       //*************** Изменение настроек *****************************
  unsigned int temp, min, max = 0;
    if (param == 0) {
    temp = EEPROM.readInt(EEPROM_FEED);
    min = 0; max = FEED_MAX;
  } else if (param == 1) {
    temp = EEPROM.read(EEPROM_START);
    min = 0; max = 1;
  } else if (param == 2) {
    temp = EEPROM.read(EEPROM_PAUSE);
    min = 0; max = 1;
  } else if (param == 3) {
    temp = EEPROM.read(EEPROM_UNLOCK);
    min = 0; max = 1;
  }
  do {
    Tablo.invertText(true);
    if (param == 0)      { Tablo.printNumI(temp,60,0);}
    else if (param == 1) { Tablo.printNumI(temp,72,8);}
    else if (param == 2) { Tablo.printNumI(temp,72,16);}
    else if (param == 3) { Tablo.printNumI(temp,72,24);}
    Tablo.invertText(false);
   
    if (param == 0) {
      if (encoder0Pos > 4)encoder0Pos = 4;
      if (encoder0Pos < -4)encoder0Pos = -4;
      if ((encoder0Pos > 1) || (encoder0Pos < 1)) {
        temp += encoder0Pos * 5;
      } else {
        temp += encoder0Pos;
      }
    } else if (param == 1) {
      if (encoder0Pos > 1)encoder0Pos = 1;
      if (encoder0Pos < 0)encoder0Pos = 0;
      temp = encoder0Pos;
    } else if (param == 2) {
      if (encoder0Pos > 1)encoder0Pos = 1;
      if (encoder0Pos < 0)encoder0Pos = 0;
      temp = encoder0Pos;
    } else if (param == 3) {
      if (encoder0Pos > 1)encoder0Pos = 1;
      if (encoder0Pos < 0)encoder0Pos = 0;
      temp = encoder0Pos;
    }
    delay(MENU_DELAY * 2);
    encRead(); if (encClick) break;
  } while (true);
  if (param == 0) {
    EEPROM.updateInt(EEPROM_FEED, temp);
  } else if (param == 1) {
    EEPROM.update(EEPROM_START, (byte)temp);
  } else if (param == 2) {
    EEPROM.update(EEPROM_PAUSE, (byte)temp);
  } else if (param == 3) {
    EEPROM.update(EEPROM_UNLOCK, (byte)temp);
  }
}

void setup_menu(void) {                //************ Меню изменения настроек ***************************
  Serial.flush();
  setup_screen();
  pp_menu = 0;
  lastReportedPos = encoder0Pos = 0;
  str_print(pp_menu, 1);
  do {
    read_keys();
    if (UP_KEY) {
      if (pp_menu > 0) {
        pp_menu--;
      } else {
        pp_menu = 4;
      }
      str_print(pp_menu, 1);
    };
    if (DOWN_KEY) {
      if (pp_menu < 4) {
        pp_menu++;
      } else {
        pp_menu = 0;
      }
      str_print(pp_menu, 1);
    };
    if (OK_KEY) {
      if (pp_menu == 0) setup_param(0);
      if (pp_menu == 1) setup_param(1);
      if (pp_menu == 2) setup_param(2);
      if (pp_menu == 3) setup_param(3);
      if (pp_menu == 4) {
        break;
      }
      setup_screen();
      str_print(pp_menu, 1);
    };
    delay(MENU_DELAY);
  } while (true);
  main_screen();
  pp_menu = 0;
  str_print(pp_menu, 2);
}

void manual_screen() {                 //********* Вывод Меню ручного управления ************************
  Tablo.clrScr();
  MSG((char*)pgm_read_word(&(axis_label[0])),0,0);
  gauge(14, 0, 31, 0, 1);
  MSG((char*)pgm_read_word(&(axis_label[1])),0,1);
  gauge(14, 1, 31, 0, 1);
  MSG((char*)pgm_read_word(&(axis_label[2])),0,2);
  gauge(14, 2, 31, 0, 1);
  MSG((char*)text_home, LEFT,3);
  MSG((char*)text_reset, LEFT,4);
  MSG((char*)text_exit, LEFT,5);
}

void go_home(void){                    //**************Команда HOME GRBL*********************************
  printSerialString((char*)cmd_absolute);  
  Serial.write(0x0A);  
  printSerialString((char*)cmd_upz);
  Serial.write(0x0A);
  printSerialString((char*)cmd_zeroxy);
  Serial.write(0x0A);
}

void move_menu(char axis) {            //*************** Меню слайдеров *********************************
  printSerialString((char*)cmd_incremental);
  Serial.write(0x0A);
  do {
    Tablo.clrScr();
    MSG((char*)pgm_read_word(&(axis_label[axis])),30,0);     // Название оси
    if (encoder0Pos > 20)encoder0Pos = 20;
    if (encoder0Pos < -20)encoder0Pos = -20;
    if (lastReportedPos > 20)lastReportedPos = 20;
    if (lastReportedPos < -20)lastReportedPos = -20;
   gauge(8, 1, 31, lastReportedPos, 1);//****************************
    Tablo.printNumI(abs(lastReportedPos),40,16);// Вывод позиции 
    MSG((char*)text_stepsize, 8,4);
    if (lastReportedPos != 0) {
      printSerialString((char*)cmd_linear);
      printSerialString((char*)pgm_read_word(&(axis_label[axis])));
    }
    if (lastReportedPos < 0) {
      Tablo.print ("-",32,16);
      if (lastReportedPos != 0) Serial.write(0x2D);
    }
    if (lastReportedPos != 0) {
      char pos = abs(lastReportedPos);
      printSerialString((char*)pgm_read_word(&(acc_table[pos])));
      Serial.write(0x0A);
      MSG((char*)pgm_read_word(&(acc_table[pos])), 17,5);//Вывод шага и скорости
    }
    if (lastReportedPos != 0) {
      while (true) {
        if (Serial.available()) break;
        encRead(); if (encClick) break;
      }
      if (Serial.available()) {
        memset(buff, 0, sizeof(buff));
        readcnt = Serial.readBytesUntil(0x0A, buff, sizeof(buff));
        if (readcnt > 0) {
          for (int8_t pe = 0; pe < sizeof(buff); pe++) {
            if ((buff[pe] == 0x0D) || (buff[pe] == 0x0A)) {
              buff[pe] = 0x00;
              break;
            }
          }
          encRead(); if (encClick) break;
          if (strncmp(buff, "error", 5) == 0) {
            //Tablo.print((buff), LEFT,16);
          }
        }
      }
    }
    encRead(); if (encClick) break;
  } while (true);
  encClick = false;
  encoder0Pos = lastReportedPos = 0;
  delay(MENU_DELAY);
}

void manual_menu(void) {               //*********** Меню ручного управления ****************************
  Serial.flush();
  //manual_screen();
  pp_menu = 0;
  lastReportedPos = encoder0Pos = 0;
  str_print(pp_menu, 1);
  do {
    read_keys();
    if (UP_KEY) {
      if (pp_menu > 0) {
        pp_menu--;
      } else {
        pp_menu = 5;
      }
      str_print(pp_menu, 1);
    };
    if (DOWN_KEY) {
      if (pp_menu < 5) {
        pp_menu++;
      } else {
        pp_menu = 0;
      }
      str_print(pp_menu, 1);
    };
    if (OK_KEY) {
      if (pp_menu == 0) {
        move_menu(0);
        delay(MENU_DELAY);
      }
      if (pp_menu == 1) {
        move_menu(1);
        delay(MENU_DELAY);
      }
      if (pp_menu == 2) {
        move_menu(2);
        delay(MENU_DELAY);
      }
      if (pp_menu == 3) {
        go_home();
        delay(MENU_DELAY);
      }
      if (pp_menu == 4) {
        printSerialString((char*)cmd_reset);
        Serial.write(0x0A);
        delay(MENU_DELAY);
      }
      if (pp_menu == 5) break;
      manual_screen();
      str_print(pp_menu, 1);
    };
    delay(MENU_DELAY);
  } while (true);
  main_screen();
  pp_menu = 0;
  str_print(pp_menu, 2);
}

void exec_screen(void) {               //************** Экран выполнения ********************************
//MSG((char*)empty_line, 30,5);
  MSG((char*)empty_line, 0,4);
//Tablo.printNumI(counter_line,30,40); //***************** Всего строк **********************************  
 }

void buttons_screen(void) {            //*********** Клавиши управления GRBL ****************************

  if (pp_menu != ppold) {
  MSG((char*)empty_line, 0,1);         //*********** Стирание названия предыдущего режима 
  MSG((char*)empty_line, 0,2);
  ppold=pp_menu;
  }
  /*play button*/
  if (pp_menu == 0) {
     MSG((char*)text_start, 20,1);
     ppold=pp_menu;
    }
  /*step button*/
  if (pp_menu == 1) {
     MSG((char*)text_step, 20,1);
     ppold=pp_menu;
    }
  /*pause button*/
  if (pp_menu == 2) {
     MSG((char*)text_pause, 20,1);
     ppold=pp_menu;
    }
  /*stop button*/
  if (pp_menu == 3) {
     MSG((char*)text_exit, 20,1);
     ppold=pp_menu;
    }
}

void process_keys(void) {              //*********** Управление клавишами GRBL **************************
  read_keys();
  if ((exec_mode == EXEC_PLAY) && (OK_KEY == true)) {
    exec_mode = EXEC_PAUSE;
  }
  if ((exec_mode == EXEC_PAUSE) ||  (exec_mode == EXEC_STEP)) {
    skip_page = 0;
    OK_KEY = false;
    do {
      read_keys();
      if (UP_KEY) {
        if (pp_menu > 0) {
          pp_menu--;
        } else {
          pp_menu = 3;
        }
      };
      if (DOWN_KEY) {
        if (pp_menu < 3) {
          pp_menu++;
        } else {
          pp_menu = 0;
        }
      };
      if (OK_KEY) {
        OK_KEY = encClick = false;
        break;
      }
      buttons_screen();
      delay(MENU_DELAY);
      skip_page++;
      if (skip_page > 3)skip_page = 0;
    } while (true);
    if (pp_menu == 0) {
      exec_mode = EXEC_PLAY;
    }
    if (pp_menu == 1) {
      exec_mode = EXEC_STEP;
    }
    if (pp_menu == 2) exec_mode = EXEC_PAUSE;
    if (pp_menu == 3) {
      exec_mode = EXEC_EXIT;
    }
    delay(MENU_DELAY);
    OK_KEY = encClick = false;
    buttons_screen();
  }
  update_pos();
}

void update_pos(void) {
  //Tablo.printNumI((feed_dig), 50,40);
//Tablo.printNumI((exec_mode), 70,0);
}

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++;
      Tablo.printNumI(current_line, 30,40);         // Вывод текущей строки при выполнении
      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++) {
          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_dig = strtol(feed, 0, 0);
          if (feed_dig > feed_safe) feed_dig = feed_safe;
          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);
        }
        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) {             //********** Пошаговый режим *****************
          Tablo.print("                    ", 0,16);             //Стираем хвост
          Tablo.print((buff), 0,16);                             //Вывод текущей строки кода
          Tablo.printNumI(current_line,30,40);                   // Выводим текущую строку
          skip++;
        }
        Serial.flush();
      }

      while (Serial.available() == 0) {
        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) {
        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();

            //Tablo.printNumI((temp), 50,24);
            Tablo.print((buff), 0,32);
            memset(temp, 0, sizeof(temp));
            if (EEPROM.read(EEPROM_PAUSE) == 1) exec_mode = EXEC_PAUSE;
            skip++;
          }

          if ((strncmp(buff, "ok", 2) == 0)) {

            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();
}

boolean init_card(void) {              //************** Инициализация CD *******************************
  if (!SD.begin(__SDCS) && Init_sd == false) {
    MSG((char*)init_error,22,8);
    digitalWrite(__SDCS, LOW);
    delay(MENU_DELAY * 4);
    digitalWrite(__SDCS, HIGH);
    return false;
  }
  root = SD.open("/");
  if (!root) {
    MSG((char*)init_error,22,8);
    delay(MENU_DELAY * 4);
    return false;
  }
  Init_sd = true;
  root.rewindDirectory();
  return true;
}

void printDirectory(File dir, String &file, bool getfile) {
  while (filecount < MAX_DISPLAY_FILES) {
    File entry = dir.openNextFile(O_READ);
    if (!entry) {
      entry.close();
      break;
    }
    if (entry.isDirectory()) {
      printDirectory(entry, file, getfile);
    } else {
      if ((getfile) && (skip == 0)) {
        file = entry.name();
        break;
      }
      if (skip == 0) {
        filecount++;
        Tablo.print((entry.name()), 9,(filecount-1)*8);
      };
      if (skip > 0) skip--;
    }
    entry.close();
  }
}

void list(void) {
  skip = skip_page * MAX_DISPLAY_FILES;
  Tablo.clrScr();//??????????????????????????????????????????????
  filecount = 0;
  root.rewindDirectory();
  printDirectory(root, fname, false);
  if (filecount == MAX_DISPLAY_FILES) {
    MSG((char*)text_next,20,(filecount));
  } else {
    Tablo.invertText(true);
    MSG((char*)text_exit,20,(filecount));
    Tablo.invertText(false);
  }
  pp_menu = 0;
  str_print(pp_menu, 1);
}

void files_menu(void) {
  //Tablo.clrScr();//??????????????????????????????????????????????
  skip_page = skip = 0;
  if (init_card()== true && Init_sd == false) {
    list();
  }
  if (Init_sd == true){
   list();
  } else
  {
    MENU_KEY = true;
  }
  do {
    read_keys();
    if (UP_KEY) {
      if (pp_menu > 0) {
        pp_menu--;
      } else {
        pp_menu = filecount;
      }
      str_print(pp_menu, 1);
    };
    if (DOWN_KEY) {
      if (pp_menu < filecount) {
        pp_menu++;
      } else {
        pp_menu = 0;
      }
      str_print(pp_menu, 1);
    };
    if (OK_KEY) {
      if (pp_menu < filecount) {
        root.rewindDirectory();
        skip = (skip_page * MAX_DISPLAY_FILES) + pp_menu;
        filecount = 0;
        fname = "";
        printDirectory(root, fname, true);
// ********************************************************************************       
  File text = SD.open(fname, O_READ);
Tablo.clrScr();
Tablo.print (fname,20, 24);//                           
Tablo.print ("Loading",20, 32);
 MSG((char*)text_line, 0,5);
//Tablo.printNumI(counter_line,0,40);
//******************************************************************************************************
//                              ПОДСЧЕТ СТРОК
  /*     counter_line = 0; //обнуляем счетчик
      while (text.available()) {  //читаем все символы из файла до конца
         char sd_t = text.read();
         if (sd_t == '\n')        {//и увеличиваем счетчик, если символ - перенос
           counter_line++; 
           if (counter_line%100==0)Tablo.printNumI(counter_line,30,40);// Вывод к-ва строк/100 при загрузке
          
         }
         }
*/
 
  text.close(); //закрываем файл

// ********************************************************************************            
        execute_file(fname);
// MSG((char*)text_line, 0,3);
//Tablo.printNumI(counter_line,30,32); 
//Tablo.print (fname,20, 24);
//delay(1000);Tablo.clrScr(); 

        
        go_home();
        do {
          encRead();
Tablo.clrScr();          
MSG((char*)text_done,0,4);
        } while (!encClick);
        break;
      }
      if ((filecount == MAX_DISPLAY_FILES) && (pp_menu == filecount)) {
        skip_page++;
      } else {
        break;
      }
      list();
    };
    delay(MENU_DELAY);
  } while (!MENU_KEY);
  filecount = skip_page = skip = 0;
  main_screen();
  pp_menu = 1;
  str_print(pp_menu, 2);
};

void rotEncoder() {
  rotating = true;
}

//*******************************************************************************
void setup() {
  Serial.begin(115200);
  Serial.setTimeout(1);
  Tablo.InitLCD();
  Tablo.setFont(SmallFont);
  Tablo.setContrast(70); 
  Tablo.clrScr();
  Tablo.print("START PROGRAMM", CENTER, 24);
  while (!Serial) {
  }
  EEPROM.setMaxAllowedWrites(2048);

  pinMode(__SDCS, OUTPUT);
  digitalWrite(__SDCS, HIGH);

  //pinMode(__LED, OUTPUT);
  //digitalWrite(__LED, HIGH);


  //display.setCursor(0, 0);

  pinMode(encoder0PinA, INPUT_PULLUP);
  pinMode(encoder0PinB, INPUT_PULLUP);
  pinMode(encoder0PinC, INPUT_PULLUP);

  attachInterrupt(0, doEncoderA, FALLING );  // прерывание при смене с HIGH на LOW pin 2
  attachInterrupt(1, doEncoderB, FALLING );  // прерывание при смене с HIGH на LOW pin 3

  lastReportedPos = encoder0Pos = 0;
  pinMode(GRBL_RES_PIN, OUTPUT);
  digitalWrite(GRBL_RES_PIN, HIGH);
  delay(200);
  digitalWrite(GRBL_RES_PIN, LOW);
  current_line = skip = 0;
  feed_safe = EEPROM.readInt(EEPROM_FEED);
  if (feed_safe > FEED_MAX) {
    feed_safe = FEED_MAX;
    EEPROM.updateInt(EEPROM_FEED, FEED_MAX);
  }
}

void doEncoderA() {
  if ( rotating ) delay (25);  
  if ( digitalRead(encoder0PinA) == LOW ) { 
    encoder0Pos ++;
    rotating = false; 
  }
}

void doEncoderB() {
  if ( rotating ) delay (25);
  if ( digitalRead(encoder0PinB) == LOW ) {
     encoder0Pos --;
    rotating = false;
  }
}

void encRead() {
  encClick = (digitalRead(encoder0PinC) == HIGH ? false : true);
  if (encoder0Pos != lastReportedPos) lastReportedPos = encoder0Pos;
}

void read_keys(void) {
  if (encoder0Pos == 0) {
    UP_KEY = false;
    DOWN_KEY = false;
  }
  encRead();
  OK_KEY = encClick;
  if (encoder0Pos > 0) {
    DOWN_KEY = true;
    encoder0Pos = lastReportedPos = 0;
  } else if (encoder0Pos < 0) {
    UP_KEY = true;
    encoder0Pos = lastReportedPos = 0;
  }
}

////////////////////////////////////////////////////////////////////////////////

void loop() {
  if (Serial.available()) {
    memset(buff, 0, sizeof(buff));
    readcnt = Serial.readBytesUntil(0x0A, buff, sizeof(buff));
    if (readcnt > 0) {
      buff[readcnt] = 0;
      //MSG((char*)empty_line,0,0);
      if (strncmp(buff, "ok", 2) == 0) {
      }
      if (strncmp(buff, "error", 5) == 0) {
      }
      Tablo.print((buff), 0,32);
      current_line++;
      if (current_line > MAX_DISPLAY_LINES)current_line = 0;
      Serial.flush();
      if ((strncmp(buff, "['$", 3) == 0) && (EEPROM.read(EEPROM_UNLOCK) == 1)) {
        printSerialString((char*)cmd_unlock);
        delay(10);
      }
    }
  }
  encRead();
    if (encClick) {
    encClick=0;
    main_menu();}
  }
Подключение дисплея кнопок и картридера прописано в скетче. Сброс GRBL подключен к пину А0. Для питания дисплея нужно 3,3 В.

И вот "схема":
Вложения
autocont_nokia1.jpg (5873 просмотра) <a class='original' href='./download/file.php?id=176802&sid=28fbb23c856fb6f9d9584ceb4e2cbd9a&mode=view' target=_blank>Загрузить оригинал (249.43 КБ)</a>
krupnfs
Новичок
Сообщения: 3
Зарегистрирован: 21 фев 2020, 09:09
Репутация: 0
Настоящее имя: Артем
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение krupnfs »

Блин собрал контроллер по оригинально схеме предложенной автором, отдельно от станка все работает, подключаю к станку и ничего не работает, даже не представляю куда копать :-(
svm
Мастер
Сообщения: 367
Зарегистрирован: 23 ноя 2017, 12:56
Репутация: 75
Настоящее имя: Владимир Сергеев
Откуда: Бузулук
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение svm »

Как подключил? Какой станок? Что им управляет? Контроллер только заменяет ПК для станков под управлением GRBL.
krupnfs
Новичок
Сообщения: 3
Зарегистрирован: 21 фев 2020, 09:09
Репутация: 0
Настоящее имя: Артем
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение krupnfs »

svm, Станок самосборный, управляется GRBL 1.1f, он мне и нужен был как раз чтобы без компа работал, но что-то пошло не так и че то не работает, как будто данные до станка не доходят и он висит бесконечно в ожидании, либо иногда че то оживает, но файлы на флешке не читаются :-(, точнее не показывает какие там есть файлы
svm
Мастер
Сообщения: 367
Зарегистрирован: 23 ноя 2017, 12:56
Репутация: 75
Настоящее имя: Владимир Сергеев
Откуда: Бузулук
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение svm »

Я сейчас тоже начал испытывать, правда на имитации станка (просто 3 шаговика). Испытать на реальном станке пока не получается. Маленький не доделан, а большой стоит в неотапливаемом подвале. Тоже заметил, что не всегда отрабатывается программа. Закономерности пока не обнаружил. Под МАЧем все работают. Посмотрите в настройках. Должна авто разблокировка быть включена и автостарт. Без первой вообще не удавалось запустить.
krupnfs
Новичок
Сообщения: 3
Зарегистрирован: 21 фев 2020, 09:09
Репутация: 0
Настоящее имя: Артем
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение krupnfs »

svm, ооооооо, спасибо большое, посмотрю
diman78
Новичок
Сообщения: 12
Зарегистрирован: 01 мар 2020, 02:17
Репутация: 0
Настоящее имя: Дмитрий Владимирович
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение diman78 »

svm писал(а):#include <LCD5110_Basic.h>
не могли бы поделиться библиотекой
svm
Мастер
Сообщения: 367
Зарегистрирован: 23 ноя 2017, 12:56
Репутация: 75
Настоящее имя: Владимир Сергеев
Откуда: Бузулук
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение svm »

Описание брал здесь http://mynobook.blogspot.com/2015/02/lcd5110basic.html. Скачивал по ссылке осюда-же. Да и сссылок на нее в инете полно. Библиотека не самая лучшая, но с другими не хватает памяти длля работы с картой. Приведенный скетч кривоват, есть варианты немного получше, но до ума еще не довел. Думал кто еще подключится и свежим глазом найдет косяки.
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение maksim_tverdohlb »

Подключил экран 5110 к ардуино про мини,прошил прошивкой под дисплей 5110,на дисплее нет ничего ....осцылографом меряю по пинам дисплея нет никаких импульсов ....Что не так можит быть ?Кардридер не подключал пока....
svm
Мастер
Сообщения: 367
Зарегистрирован: 23 ноя 2017, 12:56
Репутация: 75
Настоящее имя: Владимир Сергеев
Откуда: Бузулук
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение svm »

Импульсы идут только во время обновления информации, их можно и не заметить. Если скомпилировалось без ошибок, то проверяйте монтаж. У этих экранов бывает и другая распиновка. При включении должна быть надпись "Start programm". Если не подключен GRBL контроллер и карта не все менюшки будут работать. Если нужно, выложу более новую версию.
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

Re: Arduino GRBL Companion - Автономный контроллер для GRBL

Сообщение maksim_tverdohlb »

Выложите пожалуста новую версию...Компилируется,но много warning!Сейчас буду пробывать стандартные примеры для lcd5110)))Можит с дисплеем проблемы....
Ответить

Вернуться в «Электроника»