Как в скетче добавить еще шаги для рамдомного вращения двигателя?

maestro1969
Offline
Зарегистрирован: 26.12.2017

Здравствуйте уважаемые форумчане! Сразу скажу, что я не программист, а "технарь". Сейчас переделываю дискотечный световой прибор типа "лунный цветок" на шаговые двигатели. Появилась необходимость в скетче для двух шаговых двигателей с рамдомным вращением. Собрал скетч для двух двигателей 28BYJ-48 с регулировкой скорости каждого по отдельности. Все работает, скорость у двигателей разная, а вот шаги одинаковые. Нужно чтобы кол-во шагов тоже было разное. Как теперь добавить еще шагов? Например, чтобы двигатель прокрутился на 180 градусов вперед, потом на 90 назад, потом на 360 вперед, на 360 назад и т.д. Вот скетч:

#include <AccelStepper.h>
#define HALFSTEP 8
 
// motor pins
#define motorPin1  3     // IN1 on the ULN2003 driver 1
#define motorPin2  4     // IN2 on the ULN2003 driver 1
#define motorPin3  5     // IN3 on the ULN2003 driver 1
#define motorPin4  6     // IN4 on the ULN2003 driver 1
 
#define motorPin5  8     // IN1 on the ULN2003 driver 2
#define motorPin6  9     // IN2 on the ULN2003 driver 2
#define motorPin7  10    // IN3 on the ULN2003 driver 2
#define motorPin8  11    // IN4 on the ULN2003 driver 2
 
// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);
 
// variables
int turnSteps = 600; // number of steps for a 90 degree turn
int lineSteps = -900; //number of steps to drive straight
int stepperSpeed1 = 300;
int stepperSpeed2 = 100;//speed of the stepper (steps per second)
int steps1 = 0; // keep track of the step count for motor 1
int steps2 = 0; // keep track of the step count for motor 2
 
boolean turn1 = false; //keep track if we are turning or going straight next
boolean turn2 = false; //keep track if we are turning or going straight next
 
void setup() {
  delay(3000); //sime time to put the robot down after swithing it on
 
  stepper1.setMaxSpeed(2000.0);
  stepper1.move(1);  // I found this necessary
  stepper1.setSpeed(stepperSpeed1);
 
  stepper2.setMaxSpeed(2000.0);
  stepper2.move(1);  // I found this necessary
  stepper2.setSpeed(stepperSpeed2);
 
}
void loop() {
 
  if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps;
    }
 
    else {
      target = lineSteps;
    }
 
    stepper1.move(target);
    stepper1.setSpeed(stepperSpeed1);
    turn1 = !turn1;
  }
 
  if (steps2 == 0) {
    int target = 0;
    if (turn2 == true) {
      target = turnSteps;
    }
 
    else {
      target = lineSteps;
    }
 
    stepper2.move(target);
    stepper2.setSpeed(stepperSpeed2);
    turn2 = !turn2;
  }
 
  steps1 = stepper1.distanceToGo();
  steps2 = stepper2.distanceToGo();
 
  stepper1.runSpeedToPosition();
  stepper2.runSpeedToPosition();
}
Заранее спасибо!

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
maestro1969
Offline
Зарегистрирован: 26.12.2017
#include <AccelStepper.h>
#define HALFSTEP 8

// motor pins
#define motorPin1  3     // IN1 on the ULN2003 driver 1
#define motorPin2  4     // IN2 on the ULN2003 driver 1
#define motorPin3  5     // IN3 on the ULN2003 driver 1
#define motorPin4  6     // IN4 on the ULN2003 driver 1

#define motorPin5  8     // IN1 on the ULN2003 driver 2
#define motorPin6  9     // IN2 on the ULN2003 driver 2
#define motorPin7  10    // IN3 on the ULN2003 driver 2
#define motorPin8  11    // IN4 on the ULN2003 driver 2

// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

// variables
int turnSteps = 600; // number of steps for a 90 degree turn
int lineSteps = -900; //number of steps to drive straight
int stepperSpeed1 = 300;
int stepperSpeed2 = 100;//speed of the stepper (steps per second)
int steps1 = 0; // keep track of the step count for motor 1
int steps2 = 0; // keep track of the step count for motor 2

