Попытка переместить серводвигатель с помощью 3 кнопок
У меня возникли некоторые трудности с попыткой заставить мой серводвигатель двигаться под определенным углом в зависимости от нажатой кнопки.
Например, двигатель запускается при 0 градусах, а затем поворачивается на 180 градусов при нажатии третьей кнопки, возвращается в 0 градусов при нажатии первой кнопки и поворачивается на 90 градусов при нажатии второй кнопки. кнопка нажата и т.д. и т.п.
Я не могу сказать, делаю ли я все это неправильно или нет с моим кодом, поэтому, если бы кто-нибудь мог помочь с этим, это было бы большим подспорьем
EDIT: на всякий случай добавлена проводка
#include <Servo.h>
Servo myservo;
int angle = 0;
int anglestep = 10;
#define FIRST 2 // контакт 2 подключен к кнопке 1-го этажа
#define SECOND 3 // контакт 3 подключен к кнопке 2-го этажа
#define THIRD 4 // контакт 4 подключен к кнопке 3-го этажа
#define SIGNAL 10
void setup()
{
Serial.begin(9600);
myservo.attach(10);
myservo.write(angle);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
Serial.println("Lift/Descend");
}
void loop()
{
while (digitalRead(FIRST) == LOW)
{
if (angle > 0 && angle <= 90) //2to1
{
angle = angle - anglestep;
if (angle < 0)
{
angle = 0;
}
else
{
myservo.write(angle);
Serial.print("Moved to: ");
Serial.print(angle);
Serial.println(" degree");
}
}
else if (angle > 90 && angle <= 180) //3to1
{
angle = angle - anglestep;
if (angle < 0)
{
angle = 0;
}
else
{
myservo.write(angle);
Serial.print("Moved to: ");
Serial.print(angle);
Serial.println(" degree");
}
}
else //1 на 1
{
angle = 0;
}
}
while (digitalRead(SECOND) == LOW)
{
if (angle > 90 && angle <= 180) //3to2
{
angle = angle - anglestep;
if (angle > 90)
{
angle = 90;
}
else
{
myservo.write(angle);
Serial.print("Moved to: ");
Serial.print(angle);
Serial.println(" degree");
}
}
else if (angle > 0 && angle < 90) //1to2
{
angle = angle + anglestep;
if (angle < 90)
{
angle = 90;
}
else
{
myservo.write(angle);
Serial.print("Moved to: ");
Serial.print(angle);
Serial.println(" degree");
}
}
else
{//2на2//
angle = 90;
}
}
while (digitalRead(THIRD) == LOW)
{
if (angle > 0 && angle <= 90) //1to3
{
angle = angle + anglestep;
if (angle > 180)
{
angle = 180;
}
else
{
myservo.write(angle);
Serial.print("Moved to: ");
Serial.print(angle);
Serial.println(" degree");
}
}
else if (angle > 90 && angle < 180)
{//2to3
angle = angle + anglestep;
if (angle > 180)
{
angle = 180;
}
else
{
myservo.write(angle);
Serial.print("Moved to: ");
Serial.print(angle);
Serial.println(" degree");
}
}
else
{
angle = 180;
}
}
}
@JYKiryu, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы действительно слишком много думаете о вещах. Сервопривод будет двигаться под углом, если вы просто зададите ему окончательный угол для перемещения. Вам не нужно подталкивать его к конечному углу, посещая каждый промежуточный угол, и вам не нужно знать, под каким углом он находится в данный момент.
Вы можете просто сделать:
if (digitalRead(FIRST) == LOW) {
myservo.write(0);
}
if (digitalRead(SECOND) == LOW) {
myservo.write(90);
}
if (digitalRead(THIRD) == LOW) {
myservo.write(180);
}
Однако, если вы хотите замедлить движение, что повлечет за собой перемещение сервопривода с меньшими шагами, я бы отделил текущий угол и положение от кнопок, которые установили бы желаемый угол. Что-то вроде:
static uint8_t desiredAngle = 0;
static uint8_t currentAngle = 0;
static uint32_t timestamp = millis();
// Выбираем новый желаемый угол
if (digitalRead(FIRST) == LOW) {
desiredAngle = 0;
}
if (digitalRead(SECOND) == LOW) {
desiredAngle = 90;
}
if (digitalRead(THIRD) == LOW) {
desiredAngle = 180;
}
// Каждые 10 мс «двигаем» сервопривод в нужном направлении
// угол на 1 градус
if (millis() - timestamp >= 10) {
timestamp = millis();
if (desiredAngle > currentAngle) {
currentAngle++;
myservo.write(currentAngle);
} else if (desiredAngle < currentAngle) {
currentAngle--;
myservo.write(currentAngle);
}
}
- Arduino ждет, пока кнопка не будет отпущена для активации
- Хорошая кнопка debouncing/Библиотека StateChange
- Как заставить сервопривод вращаться на угол больше 180°
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
И в чем проблема? Вы забыли описать, что не работает как положено и как., @chrisl