Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Как собрать чпу-стол?

Чтобы по максимуму использовать возможности станка, его нужно поместить на прочный и устойчивый стол. Проще всего взять за основу старый стол и переделать его под новые нужды. Для работы нужно заранее подготовить:

  • кнопку завершения работы;
  • фиксатор роликов;
  • зенковку и биты;
  • дрель;
  • электрическую отвертку;
  • пилу;
  • станок X-Carve;
  • концевую фрезу на 4 дюйма с твердосплавным покрытием;
  • твердосплавную фрезу на 4 дюйма, с 4 каналами, с шариковым наконечником;
  • средства защиты слуха.

От старого стола нужно взять две большие полки и укрепить их. По четырем внутренним углам надо разместить угловые скобки, а по длине поперечной балки, которая проходит по нижней стороне — L-образные скобки. Чтобы закрепить полку, нужно добавить дополнительные деревянные подставки. После того как полка будет помещена на место, надо укрепить ее еще большим количеством скобок.

Чтобы найти разумное применение каждому сантиметру помещения, стол хорошо бы оснастить пегбордом, то есть перфорированной панелью для инструментов. Углы панели вырезаются электролобзиком, держатели для инструментов крепятся в отверстиях, на пегборд добавляются лотки для хранения мелких комплектующих.

Пространство в нижней части стола тоже прекрасно подходит для хранения объектов — в частности, барабанного шлифовального станка или настольной пилы. Для хранения материалов можно соорудить съемную полку, воспользовавшись для этого листом фанеры и заготовленными для ножек деревянными брусками. Ножки крепятся к листу фанеры с помощью угловых скоб.

Еще одну полку можно оборудовать наверху — иногда это помогает закрыть проводку от станка и розетку. Верхнюю полку укладывают на торцы стоек и прикручивают. У второй полки углы для ножек вырезают с помощью лобзика.

Моя история постройки чпу-станка своими руками

Приветствую всех жителей Geektimes! Сегодня я хочу вам рассказать свою историю постройки бюджетного классического портального фрезерного станка.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Хочу начать с истории, которая началась в конце 2022 года. Встретившись тогда с другом, он предложил мне сделать фрезерный чпу-станок для раскройки фанеры и пластика. Недолго подумав, я сказал ему, что для вырезания различных слов, рамочек и прочего станок не окупит себя и станет убыточным, на что он мне ответил «придумай что-нибудь»…

Так как в основе проекта был положен интерес я, конечно же, взялся за него. Но все бы ничего, но на предложенный проект не было денег, да и свободного времени тоже. Тогда, исходя из задач, возложенных на станок, было спроектировано следующее:

В итоге на весь станок выделили 20 т.р. Рабочее поле — 550х950 мм. В качестве управления выбрал китайскую синюю плату на драйверах TB6560 на 4 оси, в комплект еще входит 4 двигателя, блок питания, диск с ПО и провод для подключения к ПК, на тот момент она обошлась мне в 14 с копейками т.р.

Так как планировалось сделать что-то вроде конструктора, и не прибегая к фрезерным, расточным, шлифовальным работам, вся конструкция изготовлялась из конструкционной листовой стали толщиной 8мм, раскроенной на лазерным ЧПУ станке. Но без токарной обработки не обошлось, так как надо точить подшипниковые опоры, втулки скольжения, обтачивать концы винтов и в этом помогла наша дочерняя фирма. И вообще то, что касается металлообработки в России, я постарался, высказать свои мысли в блоге, чтобы здесь не флудить.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Подшипниковая опора.

В итоге раскрой всех деталей к станку из металлического листа вышло в 1,5т.р., еще 2т.р. отдал за токарную обработку, остальное потратилось на крепеж, подшипники и прочие невспомненные мной моменты.

Далее хотелось бы продемонстрировать несколько видео о процессе сборки и работы станка, а также фото того, что пробовал вырезать я.

И еще один момент: в качестве шпинделя решил использовать обыкновенную дрель, ввиду невысокой скорости работы станка.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Попробовали выжигать

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

По итогам сборки наладки и проверки можно сказать, что станок оказался работоспособным, но достаточно «жидким», но это и так было понятно по закладываемому бюджету. И свои задачи он выполнял отлично… Станок был собран к концу февраля и окупился у друга до лета, после чего он успешно его продал за 30 т.р. Продал по причине – надоело, пропал интерес, и нежелание работать.

