Попытка переместить серводвигатель с помощью 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;
        }
    }
}

, 👍0

Обсуждение

И в чем проблема? Вы забыли описать, что не работает как положено и как., @chrisl


1 ответ


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

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);
    }
}
,