Действие при нажатии кнопки
Проблема в том, что я не могу вращать моторы непрерывно. Если я нажимаю любую кнопку, выполняется 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:
@Róbert Pollák, 👍0
2 ответа
Лучший ответ:
Этот оператор: 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
{
// Ничего не делать
}
}
Последовательный порт — это не клавиатура. Когда вы отправляете «А», вы отправляете «А». Какой бы ни был этот источник, если вы отправляете одну букву «А», вы отправляете одну букву «А» и получаете одну букву «А».
Вам придётся придумать какой-то другой протокол и написать специальное программное обеспечение на своём компьютере, которое будет напрямую отслеживать клавиши и отправлять что-то вроде «Я нажал А» и «Я отпустил А».
- Можно ли измерить скорость акселерометром? Насколько точно?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Модуль Bluetooth HC-05 мигает красным светом - Arduino Uno
- Сканирование Bluetooth-устройств с помощью HC-05
- Модуль Bluetooth HC-05 возвращает закодированные данные
- Запустить два степпера одновременно
- Мой модуль Bluetooth HC-05 не работает
- AT-команды не работают для HC-06 НА ARDUINO UNO