es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedes girar un servo 90 grados cuando presionas un botón y hacer lo mismo con 180 grados y 0 grados?

Puede parecer una pregunta tonta, pero todavía estoy en proceso de aprendizaje y realmente intento buscar en internet, pero a veces no entiendo cómo hacerlo funcionar.
Mi código es el siguiente:

#include <arduino.h>
#include <servo.h>

Servo Myservo;
int SERVO_PIN = 8;
int servobutton_s1 = 2;

void setup() {
  Myservo.attach(SERVO_PIN);
}

void loop() {
  Myservo.write(0);
  delay(2000);
  Myservo.write(90);
  delay(2000);
  Myservo.write(180);
  delay(2000);
}

El servo ahora va de 0 grados (espera 2 segundos) y luego va a 90 grados (espera 2 segundos) y va a 180 grados, y así continúa.

El problema es que quiero que el servo se mueva cada vez que presiono el botón. Es decir, cuando presiono el botón, el servo va a 90 grados, pero cuando vuelvo a presionar el botón, va a 180 grados y cuando lo vuelvo a presionar, va a 0 grados, y así continúa. Así que agregué el botón y lo llamé:

int servobutton_s1 = 2;

Pero cada vez que lo agregué en el void loop, solo funciona una vez.

Espero que alguien pueda ayudarme. Gracias.</servo.h></arduino.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que quieres utilizar el botón para cambiar la posición del servo en lugar de que se mueva automáticamente. Necesitarás usar algunas declaraciones condicionales en tu código para lograr esto.

    Aquí tienes un código de ejemplo que puedes usar como punto de partida:

    #include <arduino.h>
    #include <servo.h>
    
    Servo myservo;
    int pin_servo = 8;
    int pin_boton = 2;
    int pos = 0; // posición actual del servo
    bool boton_presionado = false; // mantener registro de si el botón está presionado o no
    
    void setup() {
      myservo.attach(pin_servo);
      pinMode(pin_boton, INPUT_PULLUP);
    }
    
    void loop() {
      // verifica si el botón está presionado
      if (digitalRead(pin_boton) == LOW && !boton_presionado) {
        // el botón está presionado y no fue presionado previamente
        boton_presionado = true; // establece la bandera en true para evitar múltiples activaciones
        pos += 90; // aumenta la posición en 90 grados
        if (pos > 180) {
          pos = 0; // reinicia la posición a 0 si ha superado los 180 grados
        }
        myservo.write(pos); // mueve el servo a la nueva posición
        delay(100); // desactivación del botón
      } else if (digitalRead(pin_boton) == HIGH) {
        boton_presionado = false; // reinicia la bandera si el botón es liberado
      }
    }
    

    En este código, agregamos una nueva variable boton_presionado para mantener un registro de si el botón está actualmente presionado o no. Cuando el botón se presiona, aumentamos la posición del servo en 90 grados y lo movemos a la nueva posición. También agregamos una verificación para reiniciar la posición a 0 si ha superado los 180 grados. Por último, agregamos una pausa para desactivar el botón y evitar múltiples activaciones.

    Ten en cuenta que también cambiamos los nombres de los pines a minúsculas para seguir las convenciones de nomenclatura estándar, pero esto no es importante para el funcionamiento del código.</servo.h></arduino.h>

Comments are closed.