Ayuda con proyecto con servomotor (variación de "sweep")

Buenas, soy nuevo en este foro, y ¿qué mejor manera de empezar que pidiendo ayuda con un proyecto que no consigo que funcione como quiero? :stuck_out_tongue:

Es algo sencillo. Básicamente quiero hacer una variación del proyecto ejemplo "sweep" (el que mueve un servo de 0º a 180º y de 180º a 0º continuamente). La variación consiste en que el servo se mueva únicamente cuando se mantiene pulsado un botón (cuando está en "HIGH"), y que cuando deje de pulsarse el servo quede quieto en el ángulo por el que iba. Vamos, que ejecute el sweep únicamente cuando el botón está pulsado.

El código que he escrito es el siguiente:

#include <Servo.h>;
const int pinBoton = 2;
Servo servo;
int EstadoBoton;
int angulo;
int tiempoEspera = 15;

void setup() {
servo.attach(9);
pinMode(pinBoton, INPUT);
}

void loop() {

  EstadoBoton = digitalRead(pinBoton);
  while(EstadoBoton == HIGH){
    for(angulo=0;angulo<180;angulo++){
      servo.write(angulo);
      delay(tiempoEspera);}
    for(angulo=180;angulo>0;angulo--){
      servo.write(angulo);
      delay(tiempoEspera);}
  }
    
}

Y el esquema que representa cómo he colocado los elementos (por si he hecho alguna conexión mal):

Tal y como está montado, lo que ocurre cuando cargo el código en la placa Arduino es lo siguiente: El servo está quieto (como debería ser), cuando se pulsa el botón el sweep comienza a ejecutarse (como debería ser) pero al dejar de pulsar el botón, el servo no para. Después de esto el servo continúa con el sweep, por mucho que pulse o deje de pulsar el botón. ¿Alguna sugerencia?

Muchas gracias por adelantado :slight_smile:

PD.: No sé si he creado este tema en el lugar adecuado, si no es así pido disculpas :cold_sweat:

Hola.
Bienvenido al foro.
Prueba este código a ver si funciona y, sobre todo a ver si lo entiendes:

#include <Servo.h>;
const int pinBoton = 2;
Servo servo;
int angulo=0;
int direccion=1;
int tiempoEspera = 15;

void setup() {
servo.attach(9);
pinMode(pinBoton, INPUT);
servo.write(angulo);
}

void loop() {

  if (digitalRead(pinBoton)){
  	angulo+=direccion; // sumará o restará dependiendo de si dirección es 1 o -1
    servo.write(angulo);
    delay(tiempoEspera);
    if (angulo == 0 || angulo == 180) { // si hemos llegado a un tope tras mover
    	direccion = - direccion; // invertimos el valor dirección
    }
  }
  
}[code]

Saludos

Muy buenas.

Con el código que me has pasado funciona perfectamente, ¡muchas gracias! de hecho creo que es incluso más sencillo que el código que escribí yo inicialmente.

No obstante, no me queda claro qué es lo que falla en mi código. ¿No estoy usando la función "while" adecuadamente?

Un saludo y muchas gracias de nuevo :slight_smile:

AntonioTorresM:
No obstante, no me queda claro qué es lo que falla en mi código. ¿No estoy usando la función "while" adecuadamente?

Aun que lo tengas ya funcionando seguro que te interesa tener tu codigo, con el error corregido, solo estas leyendo una vez la entrada, luego cuando es HIGH se queda en el bucle y ya no sale de el, por tanto el loop solo se ejecuta una vez

#include <Servo.h>;
const int pinBoton = 2;
Servo servo;
int EstadoBoton;
int angulo;
int tiempoEspera = 15;

void setup() {
servo.attach(9);
pinMode(pinBoton, INPUT);
}

void loop() {

  EstadoBoton = digitalRead(pinBoton);
  while(EstadoBoton == HIGH){
    for(angulo=0;angulo<180&&EstadoBoton == HIGH;angulo++){
      EstadoBoton = digitalRead(pinBoton);
      servo.write(angulo);
      delay(tiempoEspera);}
    for(angulo=180;angulo>0&&EstadoBoton == HIGH;angulo--){
      EstadoBoton = digitalRead(pinBoton);
      servo.write(angulo);
      delay(tiempoEspera);}
  }
    
}

de hecho se podría quitar el while, por que ya estamos comprobando dentro del for (es imprescindible comprobar dentro del for sino no se parara hasta que no llegue a uno de los extremos)

Saludos!

Ah, ya lo entiendo. ¡Muchísimas gracias!