Я, возможно, что-то упустил и не описал, надеюсь, что на видео найдётся вся отсутствующая здесь информация. В другом же случае оставляйте комментарии.

От идеи до станка. фрезерный станок чпу своими руками

Про другие станки:  Оцилиндровочные станки купить в Красноярске - цены в интернет-магазине

Подготовительные работы

Если вы решили, что будете конструировать станок с ЧПУ своими руками, не используя готового набора, то первое, что вам необходимо будет сделать, — это остановить свой выбор на принципиальной схеме, по которой будет работать такое мини-оборудование.

За основу фрезерного оборудования с ЧПУ можно взять старый сверлильный станок, в котором рабочая головка со сверлом заменяется на фрезерную. Самое сложное, что придется конструировать в таком оборудовании, — это механизм, обеспечивающий передвижение инструмента в трех независимых плоскостях.

К устройству, собранному по такой принципиальной схеме, легко подключить программное управление. Однако его основной недостаток заключается в том, что обрабатывать на таком станке с ЧПУ можно будет только заготовки из пластика, древесины и тонкого листового металла.

Чтобы ваш самодельный станок с ЧПУ был способен выполнять полноценные фрезерные операции с заготовками из различных материалов, за перемещение рабочего инструмента должен отвечать достаточно мощный шаговый двигатель. Совершенно не обязательно искать двигатель именно шагового типа, его можно изготовить из обычного электромотора, подвергнув последний небольшой доработке.

Применение шагового двигателя в вашем фрезерном станке даст возможность избежать использования винтовой передачи, а функциональные возможности и характеристики самодельного оборудования от этого не станут хуже. Если же вы все-таки решите использовать для своего мини-станка каретки от принтера, то желательно подобрать их от более крупногабаритной модели печатного устройства.

Про другие станки:  Организация ремонта ткацких станков с точки зрения безопасности. -

Одним из наиболее важных узлов любого подобного станка является механизм фрезера. Именно его изготовлению необходимо уделить особое внимание. Чтобы правильно сделать такой механизм, вам потребуются подробные чертежи, которым необходимо будет строго следовать.

Приступаем к сборке оборудования

Основой самодельного фрезерного оборудования с ЧПУ может стать балка прямоугольного сечения, которую надо надежно зафиксировать на направляющих.

Несущая конструкция станка должна обладать высокой жесткостью, при ее монтаже лучше не использовать сварных соединений, а соединять все элементы нужно только при помощи винтов.

Объясняется это требование тем, что сварные швы очень плохо переносят вибрационные нагрузки, которым в обязательном порядке будет подвергаться несущая конструкция оборудования. Такие нагрузки в итоге приведут к тому, что рама станка начнет разрушаться со временем, и в ней произойдут изменения в геометрических размерах, что скажется на точности настройки оборудования и его работоспособности.

Сварные швы при монтаже рамы самодельного фрезерного станка часто провоцируют развитие люфта в его узлах, а также прогиб направляющих, образующийся при серьезных нагрузках.

Во фрезерном станке, который вы будете собирать своими руками, должен быть предусмотрен механизм, обеспечивающий перемещение рабочего инструмента в вертикальном направлении. Лучше всего использовать для этого винтовую передачу, вращение на которую будет передаваться при помощи зубчатого ремня.

Важная деталь фрезерного станка – его вертикальная ось, которую для самодельного устройства можно изготовить из алюминиевой плиты. Очень важно, чтобы размеры этой оси были точно подогнаны под габариты собираемого устройства. Если в вашем распоряжении есть муфельная печь, то изготовить вертикальную ось станка можно своими руками, отлив ее из алюминия по размерам, указанным в готовом чертеже.

После того как все комплектующие вашего самодельного фрезерного станка подготовлены, можно приступать к его сборке. Начинается данный процесс с монтажа двух шаговых электродвигателей, которые крепятся на корпус оборудования за его вертикальной осью. Один из таких электродвигателей будет отвечать за перемещение фрезерной головки в горизонтальной плоскости, а второй — за перемещение головки, соответственно, в вертикальной. После этого монтируются остальные узлы и агрегаты самодельного оборудования.