boolean turn1 = false; //keep track if we are turning or going straight next
boolean turn2 = false; //keep track if we are turning or going straight next

void setup() {
  delay(3000); //sime time to put the robot down after swithing it on

  stepper1.setMaxSpeed(2000.0);
  stepper1.move(1);  // I found this necessary
  stepper1.setSpeed(stepperSpeed1);

  stepper2.setMaxSpeed(2000.0);
  stepper2.move(1);  // I found this necessary
  stepper2.setSpeed(stepperSpeed2);

}
void loop() {

  if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps;
    }

    else {
      target = lineSteps;
    }

    stepper1.move(target);
    stepper1.setSpeed(stepperSpeed1);
    turn1 = !turn1;
  }

  if (steps2 == 0) {
    int target = 0;
    if (turn2 == true) {
      target = turnSteps;
    }

    else {
      target = lineSteps;
    }

    stepper2.move(target);
    stepper2.setSpeed(stepperSpeed2);
    turn2 = !turn2;
  }

  steps1 = stepper1.distanceToGo();
  steps2 = stepper2.distanceToGo();

  stepper1.runSpeedToPosition();
  stepper2.runSpeedToPosition();
}

 

maestro1969
Offline
Зарегистрирован: 26.12.2017

Спасибо что ткнули носом!! Так?

maestro1969
Offline
Зарегистрирован: 26.12.2017

Смотрите, добавляю еще шаги

turnSteps1 = 600;
int turnSteps2 = 300;
int turnSteps3 = 900; 
int lineSteps1 = -900;
int lineSteps2 = -300;
int lineSteps3 = -600; 

потом в void loop делаю вот так для первого двигателя:

 

if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps1;
    }

    else {
      target = lineSteps1;
    }
     if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps2;
    }

    else {
      target = lineSteps2;
    }
     if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps3;
    }

    else {
      target = lineSteps3;
    }

    stepper1.move(target);
    stepper1.setSpeed(stepperSpeed1);
    turn1 = !turn1;
  } 

и... выдает ошибку:

Arduino: 1.8.5 (Windows 7), Плата:"Arduino/Genuino Uno"
 
C:\Users\User\Documents\Arduino\2_motors\2_motors.ino: In function 'void loop()':
 
2_motors:101: error: expected '}' at end of input
 
 }
 
 ^
 
2_motors:101: error: expected '}' at end of input
 
exit status 1
expected '}' at end of input
 
Ребят, что я не так делаю?
 

 

maestro1969
Offline
Зарегистрирован: 26.12.2017

Вот полный переделаный скетч:

#include <AccelStepper.h>
#define HALFSTEP 8

// motor pins
#define motorPin1  3     // IN1 on the ULN2003 driver 1
#define motorPin2  4     // IN2 on the ULN2003 driver 1
#define motorPin3  5     // IN3 on the ULN2003 driver 1
#define motorPin4  6     // IN4 on the ULN2003 driver 1

#define motorPin5  8     // IN1 on the ULN2003 driver 2
#define motorPin6  9     // IN2 on the ULN2003 driver 2
#define motorPin7  10    // IN3 on the ULN2003 driver 2
#define motorPin8  11    // IN4 on the ULN2003 driver 2

// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

// variables
int turnSteps1 = 600;
int turnSteps2 = 300;
int turnSteps3 = 900; 
int lineSteps1 = -900;
int lineSteps2 = -300;
int lineSteps3 = -600; 
int stepperSpeed1 = 300;
int stepperSpeed2 = 100;//speed of the stepper (steps per second)
int steps1 = 0; // keep track of the step count for motor 1
int steps2 = 0; // keep track of the step count for motor 2

boolean turn1 = false; //keep track if we are turning or going straight next
boolean turn2 = false; //keep track if we are turning or going straight next

