Последние публикации

  • Гравировка CO2-лазером герба РФ на стеклянном стаканчике
    Подробнее
  • Гравировка CO2-лазером фотографии на стекле
    Подробнее
  • Интернет-сервис формирования G-кода из BMP, JPG, GIF, PNG
    Подробнее
  • Рисуем в Paint эскиз для резки CO2-лазером
    Читать
  • Определение величины задержки между шагами ШД
    Читать
  • Гравировка CO2-лазером на металле с использованием пасты
    Читать
  • Резка по изображению "от руки", чертежу или растровой картинке
    Читать

Заметки

  • Прошиваем GRBL в Ардуино UNO. Ошибка avrdude: stk500_recv(): programmer is not responding
    Читать
  • Изготовление источника питания для двигателей из старых зарядников.
    Читать
  • Муфта соединения оси шагового двигателя и оси винтовой передачи.
    Читать
  • Каретка винтовой передачи скольжения станка с ЧПУ.
    Читать
  • Подключение драйвера ШД на TB6560 к Ардуино, шаговому двигателю и БП.
    Читать
  • Запуск CO2-лазера при отрицательной температуре
    Читать

Прошивка Ардуино для станка с ЧПУ, драйверы DM420A, двигатели 17HS3404N

Краткое описание

  • Контроллер: Ардуино
  • Драйверы ШД: DM420A, TB6560A, EasyDriver, A4988, драйверы с управлением DIR/PUL (CW/CLK, DIR/STEP)
  • Шаговые двигатели: 17HS3404N, 17HS2408, 42HS40, двигатели в корпусе Nema
  • Назначение: гравировка картин, изображений в градациях серого с помощью ударной головки

Подробное описание

Прошивка для платы Ардуино написана на языке Processing в среде разработки Arduino 1.8.10 в операционной системе Windows.
Эта прошивка предназначена для Arduino (Mega, UNO, Nano) и работает с 2-хосевым станком с ЧПУ. Можно использовать любые драйверы для управления шаговыми двигателями с двухконтактным контролем DIR/PUL (иногда CW/CLK соответственно), например драйверы шаговых двигателей DM420A или драйверы на микросхеме TB6560A. Используются любые подходящие шаговые двигатели, например 17HS3404N, 17HS2408, 42HS40, двигатели в корпусе Nema.
Прошивка может использоваться для гравировки фотографий и картин ударной головкой.

Внимание! Теперь необходимо следить за тем, чтобы скорость передачи данных через COM-порт, установленная в прошивке, совпадала со скоростью, установленной в программе управления дешёвым станком с ЧПУ на Ардуино.

Строка в прошивке, в которой устанавливается скорость: Serial.begin(57600);
При несовпадении скоростей программа будет "залипать", а станок не будет подавать признаков жизни.

Исходный код прошивки Ардуино


int motorPins[3][2] = {{8,9},{10,11},{12, 13}};
int count;
int count2[3] = {0,0,0};
int val = 0;
int rot=0;
int incomingByte = 0;
int sign=1;
long delayTime;

//Процедура настройки прошивки
void setup() {
int i;
Serial.begin(57600); //Эта скорость должна совпадать со скоростью, установленной в программе

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
for (i=0; i<3; i++) {
for (count = 0; count < 2; count++) {
 pinMode(motorPins[i][count], OUTPUT); //установка режима работы цифровых pin'ов Ардуино
}
}
delayTime=2000;
}

//Поворот двигателя с номерм sm на один шаг вперёд
void moveForward(int sm) {
digitalWrite(motorPins[sm][1], HIGH);
digitalWrite(motorPins[sm][0], HIGH);
digitalWrite(motorPins[sm][0], LOW);
}

//Поворот двигателя с номерм sm на один шаг назад
void moveBackward(int sm) {
digitalWrite(motorPins[sm][1], LOW);
digitalWrite(motorPins[sm][0], HIGH);
digitalWrite(motorPins[sm][0], LOW);
}

//Задержка в микосекундах
void delayMicros(long wt){
unsigned long mls;
unsigned int mks;

mls=(unsigned long)(wt / 1000);
mks=(unsigned int)(wt % 1000);
if (mls>0) delay(mls);
if (mks>0) delayMicroseconds(mks);
}

//Одновременный поворот двигателей 0, 1, 2 на x, y, z шагов соответственно
void MoveSM(long x, long y, long z) {
 long c[3], c2[3];
 double c1[3], d[3];
 long m, i;
 boolean flg;
 long cm;

 c[0] = x;
 c[1] = y;
 c[2] = z;

 cm=x/2;

 m = 1;
 for (i=0; i<2; i++) {
  if (m < abs(c[i])) m = abs(c[i]);
 }

 for (i=0; i<2; i++) {
  c1[i] = 0;
  d[i] = 1.0 * c[i] / m;
  c2[i] = 0;
 }

 flg = false;
 for (i=0; i<2; i++) {
  if (abs(c1[i]) < abs(c[i])) flg=true;
 }

 while (flg) {
  flg=false;
  for (i=0; i<2; i++) {
   if (abs(c1[i]) < abs(c[i]))
    c1[i] += d[i];
   if (abs(c1[i]) - abs(c2[i]) >= 0.5) {
    if (c[i]>0) {
     c2[i]++;
     moveForward(i);
     if (i==0 && x!=0 && z>0 && c2[i]==cm) {
      digitalWrite(2, HIGH);
      delayMicros(z);
      digitalWrite(2, LOW);
     }
    } else if (c[i]<0) {
     c2[i]--;
     moveBackward(i);
     if (i==0 && x!=0 && z>0 && c2[i]==cm) {
      digitalWrite(2, HIGH);
      delayMicros(z);
      digitalWrite(2, LOW);
     }     
    }
   }
   if (abs(c1[i]) < abs(c[i])) flg=true;
  }
  delayMicros(delayTime);
 }
}

//Основной цикл
void loop() {
 if (Serial.available() > 0) { //Пришла команда
  long c[5]={0,0,0,0,0};
  int i;

  sign=1;
  i=0;
  incomingByte = Serial.read();
  while (incomingByte!=';') { //Читаем входящую строку, признак конца строки знак "точка с запятой"
   if (incomingByte=='V') Serial.println("P");
   if (c[i]==0) {
    if (incomingByte=='-') sign=-1;
   }
   if (incomingByte==',') {
    c[i]*=sign;
    sign=1;
    i++;
   } else if (incomingByte>='0' && incomingByte<='9') {
    c[i]=c[i]*10+incomingByte-'0';
   }
   while (Serial.available() == 0) {
    delayMicroseconds(1);
   }
   incomingByte = Serial.read();
  }
  c[i]*=sign;
  if (c[4]>0) delayTime=c[4];
  Serial.println("T"); //Отправляем компьютеру сообщение "T", значит можно высылать новую команду
  MoveSM(c[0],c[1],c[2]); //Вращаем двигатели на заданное число шагов
 } else
  delayMicroseconds(1); //Если ничего не пришло, ждём 1 микросекунду
}