Вращение на все узлы самодельного оборудования с ЧПУ должно передаваться только посредством ременных передач. Прежде чем подключать к собранному станку систему программного управления, следует проверить его работоспособность в ручном режиме и сразу устранить все выявленные недостатки в его работе.

Посмотреть процесс сборки фрезерного станка своими руками можно на видео, которое несложно найти в интернете.

Создание станка с чпу из доступных деталей с минимум слесарной работы

Продолжаем обзор деятельности нашего

Хакспейс-клуба

.

Мы давно мечтали купить в наш клуб ЧПУ станок. Но решили его сделать сами. С нуля, начиная от железа и кончая программного обеспечение (прошивка контроллера и управляющая программа). И у нас это получилось.

Детали для станка старались выбирать из доступных в свободной продаже, многие из которых даже не требуют дополнительной слесарной обработки.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Контроллер мы выбрали Arduino Mega 2560 и что бы много не думать, драйвер шаговых двигателей использовали RAMPS 1.4 (как у RepRap 3D принтера).

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Программу контроллера писали по алгоритму метода конечных автоматов. Последний раз я о нем слышал лет 20 назад в институте, не помню по какому предмету изучали. Это была очень удачная идея. Код получился маленький и легко расширяемый без потери читабельности (если в дальнейшем понадобится не только оси XYZ, или использовать другой G-код). Программа контроллера принимает с USB порта G-код и, собственно, дает команду двигателям осей XYZ двигаться в заданном направлении. Кто не знает, G-код — это последовательность конструкций типа G1X10Y20Z10, которая говорит станку переместится по оси X на 10 мм, Y на 20 мм и Z на 10 мм. На самом деле, в G-коде много различных конструкций (например, G90 — используется абсолютная система координат, G91 — относительная) и много модификаций самого кода. В интернете много о нем описано.

Подробнее остановлюсь на описание скетча (прошивка контроллера).

Вначале в описании переменных прописываем, к какому выходу контроллера будет подключены двигатели и концевые выключатели.