void setup() {
  delay(3000); //sime time to put the robot down after swithing it on

  stepper1.setMaxSpeed(2000.0);
  stepper1.move(1);  // I found this necessary
  stepper1.setSpeed(stepperSpeed1);

  stepper2.setMaxSpeed(2000.0);
  stepper2.move(1);  // I found this necessary
  stepper2.setSpeed(stepperSpeed2);

}
void loop() {

  if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps1;
    }

    else {
      target = lineSteps1;
    }
     if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps2;
    }

    else {
      target = lineSteps2;
    }
     if (steps1 == 0) {
    int target = 0;
    if (turn1 == true) {
      target = turnSteps3;
    }

    else {
      target = lineSteps3;
    }

    stepper1.move(target);
    stepper1.setSpeed(stepperSpeed1);
    turn1 = !turn1;
  }

  if (steps2 == 0) {
    int target = 0;
    if (turn2 == true) {
      target = turnSteps1;
    }

    else {
      target = lineSteps1;
    }

    stepper2.move(target);
    stepper2.setSpeed(stepperSpeed2);
    turn2 = !turn2;
  }

  steps1 = stepper1.distanceToGo();
  steps2 = stepper2.distanceToGo();

  stepper1.runSpeedToPosition();
  stepper2.runSpeedToPosition();
}

 

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Написано же закрывающих скобок не хватает - }. Даже двух, по-видимому.

А уж где они у Вас должны быть - Вам виднее! Проверяйте свои if-ы.

maestro1969
Offline
Зарегистрирован: 26.12.2017

Знать бы еще где... Я вижу, что не хватает скобок на "выходе". На выходе чего? Буду пробовать "методом научного тыка". Спасибо! Перепроверю if-ы

arduinec
Offline
Зарегистрирован: 01.09.2015

maestro1969 пишет:

Знать бы еще где... Я вижу, что не хватает скобок на "выходе". На выходе чего? Буду пробовать "методом научного тыка". Спасибо! Перепроверю if-ы

В Arduino IDE парные скобки подсвечиваются.

maestro1969
Offline
Зарегистрирован: 26.12.2017

Когда в arduino IDE выдает ошибку, то розовым подсвечивает самую последнюю строку со скобкой №101. И что в ней не так? Там же закрытая скобка...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

не понимаю, неужели в IDE трудно нажать Ctr-T ?

а то в ней не так, что у вас не хватает ДВУХ ! закрывающих скобок.

sadman41
Offline
Зарегистрирован: 19.10.2016

Похое, что все else без предваряющих скобок.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

да он строки 57 и 66 впихнул, а закрывать эти условия не впихнул.

Ваще код какой то адский.

sadman41
Offline
Зарегистрирован: 19.10.2016

Накликаете сейчас беду - придет квон и тогда код действительно будет адский ))

maestro1969
Offline
Зарегистрирован: 26.12.2017

После нажатия Ctr-T выдает:  "Для автоформатирования не нужны изменения".

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

все ! надо клапу звать )))

maestro1969
Offline
Зарегистрирован: 26.12.2017

Вы не поверите, но я всего неделю назад впервые в глаза увидел ардуино уно, и код этот от робомашинки, и поэтому прошу помощи. Я могу собрать усилитель мощности класса А-В на пару киловатт, это не проблема, а вот с программированием проблема, поэтому я здесь. Можете конечно постебаться, но что такое квон, я действительно не знаю, и как закрывать эти условия, я тоже не знаю. Посмотрите пост №2, этот код у меня работает. Да, я просто добавлял строки, и спрашивал, правильно ли я делаю... Но в ответ много букв и стебания, а помощи 0. Ну  и за много букАв тож спасибо!

sadman41
Offline
Зарегистрирован: 19.10.2016

А если я усилитель мощности буду умощнять припаивая параллельно одним черненьким деталькам другие черненькие - это каково будет с вашей точки зрения?

Удвойте в строках 56 и 65 фигурные скобки. Все скомпилируется. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

 

 

не так не надо !!!

все равно вы не поймете и так и будете пальцем в небо !

уберите все из фунции loop, решите чего вы хотите от моторов

ознакомтесь ВНИМАТЕЛЬНО с этим

