Делаем лазерный гравер на основе Arduino

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

Лазерный гравер на Arduino – приспособление, роль которого – гравировка древесины и других материалов. За последние 5 лет лазерные диоды продвинулись вперед, что позволило сделать достаточно мощные граверы без особой сложности управления лазерными трубами.

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

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

1. Основы сборки гравера на Aрдуино

Для начала предлагаю посмотреть того как выглядел весь процесс создания гравера у одного радиолюбителя:

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

Ниже приведены некоторые сведения о выбранных компонентах:

  1. Шаговый двигатель – 2 штуки.
  2. Размер кадра – NEMA 23.
  3. Крутящий момент 1.8 Нм на 255 унций.
  4. 200 шагов/оборотов – за 1 шаг 1,8 градусов.
  5. Ток – до 3,0 А.
  6. Вес – 1,05 кг.
  7. Биполярное 4-проводное соединение.
  8. Шаговый драйвер – 2 штуки.
  9. Цифровой степпинг-драйв.
  10. Микросхема.
  11. Выходной ток – от 0,5 А до 5,6 А.
  12. Ограничитель выходного тока – снижает риск перегрева двигателей.
  13. Сигналы управления: входы Step и Direction.
  14. Частота импульсного входа – до 200 кГц.
  15. Напряжение питания – 20 В – 50 В постоянного тока.

Для каждой оси двигатель непосредственно управляет шариковым винтом через соединитель мотора. Двигатели монтируются на раме с использованием двух алюминиевых углов и алюминиевой пластины. Алюминиевые углы и плита имеют толщину 3 мм и достаточно прочны, чтобы поддерживать двигатель (1 кг) без изгибов.

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

Еще один процесс создания данного устройства можно посмотреть на видео:

2. Материалы и инструменты

Ниже представлена таблица с материалами и инструментами, необходимыми для проекта «лазерный гравер на Aрдуино».

Пункт Поставщик Количество
Шаговый двигатель NEMA 23 + драйвер eBay (продавец: primopal_motor) 2
Диаметр 16 мм, шаг 5 мм, шариковый винт длиной 400 мм (тайваньский) eBay (продавец: silvers-123) 2
16-мм ая поддержка BK12 с шариковым винтом (приводной конец) eBay (продавец: silvers-123) 2
16 мм BF12 Поддержка шарикового винта (без ведомого конца) eBay (продавец: silvers-123) 2
16 вал длиной 500 мм (продавец: silvers-123) 4
(SK16) 16 опоры вала (SK16) (продавец: silvers-123) 8
16 линейный подшипник (SC16LUU) eBay (продавец: silvers-123) 4
eBay (продавец: silvers-123) 2
Держатель вала 12 мм (SK12) (продавец: silvers-123) 2
A4-размер 4,5 мм прозрачный акриловый лист eBay (продавец: acrylicsonline) 4
Алюминиевая Плоская штанга  100 мм x 300 мм x 3 мм eBay (продавец: willymetals) 3
50 мм x 50 мм 2.1 м Алюминиевый забор Любой тематический магазин 3
Алюминиевая Плоская штанга Любой тематический магазин 1
Алюминиевый угол Любой тематический магазин 1
Алюминиевый угол 25 мм x 25 мм x 1 м x 1,4 мм Любой тематический магазин 1
Винты с головной головкой M5 (различные длины) boltsnutsscrewsonline.com
M5 гайки boltsnutsscrewsonline.com
M5 шайбы boltsnutsscrewsonline.com

3. Разработка основания и осей

Машина использует шариковые винты и линейные подшипники для управления положением и движением осей X и Y.

Характеристики шариковых винтов и аксессуаров машины:

  • 16 мм шариковый винт, длина – 400 мм-462 мм, включая обработанные концы;
  • шаг – 5 мм;
  • C7 рейтинг точности;
  • BK12/BF12 шариковые опоры.

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

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

4. Электронная составляющая

Выбранный лазерный диод – это диод мощностью 1,5 Вт, 445 нм, установленный в корпусе размером 12 мм, с фокусируемым стеклянным объективом. Такие могут быть найдены, предварительно собраны, на eBay. Так как это лазер 445 нм, свет, который он производит, является видимым синим светом.

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

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

Еще один вариант схемы соединения микроконтроллера и электронных деталей:

5. Программное обеспечение

Эскиз Arduino интерпретирует каждый блок команд. Существует несколько команд:

1 – переместите ПРАВО на один пиксель FAST (пустой пиксель).

2 – переместите ПРАВО на один пиксель SLOW (сгоревший пиксель).

3 – переместите ЛЕВЫЙ на один пиксель FAST (пустой пиксель).

4 – переместите LEFT на один пиксель SLOW (сгоревший пиксель).

5 – перемещение вверх на один пиксель FAST (пустой пиксель).

6 – переместите UP на один пиксель SLOW (сгоревший пиксель).

7 – переместите ВНИЗ одним пикселем FAST (пустой пиксель).

8 – переместите ВНИЗ одним пикселем SLOW (сгоревший пиксель).

9 – включить лазер.

0 – выключить лазер.

r – вернуть оси в исходное положение.

С каждым символом Arduino запускает соответствующую функцию для записи на выходные выводы.

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

Скетч 3-х программ для лазерного Arduino-гравера ниже:

/* Stepper motor control program */
// constants won't change. Used here to set pin numbers:
const int ledPin =  13;      // the number of the LED pin

const int OFF = 0;
const int ON = 1;

const int XmotorDIR = 5;
const int XmotorPULSE = 2;

const int YmotorDIR = 6;
const int YmotorPULSE = 3;

//half step delay for blank pixels - multiply by 8 (<8ms)
const unsigned int shortdelay = 936;