В этом коде метода конечных автоматов переменная принимает значение ждать с USB порта первый байт, во второй конструкции case производится проверка наличия данных и переменная _s принимает значение get_cmd. Т.е считать данные с порта.

 switch(_s){
  case begin_cmd:         Serial.println("&"); //038
                          //to_begin_coord();
                          n_t=0;
                          _s=wait_first_byte;
                          len=0;
                          break;
                          
  case wait_first_byte:   if(Serial.available()){
                              Serial.print(">");
                             _s=get_cmd;
                              c_i=0;
                           }
                          break;

Далее считываем все, что есть в порту, переменная _s устанавливается в get_tag; т.е. переходим на прием буквенного значение G – кода.

case get_cmd:           c=Serial.read();
                          if(c!=-1){
                              if(c=='~'){
                                _s=get_tag;
                                c_i=0;
                                n_t=0;
                                break;
                              }
                           Serial.print(c);
                           if((c>=97)&&(c<=122))
                             c-=32;
                           if( (c==32)||(c==45)||(c==46)||((c>=48)&&(c<=57))||((c>=65)&&(c<=90)) ){
                             cmd[c_i  ]=c;
                             len  ;
                           }
                          }
                          break;

Ну и так далее.

полный код можно посмотреть здесь.

#include <Stepper.h>
#define STEPS 48
//#define SHAG 3.298701
#define STEP_MOTOR 1
double koefx = 1.333333;
double koefy = 1.694915;
Stepper stepper0(STEPS, 5, 4, 6, 3);
Stepper stepper1(STEPS, 8, 9, 10, 11);
Stepper stepper2(STEPS, 13, 12, 7, 2);
int x,y,x1,m;
int motor;
int inPinX = 15;                   // кнопка на входе 22
int inPinY = 14;                   // кнопка на входе 23
int inPinZ = 24;                   // кнопка на входе 24
int x_en = 62;
int x_dir = 48;
int x_step = 46;
int y_en = 56;
int y_dir = 61;
int y_step = 60;
const int begin_cmd=1;
const int wait_first_byte=2;
const int wait_cmd=3;
const int get_cmd=4;
const int test_cmd=5;
const int get_word=6;
const int get_tag=7;
const int get_val=8;
const int compilation_cmd=9;
const int run_cmd=10;
int abs_coord=1;
const int _X=1;
const int _Y=2;
//const int =10;
//const int =11;
//const int =12;


int _s=begin_cmd;
const int max_len_cmd=500;
char cmd[max_len_cmd];
char tag[100][20];
char val[100][20];
int n_t=0;
int c_i=0;
char c;
int i,j;
int amount_G=0;
int len=0;
char*trash;
int n_run_cmd=0;
int g_cmd_prev; //ya предыдущее значение G
class _g_cmd{
public:
_g_cmd(){
 reset();
}
int n; //ya
int g;
double x;
double y;
double z;
void reset(void){
 n=g=x=y=z=99999;
}
};
double _x,_y,_z;
double cur_abs_x,cur_abs_y,cur_abs_z; //ya stoyalo int
int f_abs_coord=1;

_g_cmd g_cmd[100];

void setup()
{

  stepper0.setSpeed(150);
  stepper1.setSpeed(150);
  stepper2.setSpeed(1000);
  Serial.begin(9600);
  pinMode(inPinX, INPUT);
  pinMode(inPinY, INPUT);
  pinMode(inPinZ, INPUT);
  pinMode(x_en, OUTPUT);
  pinMode(x_dir, OUTPUT);
  pinMode(x_step, OUTPUT);
  pinMode(y_en, OUTPUT);
  pinMode(y_dir, OUTPUT);
  pinMode(y_step, OUTPUT);
  digitalWrite(x_en, 1);
  digitalWrite(y_en, 1);
   to_begin_coord();
  //UNIimpstep(12,13,2,7,3,1000);
  //UNIimpstep(12,13,2,7,3,-1000);
}

void to_begin_coord(void)
{
 impstep(_X,-10000,1);
 impstep(_Y,-10000,1);
 cur_abs_x=cur_abs_y=cur_abs_z=0;
}

void loop()
{
  switch(_s){
  case begin_cmd:         Serial.println("&"); //038
                          //to_begin_coord();
                          n_t=0;
                          _s=wait_first_byte;
                          len=0;
                          break;
                          
  case wait_first_byte:   if(Serial.available()){
                              Serial.print(">");
                             _s=get_cmd;
                              c_i=0;
                           }
                          break;
                          
  case get_cmd:           c=Serial.read();
                          if(c!=-1){
                              if(c=='~'){
                                _s=get_tag;
                                c_i=0;
                                n_t=0;
                                break;
                              }
                           Serial.print(c);
                           if((c>=97)&&(c<=122))
                             c-=32;
                           if( (c==32)||(c==45)||(c==46)||((c>=48)&&(c<=57))||((c>=65)&&(c<=90)) ){
                             cmd[c_i  ]=c;
                             len  ;
                           }
                          }
                          break;

 
  case get_tag:           while((c_i<len)&&(cmd[c_i]<=32)) c_i  ;
                          i=0;
                          while((c_i<len)&&(cmd[c_i]>=65)){
                             tag[n_t][i]=cmd[c_i];
                             i  ;
                             c_i  ;
                             while((c_i<len)&&(cmd[c_i]<=32)) c_i  ;
                          }
                          if(i==0){
                            Serial.println("er2 cmd - 'no tag'");
                            _s=begin_cmd;
                            break;
                          }
                          tag[n_t][i]=0;
                          _s=get_val;
                          break;
                          
  case get_val:           while((c_i<len)&&(cmd[c_i]<=32)) c_i  ;
                          i=0;
                          while((c_i<len)&& ( (cmd[c_i]=='.')||(cmd[c_i]=='-')||((cmd[c_i]>=48)&&(cmd[c_i]<=57)) ) ){
                             val[n_t][i]=cmd[c_i];
                             i  ;
                             c_i  ;
                             while((c_i<len)&&(cmd[c_i]<=32)) c_i  ;
                          }
                          if(i==0){
                            Serial.println("er3 cmd - 'no val'");
                            _s=begin_cmd;
                            break;
                          }
                          val[n_t][i]=0;
                          n_t  ;
                          _s=get_tag;
                          
                          if(c_i>=len)
                              _s=compilation_cmd;
                          break;
                        
  case compilation_cmd:   Serial.println("");
                          Serial.print("compilation cmd,input (");
                          Serial.print(n_t);
                          Serial.println("): ");

                          for(i=0;i<n_t;i  ){
                            Serial.print(i);
                            Serial.print("=");
                            Serial.print(tag[i]);
                            Serial.print("(");
                            Serial.print(val[i]);
                            Serial.println(")");
                          }
                          for (int k=0; k<=j; k  )
                          {
                          g_cmd[k].reset();
                          }
                         j=0;
                         i=0;

                         while(i<n_t){
                          if(tag[i][0]=='N'){
                           g_cmd[j].n=(int)strtod(val[i],&trash);
                           i  ;
                           while((i<n_t)&&(tag[i][0]!='N')){ //(g_cmd[j].g==1)&&
                                if(tag[i][0]=='G'){
                                   g_cmd[j].g=(int)strtod(val[i],&trash);
                                   g_cmd_prev = g_cmd[j].g;
                                }
                                else { g_cmd[j].g = g_cmd_prev;
                                }
                            if(tag[i][0]=='X')
                               g_cmd[j].x=(double)strtod(val[i],&trash);
                            if(tag[i][0]=='Y')
                               g_cmd[j].y=(double)strtod(val[i],&trash);
                            if(tag[i][0]=='Z')
                               g_cmd[j].z=(double)strtod(val[i],&trash);
                            i  ;
                           }//while((i<n_t)&&(tag[i]!="G"))
                           j  ;
                          }//if(tag[i]=="G")
                          else i  ;
                         }//while(i<n_t)
                         amount_G=j;

                        Serial.print("compilation cmd,output (");
                        Serial.print(amount_G);
                        Serial.println("): ");
                  
                         for(j=0;j<amount_G;j  ){
                            Serial.print(j);
                            Serial.print("=");
                            Serial.print("N");Serial.print(g_cmd[j].n);Serial.print(" ");
                            Serial.print("G");Serial.print(g_cmd[j].g);Serial.print(" ");
                            Serial.print("X");Serial.print(g_cmd[j].x);Serial.print(" ");
                            Serial.print("Y");Serial.print(g_cmd[j].y);Serial.print(" ");
                            Serial.print("Z");Serial.print(g_cmd[j].z);Serial.println(" ");
                         }
                         
                         n_run_cmd=0;
                         _s=run_cmd;
                         break;

  case run_cmd:          
                         Serial.print("run cmd [");
                         Serial.print("N");Serial.print(g_cmd[n_run_cmd].n);Serial.print(" ");
                         Serial.print("G");Serial.print(g_cmd[n_run_cmd].g);Serial.print(" ");
                         Serial.print("X");Serial.print(g_cmd[n_run_cmd].x);Serial.print(" ");
                         Serial.print("Y");Serial.print(g_cmd[n_run_cmd].y);Serial.print(" ");
                         Serial.print("Z");Serial.print(g_cmd[n_run_cmd].z);Serial.print(" ");
                         Serial.println("]");

                         int f_cmd_coord=0;
                         if(g_cmd[n_run_cmd].g==90){
                            f_abs_coord=1;
                            f_cmd_coord=1;
                            Serial.println("change to ABS coord");
                         }
                         if(g_cmd[n_run_cmd].g==91){
                            f_abs_coord=0;
                            f_cmd_coord=1;                            
                            Serial.println("change to REL coord");
                         }
                         Serial.print("cur_abs(");Serial.print(cur_abs_x);Serial.print(",");Serial.print(cur_abs_y);Serial.print(",");Serial.print(cur_abs_z);Serial.println(")");
                         if(f_cmd_coord){if(  n_run_cmd>=amount_G) _s=begin_cmd; break;}
                         
                         if(f_abs_coord){
                            Serial.println("zdes kosjak G90 ABS");
                            if (g_cmd[n_run_cmd].x==99999)
                            _x=0;
                            else
                           _x=g_cmd[n_run_cmd].x-cur_abs_x;
                            if (g_cmd[n_run_cmd].y==99999)
                            _y=0;
                            else
                           _y=g_cmd[n_run_cmd].y-cur_abs_y;
                           if (g_cmd[n_run_cmd].z==99999)
                            _z=0;
                            else
                           _z=g_cmd[n_run_cmd].z-cur_abs_z;
                           
                         }else{
                           Serial.println("normalno G91 REL");
                           _x=g_cmd[n_run_cmd].x;
                           _y=g_cmd[n_run_cmd].y;
                           _z=g_cmd[n_run_cmd].z;                         
                         }

                         if((_x==0)&&(_y==0)&&(_z==0)){
                           Serial.println("exit: _x=0,_y=0,_z=0");
                           if(  n_run_cmd>=amount_G) _s=begin_cmd; break;
                         }
                         
                        // _x=_x*koefx;
                        // _y=_y*koefy;
                         //_z=_z*koef;
                         double max_l=abs(_x); //ya
                         if(abs(_y)>max_l)
                             max_l=abs(_y);
                         if(abs(_z)>max_l)
                             max_l=abs(_z);
                         double unit_scale=90; // steps in 1.0
                         double unit_len=max_l*unit_scale,unit_step;
                         double px=0,py=0,pz=0,x=0,y=0,z=0,kx,ky,kz;
                         int all_x_steps=0,all_y_steps=0,all_z_steps=0;
                         kx=_x/unit_len;
                         ky=_y/unit_len;
                         kz=_z/unit_len;
                    //     Serial.print("unit_len - "); Serial.print(unit_len); Serial.print(" _x- "); Serial.print(_x); Serial.print(" max_l- "); Serial.println(max_l);
                    //     Serial.print("kx=");Serial.print(kx);Serial.print(" ky=");Serial.print(ky);Serial.print(" kz=");Serial.println(kz); 
                         if((kx==0)&&(ky==0)&&(kz==0)){if(  n_run_cmd>=amount_G) _s=begin_cmd; break;}
                         for(unit_step=0;unit_step<unit_len;unit_step  ){

                          if((abs(x-px)*unit_scale)>=1){
                            impstep(_X,STEP_MOTOR*kx/abs(kx),1);  //stepper0.step(STEP_MOTOR*kx/abs(kx));
                            //Serial.print("x_step ");Serial.println(kx/abs(kx));
                            all_x_steps  ;
                            px=x;
                          }
                          if((abs(y-py)*unit_scale)>=1){
                            impstep(_Y,STEP_MOTOR*ky/abs(ky),1); //stepper1.step(STEP_MOTOR*ky/abs(ky));
                            //Serial.print("y_step ");Serial.println(ky/abs(ky));
                            all_y_steps  ;
                            py=y;
                          }
                          if((abs(z-pz)*unit_scale)>=1){
                            UNIimpstep(12,13,2,7,3,10*kz/abs(kz)); //stepper2.step(STEP_MOTOR*kz/abs(kz)); 
                            //Serial.print("z_step ");Serial.println(kz/abs(kz));
                            all_z_steps  ;
                            pz=z;
                          }
                          x =kx; y =ky; z =kz;
                       //   Serial.print(unit_step);Serial.print("  :  ");
                        //  Serial.print(x);Serial.print("  |  ");Serial.print(y);Serial.print("  |  ");Serial.println(z);                          
                         }
                          Serial.println("-----------------------------------------");
                          Serial.print("all_steps(");Serial.print(all_x_steps);Serial.print(",");Serial.print(all_y_steps);Serial.print(",");Serial.print(all_z_steps);Serial.print(")");
                          cur_abs_x =_x; cur_abs_y =_y; cur_abs_z =_z;                         
                          Serial.print("cur_abs(");Serial.print(cur_abs_x);Serial.print(",");Serial.print(cur_abs_y);Serial.print(",");Serial.print(cur_abs_z);Serial.println(")");
                          Serial.println("-----------------------------------------");   
                         
                         if(  n_run_cmd>=amount_G) _s=begin_cmd;
                            
 }//switch(_s)
}

char end_button(int coord)
{
  int but=0;
  
  if(coord==_X)
      but=digitalRead(inPinX);
  if(coord==_Y)
      but=digitalRead(inPinY);
  
  if(but){
   if(coord==_X)
       Serial.println("[ X out of range ]"); 
   if(coord==_Y)
       Serial.println("[ Y out of range ]"); 
  }
  return but;
}
   
char impstep(int coord,int kol,int f_test_coord)
{
  int IN_en,IN_dir,IN_step,pause;
  pause=2; //35
  switch(coord){
   case _X:  IN_en=x_en; IN_dir=x_dir; IN_step=x_step;
     digitalWrite(IN_en, 0);
     break;
   case _Y:  IN_en=y_en; IN_dir=y_dir; IN_step=y_step;
     digitalWrite(IN_en, 0);
     break;
    }
  if(!f_test_coord)
     Serial.println("[ break step ]");
  //delay(100);
  if (kol<0)
    for (int i=0; i<=abs(kol); i  ){
    if(f_test_coord&&end_button(coord)){
      impstep(coord,200,0);
      return 0;
    }
    digitalWrite(IN_dir, LOW);
    digitalWrite(IN_step, HIGH);
    delay(pause);
    digitalWrite(IN_step, LOW);
    delay(pause);
  }else
    for (int i=0; i <= kol; i  ){
      if(f_test_coord&&end_button(coord)){
        impstep(coord,200,0);
        return 0;
      }
    digitalWrite(IN_dir, HIGH);
    digitalWrite(IN_step, HIGH);
    delay(pause);
    digitalWrite(IN_step, LOW);
    delay(pause);
    }
    digitalWrite(IN_en, 1);
    return 1;
  }

void UNIimpstep(int IN1,int IN2,int IN3,int IN4,int pause,int kol)
{
      //delay(100);
  if (kol<0)
    for (int i=0; i<=abs(kol); i  ){
         digitalWrite(IN1, 0);
    digitalWrite(IN2, 1);
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 0);
    delay(pause);
    digitalWrite(IN1, 1);
    digitalWrite(IN2, 0);
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 0);
    delay(pause);
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 0);
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 1);
    delay(pause);
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 0);
    digitalWrite(IN3, 1);
    digitalWrite(IN4, 0);
     delay(pause);
   }
   else
    for (int i=0; i <= kol; i  ){
    digitalWrite(IN1, 1);
    digitalWrite(IN2, 0);
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 0);
    delay(pause);
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 1);
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 0);
    delay(pause);
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 0);
    digitalWrite(IN3, 1);
    digitalWrite(IN4, 0);
    delay(pause);
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 0);
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 1);
    delay(pause);
 }
}

