Действие при нажатии кнопки

Проблема в том, что я не могу вращать моторы непрерывно. Если я нажимаю любую кнопку, выполняется motor.step, а затем останавливается, даже если я не отпускал кнопку.
Это мой проект на данный момент.
Код:

#include <AFMotor.h>


//определить степперы
AF_Stepper motor1(48, 1);
AF_Stepper motor2(48, 2);

char data;

void setup()
{

  motor1.setSpeed(200);  // 10 об/мин
  motor2.setSpeed(200);  // 10 об/мин
  Serial.begin(9600);
}

void loop()
{
  Serial.println(data);
  if (Serial.available())
  {
    data = Serial.read();
    if (data == 'A')
    {
      motor1.step(200, FORWARD, DOUBLE);
    }
    if (data == 'B')
    {
      motor1.step(200, BACKWARD, DOUBLE);
    }
    if (data == 'C')
    {
      motor2.step(200, FORWARD, SINGLE);
    }
    if (data == 'D')
    {
      motor2.step(200, BACKWARD, SINGLE);
    }
    if (data == 'E')
    {
    delay(50);
    }
  }
}

Блоки App Inventor:блоки app Inventor

, 👍0


2 ответа


Лучший ответ:

0

Этот оператор: data = Serial.read(); потребляет данные, отправленные через последовательный порт, поэтому для обеспечения непрерывного движения вам придется постоянно вводить A или B и т. д. из того, что генерирует эти данные.

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

(непроверенный код)

#include <AFMotor.h>

//определить степперы
AF_Stepper motor1(48, 1);
AF_Stepper motor2(48, 2);

char data;
int8_t motor1state=0;  // 0=> Остановлен, -1=>Назад, 1=>Вперед
int8_t motor2state=0;

void setup()
{
  motor1.setSpeed(200);  // 10 об/мин
  motor2.setSpeed(200);  // 10 об/мин
  Serial.begin(9600);
}

void loop()
{
  Serial.println(data);
  if (Serial.available())
  {
    data = Serial.read();
    if (data == 'A')
    {
      motor1state = 1;
    }
    if (data == 'B')
    {
      motor1state = -1;
    }
    if (data == 'C')
    {
      motor2state = 1;
    }
    if (data == 'D')
    {
      motor2state = -1;
    }
    if (data == 'F')
    {
      motor1state = 0;
    }
    if (data == 'G')
    {
      motor2state = 0;
    }
    if (data == 'E')
    {
    delay(50);
    }
  }

  if (motor1state>0)
  {
    // Шаг вперед
    motor1.step(200, FORWARD, DOUBLE);
  }
  else if (motor1state<0)
  {
    // Шаг назад
    motor1.step(200, BACKWARD, DOUBLE);
  }
  else
  {
    // Ничего не делать
  }

  if (motor2state>0)
  {
    // Шаг вперед
    motor2.step(200, FORWARD, SINGLE);
  }
  else if (motor2state<0)
  {
    // Шаг назад
    motor2.step(200, BACKWARD, SINGLE);
  }
  else
  {
    // Ничего не делать
  }
}
,

0

Последовательный порт — это не клавиатура. Когда вы отправляете «А», вы отправляете «А». Какой бы ни был этот источник, если вы отправляете одну букву «А», вы отправляете одну букву «А» и получаете одну букву «А».

Вам придётся придумать какой-то другой протокол и написать специальное программное обеспечение на своём компьютере, которое будет напрямую отслеживать клавиши и отправлять что-то вроде «Я нажал А» и «Я отпустил А».

,