Добрый день! Помогите разобраться, делаю поворотное устройство на шаговом двигателе ШД57 + редуктор (1/25)
С простыми поворотами и с кручением туда-сюда, все хорошо, но вот не как не могу отладить патрулирование... есть 23 точки, к каждой нужно подъехать остановиться на 2 минуты и поехать к следующей.
Все работает без цикла For, но вот в нем почему-то не отправляются данные на двигатель
вот скетч
С простыми поворотами и с кручением туда-сюда, все хорошо, но вот не как не могу отладить патрулирование... есть 23 точки, к каждой нужно подъехать остановиться на 2 минуты и поехать к следующей.
Все работает без цикла For, но вот в нем почему-то не отправляются данные на двигатель
вот скетч
C++:
/* управление
!lдвижение по часовой стрелке
w - влево на X градусов
e - вправо на X градусов
y - режим патруля
s - остановить y
p - узнать положение в градусах
m -
72000 шагов = полный круг (360*)
200 шагов = 1 градус
*/
#include <GyverStepper.h>
GStepper<STEPPER4WIRE> stepper(1600, 5, 3, 4, 2);
unsigned long last_time;
long mass1[22] = {0, 5, 9, 13, 17, 21, 24, 29, 32, 89, 92, 97, 99, 124, 132, 136, 139, 143, 146, 149, 151, 153}; // массив с координатами
long mass2[22]; // массив с преобразованием координат в шаги
long v; // хранение координаты
int a; // выбор режима
int val; // временно не нужно
char ch; // ввод в консоль
int n1; // для первого таймера
int n2; // для второго таймера
void setup() {
Serial.begin(9600); //
stepper.setRunMode(FOLLOW_POS);
// установка макс. скорости в шагах/сек
stepper.setMaxSpeed(200); // в рабочем режиме вернуть на 50
// установка ускорения в шагах/сек/сек
stepper.setAcceleration(200);
a = 1;
for (int i = 0; i < 21; i++) { //преобразую координаты в шаги
mass2[i] = mass1[i] * 200;
Serial.println(mass2[i]);
}
}
void loop()
{
stepper.tick();
if (a<2) { // работа в ручном режиме
char ch = Serial.read();
if (ch == 'w') // влево на +1 градусов
{
stepper.setTargetDeg(-200, RELATIVE);
}
if (ch == 'e') // вправо на -1 градусов
{
stepper.setTargetDeg(200, RELATIVE);
}
if (ch == 'o') // вернуться в 0
{
stepper.setTargetDeg(0);
}
if (ch == 'p') // узнать положение
{
Serial.println(stepper.getCurrent()/888);
}
if (ch == 'z') a = 3; // переход в режим патруля
}
else {
stepper.tick();
Serial.println (" 1 "); // тут тест входа в Z
v = stepper.getCurrent()/888; // Определение координаты
for (int j = 1; j < 21; j++){ // цикл поворота вправо
stepper.tick();
Serial.println ("2"); // тест входа в for
last_time = millis();
do { // таймер пока что установлен на 5 секунд
if (millis() - last_time > 5000) {
Serial.println("3"); // тест выхода в таймер
n1 = 1;
}
else {
Serial.println("4"); // жду конца таймера
n1 = 0;
}
} while (n1 != 1);
stepper.setTargetDeg(mass2[j]); // даю координаты двигателю (но почему то игнорируется и никуда не едет
Serial.println("5"); // срабатывает
while (mass2[j] != v) { // жду пока мотор повернет до заданного направления
Serial.println("mass2");
Serial.println(mass2[j]);
Serial.println("v");
Serial.println(v);
v = stepper.getCurrent()/888;
v = v*200; // умножаю на 200, что бы число было в формате масс2
}
Serial.println("7");
}
for (int k = 21; k > -1; k = k-1){ //тоже самое в обратную сторону (чутка отличается потому что тестирую, но в любом случае никак не работает
stepper.tick();
last_time = millis();
do {
if (millis() - last_time > 5000) {
n2 = 1;
}
else {
n2 = 0;
}
} while (n2 != 1);
stepper.setTargetDeg( mass2[k]);
do {
v = stepper.getCurrent()/888;
v = v*200;
} while (mass2[k] < v);
}
char ch = Serial.read(); // стоп, выход из цикла с патрулём
if (ch == 's') a = 1;
}
}
Изменено: