Изделия своими руками

Самодельный станок с ЧПУ

Самодельный станок с ЧПУСамодельный станок с ЧПУКак построить 3-осевой станок с ЧПУ в домашних условиях? Об этом нам расскажет мастер-самодельщик с ником Tuenhidiy. Многие детали в этой сборки используются повторно. Например, 2 старых серводвигателя постоянного тока и 2 деревянных ящика для вина.
Давайте посмотрим небольшое видео.

Инструменты и материалы:
-Деревянный ящик 350 x 400 x 80 x 8 мм. (Ш x Д x В x Т);
-Деревянный ящик 220 x 340 x 100 x 10 мм. (Ш x Д x В x Т);
-Arduino Uno R3;-Arduino Mega 2560;-Arduino CNC Shield V3 GRBL;-Драйвер шагового двигателя A4988;-Arduino L293D Motor Shield;-Сервомотор постоянного тока NF5475E 2 -шт;
-Привод CD / DVD-ROM;
-Опора шагового двигателя 50 мм – 2 шт;-GT2 6 мм ремень 200 мм – 2 шт;-GT2 Шкив 60 зубьев – 2шт;-Стержень 8 мм, длина 400 мм – 4 шт;-2 ходовых винта T8, шаг 2 мм, шаг 8 мм, длина 400 мм;-Алюминиевая муфта с гибким валом, размер внутреннего отверстия: 10 мм x 10 мм;-Горизонтальный кронштейн для шарикоподшипника – 12 шт;-Вертикальный кронштейн для шарикоподшипника – 4 шт;-Подшипники F608ZZ 8 x 22 x 7 мм – 2 шт;-Макетная плата;-Блок питания 12 В 10 А;-Блок питания 5В 5A;
-Разъем постоянного тока;
-Ленточный кабель;-Акрил 5 мм;
-Доска для рисования;
-Резьбовые вставки;-Неодимовые магниты 16 шт;-Кабельные стяжки;-Крепеж;-Сверлильный станок;-Паяльные принадлежности;
Шаг первый: схема проекта
Схему проекта можно скачать здесь. Для ЧПУ мастер использует 2 сервомотора постоянного тока для осей X, Y и 1 шагового двигателя для оси Z.
На схеме есть 3 группы:
Группа 1 – красная: включает Arduino Uno с предустановленной прошивкой GRBL и CNC Shield. Arduino Uno отвечает за отправку управляющих сигналов: Шаг / Направление на драйвер серводвигателя постоянного тока X, Y и драйвер шагового двигателя Z.
Группа 2 – синяя: включает Arduino Mega 2560 и L293D Motor Shield, которые работают как драйвер серводвигателя постоянного тока. Они получают команды STEP / DIR от Arduino Uno и выполняет ПИД-регулирование для осей X и Y.
Группа 3 – коричневая: включает серводвигатель постоянного тока X, Y.
Самодельный станок с ЧПУШаг второй: серводвигатель постоянного тока
Параметры основного серводвигателя постоянного тока NF5475E отмечены красным прямоугольником на фото.
Самодельный станок с ЧПУДля питания мастер использовал источник питания 12 В постоянного тока, потому что это напряжение совместимо с L293D Motor Shield. Если использовать источник питания 24 В постоянного тока, модуль управления двигателем должен иметь более высокий уровень напряжения, например L298N.
Энкодер должен получать питание от 5 В постоянного тока, и он имеет два канала A, B. Разрешение энкодера 200 200 импульсов на оборот. Т.е. энкодер будет генерировать 200 импульсов, когда двигатель совершит один оборот.
Самодельный станок с ЧПУШаг третий: сборка станкаПостроение оси Y
Сначала мастер измерил двигатель, ремни и шкивы. На старом серводвигателе установлен шкив с 20 зубьями. Мастер заменил его на шкив с 60 зубьями + зубчатый ремень 200 мм для привода ходового винта.
Самодельный станок с ЧПУВ ящике просверлил отверстия. Установил опорные подшипники. Установил ходовой винт и стержни.
Самодельный станок с ЧПУМонтаж рабочей поверхности по оси Y
В качестве рабочей поверхности мастер использовал ламинированную доску.
Самодельный станок с ЧПУЧтобы зажать медную гайку ходового винта, он использовал опору шагового двигателя L и 2 акриловые пластины, как на картинке ниже. Диаметр отверстия L-образной опоры и медной гайки совмещены.
Самодельный станок с ЧПУЗатем платформу нужно закрепить на опорных подшипниках + ходовой винт.
Самодельный станок с ЧПУСамодельный станок с ЧПУПостроение оси X
Маленькая коробка использовалась для того, чтобы построить структуру оси X. Как и ось Y, он использовал дополнительный шкив с 60 зубьями и зубчатый ремень 200 мм для привода ходового винта.
Самодельный станок с ЧПУСерводвигатель оси X спрятан внутри коробки. Один акриловый лист размером 100 x 230 мм был установлен на оси X, а позже на нем будет установлен CD-привод для оси Z.
Самодельный станок с ЧПУМедная гайка ходового винта зажимается между опорой двигателя L-образной формы и двумя небольшими акриловыми листами, как и ось Y. Дальше собирает две оси вместе.
Самодельный станок с ЧПУСамодельный станок с ЧПУПостроение ось Z
Для оси Z мастер использовал CD-привод. Ручка / карандаш зажимается алюминиевой муфтой.
Самодельный станок с ЧПУДалее раму укрепил шпильками. Установил рабочий стол.
Самодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУШаг четвертый: монтаж платы управления Arduino Mega Adapter Shield.
Дальше нужно вырезать плату 60 x 90 мм и смонтировать все детали. Adapter Shield используется для подключения Arduino Mega 2560 к L293D Motor Shield, энкодерам серводвигателей постоянного тока следующим образом:
Верхний разъем: подключение к L293D Motor Shield.
Нижний разъем: подключение к Arduino Mega 2560.
4 контакта – верхние штекерные разъемы: подключение к сервомотору X Encoders (5 В, GND, канал A, канал B).
4 контакта – верхние штекерные разъемы: подключение к сервомотору Y Encoders (5 В, GND, канал A, канал B).
2 контакта – верхний штекерный разъем: подключение к сигналам X.STEP и X.DIR.
2 контакта – верхний штекерный разъем: подключение к сигналам Y.STEP и Y.DIR.
Самодельный станок с ЧПУРаспиновка разъема энкодера на серводвигателе NF5475E, должна быть такой, как показано ниже.
Самодельный станок с ЧПУСборка платы управления
Затем собирает детали в следующем порядке:
Ардуино Мега 2560.
Плата
L293D
Arduino Uno
Плата расширения
Самодельный станок с ЧПУУстанавливает плату управления и блоки питания (5 и 12 В постоянного тока) внутри маленькой коробки.
Устанавливает выключатель.
Самодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУШаг пятый: программирование
Код Arduino Mega 2560 можно скачать ниже.

