Самодельный станок с ЧПУ - Своими руками
Своими руками

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

>

Самодельный станок с ЧПУКак построить 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
Самодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУВсе готово.
Самодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУСамодельный станок с ЧПУ

SitesReady

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

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.