Правильность кода для управления шаговиком в режиме микрошага 1/16
- Войдите на сайт для отправки комментариев
Чт, 04/02/2016 - 10:46
Здравствуйте. Появился вопрос о правильности написания кода по управлению шаговым двигателем с использованием микрошага, а именно при подаче с компьютера команда 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 |
} |