Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧПУ на базе Arduino своими руками http.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.52 Mб
Скачать

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

Прошивка для платы Ардуино написана на языке Processing в среде разработки Arduino 1.0.5 r2 в операционной системе Windows. Эта прошивка работает с 2-хосевым станком с ЧПУ. 3-ю ось отключаем, ибо не хватает контактов. Используются драйверы шаговых двигателей ULN2003 и шаговые двигатели 28BYJ-48-5V или любые подходящие, с 5-ю выводами (для двигателей с 6 выводами, два необходимо замкнуть). Если подключаются более мощные двигатели, то имеет смысл установить радиатор на микросхему ULN2003. Первый и второй драйверы ШД должны быть подключены к 2,3,4,5 и 6,7,8,9 пинам Ардуино соответственно, управляющий вывод лазерного модуля TTL+ к 10 пину Ардуино. Эти параметры задаются первыми двумя строками прошивки. Прошивка может использоваться для лазерной гравировки для обведения орнаментов и силуэтов.

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

int motorPins[2][4] = {{2, 3, 4, 5},{6, 7, 8, 9}}; int laserPin=13; int count; int count2[3] = {0,0,0}; int delayTime; int val = 0; int rot=0; int incomingByte = 0; int sign=1; //Процедура настройки прошивки void setup() { int i; Serial.begin(9600); pinMode(laserPin, OUTPUT); for (i=0; i<2; i++) {  for (count = 0; count < 4; count++) {   pinMode(motorPins[i][count], OUTPUT); //установка режима работы цифровых pin'ов Ардуино  } } delayTime=2; //задержка между шагами 3 мс (2 мс - время реакции ШД на подачу напряжения) } //Поворот двигателя с номерм sm на один шаг вперёд void moveForward(int sm) { if ((count2[sm] == 0) || (count2[sm] == 1)) {  count2[sm] = 16; } count2[sm]>>=1; for (count = 3; count >= 0; count--) {  digitalWrite(motorPins[sm][count], count2[sm]>>count&0x01); } } //Поворот двигателя с номерм sm на один шаг назад void moveBackward(int sm) { if ((count2[sm] == 0) || (count2[sm] == 1)) {  count2[sm] = 16; } count2[sm]>>=1; for (count = 3; count >= 0; count--) {  digitalWrite(motorPins[sm][3 - count], count2[sm]>>count&0x01); } } //Одновременный поворот двигателей 0, 1, 2 на x, y, z шагов соответственно void MoveSM(long x, long y, long z) {  long c[2], c2[2];  double c1[2], d[2];  long m, i;  boolean flg;    c[0] = x;  c[1] = y;    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);     } else {     c2[i]--;     moveBackward(i);     }    }    if (abs(c1[i]) < abs(c[i])) flg=true;   }   delay(delayTime);  }  if (z>0) {   digitalWrite(laserPin, HIGH);  }  if (z<0) {   digitalWrite(laserPin, LOW);  } } //Основной цикл void loop() { if (Serial.available() > 0) { //Пришла команда  long c[3]={0,0,0};  int i;  sign=1;  i=0;  incomingByte = Serial.read();  while (incomingByte!=';') { //Читаем входящую строку, признак конца строки знак "точка с запятой"   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) {   delay(1);   }   incomingByte = Serial.read();  }  c[i]*=sign;  MoveSM(c[0],c[1],c[2]); //Вращаем двигатели на заданное число шагов  Serial.println("OK"); //Отправляем компьютеру сообщение "OK", значит можно высылать новую команду } else  delay(1); //Если ничего не пришло, ждём 1 миллисекнду. }