/*     In this project, DC servo motors can be simulated as same as stepper motors and they can be controlled via GRBL firmware for CNC application.  */    // Timer2 library  #include "FlexiTimer2.h"    // PID library  #include <PID_v1.h>    // AFMotor library  #include <AFMotor.h>    // Quadrature Encoder Library  #include "Encoder.h"    // Create the motor driver instances  AF_DCMotor motorX(1, MOTOR12_8KHZ);  AF_DCMotor motorY(2, MOTOR12_8KHZ);    // Set up pins for the quadrature encoders - Arduino MEGA2560 has 6 interrupt pins.  #define EncoderX_ChannelA   18  // Interrupt 5  #define EncoderX_ChannelB   22  #define EncoderY_ChannelA   20  // Interrupt 3  #define EncoderY_ChannelB   24    // Set up STEP & DIRECTION pins for X and Y axis  #define STEP_XPIN           19  // Interrupt 4  #define STEP_YPIN           21  // Interrupt 2  #define DIR_XPIN            23  #define DIR_YPIN            25    // Turn on/ off debugging for X/Y servo motor  #define DEBUG_X             0   // For X servo motor  #define DEBUG_Y             0   // For Y servo motor    // For calculating the actual movements  #define STEPSPERMM_X      300.0    // STEP/mm is used in the GRBL firmware for DC servo motor X axis.  #define DEADBW_X          30.0     // Deadband width = 30.0 --> Acceptable error for positioning in mm: 0.10mm.    #define STEPSPERMM_Y      300.0   // STEP/mm is used in the GRBL for DC servo motor Y axis.  #define DEADBW_Y          30.0    // Deadband width = 30.0 --> Acceptable error for positioning in mm: 0.10mm.      // Set up Input  double INPUT_X;  double INPUT_Y;    double OLD_INPUT_X = 0;  double OLD_INPUT_Y = 0;    // Set up Actual value  double ACTUAL_X_MM;  double ACTUAL_Y_MM;    double OLD_ACTUAL_X_MM;  double OLD_ACTUAL_Y_MM;    // PID controller constants  double KP_X = 10.0;     // P for X servo motor  double KI_X = 0.03;     // I for X servo motor  double KD_X = 0.01;     // D for X servo motor    double KP_Y = 10.0;     // P for Y servo motor  double KI_Y = 0.03;     // I for Y servo motor  double KD_Y = 0.01;     // D for Y servo motor    // The Output variable motor speed to the motor driver  double OUTPUT_X;  double OUTPUT_Y;  double OLD_OUTPUT_X = 0;  double OLD_OUTPUT_Y = 0;    // Setpoint  double SETPOINT_X = 0;  double SETPOINT_Y = 0;    double OLD_SETPOINT_X = 0;  double OLD_SETPOINT_Y = 0;    double ERROR_X = 0;  double ERROR_Y = 0;    // Direction  int directionX;  int directionY;    // PID controller  PID myPID_X(&INPUT_X, &OUTPUT_X, &SETPOINT_X, KP_X, KI_X, KD_X, DIRECT);  PID myPID_Y(&INPUT_Y, &OUTPUT_Y, &SETPOINT_Y, KP_Y, KI_Y, KD_Y, DIRECT);    // Setup optical encoders  Encoder XEncoder(EncoderX_ChannelA, EncoderX_ChannelB);  Encoder YEncoder(EncoderY_ChannelA, EncoderY_ChannelB);    void setup()  {    // For debugging    if (DEBUG_X || DEBUG_Y)    {    Serial.begin(115200);    }      pinMode(STEP_XPIN, INPUT);    pinMode(STEP_YPIN, INPUT);    pinMode(DIR_XPIN, INPUT);    pinMode(DIR_YPIN, INPUT);      // The stepper simulator    attachInterrupt(4, doXstep, RISING);  // PIN 19 (Interrupt 4) - Interrupt X step at rising edge pulses    attachInterrupt(2, doYstep, RISING);  // PIN 21 (Interrupt 2) - Interrupt Y step at rising edge pulses      // Outpout PWM limits    myPID_X.SetOutputLimits(-255, 255);    myPID_Y.SetOutputLimits(-255, 255);      // Compute output every 1ms    myPID_X.SetSampleTime(1);    myPID_Y.SetSampleTime(1);      // Setup PID mode    myPID_X.SetMode(AUTOMATIC);    myPID_Y.SetMode(AUTOMATIC);      // Apply PID every 1ms by FlexiTimer2    FlexiTimer2::set(1, 1.0 / 1000, doPID);    FlexiTimer2::start();  }    void loop()  {    // Read X and Y axis servo encoders    INPUT_X = XEncoder.read();    INPUT_Y = YEncoder.read();      // Calculating the error    ERROR_X = (INPUT_X - SETPOINT_X);    ERROR_Y = (INPUT_Y - SETPOINT_Y);      // For debugging    if (DEBUG_X)    {      ACTUAL_X_MM = INPUT_X / STEPSPERMM_X;      // Debugging X motor actual position in mm      if (OLD_ACTUAL_X_MM != ACTUAL_X_MM)      {        Serial.print("ACTUAL X(MM): ");        Serial.println(ACTUAL_X_MM);        OLD_ACTUAL_X_MM = ACTUAL_X_MM;      }      // Debugging position X encoders      if (OLD_INPUT_X != INPUT_X)      {        Serial.print("POSITION X: ");        Serial.println(INPUT_X);        OLD_INPUT_X = INPUT_X;      }      // Debugging X stepping input      if ( SETPOINT_X != OLD_SETPOINT_X )      {        Serial.print("SETPOINT X: ");        Serial.println(SETPOINT_X);        OLD_SETPOINT_X = SETPOINT_X;      }      // Debugging X motor PWM output      if ( OUTPUT_X != OLD_OUTPUT_X )      {        Serial.print("OUTPUT X: ");        Serial.println(OUTPUT_X);        OLD_OUTPUT_X = OUTPUT_X;      }      }    if (DEBUG_Y)    {      ACTUAL_Y_MM = INPUT_Y / STEPSPERMM_Y;      // Debugging Y motor actual position in mm      if (OLD_ACTUAL_Y_MM != ACTUAL_Y_MM)      {        Serial.print("ACTUAL Y(MM): ");        Serial.println(ACTUAL_Y_MM);        OLD_ACTUAL_Y_MM = ACTUAL_Y_MM;      }      // Debugging Y stepping input      if ( SETPOINT_Y != OLD_SETPOINT_Y )      {        Serial.print("SETPOINT Y: ");        Serial.println(SETPOINT_Y);        OLD_SETPOINT_Y = SETPOINT_Y;      }      // Debugging position Y encoders      if (OLD_INPUT_Y != INPUT_Y)      {        Serial.print("POSITION Y: ");        Serial.println(INPUT_Y);        OLD_INPUT_Y = INPUT_Y;      }      // Debugging Y motor PWM output      if ( OUTPUT_Y != OLD_OUTPUT_Y )      {        Serial.print("OUTPUT Y: ");        Serial.println(OUTPUT_Y);        OLD_OUTPUT_Y = OUTPUT_Y;      }      }  }    void doXstep()  {    if ( digitalRead(DIR_XPIN) == HIGH ) SETPOINT_X--;    else SETPOINT_X++;  }    void doYstep()  {    if ( digitalRead(DIR_YPIN) == HIGH ) SETPOINT_Y--;    else SETPOINT_Y++;  }    void doPID()  {    interrupts();    myPID_X.Compute();    myPID_Y.Compute();    if (abs(ERROR_X) < DEADBW_X) // If servo motor X is in position within the deadband width (acceptable error)      {        motorX.setSpeed(0); // Turn off servo motor X      }    else      {        motorX.setSpeed(abs(int(OUTPUT_X)));  // Servo motor X is regulated by PID controller ouput      }    if (abs(ERROR_Y) < DEADBW_Y) // If servo motor Y is in position within the deadband width (acceptable error)      {        motorY.setSpeed(0); // Turn off servo motor Y      }    else      {          motorY.setSpeed(abs(int(OUTPUT_Y)));  // Servo motor Y is regulated by PID controller ouput      }    int directionX;    int directionY;        if(OUTPUT_X > 0)      {        directionX = FORWARD;      }    if(OUTPUT_X < 0)      {        directionX = BACKWARD;      }          if(OUTPUT_Y > 0)      {        directionY = FORWARD;      }    if(OUTPUT_Y < 0)      {        directionY = BACKWARD;      }        motorX.run(directionX);    motorY.run(directionY);  }

