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

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

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

Сообщение svm »

Эта версия почти работает ( после удачного выполнения G кода перестают работать кнопки).Приходится перезагружать. Версия IDE ардуино 1.6.9. Библиотеки из первого поста , кроме дисплея. А на что ругается?

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

#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 100
#define GRBL_RES_PIN A0


#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;  // Счетчик
int8_t lastReportedPos = 1;   // Изменения
static boolean rotating = false;    // Дребезг


// 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();
  delay(MENU_DELAY);
  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();
      }
      main_screen();
      str_print(pp_menu, 2);
      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;
        Tablo.clrScr();
  Tablo.print("RESET", CENTER, 16);
        digitalWrite(GRBL_RES_PIN, HIGH);
        delay(200);
        digitalWrite(GRBL_RES_PIN, LOW);
        break;
      }
      if (pp_menu == 5) {
        //main_screen();
        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();
    OK_KEY=0;
    delay(MENU_DELAY);
  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) {
      delay(MENU_DELAY);
      OK_KEY=0;
       lastReportedPos = encoder0Pos = 0;
      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, 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);                             // Вывод G кода текущей строки 
          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();
        //MSG((char*)text_exit,30,4);
        do {
          encRead();
Tablo.clrScr(); 
  
MSG((char*)text_done,30,4);      //  **************** Конец файла *************************
        } while (!encClick);     //  **************** Ждем кнопки *************************
        pp_menu = 1;
        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, 16);
  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 (30);  
  if ( digitalRead(encoder0PinA) == LOW ) { 
    encoder0Pos ++;
    rotating = false; 
  }
}

void doEncoderB() {
  if ( rotating ) delay (30);
  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;

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

      }
      if (strncmp(buff, "error", 5) == 0) {
      }
      Tablo.print((buff), LEFT,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();}
  }
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

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

Сообщение maksim_tverdohlb »

ОШИБОЧКУ В КОДЕ НАШОЛ LCD5110 Tablo( 5 , 6 , 7, 9 ,8);
// SCK MOSI DS RST CE )))))дисплей запустился )))Спасибо )))Буду собирать дальше.....
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

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

Сообщение maksim_tverdohlb »

Подскажите,как проверить контролер,как он должен работать?Я запустил ,бегаю по меню,в роздел файл не заходит? В ручную осями не двигает ...импульсов на тх,rx нет
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

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

Сообщение maksim_tverdohlb »

Спаял
Вложения
Схема (7800 просмотров) <a class='original' href='./download/file.php?id=177923&sid=9370799c19f6aedc67fac4709040c602&mode=view' target=_blank>Загрузить оригинал (5.33 МБ)</a>
Схема
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

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

Сообщение maksim_tverdohlb »

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

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

Сообщение svm »

Я библиотеки брал из первого поста. Если не двигает осями, значит нет ответа от GRBL. Он должен на каждое движение отвечать OK. Если ответа нет, то программа ждет его и не реагирует. Может TX/RX местами попутаны? В меню файл заходить должно. Там вроде все работает. Попробуйте скетч работы с СD из примеров библиотеки. И монтаж кардридера. А ошибки при компиляции могут быть просто от наличия лишних библиотек. Если компилируется и заливается, то работать должно. Если ругается типа этого - warning: deprecated conversion from string, то это просто использование устаревшего, но рабочего варианта вывода текста в библиотеке (как мне кажется). Еще один нюанс. На чем у Вас собран контроллер? Если про мини 3 вольтовая, то кардридер работать не должен. У него есть собственный стабилизатор с 5В на 3,3 В. И если его запитать от 3,3, то он не обязан работать. А дисплей должен питаться от 3,3. Хотя 5 В он выдерживает, но это не совсем правильно.
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

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

Сообщение maksim_tverdohlb »

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

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

Сообщение svm »

