Помогите доработать скетч (нахаляву)

Всем привет. С наступившим Новым Годом вас. Мира и счастья вам в Новом Году.
Сразу хочу сказать, что программист я никакой.
Нарыл на просторах инета скетч, для работы ударно гравировального станка. Есть программа установленная на компьютер. Залил скетч в ардуино уно, подключил USB шнурок, запустил программу и все ОК.
Но… Хочется что то автономное. Например считывание с SD карты тех же данных, что идут в порт с компьютера. Вот скетч:

int motorPins[3][2] = {{2, 5}, {3, 6}, {4, 7}};
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(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  for (i = 0; i < 3; i++) {
    for (count = 0; count < 2; count++) {
      pinMode(motorPins[i][count], OUTPUT); //установка режима работы цифровых pin'ов Ардуино
    }
  }
  delayTime = 10; // задержка между шагами
}

//Поворот двигателя с номерм 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(10, HIGH);
            delayMicros(z);
            digitalWrite(10, LOW);
          }

        } else if (c[i] < 0) {
          c2[i]--;
          moveBackward(i);  // Удар при движении влево
          if (i == 0 && x != 0 && z > 0 && c2[i] == cm) {
            digitalWrite(10, HIGH);
            delayMicros(z);
            digitalWrite(10, 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 микросекунду
}
   Нужно переделать под чтение с SD карты. Помогите друзья, пожалуйста.

Скетч брал с сайта: https://ecnc.ru/

очередной пост из разряда “Скетч нахаляву”

1 лайк

Если программист ты “никакой”, то твой удел - повторять готовое. Шаг в сторону - нужны или знания или деньги. Что из этого есть у тебя?

Виталий, чтобы не было обид - ваше “Помогите” пока звучит как “Давайте делайте все за меня, а я смотреть буду”
Чтобы это было и правда помощью - начните что-то делать сами (ну кроме копи-пасты готового кода с чужого сайта). Найдите поиском библиотеку СД-карты, почитайте примеры, соберите схему, попробуйте прочитать карту.
Далее придет время попробовать встроить код примера в код станка.
Если будут вопросы - спрашивайте. Только вопросы про ваш код, а не про чужой.

2 лайка

:slightly_smiling_face: Ну, знаний пока маловато, как в принципе и денег. Хотелось бы услышать мнение профи. Если уж ооочень сложно, то не заморачиваетесь. Буду потихоньку разбираться.

Разбирайся. Я разрешил.

Примерно, через полгода приходи, разобрамшысь.

Ну смотря для кого. Я бы наверно за недельку справился.

Вы, через некоторое время, тоже.

Кстати, не знаю, будет ли это для вас новостью, но код довольно-таки плохо написан, его сначала еще править надо.

И со всеми вы такие приветливые?

Ну, с компа работает неплохо.

Так это не грубость, это правда.

Скажи, у тебя хоть какой-то опыт программирования есть? На любом языке в любой среде?

На qbasic, когда то давно, что то там писал. :grinning:

это только кажется.
Например цикл в строке 123 пишет данные в массив c[5] без проверки числа элементов. Придет 10 параметров в строчке - запишет в массив из пяти ячеек десять значений :slight_smile:

ну если общее понимание логики кода есть… и если будешь сидеть вечерами по несколько часов разбираться - есть шанс что через пару месяцев что-то начнет получаться.

А кто приделывает к названиям тем слово нахаляву? Или это ТСы сами?

в данном случае я

В прошлые разы кто-то другой из тусовки, но тоже явно не ТС

Читал я про SD библиотеку. Просто записать и считать могу. А вот в этот скетч вставить, не хватает мозгов. :grinning:

Да нет, это не я. :grinning:

начни пробовать.
Если будет код, где ты пробовал добавить СД-карту - будет что обсуждать.
А пока говорить не о чем.

это был я :smiling_face: