Использование джойстика для активации двух отдельных шаговых двигателей (с использованием джойстика X и Y с двумя двигателями) - PullRequest
0 голосов
/ 11 ноября 2019

Я использую два шаговых двигателя 28BYJ-48 и простой джойстик с функцией осей X и Y. У меня есть код, который заставляет их работать по отдельности, однако я бы хотел, чтобы мое arduino одновременно отслеживало значения x и y, чтобы при перемещении по диагонали оба двигателя вращались одновременно. Прямо сейчас я могу заставить только один двигатель вращаться за один раз. Я точно знаю, что мне нужно делать, однако я не знаю, как это сделать в Arduino, я обычно использую контроллер TI с блоками кода, поэтому я могу следить за своим кодом во время работы.

Мне нужно, чтобы мой код проверял значения X и Y одновременно, и я могу только заставить его проверять их одно, а затем другое, поэтому только один двигатель вращается за раз, а иногда нет. вижу, что я двигаю джойстик на всех. Это становится немного запутанным и застрявшим время от времени. Я бы вообразил что-то вроде прерывания. Я не уверен, является ли Arduino таким сложным или нет.

Я испробовал множество различных функций, таких как использование циклов while или выполнение whiles, или добавление моего кода второго двигателя в оператор else первого двигателя, чтобы попытаться заставить его взглянуть на него. Я осмотрелся вокруг, пытаясь получить это, но ни у кого нет двух двигателей только по одному за раз. Я также попытался включить оба кода двигателей вместе, чтобы они работали вместе, но ничего не работает.

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

// include Arduino stepper motor library
#include <Stepper.h>

// define number of steps per revolution
#define STEPS 32

// define stepper motor control pins
#define IN5  7
#define IN6  6
#define IN7  5
#define IN8  4

#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11

// initialize stepper library
Stepper stepper(STEPS, IN8, IN6, IN7, IN5);
Stepper stepper_vert(STEPS, IN4, IN2, IN3, IN1);

// joystick pot output is connected to Arduino A0
#define joystick  A1
#define joystick_vert A0 //vert is referring to the vertical axis

void setup()
{

}

void loop()
{
  // read analog value from the potentiometer
  int val = analogRead(joystick);
  int val_vert = analogRead(joystick_vert);

  // if the joystic is in the middle ===> stop the motor
  if(  (val > 490) && (val < 540))
  {
    digitalWrite(IN5, LOW);
    digitalWrite(IN6, LOW);
    digitalWrite(IN7, LOW);
    digitalWrite(IN8, LOW);
  }

  else
  {
    // move the motor in the first direction
    while (val >= 520)
    {
      // map the speed between 5 and 500 rpm
      int speed_ = map(val, 520, 1023, 5, 500);
      // set motor speed
      stepper.setSpeed(speed_);

      // move the motor (1 step)
      stepper.step(1);

      val = analogRead(joystick);
    }

    // move the motor in the other direction
    while (val <= 500)
    {

      int speed_ = map(val, 500, 0, 5, 500);// map the speed between 5 and 500 rpm
      // set motor speed
      stepper.setSpeed(speed_);

      // move the motor (1 step)
      stepper.step(-1);

      val = analogRead(joystick);

    }
  }

if(  (val_vert > 490) && (val_vert < 540) )
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
  }

  else
  {

    while (val_vert >= 540)// move the motor in the first direction
    {
      // map the speed between 5 and 500 rpm
      int speed_ = map(val_vert, 540, 1023, 5, 500);
      // set motor speed
      stepper_vert.setSpeed(speed_);

      // move the motor (1 step)
      stepper_vert.step(1);

      val_vert = analogRead(joystick_vert);
    }

    // move the motor in the other direction
    while (val_vert <= 500)
    {
      // map the speed between 5 and 500 rpm
      int speed_ = map(val_vert, 500, 0, 5, 500);
      // set motor speed
      stepper_vert.setSpeed(speed_);

      // move the motor (1 step)
      stepper_vert.step(-1);

      val_vert = analogRead(joystick_vert);
    }

  }



}

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

...