Личный опыт
Когда я впервые начал разрабатывать, продумывать и делать первый ЧПУ фрезер своими руками, на создание проекта ушел примерно один день. Затем, когда начал покупать части, я провел небольшое исследование. И нашел кое-какие сведения в различных источниках и форумах, что привело к появлению новых вопросов:
- Мне действительно нужны шарико-винтовые пары, или обычные шпильки и гайки будут работать вполне нормально?
- Какой линейный подшипник лучше, и могу ли я его себе позволить?
- Двигатель с какими параметрами мне нужен, и лучше использовать шаговик или сервопривод?
- Деформируется ли материал корпуса слишком сильно при большом размере станка?
- И т.п.
К счастью, на некоторые из вопросов я смог ответить благодаря своей инженерно-технической базе, оставшейся после учебы. Тем не менее, многие из проблем, с которыми я бы столкнулся, не могли быть рассчитаны. Мне просто нужен был кто-то с практическим опытом и информацией по этому вопросу.
Конечно, я получил много ответов на свои вопросы от разных людей, многие из которых противоречили друг другу. Тогда мне пришлось продолжить исследования, чтобы выяснить, какие ответы стоящие, а какие – мусор.
Каждый раз, когда у меня возникал вопрос, ответ на который я не знал, мне приходилось повторять тот же процесс. По большему счету это связано с тем, что у меня был ограниченный бюджет и хотелось взять лучшее из того, что можно купить за мои деньги. Такая же ситуация у многих людей, создающих самодельный фрезерный станок с ЧПУ.
Максимум внимания – станине
Необходимая жесткость станку обеспечивается за счёт станины. На нее устанавливают подвижной портал, систему рельсовых направляющих, ШД, рабочую поверхность, ось Z и шпиндель.
К примеру, один из создателей самодельного станка ЧПУ, несущую раму сделал из алюминиевого профиля Maytec – две детали (сечение 40х80 мм) и две торцевые пластины толщиной 10 мм из этого же материала, соединив элементы алюминиевыми уголками. Конструкция усилена, внутри рамы сделано рамку из профилей меньших размеров в форме квадрата.
Станина монтируется без использования соединений сварного типа (сварным швам плохо удаётся переносить вибронагрузки). В качестве крепления лучше использовать Т-образные гайки. На торцевых пластинах предусмотрена установка блока подшипников для установки ходового винта. Понадобится подшипник скольжения и шпиндельный подшипник.
Основной задачей сделанному своими руками станку с ЧПУ умелец определил изготовление деталей из алюминия. Поскольку ему подходили заготовки с максимальной толщиной 60 мм, он сделал просвет портала 125 мм (это расстояние от верхней поперечной балки до рабочей поверхности).
Монтируем электронную начинку станка
Чтобы сделать своими руками ЧПУ станок и управлять ним, надо оперировать правильно подобранным числовым программным управлением, качественными печатными платами и электронными комплектующими (особенно если они китайские), что позволит на станке с ЧПУ реализовать все функциональные возможности, обрабатывая деталь сложной конфигурации.
Для того, чтобы не было проблем в управлении, у самодельных станков с ЧПУ, среди узлов, есть обязательные:
- шаговые двигатели, некоторые остановились напримере Nema;
- порт LPT, через который блок управления ЧПУ можно подключить к станку;
- драйверы для контроллеров, их устанавливают на фрезерный мини-станок, подключая в соответствии со схемой;
- платы коммутации (контроллеры);
- блок электропитания на 36В с понижающим трансформатором, преобразующем в 5В для питания управляющей цепи;
- ноутбук или ПК;
- кнопка, отвечающая за аварийную остановку.
Только после этого станки с ЧПУ проходят проверку (при этом умелец сделает его пробный запуск, загрузив все программы), выявляются и устраняются имеющиеся недостатки.
Предисловие от автора
Уже в 12 лет я мечтал построить машину, которая будет способна создавать различные вещи. Машину, которая даст мне возможность изготовить любой предмет домашнего обихода. Спустя два года я наткнулся на словосочетание ЧПУ или если говорить точнее, то на фразу «Фрезерный станок с ЧПУ». После того как я узнал, что есть люди способные сделать такой станок самостоятельно для своих нужд, в своем собственном гараже, я понял, что тоже смогу это сделать. Я должен это сделать! В течение трех месяцев я пытался собрать подходящие детали, но не сдвинулся с места. Поэтому моя одержимость постепенно угасла.
В августе 2022 идея построить фрезерный станок с ЧПУ вновь захватила меня. Я только что окончил бакалавриат университета промышленного дизайна, так что я был вполне уверен в своих возможностях. Теперь я четко понимал разницу между мной сегодняшним и мной пятилетней давности. Я научился работать с металлом, освоил техники работы на ручных металлообрабатывающих станках, но самое главное я научился применять инструменты для разработки. Я надеюсь, что эта инструкция вдохновит вас на создание своего станка с ЧПУ!
Работы подготовительного этапа
Чтобы сделать самодельный ЧПУ для фрезерования, есть два варианта:
- Берёте готовый ходовой набор деталей (специально подобранные узлы), из которого собираем оборудование самостоятельно.
- Найти (изготовить) все комплектующие и приступить к сборке ЧПУ станка своими руками, который бы отвечал всем требованиям.
Важно определиться с предназначением, размерами и дизайном (как обойтись без рисунка самодельного станка ЧПУ), подыскать схемы для его изготовления, приобрести или изготовить некоторые детали, которые для этого нужны, обзавестись ходовыми винтами.
Есть различные примеры выбора варианта. Зачастую выполняют станок из МДФ, многие используют фанеру для изготовления самого рабочего стола, других деталей, также для направляющих можно купить трубу нержавеющую.
Возможна схема фрезерного станка с ЧПУ, в котором взяли, как основу, старый сверлильный станок, и рабочую головку со сверлом заменили на фрезерную.
А для этого нужно сконструировать механизм (в его конструкции есть подшипник), отвечающий за то, чтобы инструмент перемещался в трех плоскостях (по осях). Обычно его собирают на базе кареток принтера. Когда выполнена сборка по такой принципиальной схеме, останется подключить к устройству программное управление.
Но на таком самодельном станке, вследствие недостаточной жесткости кареток, будет возможность освоить производство печатных плат, выполнять обработку только пластиковых заготовок, древесины и тонкого листового металла. Для ЧПУ станка и полноценных фрезерных операций на нем, нужен мощный двигатель и хорошая электроника. И, в частности, печатная плата.
Если принято решение создать станок ЧПУ своими руками и обойтись без готовых наборов узлов и механизмов, крепёжных деталей, нужна та схема, собранный по которой станок будет работать.
Обычно, найдя принципиальную схему устройства, сначала моделируют все детали станка, готовят технические чертежи, а потом по ним на токарном и фрезерном станках (иногда надо использовать и сверлильный) изготовляют комплектующие из фанеры или алюминия. Чаще всего, рабочие поверхности (называют еще рабочим столом) – фанерные с толщиной 18 мм.
Самодельный чпу по металлу
Можно приобрести КФПЭ-250, счертить его, ( я ради прикола только модель тв-4 в кнопасе перечерчивал у меня ушел почти месяца 1.5 времени, на создание человеческих чертежей ( с базами, допусками, формы, биений, шероховатостей твердостью, ушло бы еще месяца 3 ).
Если реально собрались делать, то покупка фрезера того же КФПЭ — 250 или даже 67к25 для анализа составит, дай б-г если 5% от стоимости затеи. эти 5 % — примерно соответствуют 200 000 р. если заморочиться то можно довести его до работающего состояния за цену от 180 и выше.
Кстати готовый чпу стоит примерно от 2 лимона новый и от 1 500 бу. в работоспособном состоянии.
Расклад такой что привода, двигатели и стойку. вы скорее всего делать не станете, ибо это обойдется значительно дороже. привода сервы примерно 70 -80 за ось,
привод шпинделя пусть 5.5 квт от 30, если серва то от 120 р
стойка приличная от 40 шеньжень, с более приличными итерполяциями от 120 и до 700 вообще блатная.
шкаф — и мелочи по электрике примерно 50 — 70.
шпиндель под автосмену, плюс рабобан — от 400 тыр
шпиндельный узел тоже прийдется купить, подшипник в условияг гаража/сарая не сделать впринципе. отшлифовать кольцы гильзу и сам шпиндель нужны станки и/или доступ к ним,
Чертёж обойдется заказать просто счертить — примерно в 250 т р. если самому, то это долго.
Просто чертёж не сильно поможет, он делается под технологию( доступность инструмента и обороудования и исполнимость грубо говоря можно начертить такую вещь которую сделать практически нереально например бесшовный шар, с глухими расточками внутри и соточныви допусками и сварка недопустима или не возможна ) ( как старый анекдот про то что один дурак может такой вопрос задать что и трое великих мудрецов не смогут ответить).
Чугун реально отлить на заказ, но отливка это настолко мизерная часть создания станка, что хорошо если аналог КФПЭ вам обойдется в миллинов 5-6. как минимум. и года полтора. два, и получится он с n-ной попытки.
роутер — это не станок а так баловство.
Ради прикола, была тема про тот же лентопил, попытался было я его начертить, и так и не осилил, на него надо очень много времени. там много ньюансов, как оказалось, я выбрал идею сварной станины, заказывал резку, и пытался варить, всё хорошо пока варить не начал, поводки такие, что тикай так что там нужна технологя сварки ( порядок, кондуктор, отжиг ).
Изменено 18.05.2022 11:02 пользователем Tuntik
§
§
любезный, у вас хоть один патент есть?
У меня их нет, ибо это оправдано ( экономически) только при наличии связей ( там где надо) , собственного производства, и действительно полезной модели, идеи. и свободных денег.
У меня ничего из этого нет даже идеи, соответственно, нет практического смысла в имении патента на изобретение/полезную модель.
плазморез и фрезер , который я купил и проапгрейдил под свои нужды. Хочу еще токарный. Но пока думаю что проще — купить готовый или собирать самому.
Плазморез, создать реально, на сборку из китайских комплектующих, при наличии доступа к лазеру, сварке, болгарке реально за полгода по вечерам ( в зависимости от размера). Еще быстрее приобрести, у по городу это добро продают и покупают новые и бу, купить можно за неделю а то и быстрее, я самолично два раза встречал неубитые плазмогазорезы, тупо порезанные кислородом, и сданные в лом. с нимал с них остатки реек, даже две головы Z лежат и ждут своего часа.
всё дело в требованиях к точности а у плазмы оно /- миллиметр.
Не видел ваш фрезер ( но почти уверен что этот фрезер — роутер по для порезки пласмаски бумаги максимум люминия ну шкарябания по стали), я могу ошибаться но скорее всего нет, ну о требования к точности дай б-г если в десятку попадёте по повторяемости.
Фрезер начинается от 700 кг для заготовки 200*200*300 и это не тумба а собственно фрезер.
у меня лично не много денег, поэтому изобретать я бы не стал, а приобрел бы структуру от например 2с150пмф4 ( и это прошу заметить не фрезер а сверлильно расточной ( весит примерно 7 тонн) и вот это почти фрезер ( для деликатных режимов ) а не драть как глухонемой. ибо стол там не рассчитан на такое.
Но конкретно этот станок я переделывал со старой стойки на новую, с заменой практически всего(привода электрика стойка энкодеры ( чего стоит вывод сигнала шпинделя, ибо там был резольвер внутри коробки, в масле) а при нарезании резьбы этот энкодер ой как нужен) итого шпиндель 11 квт серва и по 3 квт на оси *3 штуки в шпинделе исо 40.)
заняло практически полтора месяца .
Себе бы такой приобрёл или махо 600.
ну или посеръезнее 67 группы. с швп.
§
Не знаю где сейчас есть предприятия полного цикла, для массового выпуска, станин, и прочих частей.
где от шихты, до станка в ящике. наверное не в нашей стране, китайцы льют, вот много чего приобретено за последние пять лет, всё практически с иероглифами на отлиивке. ДМТГ.
А практически дело в технологии. все техники искуственного старения, не заменяются старением естественным, а это минимум по хорошему лет пять, от шихты до отливки, перед началом финишной мехобработки. и то её корёжит при больших съёмах.
Поэтому чугун мало отлить, его надо отпесочить, просмотреть ультразвуком, рентгеном и дальше либо на копёр и на следующий цикл, или на предварительную обработку и на старение. и покурить. несколько лет.
всё остальное как и сварные станки, это так себе станки. хотя выглядят почти как настоящие.
Вагранка не годится, для такого чугуна, ибо там гомно а не чугун. с неё заготовки для изложниц, противовесы, и контргрузы лить. станочный чугун должен быть более предсказуемого химсостава, а это и легирование, и раскисление.
Значит остаётся индукционная плавка с ваккуматором, и/или под аргоном, и то пузырь, или трещины бывают.
Изменено 24.05.2022 15:22 пользователем Tuntik
Сборка некоторых важных узлов станка
В станке, который вы начали собирать собственноручно, надо предусмотреть ряд ответственных узлов, обеспечивающих вертикальное перемещение рабочего инструмента. В этом перечне:
- винтовая передача – вращение передаётся, используя зубчатый ремень. Он хорош тем, что не проскальзывают на шкивах, равномерно передавая усилия на вал фрезерного оборудования;
- если используют шаговый двигатель (ШД) для мини-станка, желательно брать каретку от более габаритной модели принтера – помощнее; старые матричные печатные устройства имели достаточно мощные электродвигатели;
- для трёхкоординатного устройства, понадобится три ШД. Хорошо, если в каждом найдётся 5 проводов управления, функционал мини-станка возрастёт. Стоит оценить величину параметров: напряжения питания, сопротивления обмотки и угла поворота ШД за один шаг. Для подключения каждого ШД нужен отдельный контроллер;
- с помощью винтов, вращательное движение от ШД преобразуется в линейное. Для достижения высокой точности, многие считают нужным иметь шарико-винтовые пары (ШВП), но это комплектующая не из дешевых. Подбирая для монтажа блоков набор гаек и крепежных винтов, выбирают их со вставками из пластика, это уменьшает трение и исключает люфты;
- вместо двигателя шагового типа, можно взять обычный электромотор, после небольшой доработки;
- вертикальная ось, которая обеспечивает перемещение инструмента в 3D, охвачивая весь координатный стол. Её изготовляют из алюминиевой плиты. Важно, чтобы размеры оси были подогнаны к габаритам устройства. При наличии муфельной печи, ось можно отлить по размерам чертежей.
Ниже – чертёж, сделанный в трёх проекциях: вид сбоку, сзади, и сверху.
Создание станка с чпу из доступных деталей с минимум слесарной работы
Продолжаем обзор деятельности нашего
Хакспейс-клуба
.
Мы давно мечтали купить в наш клуб ЧПУ станок. Но решили его сделать сами. С нуля, начиная от железа и кончая программного обеспечение (прошивка контроллера и управляющая программа). И у нас это получилось.
Детали для станка старались выбирать из доступных в свободной продаже, многие из которых даже не требуют дополнительной слесарной обработки.
Контроллер мы выбрали 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);
}
}
Завершается конечный автомат конструкцией 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, но для этого нужно придумать, из чего делать более мощные направляющие. В прошивке контроллера добавить возможность изменять скорость вращения шпинделя. Особенно интересно нам установить камеру и сделать что-то подобное системе технического зрения, что бы станок сам определял размеры заготовки, вычислял начальную координату заготовки по всем осям в программе минимум. В программе максимум, чтобы с помощью камеры станок контролировал все этапы своей работы, возможно даже принимал решения изменить программу. Ну, например, увидел он, что шероховатость больше допустимого, взял и послал фрезу по второму кругу все отшлифовать с более высокой скоростью.
Надеюсь, сможем и в дальнейшем делиться своими разработками с вами уважаемые хаброчитатели.
Этот непростой процесс монтажа
Собрать самодельные ЧПУ станки, после подготовки комплектующих, лучше строго по чертежу, чтобы они работали. Процесс сборки, применяя ходовые винты, стоит выполнять в такой последовательности:
- знающий умелец начинает с крепления на корпусе первых двух ШД – за вертикальной осью оборудования. Один отвечает за горизонтальное перемещение фрезерной головки (рельсовые направляющие), а второй за перемещение в вертикальной плоскости;
- подвижной портал, перемещающийся по оси X, несет фрезерный шпиндель и суппорт (ось z). Чем выше будет портал, тем большую заготовку удастся обработать. Но у высокого портала, в процессе обработки, – снижается устойчивость к возникающим нагрузкам;
- для крепления ШД оси Z, линейных направляющих используют переднюю, заднюю, верхнюю, среднюю и нижнюю пластины. Там же сделайте ложемент фрезерного шпинделя;
- привод собирают из тщательно подобранных гайки и шпильки. Чтобы зафиксировать вал электродвигателя и присоединить к шпильке, используют резиновую обмотку толстого электрокабеля. В качестве фиксатора могут быть винты, вставленные в нейлоновую втулку.
Затем начинается сборка остальных узлов и агрегатов самоделки.
Вместо заключения
Как видите, сделать ЧПУ, которое не уступит китайским моделям, – реально. Сделав комплект запчастей с нужным размером, имея качественные подшипники и достаточно крепежа для сборки, эта задача – под силу тем, кто заинтересован в программной технике. Примера долго искать не придётся.
На фото внизу – некоторые образцы станков, имеющих числовое управление, которые сделаны такими же умельцами, не профессионалами. Ни одна деталь не делалась поспешно, произвольным размером, а подходящая к блоку с большой точностью, с тщательным выверением осей, применением качественных ходовых винтов и с надёжными подшипниками. Верно утверждение: как соберешь, так и работать будешь.
На ЧПУ выполняется обработка дюралевой заготовки. Таким станком, который собрал умелец, можно выполнить много фрезерных работ.
Еще один образец собранного станка, где плиту ДВП используют как рабочий стол, на котором возможно изготовление печатной платы.
Каждый, кто начнет делать первое устройство, скоро перейдет и к другим станкам. Возможно, захочет испытать себя в качестве сборщика сверлильного агрегата и, незаметно, пополнит армию умельцев, собравших немало самодельных устройств. Занятия техническим творчеством сделают жизнь людей интересной, разнообразной и насыщенной.