/*
http://www.airspayce.com/mikem/arduino/AccelStepper/
Basic Usage
You can create multiple AccelStepper objects, giving a unique name to each motor. AccelStepper can manage any number of motors, as long as you repetitively call their "run" functions.

////Defining & Configuring Motors
AccelStepper mystepper(DRIVER, step, direction);              // Шаговый двигатель, управляемый выделенной платой.
AccelStepper mystepper(FULL2WIRE, pinA, pinB);                // Биполярный шаговый двигатель, управляемый Н-мостом.
AccelStepper mystepper(FULL4WIRE, pinA1, pinA2, pinB1, pinB2);// Униполярный двигатель, управляемый четырмя транзисторами.
mystepper.setMaxSpeed(stepsPerSecond);            // Установка максимальной скорости (оборотов в минуту). Скорость по умолчанию очень низкая, так что её требуется переопределить. При движении шаговый двигатель будет ускоряться до этой максимальной скорости и замедляться при подходе к концу движения.
mystepper.setAcceleration(stepsPerSecondSquared); // Установка ускорения, в шагах в секунду за секунду.

////Position Based Control
mystepper.isRunning();                            // Возвращает true, если ШД в режиме вращения.
mystepper.currentPosition();                      // Возвращает текущее абсолютное положение (в шагах).
mystepper.setCurrentPosition (long position);     // Установить счетчик как текущую позицию. Полезно как задание нулевой координаты. Обнуляет текущую скорость до нуля.
mystepper.targetPosition();                       // Конечное положение (в шагах).
mystepper.distanceToGo();                         // Вернуть расстояние до указанного положения. Может использоваться для проверки: достиг ли двигатель указанной конечной точки.
mystepper.moveTo(long absolute);                  // Переместиться в абсолютно указанное положение. Само движение запускается функцией run().
mystepper.move(long relative);                    // Переместиться в относительно указанное положение. Само движение запускается функцией run(). Значение distance может быть больше или меньше нуля.
mystepper.run();                                  // Начать движение с ускорением. Один шаг. Для продолжения движения следует вызывать функцию повторно как можно чаще - в loop() или иной функции.
mystepper.runToPosition();                        // Начать движение и подождать когда двигатель достигнет указанной точки. БЛОКИРУЮЩАЯ ФУНКЦИЯ - функция не прерывается, пока двигатель не остановится!
mystepper.runToNewPosition();                     // Начать движение с ускорением, до заданной позиции. БЛОКИРУЮЩАЯ ФУНКЦИЯ!
mystepper.stop();                                 // Максимально быстрая остановка (без замедления), используя текущие параметры скорости и ускорения. Также задает новое конечное положение.

////Speed Based Control
mystepper.setSpeed(stepsPerSecond);               // Установить скорость (в шагах за секунду). Само движение запускается функцией runSpeed().
mystepper.runSpeed();                             // Начать движение с текущей заданной скоростью (без плавного ускорения). Для продолжения движения двигателя следует вызывать функцию повторно как можно чаще.
mystepper.runSpeedToPosition();                   // Начать движение с текущей заданной скоростью (без плавного ускорения), до заданной позиции. БЛОКИРУЮЩАЯ ФУНКЦИЯ!

////Power Control
mystepper.disableOutputs();                       // Деактивировать занятые пины и установить их в LOW. Снимает напряжение с обмоток двигателя, экономя энергию (вал при это может проворачиваться под внешними нагрузками)
mystepper.enableOutputs();                        // Активировать зарезервированные пины и устанавивает их в режим OUTPUT. Вызывается автоматически при запуске движения.
*/

что то попробуйте, не получится возвращайтесь с конкретными вопросами, а не с вопросоми туда или не туда я чего то вставил.

я думаю на первое время вам хватит одной функции - mystepper.runToPosition(); 

 

maestro1969
Offline
Зарегистрирован: 26.12.2017

sadman41 пишет:

А если я усилитель мощности буду умощнять припаивая параллельно одним черненьким деталькам другие черненькие - это каково будет с вашей точки зрения?

Удвойте в строках 56 и 65 фигурные скобки. Все скомпилируется. 

Так... это обЪяснение мне "ближе к телу". Вот за это огромное спасибо!!! Ребят, я понимаю что здесь свои законы (в программировании), но "я не волшебник, я только учусь"... Ща буду пробовать

maestro1969
Offline
Зарегистрирован: 26.12.2017

xDriver, огромное спасибо! Хорошее "пособие" начинающему. 

Что то у меня не получается "цитировать"... выдает ошибку:

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, zzziii@mail.ru and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Я вроде не косячил...