//half step delay for burnt pixels - multiply by 8 (<18ms)
const unsigned int longdelay = 2125;      

//Scale factor
//Motor driver uses 200 steps per revolution
//Ballscrew pitch is 5mm. 200 steps/5mm, 1 step = 0.025mm
//const int scalefactor = 4;        //full step
const int scalefactor = 8;          //half step

const int LASER = 51;

// Variables that will change:
int ledState = LOW;             // ledState used to set the LED
int counter = 0;
int a = 0;
int initialmode = 0;
int lasermode = 0;

long xpositioncount = 0;
long ypositioncount = 0;

//***********************************************************************************************************
//Initialisation Function
//***********************************************************************************************************

void setup()
{
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  pinMode(LASER, OUTPUT);
  
  for (a = 2; a <8; a++){
    pinMode(a, OUTPUT);
  }
  
  a = 0;
  
  
  setinitialmode();
  digitalWrite (ledPin, ON);
  delay(2000);
  digitalWrite (ledPin, OFF);
  
  // Turn the Serial Protocol ON
  Serial.begin(9600);
}

//************************************************************************************************************
//Main loop
//************************************************************************************************************

void loop()
{
  byte byteRead;
  
  if (Serial.available()) {
  
    /* read the most recent byte */
    byteRead = Serial.read();
    //You have to subtract '0' from the read Byte to convert from text to a number.
    if (byteRead!='r'){
      byteRead=byteRead-'0';
    }
    
    //Move motors
    if(byteRead==1){
      //Move right FAST
      fastright();         
    }
    if(byteRead==2){
      //Move right SLOW
      slowright();
    }
    if(byteRead==3){
      //Move left FAST
      fastleft();         
    }
    if(byteRead==4){
      //Move left SLOW
      slowleft();         
    }
    if(byteRead==5){
      //Move up FAST
      fastup();
    }
    if(byteRead==6){
      //Move up SLOW
      slowup();
    }
    if(byteRead==7){
      //Move down FAST
      fastdown();
    }
    if(byteRead==8){
      //Move down SLOW
      slowdown();
    }
    if(byteRead==9){
      digitalWrite (LASER, ON);
    }
    if(byteRead==0){
      digitalWrite (LASER, OFF);
    }
    if (byteRead=='r'){
      //reset position
      xresetposition();
      yresetposition();
      delay(1000);
    }
  }
   
}

//************************************************************************************************************
//Set initial mode
//************************************************************************************************************

void setinitialmode()
{
  if (initialmode == 0){
    digitalWrite (XmotorDIR, OFF);
    digitalWrite (XmotorPULSE, OFF);

    digitalWrite (YmotorDIR, OFF);
    digitalWrite (YmotorPULSE, OFF);

    digitalWrite (ledPin, OFF);
    initialmode = 1;
  }
}

//************************************************************************************************************
// Main Motor functions
//************************************************************************************************************

void fastright()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (XmotorDIR, ON);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, OFF);
    delayMicroseconds(shortdelay);
    digitalWrite (ledPin, OFF);
  }
  xpositioncount++;
}

void slowright()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (XmotorDIR, ON);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, OFF);
    delayMicroseconds(longdelay);
    digitalWrite (ledPin, OFF);
  }
  xpositioncount++;
}

void fastleft()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (XmotorDIR, OFF);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, OFF);
    delayMicroseconds(shortdelay);
    digitalWrite (ledPin, OFF);
  }
  xpositioncount--;
}

void slowleft()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (XmotorDIR, OFF);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);
    digitalWrite (XmotorPULSE, OFF);
    delayMicroseconds(longdelay);
    digitalWrite (ledPin, OFF);
  }
  xpositioncount--;
}

void fastup()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (YmotorDIR, ON);
    delayMicroseconds(15);
    digitalWrite (YmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);    
    digitalWrite (YmotorPULSE, OFF);
    delayMicroseconds (shortdelay);
    digitalWrite (ledPin, OFF);
  }
  ypositioncount++;
}

void slowup()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (YmotorDIR, ON);
    delayMicroseconds(15);
    digitalWrite (YmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);    
    digitalWrite (YmotorPULSE, OFF);
    delayMicroseconds (longdelay);
    digitalWrite (ledPin, OFF);
  }
  ypositioncount++;
}

void fastdown()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (YmotorDIR, OFF);
    delayMicroseconds(15);
    digitalWrite (YmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);
    digitalWrite (YmotorPULSE, OFF);
    delayMicroseconds (shortdelay);
    digitalWrite (ledPin, OFF);
  }
  ypositioncount--;
}

void slowdown()
{
  for (a=0; a<scalefactor; a++)
  {
    digitalWrite (YmotorDIR, OFF);
    delayMicroseconds(15);
    digitalWrite (YmotorPULSE, ON);
    digitalWrite (ledPin, ON);
    delayMicroseconds(15);
    digitalWrite (YmotorPULSE, OFF);
    delayMicroseconds (longdelay);
    digitalWrite (ledPin, OFF);
  }
  ypositioncount--;
}

void xresetposition()
{
  while (xpositioncount!=0){
    if (xpositioncount > 0){
      fastleft();
    }
    if (xpositioncount < 0){
      fastright();
    }
  }
}

void yresetposition()
{
  while (ypositioncount!=0){
    if (ypositioncount > 0){
      fastdown();
    }
    if (ypositioncount < 0){
      fastup();
    }
  }
}

6. Запуск и настройка

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

7. Проверка работоспособности

Эта схема требует, по меньшей мере, питания 10 В постоянного тока, и имеет простой входной сигнал включения/выключения, который предоставляется Arduino. Микросхема LM317T представляет собой линейный регулятор напряжения, который настроен, как регулятор тока. В схему включен потенциометр, позволяющий регулировать регулируемый ток.

Ардуино+