Лазерный гравер, не могу понять код

blood0073
Offline
Зарегистрирован: 21.03.2018

Доброго времени суток. Хочу собрать лазерный гравер на ардуино и нашел код, не могу в нём разобраться.

Я так понимаю функции moveForward и moveBackward отвечает за вращения мотора, вперед, назад. Создается массив?

Ещё мне не понятна функция moveSM, я так понимаю она отвечает, где должна остановиться каретка с лазером x- это координата х y - это координата y, а z - это лазер работает, не работает.

Может кто-то имел опыт с такой работой?

Объясните пожалуйста принцип работы.

 

 

int motorPins[3][2] = {{8,9},{10,11},{12, 13}};   
int count;                         //подключение первого мотора                
int count2[3] = {0,0,0};           //пин STEP на пин ардуины D8             
int delayTime = 150;               //пин DIR на пин ардуины D9
int val = 0;
int rot=0;                          //подключение второго мотора   
int incomingByte = 0;               //пин STEP на пин ардуины D10
int sign=1;                         //пин DIR на пин ардуины D11
int s_p=40;                                 
void setup() {                      //Лазер подключается на пин D2
int i;
Serial.begin(57600);  //Эта скорость должна совпадать со скоростью в программе
pinMode(2, OUTPUT);
for (i=0; i<3; i++) {
 for (count = 0; count < 2; count++) {
  pinMode(motorPins[i][count], OUTPUT);}} //установка режима работы цифровых pin'ов Ардуино
 delayTime=150;}                         //задержка между шагами по умолчанию
void moveForward(int sm) { //процедура с параметром sm установить напржение на [1] и [2], а за тем убрать напряжение с [2]
digitalWrite(motorPins[sm][1], HIGH); //подаёт напряжение на цифровой вход pin [1] = HEIGH
digitalWrite(motorPins[sm][0], HIGH);
digitalWrite(motorPins[sm][0], LOW);} //отключает напряжение цифровой вход pin [0] = LOW
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);}
void MoveSM(long x, long y, long z) { 
 long c[3], c2[3];
 double c1[3], d[3];
 long m, i;
 boolean flg;
 long ms;
 long d1, d2, d3, d4, t, dt;
 c[0] = x;
 c[1] = y;
 c[2] = z;
 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;}
 t=m;
 if (z>0 && t>0) {
  if (z>=delayTime) {
   dt=z; d1=s_p; d2=1;
   d3=0;
   if (d1==d2) d4=z/2; else d4=z;       
  } else {
   dt=delayTime;
   d3=dt*s_p*(dt-z)/dt/2;
   d2=d3/dt;
   d1=s_p-d2;
   d3=d3-d2*dt;
   d2=d2+1;
   if (d1==d2) d4=dt/2-d3; else d4=dt-d3;}
 } else {
  dt=delayTime;
  d1=-1; d2=-1; d3=0; d4=0;}
 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 if (c[i]<0) {
    c2[i]--;
    moveBackward(i);}}
   if (abs(c1[i]) < abs(c[i])) flg=true;}
  if (z>0) {
   if (t==d1) {
    delayMicros(d3);
    digitalWrite(2, HIGH);
    delayMicros(d4);}
   if (t==d2) {
    delayMicros(d4);
    digitalWrite(2, LOW);
    delayMicros(d3);}
   if (t!=d1 && t!=d2) {
    delayMicros(dt);}
  } else {
   delayMicros(dt);}
  t--;}}
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 (c[i]==0) {
  if (incomingByte=='-')
   sign=-1;}
  if (incomingByte==',') {
  c[i]*=sign; // умножаем c[i] на sign
  sign=1;
  i++;
  } else if (incomingByte>='0' && incomingByte<='9') { есди incomingByte больше 0 и меньше 9
  c[i]=c[i]*10+incomingByte-'0';}
  while (Serial.available() == 0) { если данные кончились то ниже задержка
  delayMicroseconds(1);}
  incomingByte = Serial.read();}
 c[i]*=sign; 
 if (c[3]>0) s_p=c[3]; //количество шагов на 1 пиксель
 if (c[4]>0) delayTime=c[4];  //количество шагов на 1 пиксель
 MoveSM(c[0],c[1],c[2]); //Вращаем двигатели на заданное число шагов
 Serial.println("OK");} /Отправляем компьютеру сообщение "OK", значит можно высылать новую команду
else
 delayMicroseconds(1); } 

 

svm
Offline
Зарегистрирован: 06.11.2016

Похоже это на сколько и куда сместится каретка и когда включать лазер, прочитав данные с ПК. А что Вас не устраивает? Программа работает или нет? Чем она управляется. И похоже использует нестандартный G код. Чем он формируется?

Скетч дает только представление как ардуинка управляет движками и лазером. А где все остальное?

blood0073
Offline
Зарегистрирован: 21.03.2018

Я хочу понять как работает данный скетч, есть программа, Arduino ЧПУ, там выберается изображение. Видимо все остальное делает она.

svm
Offline
Зарегистрирован: 06.11.2016

Запустите и попробуйте. Если устроит, то пользуйтесь. Но судя по коду программа заточена под конкретную механику т.к. никаких настроек под произвольные системы линейного перемещения с первого взгляда не видно.

Неплохая разработка с исходным кодом есть здесь: https://vk.com/club103426776 правда тоже не без недостатков, но работает.

blood0073
Offline
Зарегистрирован: 21.03.2018

Спасибо, а что за функция moveSM, что она выполняет?

svm
Offline
Зарегистрирован: 06.11.2016

blood0073 пишет:

Я хочу понять как работает данный скетч, есть программа, Arduino ЧПУ, там выберается изображение. Видимо все остальное делает она.

Все как раз и делается в программе Ардуино ЧПУ, а этот скетч только движки крутит и лазер включает. Без структуры управляющей программы (типа G кода) и описания программы Arduino ЧПУ, разобраться довольно муторно, хотя програмка достаточно простая. Лучше выложите ссылку на страничку проекта, дело пойдет веселее, может кто и заинтересуется.

svm
Offline
Зарегистрирован: 06.11.2016

blood0073 пишет:

Спасибо, а что за функция moveSM, что она выполняет?

Просто перемещает каретку на нужное расстояние и направление, а так-же включает лазер по данным полученным от ПК по КОМ порту.