помогите новичку с управлением шаговиками

Zibn
Offline
Зарегистрирован: 03.01.2018

Господа, простите нуба, но я никак не могу разобраться с одной проблеммкой. Необходимо сделать так, чтобы два шаговика управлялись джойстиком. В наличии ардуинон нано, шилд на три драйвера и собственно джойстик. Уже три дня ковыряюсь никак не могу запустить, может есть у кого готовый скетчик или пару советов, буду премного благодарен. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А у Вас есть "готовый скетчик"? Пусть не совсем правильно работающий? Публикуйте, посмотрим.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это элементарно,Zibn, вам надо не только три дня ковырятся,но и хотя бы один раз написать скетч.

Zibn
Offline
Зарегистрирован: 03.01.2018
int step_pin = 2;  // Pin 9 connected to Steps pin on EasyDriver
int dir_pin = 5;   // Pin 8 connected to Direction pin
int X_pin =A7;    // Pin A0 connected to joystick x axis
int Joy_switch = 12;  // Pin 4 connected to joystick switch
int step_speed = 1;  // Speed of Stepper motor (higher = slower)

void setup() {
   pinMode(dir_pin, OUTPUT);
   pinMode(step_pin, OUTPUT);
   Serial.begin(9600);
   }

void loop() {
  
 int x = (analogRead(X_pin));
 int xm = map (x,0,1023,1,10);
 Serial.println(xm);
  if (xm = 1)
    {
        digitalWrite(dir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(step_pin, HIGH);
        delay(step_speed);
        digitalWrite(step_pin, LOW);
        delay(step_speed);
    }      
     if (1<xm<10)
    {
        digitalWrite(dir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(step_pin, LOW);
        delay(step_speed);
        digitalWrite(step_pin, LOW);
        delay(step_speed);
    }      
    if (xm = 10)
    { 
        digitalWrite(dir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(step_pin, HIGH);
        delay(step_speed);
        digitalWrite(step_pin, LOW);
        delay(step_speed);
    }      
 }

 

Zibn
Offline
Зарегистрирован: 03.01.2018

пробовал так, не работает.

Zibn
Offline
Зарегистрирован: 03.01.2018
#define EN 8 // stepper motor enable, low level effective
#define X_DIR 5 //X axis, stepper motor direction control
#define Y_DIR 6 //y axis, stepper motor direction control
#define Z_DIR 7 //zaxis, stepper motor direction control
#define X_STP 2 //x axis, stepper motor control
#define Y_STP 3 //y axis, stepper motor control
#define Z_STP 4 //z axis, stepper motor control
 int X_pin =A7;
/*
// Function: step -control the direction and number of steps of the stepper motor
// Parameter: dir -direction control, dirPin corresponds to DIR pin, stepperPin
correspomds to
step pin, steps is the number of steps.
// no return value
*/
void step(boolean dir, byte dirPin, byte stepperPin, int steps)
{
 digitalWrite(dirPin, dir);
 delay(0.1);
 for (int i = 0; i < steps; i++) {
 digitalWrite(stepperPin, HIGH);
 delayMicroseconds(0.1);
 digitalWrite(stepperPin, LOW);
 delayMicroseconds(0.1);
 }
}
void setup(){// set the IO pins for the stepper motors as output
 pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);
 //pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);
 //pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT);
 pinMode(EN, OUTPUT);
 digitalWrite(EN, LOW);

Serial.begin(9600);
}
void loop(){
 int x = (analogRead(X_pin));
 int xm = map (x,0,1023,1,10);
 Serial.println(xm);
 if (xm = 1)
    {
 step(false, X_DIR, X_STP, 200); 
 //step(false, Y_DIR, Y_STP, 200); 
 //step(false, Z_DIR, Z_STP, 200);
 delay(0.1);
    }
    if (xm = 10)
    { 
 step(true, X_DIR, X_STP, 200);
// step(true, Y_DIR, Y_STP, 200); 
 //step(true, Z_DIR, Z_STP, 200);
 delay(0.1);
    }
}

 

Zibn
Offline
Зарегистрирован: 03.01.2018

пробовал так, не работает.... всю голову сломал...

Zibn
Offline
Зарегистрирован: 03.01.2018
#include <Stepper.h>
const int stepsPerRevolution = 800;
Stepper myStepper(stepsPerRevolution, 2, 5);  
int X_pin =A7;         
void setup() {
 myStepper.setSpeed(90);
Serial.begin(9600);
int x = (analogRead(X_pin));

}
 
void loop() {
  int x = (analogRead(X_pin));
  int xm = map (x,0,1023,1,10);
  Serial.println(xm);
  if (xm = 1)
    {
   Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(1);
    }
    else  if (1<xm<10)
    {
      myStepper.step(0);
    }
    else  if (xm = 10)
    {
  Serial.println("counterclockwise");

  myStepper.step(-stepsPerRevolution);

  delay(1);
    }
}

 

Zibn
Offline
Зарегистрирован: 03.01.2018

пробовал так - не работает....

не могу понять в чём проблемма, во всех вариантах мотор крутится, но на джойстик не реагирует никак.

 

vvadim
Offline
Зарегистрирован: 23.05.2012

блин , в сети тыщщи примеров с кодами да ещё с видео))))

Zibn
Offline
Зарегистрирован: 03.01.2018

я не нашёл, ссылку в студию

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А "не работает" это как? Можете внятно описать проблему? А от хрустальные шары тут запрещены.

Zibn
Offline
Зарегистрирован: 03.01.2018

"не работает" - это при подаче питания на щилд мотор начинает вращаться по часовой стрелке, при этом никак не реагируя на положение джойстика подключеного к А7

 

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

Zibn пишет:

"не работает" - это при подаче питания на щилд мотор начинает вращаться по часовой стрелке, при этом никак не реагируя на положение джойстика подключеного к А7

Вы, по-моему, вместо того, чтобы за пять минут локализовать проблему, задались целью перепробовать все скетчи из интернета, где упоминается шаговый двигатель. И все подробности из Вас клещами тянуть нужно.

Вот в последнем скетче у Вас есть вывод значений в сериал. Что Вы там видите-то, значения меняются так как Вы ожидаете? Работает ли Ваш джойстик вообще? Какие из Ваших отладочных строк Вы видите?

Если с джойстиком всё хорошо, то разбирайтесь с моторами. Выкинте всё лишнее из скетча. Оставьте только инициализацию и какую-нибудь одну команду - один оборот по часовой, например. Так работает? А против часовой?

Если и джойстик и двигатель по отдельности работают, собирайте всё вместе и остаётся в целом тщательно проверить качество сборки Вашей схемы, особенно если присутствуют макетки и прочие сопли.

Zibn
Offline
Зарегистрирован: 03.01.2018

локализовать проблему за 5 минут мне не удалось, и за 30 мин. и за час тоже. Все элементы проверены отдельно и работают. Качество сборки проверено не единожды, собирал на макете, собирал без него - результат тот-же. В окне мониторинга ком порта отображаются результаты введённые в цикле последовательно: положение джойстика, затем "clockwise", затем "counterclockwise"

 

Zibn
Offline
Зарегистрирован: 03.01.2018
#include <AccelStepper.h>

AccelStepper X (8, 2, 5);

AccelStepper Y (8, 3, 6);

 

int JoistPinX = A6;

int JoistPinY = A7;

int JoistPinK = 12;

void setup() {

X.setMaxSpeed(2000);

Y.setMaxSpeed(2000);

}

void loop() {

  int levelX = analogRead(JoistPinX);

  int levelY = analogRead(JoistPinY);

///////////////////////////////////////////////////////////////////////////////////

  X.runSpeed();

  if(levelX >= 0 || levelX < 390)

      {X.moveTo(map(-levelX, 390, 0, 0, 2000));

       X.setSpeed(map(levelX, 390, 0, 0, 2000));}

  if(levelX >= 390 || levelX < 610)    
   {X.moveTo(0);
    X.setSpeed(0);}

  if(levelX > 610 || levelX <= 1023)

          {X.moveTo(map(levelX, 610, 1023, 0, 2000));

           X.setSpeed(map(levelX, 610, 1023, 0, 2000));}

          

///////////////////////////////////////////////////////////////////////////////////

  Y.runSpeed();

  if(levelY >= 0 || levelY < 390)

      {Y.moveTo(map(-levelY, 390, 0, 0, 2000));

       Y.setSpeed(map(levelY, 390, 0, 0, 2000));}

       if(levelY >= 390 || levelX < 610)    
   {Y.moveTo(0);
    Y.setSpeed(0);}

  if(levelY > 610 || levelY <= 1023)

          {Y.moveTo(map(levelY, 610, 1023, 0, 2000));

           Y.setSpeed(map(levelY, 610, 1023, 0, 2000));}

}

 

Zibn
Offline
Зарегистрирован: 03.01.2018

Нашёл скетч на этом форуме, подправил, не работает. Подскажите формат команды "AccelStepper X (8, 2, 5); " я так понимаю первое значение вывод reset, второе вывод step, третье dir? Или где это посмотреть?

Zibn
Offline
Зарегистрирован: 03.01.2018

Может у меня и правда с подключением проблема? Но по отдельности всё работает...

Zibn
Offline
Зарегистрирован: 03.01.2018

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

Zibn
Offline
Зарегистрирован: 03.01.2018

есть мысли что это может быть?

Zibn
Offline
Зарегистрирован: 03.01.2018
#include <AccelStepper.h>
#include <MultiStepper.h>