Про другие станки:  Настольный сверлильный станок своими руками: схемы и чертежи - RMNT - 22 ноября - 43761073018 - Медиаплатформа МирТесен

Завершается конечный автомат конструкцией case run_cmd: где собственно и подается управляющий сигнал на двигатель. Управлением двигателем можно было бы использовать библиотеку #include <Stepper.h> но мы написали свою функцию(char impstep -для биполярного двигателя, void UNIimpstep — униполярного ), что бы можно было не ждать пока один двигатель отработает, что бы послать сигнал другому. Ну и на будущее, отдельная процедура позволит гибче использовать возможностями шагового двигателя. Например, если будем использовать другой драйвер двигателя программно задавать полушаг или шаг двигателя. В нынешнем исполнении с RAMPS получается 1/16 шага. Если кому интересно, про управление шаговыми двигателями можно отдельную статью часами писать.

Теперь немного о железе.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Двигатели использовали 17HS8401, самые мощные из NEMA17, которые смогли на ebay найти. Там же купили подшипники и оптические концевики.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото
Все остальное отечественное, родное. Оригинальная идея с направляющими, сделали их из длинных хромированных ручек для мебели, они как раз диаметром 12 мм под подшипники, длиной они продаются до метра, и прочности вполне хватает. В торцах ручек просверлили отверстия и метчиком нарезали резьбу. Это позволило просто болтом надежно соединить направляющие с несущим конструктивом. Для оси Z так вообще ручку прикрепили к пластине конструктива целиком, Вал продается в любом строительном магазине как шпилька с резьбой любого диаметра. Мы использовали на 8 мм. Соответственно и гайки 8 мм. Гайку с подшипником и несущим конструктивом оси Y соединили с помощью соединительной скобы. Скобы купили в специализированном магазине для витрин. Видели наверно такие хромированные конструкции в магазинах стоят на которых галстуки или рубашки висят, вот там используются такие скобы для соединения хромированных трубок. Двигатель соединили с валом муфтой, которую сделали из куска стального прута диаметром 14мм, просверлив по центру отверстие и пару отверстий сбоку, для зажимания винтами. Можно не заморачиваться и купить готовые на ebay по запросу cnc coupling их куча выпадает. Несущий конструктив нам вырубили на гильотине за 1000 р. Сборка всего этого заняло не много времени и получили на выходе вот такой станок, на фото еще не установлены концевики, контроллер и не установлен двигатель фрезы.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Точность получилась просто изумительная, во-первых шаговый двигатель шагает 1/16 шага, во-вторых вал с мелкой резьбой. Когда в станок вставили ручку вместо фрезы, он нарисовал сложную фигуру, потом еще несколько раз обвел эту фигуру, а на рисунке видно как будто он один раз рисовал, под лупой рассматривали пытались другую линию найти. Жесткость станка тоже хорошая. Шатается только в пошипниках в допустимых пределах их собственого допуска и посадки. Немного шатается еще по оси Y, ну здесь я думаю конструктив оси Z надо доработать.