Для этого проекта нужно установить следующие библиотеки:
PID Бретта Борегарда (PID_v1)Библиотека Adafruit Motor Shield (AFMotor)Библиотека кодировщикаБиблиотека FlexiTimer2
Шаг шестой: параметры GRBL
Параметры GRBL для ЧПУ следующие

$0	10.000	Step pulse time  $1	25.000	Step idle delay  $2	0.000	Step pulse invert  $3	0.000	Step direction invert  $4	0.000	Invert step enable pin  $5	0.000	Invert limit pins  $6	0.000	Invert probe pin  $10	1.000	Status report options  $11	0.010	Junction deviation  $12	0.002	Arc tolerance  $13	  0.000    Report in inches  $20	  0.000    Soft limits enable  $21	  0.000    Hard limits enable  $22	  0.000    Homing cycle enable  $23	  0.000    Homing direction invert  $24	25.000	Homing locate feed rate  $25	500.000	Homing search seek rate  $26	250.000	Homing switch de-bounce delay  $27	1.000	Homing switch pull-off distance  $30	1000.000	Maximum spindle speed  $31	0.000	Minimum spindle speed  $32	0.000	Laser-mode enable  $100	300.000	X-axis travel resolution  $101	300.000	Y-axis travel resolution  $102	53.333	Z-axis travel resolution  $110	20000.000	X-axis maximum rate  $111	20000.000	Y-axis maximum rate  $112	2000.000	Z-axis maximum rate  $120	20.000	X-axis acceleration  $121	20.000	Y-axis acceleration  $122	10.000	Z-axis acceleration  $130	210.000	X-axis maximum travel  $131	297.000	Y-axis maximum travel  $132	40.000	Z-axis maximum travel