AccelStepper X (1, 2, 5);
AccelStepper Y (1, 3, 6);

int JoistPinX = A6;
int JoistPinY = A7;
int JoistPinK = 12;
int EN = 8;

 void setup() {
 pinMode(EN, OUTPUT);
 digitalWrite(EN, LOW);
X.setMaxSpeed(2000);
Y.setMaxSpeed(2000);
}

void loop() {
  int levelX = analogRead(JoistPinX);
  int levelY = analogRead(JoistPinY);
  
///////////////////////////////////////////////////////////////////////////////////

  X.runSpeed();
  if(levelX >= 0 || levelX < 390)
      {X.moveTo(map(-levelX, 390, 0, 0, 2000));
       X.setSpeed(map(levelX, 390, 0, 0, 2000));}

  if(levelX >= 390 || levelX < 610)    
      {X.moveTo(0);
       X.setSpeed(0);}

  if(levelX > 610 || levelX <= 1023)
     {X.moveTo(map(levelX, 610, 1023, 0, 2000));
      X.setSpeed(map(levelX, 610, 1023, 0, 2000));}
      
/////////////////////////////////////////////////////////////////////////////////

  Y.runSpeed();
  if(levelY >= 0 || levelY < 390)
      {Y.moveTo(map(-levelY, 390, 0, 0, 2000));
       Y.setSpeed(map(levelY, 390, 0, 0, 2000));}
       
  if(levelY >= 390 || levelX < 610)    
      {Y.moveTo(0);
       Y.setSpeed(0);}

  if(levelY > 610 || levelY <= 1023)
      {Y.moveTo(map(levelY, 610, 1023, 0, 2000));
       Y.setSpeed(map(levelY, 610, 1023, 0, 2000));}

}

 

Zibn
Offline
Зарегистрирован: 03.01.2018

При выполнении этого скетча мотор двигается на один шаг при отклонении джойстика. Да что не так то....?

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

Zibn пишет:

При выполнении этого скетча мотор двигается на один шаг при отклонении джойстика. Да что не так то....?

Не хотите Вы спокойно и методично всё сделать... Опять новые библиотеки, новые скетчи, новые косяки. Даже если кто-то захочет что-нибудь подсказать, какой из них обсуждать-то? Остановитесь уж на чём-нибудь!

В последних скетчах у Вас условия какие-то странные. Скорее всего везде вместо || (ИЛИ) должно && (И) быть.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

В строках 26 30 34 40 45 49 заменить || на &&.

В строках 30 34 45 49 заменить if на else if.

Zibn
Offline
Зарегистрирован: 03.01.2018

Voodoo Doll спасибо

Zibn
Offline
Зарегистрирован: 03.01.2018
#include <AccelStepper.h>
#include <MultiStepper.h>

AccelStepper X (2, 5);
AccelStepper Y (3, 6);

int JoistPinX = A6;
int JoistPinY = A7;
int JoistPinK = 12;
int EN = 8;

 void setup() {
 pinMode(EN, OUTPUT);
 digitalWrite(EN, LOW);
X.setMaxSpeed(2000);
Y.setMaxSpeed(2000);
}

void loop() {
  int levelX = analogRead(JoistPinX);
  int levelY = analogRead(JoistPinY);
  
///////////////////////////////////////////////////////////////////////////////////

  X.runSpeed();
  if(levelX >= 0 && levelX < 390)
      {X.moveTo(-100000);
       X.setSpeed(map(levelX, 390, 0, 0, 2000));}

  else if(levelX >= 390 && levelX < 610)    
      {X.moveTo(0);
       X.setSpeed(0);}

  else if(levelX > 610 && levelX <= 1023)
     {X.moveTo(100000);
      X.setSpeed(map(levelX, 610, 1023, 0, 2000));}
      
/////////////////////////////////////////////////////////////////////////////////

  Y.runSpeed();
  if(levelY >= 0 && levelY < 390)
      {Y.moveTo(map(levelY, 390, 0, 0, -2000));
       Y.setSpeed(map(levelY, 390, 0, 0, 2000));}
       
  else if(levelY >= 390 && levelX < 610)    
      {Y.moveTo(0);
       Y.setSpeed(0);}

  else if(levelY > 610 && levelY <= 1023)
      {Y.moveTo(map(levelY, 610, 1023, 0, 2000));
       Y.setSpeed(map(levelY, 610, 1023, 0, 2000));}

}

 

Zibn
Offline
Зарегистрирован: 03.01.2018

изменил строку 4, 5. исправил указаные ошибки. Заработало на половину. при изменении положения джойстика шаговик начинает крутиться, но, собака, в одну сторону. Тоесть отклоняешь в право крутится против часовой, отклоняешь влево, тоже против часовой, в центральном положении стоит как и положено.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Проверяйте тип аргумента X.moveTo();

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, не, нормальный у него тип.