Фото получилось не качественное, на заднем плане стекло отражает. Не знаю какой я конструктор станка, но фотограф я просто никакой. Вот чуть получше.

Фрезерный станок с ЧПУ своими руками: чертежи, видео, фото

Теперь об управляющей программе. Не помню почему, но мы решили сделать свою программу, которая готовый G-код с компьютера передает в контроллер. Может просто не нашли подходящий.

Программа написана на Microsoft Visual C , использовалась библиотеки:

Module: SERIALPORT.H
Purpose: Declaration for an MFC wrapper class for serial ports
Copyright 1999 by PJ Naughter. All rights reserved.
Программа еще сырая, ну в двух словах используем

port.Open(8, 9600, CSerialPort::NoParity, 8, CSerialPort::OneStopBit, CSerialPort::XonXoffFlowControl);
для открытия порта
port.Write(text, l); - запись в порт
port.Read(sRxBuf, LEN_BUF); - чтение порта.

Использовался еще стандартный компонент msflexgrid таблица, в которую в реальном времени заносится выполняемый в настоящий момент G-код. Т.е. эта программа просто открывает готовый G-код и маленькими порциями запихивает его в контроллер.

Исходный код управляющей программы можно посмотреть здесь github.com/konstantin1970/cnc.git
Для понимания добавлю еще, что стандартный windows hyperterminal или putty делает то-же самое, запихивает данные в контроллер.
Сам G-код можно сделать в любой CAD/CAM системе например, мне понравился ARTCAM.