Так и должно быть. контроллер передает GRBL команду ( в G кодах) перемещения оси сначала на 0,01 мм и скорость 100 и ждет ответа OK. пока не получит будет ждать (смысла передавать следующую команду, пока не выполнена предыдущая - нет!). Осциллографом там тяжело что-то увидеть. Лучше подключитесь к монитору ардуино на скорости 115200. И все будет видно. Заодно и другие режимы, типа Home, или сброс увидите.
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

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

Сообщение maksim_tverdohlb »

розобрался почему контролер не двигал осями ))))TX RX БЫЛО ПОПЛУТАНО МЕСТАМИ ))))Осталось розобраться почему не заходит в роздел файл .....
maksim_tverdohlb
Новичок
Сообщения: 24
Зарегистрирован: 09 мар 2020, 16:08
Репутация: 0
Настоящее имя: Максим
Контактная информация:

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

Сообщение maksim_tverdohlb »

Ошибку нашол-ПОМЕНЯЛ МЕСТАМИ MOSI MISO)))в роздел файл заходит но файлов не видит, только exit)))В чом можит быть проблема?
svm
Мастер
Сообщения: 367
Зарегистрирован: 23 ноя 2017, 12:56
Репутация: 75
Настоящее имя: Владимир Сергеев
Откуда: Бузулук
Контактная информация:

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

Сообщение svm »

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

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

Сообщение maksim_tverdohlb »

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

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

Сообщение svm »

Ok!
brun12
Новичок
Сообщения: 2
Зарегистрирован: 20 апр 2020, 19:21
Репутация: 0
Настоящее имя: brun
Контактная информация:

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

Сообщение brun12 »

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

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

Сообщение svm »

Схема связи контроллера и платы ГРБЛ в посту http://www.cnc-club.ru/forum/viewtopic. ... 80#p551768
Я сейчас притормозил с доводкой контроллера до ума, занялся механикой http://www.cnc-club.ru/forum/viewtopic. ... 83#p561283, пока тестирую под МАЧ3
brun12
Новичок
Сообщения: 2
Зарегистрирован: 20 апр 2020, 19:21
Репутация: 0
Настоящее имя: brun
Контактная информация:

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

Сообщение brun12 »

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

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

Сообщение svm »

Там, это встречается во многих местах, принцип простой - контроллер посылает плате ГРБЛ через КОМ порт G коды (просто текст) и ждет ответа "Ok". Если ответ есть шлет следующий. В программе все достаточно прокомментировано. Я уже достаточно длительное время с этим делом не занимался, и сразу не въеду. Вот с механикой закончу, продолжу с контроллером. Посмотрите здесь; [url]https://drive.google.com/file/d/16XYIbb ... /view/[url], все очень понятно.
Аватара пользователя
Yashcher
Новичок
Сообщения: 18
Зарегистрирован: 24 окт 2011, 23:26
Репутация: 0
Контактная информация:

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

Сообщение Yashcher »

tecnocat писал(а):
Yashcher писал(а):Собрал! Но работает как то странно, можно запустить файл 11раз, потом говорит что файлов или флэшки нет. Приходится всё выключать и включать заново, тогда всё снова работает. Простое нажатие на кнопку резет не помогает. У кого подобное было? Или возможная причина?
Возможная причина - нехватка памяти, не факт что везде корректно освобождается память
Возможно её принудительно освобождать? Или где про это можно прочесть?
_Всё решают мелочи...
http://forum.easyelectronics.ru/viewtop ... =16&t=2097
SAG74
Новичок
Сообщения: 17
Зарегистрирован: 20 ноя 2018, 18:56
Репутация: 0
Настоящее имя: Александр
Откуда: Херсон
Контактная информация:

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

Сообщение SAG74 »

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

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

Сообщение svm »

Можно ничего не соединять, просто последовательно отправлять коды в КОМ порт, а в конце добавить конец строки. Я сейчас немного оторвался от программирования. Живу в деревне и приходится много времени проводить на свежем воздухе. После таких прогулок не остается ни сил не времени. Так-что особо Вам помочь не смогу. Чтобы въехать надо хотя-бы пару дней посидеть за компом.
Ответить

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