Всем привет. С наступившим Новым Годом вас. Мира и счастья вам в Новом Году.
Сразу хочу сказать, что программист я никакой.
Нарыл на просторах инета скетч, для работы ударно гравировального станка. Есть программа установленная на компьютер. Залил скетч в ардуино уно, подключил 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/