В планах у нас сделать более мощный станок на двигателях NEMA 23, но для этого нужно придумать, из чего делать более мощные направляющие. В прошивке контроллера добавить возможность изменять скорость вращения шпинделя. Особенно интересно нам установить камеру и сделать что-то подобное системе технического зрения, что бы станок сам определял размеры заготовки, вычислял начальную координату заготовки по всем осям в программе минимум. В программе максимум, чтобы с помощью камеры станок контролировал все этапы своей работы, возможно даже принимал решения изменить программу. Ну, например, увидел он, что шероховатость больше допустимого, взял и послал фрезу по второму кругу все отшлифовать с более высокой скоростью.

Надеюсь, сможем и в дальнейшем делиться своими разработками с вами уважаемые хаброчитатели.

Электронная начинка оборудования

Управлять вашим станком с ЧПУ, сделанным своими руками, будет программное обеспечение, а его необходимо правильно подобрать. Выбирая такое обеспечение (его можно написать и самостоятельно), важно обращать внимание на то, чтобы оно было работоспособным и позволяло станку реализовывать все свои функциональные возможности. Такое ПО должно содержать драйверы для контроллеров, которые будут установлены на ваш фрезерный мини-станок.

В самодельном станке с ЧПУ обязательным является порт LPT, через который электронная система управления и подключается к станку. Очень важно, чтобы такое подключение осуществлялось через установленные шаговые электродвигатели.

Выбирая электронные комплектующие для своего станка, сделанного своими руками, важно обращать внимание на их качество, так как именно от этого будет зависеть точность технологических операций, которые на нем будут выполняться. После установки и подключения всех электронных компонентов системы ЧПУ нужно выполнить загрузку необходимого программного обеспечения и драйверов.

Все вышеописанные действия и перечисленные комплектующие подходят для изготовления своими руками фрезерного станка не только координатно-расточной группы, но и ряда других типов. На таком оборудовании можно выполнять обработку деталей со сложной конфигурацией, так как рабочий орган станка может перемещаться в трех плоскостях: 3d.

Ваше желание своими руками собрать такой станок, управляемый системой ЧПУ, должно быть подкреплено наличием определенных навыков и подробных чертежей. Очень желательно также посмотреть ряд тематических обучающих видео, некоторые из которых представлены в данной статье.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 4,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Войти