Servo, maquinas de estado, potenciómetro y señales de entrada

Buenas!

Soy nuevo en el foro y estoy teniendo algún problema para realizar un proyecto con un servomotor y una señal de entrada externa.

El proyecto en sí consiste en mover un servomotor de 0 a una posición dada por un potenciómetro cuando la señal de entrada es un 0 y de la posición dada por el potenciómetro a cero cuando la señal de entrada es un 1.

Para ello he programado una máquina de estados con dos estados donde al completar el movimiento sea de 0 a "x" o de "x" a 0 este se pare. Es decir, si entra un 1 cuando ya ha llegado a la posición "x" que no siga girando.

El problema está en que al conectar la señal la placa no detecta ni 1 ni 0 y por lo tanto no realiza ningún movimiento excepto el de

La señal haría las veces de interruptor.

Adjunto el código que he hecho hasta la fecha.

#include <Servo.h>

Servo motor;
byte valor_entrada = 0;
int entrada = 5;
int pos = 0;
const int poten = A0;
int giro ;
// declaración de estados del motor
enum estado_pinza
{
  m_cerrado,
  m_abierto
};
// e_motor: estado en el que está el motor.
estado_pinza e_motor = m_abierto;

void setup() {

motor.attach (9);
motor.write (pos);
pinMode (entrada, INPUT);
e_motor = m_abierto;

}
void apertura () {

 for (pos = giro; pos > 0; pos -=1) {
      motor.write (pos);
      delay (15);
  }
  e_motor = m_abierto;
}
void cierre () {


  for (pos = 0; pos <= giro; pos +=1) {
      motor.write (pos);
      delay (15);
  }
  e_motor = m_cerrado;
}
void loop() { 
  delay (550);
  valor_entrada = digitalRead (entrada);
  giro = analogRead (poten);
  giro = map (giro, 0, 1023, 0, 180);
switch (e_motor) {
  case m_cerrado:
     if (valor_entrada == LOW){ 
  apertura ();}

  else ;{}
break; 
  case m_abierto:
     if (valor_entrada == HIGH){ 
    cierre ();}
  else;{}
break;
}
}

Gracias. Un saludo

Hola Marcosvp123, bienvenido.

Si no usaras el else no es necesario ponerlo. Ademas no va el ; luego del else.

switch (e_motor) {
   case m_cerrado:
      if (valor_entrada == LOW){
         apertura();
      }else ;{}           //Error
      break;
   case m_abierto:
      if (valor_entrada == HIGH){
         cierre();
      }else;{              //Error
      }
      break;
   }

Bastaria ponerlos asi:

switch (e_motor) {
   case m_cerrado:
      if (valor_entrada == LOW){
         apertura();
      }
      break;
   case m_abierto:
      if (valor_entrada){    //No es necesario igualar a HIGH
         cierre();
      }
      break;
   }

Hola Kike_GL

Muchas gracias!

Ya he hecho los cambios que me has indicado.

Finalmente el problema era debido a un componente de la electrónica.

Gracias por las molestias!

Intenta no usar ese delay(550) solo demora todo tu sistema.
Necesitas pausas, usas millis(). No sabes cómo? Ve a documentación => indice de temas tutoriales => millis() y tmb relee máquina de estados.