Самодельный станок с ЧПУШаг седьмой: настройка ПИД-регулятора
Оптимальные параметры PID, которые соответствуют значениям настройки GRBL на предыдущем шаге следующие:

// The PID parameters  double KP_X = 10.0;   // P for X servo motor  double KI_X = 0.03;   // I for X servo motor  double KD_X = 0.02;   // D for X servo motor    double KP_Y = 10.0;   // P for Y servo motor  double KI_Y = 0.03;   // I for Y servo motor  double KD_Y = 0.02;   // D for Y servo motor

Он также применил функцию « d eadband » в ПИД-регуляторе. Серводвигатели постоянного тока работают без сбоев. Они не нагреваются и не перегреваются, даже если поддерживается их непрерывная работа в течение многих часов.

#define STEPSPERMM_X      300.0    // STEP/mm ($100) is used in the GRBL firmware for DC servo motor X axis.  #define DEADBW_X          30.0     // Deadband width in pulses = 30.0 --> Acceptable error for positioning in mm: 0.10mm.[url=https://winder.github.io/ugs_website/download/]Универсальная платформа Gcode (UGS)[/url]    #define STEPSPERMM_Y      300.0   // STEP/mm ($101) is used in the GRBL firmware for DC servo motor Y axis.  #define DEADBW_Y          30.0    // Deadband width in pulses = 30.0 --> Acceptable error for positioning in mm: 0.10mm.

Шаг восьмой: тестирование
Теперь можно установить ручку в держатель, поместить лист на рабочем столе и протестировать устройство.
В этом проекте используются следующее ПО и расширения:
Прошивка GRBLУниверсальная платформа Gcode (UGS)Inkscape 1.0 Расширения GcodetoolsAxiDraw Software 2.6.3 от Evil Mad Scientist Laboratories
Самодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУВсе готово.
Самодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУ

Самоделкин

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Your Header Sidebar area is currently empty. Hurry up and add some widgets.