Правильность кода для управления шаговиком в режиме микрошага 1/16

Нет ответов
FreeWindusis
Offline
Зарегистрирован: 04.02.2016

Здравствуйте. Появился вопрос о правильности написания кода по управлению шаговым двигателем с использованием микрошага, а именно при подаче с компьютера команда foward или back получать поворот на 1 микрошаг в ту или другую сторону. Из техничесокй части, имеется Arduino UNO + драйвер A4988+шаговый двигатель по типу Nema 17 с поворотом за один шаг на 1,8 градуса и CNC шилд для удобства подключения. Просьба посмотреть код на правильность написания. Пусть не удивляет такое большое колличестов портов в дальнейшем код будет модернизироваться для управления по тому же принципу ещё 2 двигателями. Микрошаг устанавливается путем замыкания контактов на шилде.

01 // Инициализация портов на ардуино (Xs,Ys,Zs выходы для регулировки шага; Xd,Yd,Zd выходы для регулировки направления; En выход для включения двигателей)
02 int Xs = 2;
03 int Ys = 3;
04 int Zs = 4;
05 int Xd = 5;
06 int Yd = 6;
07 int Zd = 7;
08 int En = 8;
09 int inSize=0; // Переменная которая будет содержать размер буфера
10 int delayTime = 20; // Выдержка для регулировки скорости вращения
11 char str[128]; // Массив символов
12 void setup() {
13   // Настраиваем нужные контакты на выход
14   pinMode(Xs, OUTPUT);
15   pinMode(Xd, OUTPUT);
16   pinMode(En, OUTPUT);
17   Serial.begin(9600); // Открываем порт со скоростью передачи в 9600 бод(бит/с)
18 }
19 void foward()
20
21   digitalWrite(Xd, HIGH); // Задаём направление вращения по часовой стрелке
22     // Делаем 1 шаг
23   for (int i = 0; i < 1; ++i) {
24     // Выполнение шага
25     digitalWrite(Xs, HIGH);
26     delay(delayTime);
27     digitalWrite(Xs, LOW);
28     delay(delayTime);
29   }
30  
31 }
32 void back()
33 {
34   digitalWrite(Xd, LOW); // Задаём направление вращения против часовой стрелки
35     // Делаем 1 шаг
36   for (int i = 0; i < 1; ++i) {
37     // Выполнение шага
38     digitalWrite(Xs, HIGH);
39     delay(delayTime);
40     digitalWrite(Xs, LOW);
41     delay(delayTime);
42   }
43 }
44 void loop()
45 {    
46   digitalWrite(En, HIGH); // Подаём питание на двигатель
47      inSize=0; // Сбрасываем переменную
48 memset(str, '\0', 128); // Очищаем массив
49  if(Serial.available() > 0)
50  {
51    delay(200); // Ждем, для того, чтобы пришли все данные
52    inSize = Serial.available(); // Получаем длину строки и записываем ее в переменную
53    for (int a = 0; a < inSize; a++)
54    {
55      str[a] = Serial.read(); // Читаем каждый символ, и пишем его в массив
56    }
57   
58    // Сравнять массив со строкой
59    if (strcmp(str, "foward") == 0) // Если было передано "foward" - вращаем вперед
60    {
61      Serial.println("roll foward"); // Отправляем сообщение компьютеру
62      foward();
63   }
64   else if (strcmp(str, "back") == 0) // Если было передано "back" - вращаем назад
65   {
66      Serial.println("roll back");
67      back();
68   }
69     else
70   {
71      Serial.println("Error command!");
72   }
73  }
74 }